linux AIO

Linux AIO(异步非阻塞IO)是2.6内核提供的增强特性,允许进程发起I/O操作而不阻塞,提高系统效率。文章详细介绍了同步阻塞/非阻塞IO、异步阻塞IO模型,并重点解析了AIO的工作原理,包括Linux AIO的初始化、读写请求的下发和回收。还提到了POSIX AIO和Linux direct-io的相关信息。
摘要由CSDN通过智能技术生成

AIO 是 Linux 下的异步读写模型,它是 2.6 内核提供的一个标准增强特性。对于文件的读写,即使以 O_NONBLOCK 方式来打开一个文件,也会处于 “阻塞” 状态,因为文件时时刻刻处于可读状态,而从磁盘到内存所等待的时间是惊人的。

为了充份发挥把数据从磁盘复制到内存的时间,引入了 AIO 模型,其基本原理是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。

IO 模型

下图给出了同步和异步,以及阻塞和非阻塞的模型。简单来说,一个系统调用 (read, select) 立即返回表示非阻塞;在一个时间点只能去处理一个请求表示同步。

每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点。

同步阻塞IO

最常用的模型,当用户空间的应用执行一个系统调用后,会导致应用程序阻塞,直到系统调用完成为止(数据传输完成或发生错误)。应用程序只能处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。

 

在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换;然后会触发读磁盘操作,当从读取的设备中返回后,数据就被移动到用户空间的缓冲区中;然后应用程序就会解除阻塞(read 调用返回)。

同步非阻塞IO

备以非阻塞的形式打开,这意味着 I/O 操作不会立即完成,read 操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAIN 或 EWOULDBLOCK)。

该模型中可能需要应用程序调用多次来等待操作完成,这样的效率仍然不高,因为很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。

正如上图所示,这个方法会引入 I/O 操作的延时,因为数据在内核中变为可用到用户调用 read 返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。

异步阻塞IO

阻塞通知的非阻塞 I/O,配置的是非阻塞 I/O,然后使用阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。select 可以为多个描述符提供通知,而不是仅仅为一个描述符提供通知;通知的事件包括写数据、有读数据可用以及是否发生错误。

 

select 调用的主要问题是它的效率不是非常高,尽管这是异步通知使用的一种方便模型,但是对于高性能的 I/O 操作来说不建议使用。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值