我 似乎 明白了:
POSIX AIOAPI已原型化,<aio.h>您将程序与librt(-lrt)链接,而libaioAPI中<libaio.h>和您的程序已与libaio(-laio)链接。
POSIX AIO
<aio.h>
libaio
<libaio.h>
我不知道的是:
1.内核对这两种方法的处理方式是否不同?
2. O_DIRECT使用这两个标志是否强制性的?
O_DIRECT
正如提到的这个帖子,libaio的工作正常不O_DIRECT使用时libaio.Okay,理解,但:
据R.Love的 Linux的系统编程 的书,Linux支持 AIO (我假设是POSIX AIO)在常规文件上 只 如果打开了O_DIRECT。但一个小程序,我写的(使用aio.h,与-lrt链接)的呼叫aio_write上没有O_DIRECT标志打开的文件不会有问题。
aio_write
在linux上,这两个AIO实现根本不同。
POSIX AIO是一种用户级别的实现,可以在多个线程中执行常规的阻塞I / O,因此给人一种I / O异步的错觉。这样做的主要原因是:
主要缺点是队列深度(即实际上可以执行的未完成操作的数量)受您选择拥有的线程数量的限制,这也意味着一个磁盘上的慢速操作可能会阻止去往一个磁盘的操作。不同的磁盘。它还影响内核和磁盘调度程序看到哪些I / O(或多少)。
内核AIO(即io_submit()等)是内核对异步I / O操作的支持,其中io请求实际上在内核中排队,按您拥有的任何磁盘调度程序排序,大概其中一些转发(以某种最佳的顺序(作为希望)对实际磁盘进行异步操作(使用TCQ或NCQ)。这种方法的主要限制是,并非所有文件系统都可以在异步I / O上很好地工作或根本无法工作(并且可能会退回到阻塞语义),因此必须使用O_DIRECT打开文件,这对O_DIRECT带来了很多其他限制。 I / O请求。如果您无法使用O_DIRECT打开文件,它可能仍然可以“工作”,就像返回正确的数据一样,但是它可能不是异步完成的,而是会退回到阻塞语义上。
还请记住,在某些情况下,io_submit()实际上可以在磁盘上进行阻止。