IT-Swarm.Net

Linux上的POSIX AIO和libaio之间的区别?

似乎 理解:

POSIX AIO API在<aio.h>中原型化,您将程序与librt(-lrt)链接,而<libaio.h>中的libaio API和您的程序与libaio(-laio)链接。.

我无法弄清楚:

1.内核是否以不同方式处理这两种方法中的任何一种?

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

正如在 这篇文章中提到的那样 libaio在使用libaio时没有O_DIRECT就可以正常工作。好的,理解但是:

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

50
itisravi

在linux上,两个AIO实现从根本上是不同的。.

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

  1. 它适用于任何文件系统
  2. 它(基本上)在任何操作系统上工作(请记住,gnu的libc是可移植的)
  3. 它适用于启用了缓冲的文件(即没有设置O_DIRECT标志)

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

内核AIO(即io_submit()et.al。)是异步I/O操作的内核支持,其中io请求实际上在内核中排队,按照您拥有的任何磁盘调度程序排序,可能是其中一些被转发(我们希望将实际的磁盘作为异步操作(使用TCQ或NCQ)。这种方法的主要限制是,并非所有文件系统都能很好地工作或者根本不能使用异步I/O(并且可能会回退到阻塞语义),因此必须使用O_DIRECT打开文件,而O_DIRECT还带有许多其他限制。 I/O请求。如果您无法使用O_DIRECT打开文件,它可能仍然“正常”,就像您获得正确的数据一样,但它可能不是异步完成,而是回到阻止语义。.

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

62
Arvid

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!