我正在阅读本教程asynchronous磁盘文件io,但它并没有让我清楚,实际上让我更加困惑。
根据本教程,有两种不同的asynchronousIO模型:
asynchronous阻塞I / O:使用O_ASYNC打开文件,然后使用epoll / poll / select。
asynchronousIO:在该文章中使用glibc AIO。 因为glibc实现只是一个通过线程池的模拟,我在这个问题中引用的是内核AIO ,即io_submit。
至less从概念的angular度来看,并没有什么大的区别,事实上,io_submit可以让你发出多个io reqeusts,另一方面,使用O_ASYNC读取,你可以发出一个带有文件位置的请求。
而且本指南还提到,使用epoll作为Linux AIO的替代scheme:
截断内存映射文件
从标准input读()
Python – stdout总是“可用”?
epoll的。 Linux对使用epoll作为asynchronousI / O机制的支持有限 。 对于以缓冲模式(即没有O_DIRECT)打开的文件进行读取,如果文件打开为O_NONBLOCK,则读取将返回EAGAIN,直到相关部分在内存中。 写入缓冲文件通常是直接的,因为它们是用另一个写回线程写出来的。 但是,这些机制并没有给予直接I / O给出的I / O控制级别。
使用epoll作为AIO替代品的问题是什么? 或换句话说,我们需要一个新的接口io_submit来解决什么问题?
fopen()无法打开stream:权限被拒绝,但权限应该是有效的
可以使用fopen来打开URL
如何在Ruby中使用Open#popen3读取未缓冲的stdout
我认为,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()是一个方便的同伴,可以高效地使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。