我似乎明白了:
POSIX AIO API在<aio.h>中原型(prototype)化,您将程序与librt(-lrt)链接,而libaio中的<libaio.h> API在程序中与libaio(-laio)链接。

我不知道的是:

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

2.是否必须使用O_DIRECT标志才能使用它们中的任何一个?

this post中所述,libaio在使用O_DIRECT时无需libaio即可正常工作。

根据R.Love的《 Linux系统编程》一书,仅当使用O_DIRECT打开时,Linux才在常规文件上支持aio(我认为是POSIX AIO),但是我编写的一个小程序(使用aio.h,与-lrt链接)调用在没有aio_write标志的情况下打开的文件上的O_DIRECT可以正常工作。

最佳答案

在linux上,两个AIO实现根本不同。

POSIX AIO是一种用户级别的实现,可以在多个线程中执行常规的阻塞I/O,因此给人一种I/O异步的错觉。这样做的主要原因是:

  • 它可与任何文件系统一起使用
  • (基本上)可以在任何操作系统上工作(请记住,gnu的libc是可移植的)
  • 它适用于启用了缓冲的文件(即未设置O_DIRECT标志)

    主要缺点是队列深度(即实际上可以执行的未完成操作的数量)受您选择拥有的线程数量的限制,这也意味着一个磁盘上的慢速操作可能会阻止去往一个磁盘的操作。不同的磁盘。它还影响内核和磁盘调度程序看到哪些I/O(或多少)。

    内核AIO(即io_submit()等)是对异步I/O操作的内核支持,其中io请求实际上在内核中排队,并根据您拥有的任何磁盘调度程序进行排序,大概其中一些转发(以某种最佳的顺序(作为希望)对实际磁盘进行异步操作(使用TCQ或NCQ)。这种方法的主要限制是,并非所有文件系统都可以通过异步I/O很好地工作或根本无法工作(并且可能会退回到阻塞语义),因此必须使用O_DIRECT打开文件,这对O I/O请求。如果您无法使用O_DIRECT打开文件,它可能仍然可以“工作”,就像返回正确的数据一样,但是它可能不是异步完成的,而是会回到阻止语义的方式。

    还请记住,在某些情况下,io_submit()实际上可以在磁盘上进行阻止。

  • 10-06 11:17