【发布时间】:2013-04-29 16:58:03
【问题描述】:
我正在阅读这个关于异步磁盘文件 I/O 的tutorial,但它并没有让事情变得清晰,实际上让我更加困惑。
有两种不同的异步。教程中的 I/O 模型:
-
异步阻塞 I/O,您使用
O_ASYNC打开文件,然后使用epoll/poll/select。 -
使用glibc的AIO的异步IO
由于 glibc 使用线程池实现 AIO,所以我在这个问题中使用“AIO”指的是kernel AIO,即io_submit
至少从概念上看,似乎没有太大区别——io_submit可以让你发出多个I/O请求,而另一方面,使用read和O_ASYNC你可以只需发出一个带有文件位置的请求。
This guide 还提到使用epoll 作为 Linux AIO 的替代方案:
电子投票。 Linux 对使用
epoll作为异步I/O 的机制支持。对于以缓冲模式打开的文件(即没有O_DIRECT)的读取,如果文件以O_NONBLOCK打开,则读取将返回EAGAIN,直到相关部分在内存中。对缓冲文件的写入通常是立即的,因为它们是由另一个 writeback 线程写出的。但是,这些机制并没有提供直接 I/O 提供的对 I/O 的控制级别。
使用epoll 作为 AIO 替代品有什么问题?或者换句话说,我们需要[新界面]io_submit解决什么问题?
【问题讨论】:
-
你链接的教程没有提到
O_ASYNC。而man 2 open说This feature is available only for terminals, pseudoterminals, sockets, and (since Linux 2.6) pipes and FIFOs.,所以不是你想要的磁盘文件IO。你的意思是O_NONBLOCK? -
我已经在这里详细询问了您关于对 epoll 的有限支持的问题:github.com/littledan/linux-aio/issues/2
标签: linux asynchronous io linux-kernel aio