我正在阅读这个tutorial异步磁盘文件io,但是并不清楚,实际上让我更加困惑。

根据本教程,有两种不同的异步IO模型:

  • 异步阻止I/O:使用O_ASYNC打开文件,然后使用epoll/poll/select。
  • 异步IO:在该文章中使用glibc AIO。由于glibc实现只是通过线程池进行的模拟,因此我在此问题中所指的是kernel AIO,即io_submit。

  • 至少从概念的角度来看,没什么大不了,是的,io_submit可以让您发出多个io请求,另一方面,通过对O_ASYNC的读取,您可以发出一个牵连其中的请求文件位置。

    而且此guide还提到使用epoll作为Linux AIO的替代方法:



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

    最佳答案

    我认为,io_ * api背后的关键问题是通过以下两种主要措施实现更高的IO吞吐量的能力:

  • 最小化应用程序IO循环中的系统调用数。可以提交多个请求批次,然后在以后的某个时间,应用程序可以使用io_getevents()一次返回以检查单个请求的结果。重要的是,io_getevents()将返回有关每个单个IO事务的信息,而不是由epoll()在每次调用时返回的信息的模糊“fd x具有待处理的更改”位。
  • 内核IO调度程序可以依靠请求重新排序来更好地利用硬件。应用程序甚至可能传递有关如何使用struct iocb中的aio_reqprio字段重新排序请求的一些技巧。必要时,如果我们允许对IO请求进行重新排序,则需要为应用程序提供适当的API来进行查询,以查询是否已完成某些特定的高优先级请求(因此io_getevents())。

  • 可以说io_getevents()是真正重要的功能,因此io_submit()是有效利用它的便捷伴侣。

    关于linux - io_submit和带有O_ASYNC的文件有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16390250/

    10-11 22:38
    查看更多