我似乎要理解的内容:
POSIX AIO
API是<aio.h>
中的原型,您将程序与librt(-lrt)相关联,而libaio
中的<libaio.h>
API和您的程序与libaio相关联(-laio)。
我无法弄清楚:
1.内核是否以不同的方式处理这两种方法?
2. O_DIRECT
标志是否必须使用其中任何一个?
正如this post中所述,使用O_DIRECT
时,libaio在没有libaio
的情况下正常工作。好的,理解但是:
根据R.Love的 Linux系统编程一书,Linux支持 aio (我假设是POSIX AIO)在常规文件上用O_DIRECT
打开。但是我编写的一个小程序(使用aio.h,与-lrt链接)在没有aio_write
标志的文件上调用O_DIRECT
可以正常工作。< / p>
答案 0 :(得分:62)
在Linux上,两个AIO实现根本不同。
POSIX AIO是一个用户级实现,可在多个线程中执行正常的阻塞I / O,从而产生I / O异步的错觉。这样做的主要原因是:
主要缺点是您的队列深度(即您在实践中可能拥有的未完成操作的数量)受到您选择的线程数量的限制,这也意味着一个磁盘上的慢速操作可能会阻止操作去另一个磁盘。它还会影响内核和磁盘调度程序看到的I / O(或多少)。
内核AIO(即io_submit()et.al。)是异步I / O操作的内核支持,其中io请求实际上在内核中排队,按照您拥有的任何磁盘调度程序排序,可能是其中一些被转发(以某种最佳顺序,人们希望)作为异步操作(使用TCQ或NCQ)转发到实际磁盘。这种方法的主要限制是,并非所有文件系统都能很好地工作或者根本不能使用异步I / O(并且可能会回退到阻塞语义),因此必须使用O_DIRECT打开文件,而O_DIRECT还带有许多其他限制。 I / O请求。如果您无法使用O_DIRECT打开文件,它可能仍然“正常”,就像您获得正确的数据一样,但它可能不是异步完成,而是回到阻止语义。
还要记住,在某些情况下,io_submit()实际上可以在磁盘上阻塞。