什么状态的POSIX步I/O(AIO)?
-
01-07-2019 - |
题
有网页的周围分散的网络,用于描述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