我想要了解的是:

<aio.h>中有POSIX AIO个API是原型,你可以用librt(-lrt)链接你的程序,而<libaio.h>中的libaio个API和你的程序是用libaio(-laio)链接的.

我不明白的是:

1.内核处理这两种方法的方式是否不同?

2.使用其中任何一种都必须使用O_DIRECT号标志吗?

this post所述,当使用libaio时,libaio在没有O_DIRECT的情况下工作良好.好的,明白了,但是:

根据R.Love的Linux System Programming本书,如果用O_DIRECT打开,Linux在常规文件only上支持aio(我假设是POSIX AIO).但我编写的一个小程序(使用aio.h,与-lrt链接)在没有O_DIRECT标志的情况下打开的文件上调用aio_write,运行起来没有问题.

推荐答案

在linux上,这两种AIO实现是根本不同的.

POSIX AIO是一种用户级实现,在多个线程中执行正常的阻塞I/O,因此产生了I/O异步的错觉.这样做的主要原因是:

  1. 它适用于任何文件系统
  2. 它(基本上)可以在任何操作系统上运行(请记住gnu的libc是可移植的)
  3. 它适用于启用缓冲的文件(即未设置O_直接标志)

主要缺点是队列深度(即,在实践中可以执行的未完成操作的数量)受您 Select 的线程数量的限制,这也意味着一个磁盘上的慢速操作可能会阻止一个操作进入另一个磁盘.它还影响内核和磁盘调度器看到的I/O(或数量).

内核AIO(即io_submit()等)是对异步i/O操作的内核支持,其中io请求实际上在内核中排队,按您拥有的任何磁盘调度器排序,可能其中一些请求作为异步操作(使用TCQ或NCQ)被转发(以某种程度上人们希望的最佳顺序)到实际磁盘.这种方法的主要限制是,并非所有文件系统都能很好地工作,或者根本不能使用异步I/O(并且可能会退回到阻塞语义),文件必须使用O_DIRECT打开,而O_DIRECT对I/O请求有很多其他限制.如果您无法使用O_DIRECT打开文件,它可能仍然"有效",比如您可以获取正确的数据,但它可能不是异步完成的,而是退回到阻塞语义.

还要记住,io_submit()在某些情况下实际上可能会在磁盘上阻塞.

Linux相关问答推荐

是否有例外情况需要在.gitconfig中使用?

并行函数的最后一个实例的状态

无法分析nasm中的单词

为什么在已连接的设备上调用 btmgmt conn-info 返回:状态 0x02(未连接)

从 MariaDB 连接到 Oracle 时出现错误消息libsqora.so.11.1:找不到文件

linux shell 脚本获取文件夹中

如何使用 shell 脚本将文本文件转换为 JSON 文件

当 skylake 有 fsgsbase 时,为什么使用 __builtin_ia32_wrfsbase64 会收到非法指令?

根据其他列的值创建一个新列

如何在 AWS Linux 服务器上实现虚拟主机?

如何增加 /proc/pid/cmdline 4096 字节限制?

从 Linux shell 将多个文件从一个目录复制到另一个目录

对一行的最后一个字段进行排序

如何将输出从 grep 传送到 cp?

何时判断 EINTR 并重复函数调用?

使用 linux 命令行 (bash) 从网络摄像头拍照

仅在不存在时添加换行符

我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

Bash:如何标记字符串变量?

当我已经 ssh 进入远程机器时,如何 scp 回到本地?