2013-05-05 106 views
4

我正在读这个tutorial异步磁盘文件io,但它并没有让我清楚,实际上让我更加困惑。io_submit和O_ASYNC文件有什么区别

有根据本教程中两个不同的异步IO模式:

  1. 异步非阻塞I/O:打开文件与O_ASYNC,然后使用epoll的/调查/选择。
  2. 异步IO:在该文章中使用glibc AIO。因为glibc的实现只是一个通过线程池的模拟,我在这个问题中提到的是kernel AIO,即io_submit。

在从概念至少点的观点,也没有大的区别,真正的,io_submit可以让你发出多个IO多个请求,而在另一方面,使用与O_ASYNC阅读,你可以只发出一个涉及文件位置的请求。

guide还提到,使用epoll的作为替代的Linux AIO:

epoll的。 Linux有有限支持使用epoll作为 异步I/O的机制。对于以缓冲模式( ,没有O_DIRECT)打开的文件进行读取时,如果文件被打开为O_NONBLOCK,那么 读取将返回EAGAIN,直到相关部分在内存中。将 写入缓冲文件通常是立即执行的,因为它们是用 另一个写回线程写出的。然而,这些机制并没有给出直接I/O给出的I/O的控制级别。

使用epoll作为AIO替代品的问题是什么?换句话说,我们需要一个新的接口io_submit来解决什么问题?

回答

1

我的意见时,io_ * API背后的关键问题是通过两个主要措施,以实现更高的IO吞吐能力:

  1. 的系统的数量在应用IO循环调用最小化。可以提交多个请求批次,然后在稍后的时间,应用程序可以返回以使用io_getevents()一次性检查各个请求的结果。重要的是,每次调用时,io_getevents()都会返回每个单独的IO事务的信息,而不是一个模糊的“fd x有待处理的更改”位的epoll()返回的信息。

  2. 内核IO调度程序可以依靠请求重新排序来更好地使用硬件。应用程序甚至可以传递一些关于如何使用struct iocb中的aio_reqprio字段重新排序请求的提示。必要时,如果我们允许重新排序IO请求,我们需要为应用程序提供适当的API来查询,是否某些特定的高优先级请求已经完成(因此io_getevents())。

可以说,这io_getevents()是功能,真正重要的一块,于是io_submit()是一个方便的伴侣有效地利用它。