网络上散布着一些页面,它们以不同的详细程度描述了 POSIX AIO 设施。它们都不是最近的。目前尚不清楚他们到底在描述什么。例如,“官方”(?)web site for Linux kernel asynchronous I/O support here说套接字不起作用,但我的 Ubuntu 8.04.1 工作站上的“aio.h”手册页似乎都暗示它适用于任意文件描述符。然后是 another project that seems to work at the library layer文档更少。
我想知道:
<aio.h>
暗示的“任何 FD 的任何 I/O”?似乎答应了?我可以使用的其他多路复用机制非常好,但是周围漂浮的随机信息片段让我感到好奇。
最佳答案
使用 kqueue、epoll、IO 完成端口等解决了高效的套接字 I/O。做异步文件 I/O 有点晚了(除了 windows 的重叠 I/O 和 solaris 对 posix AIO 的早期支持)。
如果您正在寻找套接字 I/O,则最好使用上述机制之一。
AIO 的主要目的是解决异步磁盘 I/O 的问题。这很可能是为什么 Mac OS X 只支持常规文件的 AIO,而不支持套接字(因为 kqueue 无论如何都做得更好)。
写入操作通常由内核缓存并在以后刷新。例如,当驱动器的读取头恰好经过要写入 block 的位置时。
但是,对于读取操作,如果您希望内核对读取进行优先级排序,AIO 确实是唯一的选择。这就是内核可以(理论上)比任何用户级应用程序做得更好的原因:
也就是说,posix AIO 有一个相当尴尬的界面,例如:
对于使用 posix AIO 的实际应用程序,您可以查看 lighttpd (lighty),它还发布了 performance measurement引入支持时。
目前大多数 posix 平台都支持 posix AIO(Linux、BSD、Solaris、AIX、tru64)。 Windows 通过其重叠的文件 I/O 支持它。我的理解是只有 Solaris、Windows 和 Linux 真正支持异步。文件 I/O 一直到驱动程序,而其他操作系统则模拟异步。带有内核线程的 I/O。 Linux 是个异常(exception),它在 glibc 中的 posix AIO 实现模拟用户级线程的异步操作,而它的 native 异步 I/O 接口(interface)(io_submit() 等)在驱动程序支持的情况下一直是真正异步的.
我相信操作系统不支持任何 fd 的 posix AIO 是相当普遍的,而是将其限制为常规文件。
https://stackoverflow.com/questions/87892/