我正在阅读这篇关于异步磁盘文件 I/O 的教程,但是它并没有让事情变得清晰,它实际上让我更加困惑。
有两种不同的异步。根据教程的 I/O 模型:
异步阻塞 I/O,您使用.打开文件
O_ASYNC
,然后使用epoll
// 。poll
select
使用 glibc 的 AIO 的异步 IO
由于 glibc 使用线程池实现 AIO,所以我在这个问题中用“AIO”指的是内核 AIO,即io_submit
至少从概念上看,似乎没有太大区别——io_submit
可以让你发出多个 I/O 请求,而另一方面,read
与O_ASYNC
你一起使用可以只发出一个带有文件位置的请求。
本指南还提到使用epoll
作为 Linux AIO 的替代方案:
民意调查。Linux对用作异步 I/O 机制的支持有限。
epoll
对于以缓冲模式打开的文件(即没有O_DIRECT
)的读取,如果文件以 方式打开O_NONBLOCK
,则读取将返回 EAGAIN 直到相关部分在内存中。对缓冲文件的写入通常是立即的,因为它们是通过另一个写回线程写出的。但是,这些机制并没有提供直接 I/O 提供的对 I/O 的控制级别。
epoll
用作 AIO 替代品有什么问题?或者换句话说,我们需要[新界面]io_submit
解决的问题是什么?