有网页的周围分散的网络,用于描述POSIX AIO设施在不同数量的详细说明。他们都非常近。还不清楚,究竟是什么,他们描述的。例如,"官方"(?) 网站为Linux内核步I/O持在这里 说是座不工作,但"aio。h"的手册对我Ubuntu8.04.1工作站都似乎意味着它可以作为任意的文件的描述符。然后还有 另一个项目,似乎工作在图书馆层 与甚至小的文件。

我想知道:

  • 是什么目的POSIX AIO?鉴于最明显的例子的一个实现我能找到的表示,它不支持插座、整件事情似乎奇怪我。它只是异步的磁盘I/O?如果是这样,为什么hyper-一般API?如果不是,为什么盘I/O的第一件事就得到了攻击?
  • 其中是否有例 完整的 POSIX AIO节目,我可以看看?
  • 任何人都不会实际上使用它,真的吗?
  • 什么样的平台支持POSIX AIO?哪些部分这样做,他们的支持吗?任何人都不会真正支持的暗示"任何I/O到任何FD", <aio.h> 似乎承诺?

其他复机制提供给我的是完美的,但是随机的片段中的信息漂浮在那里让我感到好奇。

有帮助吗?

解决方案

网络I/O不是一个优先事项为AIO,因为每个人都写POSIX网络服务器使用一个基于事件、无阻塞的方法。旧式Java"数十亿阻断线"的方法吸得很惨

磁盘写入I/O已经缓冲和盘读I/O可以预取进入缓冲区的使用功能等posix_fadvise.那叶子直接、无缓冲盘I/O作为唯一有用的目的AIO。

直接的,无缓冲I/O是唯一真正有用的事务数据库,以及那些倾向于编写他们自己的线或进程,以管理自己的磁盘I/O.

因此,在结束这使POSIX AIO在的位置不服务 任何 有用的目的。不要使用它。

其他提示

做座I/O有效地解决了与kqueue,epoll,IO完成港口和的喜欢。做异步文件I/O样的一个晚来的人(除了从窗'I/O重叠和solaris早期支持posix AIO)。

如果你是在寻找这样做座I/O,你可能更好利用上述机制。

主要目的AIO因此要解决的问题的步盘I/O.这很可能是为什么Mac OS X仅支持AIO定期文件,没有插座(由于kqueue不好多无论如何)。

写作业通常是缓存的核心,并刷新了在稍后的时间。例如,当读头的驱动发生的地块。

然而,对于读取的行动,如果你想要的核心优先考虑并为了你的读,AIO是真的唯一选择。这里就是为什么内核可(在理论上)这样做更好的比任何用户一级的应用程序:

  • 核看到的所有磁盘I/O,不只是你的应用程序的磁盘的工作,并可以命令他们在全球一级
  • 核(可能)知道在哪里盘读头,并且可以选择读工作,你通过它在最佳顺序,头移动的距离最短的
  • 内核可以利用 原命令的排队 要优化操作进一步阅读
  • 你可以能够发出更多的读操作系统使用lio_listio()于与缓存(),特别是如果你读都没有(从逻辑上)连续的、节省一个小小的系统,叫开销。
  • 你的计划可能会稍微简单的AIO因为你不需要额外线块在一读或写的呼吁。

这就是说,posix AIO有一个很尴尬的界面,例如:

  • 唯一有效的和支持的意思的事件的回调都通过信号,这使得它难以使用一个图书馆,因为它意味着要使用信号从该过程全球信号的名字空间。如果你的操作系统并不支持实时信号,这也意味着你必须循环,通过你所有杰出的请求,以找出哪一个实际上完成了(这种情况for Mac OS X例如,不Linux)。捕捉信号在一个多线程的环境也使得一些棘手的限制。你可以在通常不作出反应的事件里面的信号处理程序,但你必须提出一个信号,写信给管或使用signalfd()(on linux)。
  • lio_suspend()具有相同的问题作为选择()不会,它不会的规模与数量的工作。
  • lio_listio(),作为实现具有相当数量有限的就业岗位你可以通过在,这不是微不足道,以找到这种限制在一个便携式的方式。你得打电话给sysconf(_SC_AIO_LISTIO_MAX),这可能失败,在这种情况下可以使用AIO_LISTIO_MAX定义,这不一定义,但是然后你可以用2,其定义为保证给以支持。

作为对真实世界的应用程序使用posix AIO,你可以看看程序(莱蒂),其中也贴了 性能量测 当引入支持。

最posix平台支持posix AIO现在(Linux,BSD,Solaris,AIX,tru64).Windows支持通过它的重叠文件I/O.我的理解是,只有Solaris、Windows和Linux真正的支持异步.文件I/O到的驱动程序,而其他操作系统的模拟异步.I/O与核线。Linux是例外,其posix AIO执行在glibc模拟异步行动与用户的水平线,而其母异步I/O接口(io_submit()etc.) 是真正的异步的所有方式的驱动,假设的驱动程序支持它。

我相信这是相当普遍的操作系统不支持posix AIO任何fd,但是限制它的定期文件。

一libtorrent开发商提供一份报告: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

有aio_write实现在glibc;第一呼吁aio_read或aio_write功能会产生一些模式用户线,aio_write或aio_read员额的请求,线,该线的确的传播/pwrite和完成时的答案发回到阻止调线。

那里也是'真正的'aio支持通过的核心水平(需要libaio为此,请参阅io_submit呼叫 http://linux.die.net/man/2/io_submit );还需要O_DIRECT对的(也可能不会支持通过所有文件系统,但主要的支持)

在这里看到:

http://lse.sourceforge.net/io/aio.html

http://linux.die.net/man/2/io_submit

差POSIX AIO和libaio在Linux上?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top