微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

io_submit和O_ASYNC文件有什么区别

我正在阅读本教程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:

如何在Windows中使用文件带宽保留(预定文件IO)

如何在python中获取(MB)文件中tar.gz的大小

截断内存映射文件

从标准input读()

Python – stdout总是“可用”?

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

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

fopen()无法打开stream:权限被拒绝,但权限应该是有效的

如何在NTFS上创build一个稀疏文件

可以使用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] 举报,一经查实,本站将立刻删除。

相关推荐