为什么Linux内核AIO不支持异步“open”系统调用?因为“open”可能会在文件系统上阻塞很长时间,进而导致无法异步执行。
首先,这是一个完全合理和合法的问题;downvote(踩)非常不幸,它可能会把比我更有知识的人推开。
据我所知,没有一个好的原因。您发现的讨论是相关的,但并不令人满意(这也可能是您的结论)。虽然Torvald 的观点在技术上是正确的,但他们显然忽略了屏幕上的大象 - GUI编程 - 以及我确定的许多其他用例。
是的,网络服务器会受到网络延迟的限制。虽然这不应该成为忽略其他IO的理由,但我可以接受。
是的,许多服务器工作负载将能够利用dentry/inode缓存,但并非所有工作负载都能够利用,而且总会有缺失。
是的,“购买更多RAM”的论点是有效的。但我从未认为这是一个好的论点。
还有其他所有用例。对于许多用例,包括GUI编程,我们有时或经常阻塞并不重要;我们永远不应该阻塞。如果访问模式非常随机且时间间隔很长,购买更多RAM也无济于事——除非具备与二级存储所提供的容量相同的容量。
“它应该快速”这个想法也是错误的;始终考虑远程文件系统。
唯一令人信服的观点是:
简短明了地说," aio_open()" 基本上不应该成为问题。如果出现问题,则说明您设计有误,或者您试图过于努力地将所有内容单线程化(通过仅称其为 "AIO" 而将发生的线程 "隐藏" - 简而言之,欺骗自己)。http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0074.html
这听起来像是一个合适的解释,尽管显然不是一个好的解释。http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0139.html
因为它强化了一个观念,即许多不同的系统不会异步实现“open”(和其他调用)。此外,“aio_open”未被POSIX规定,并且我找不到解释原因的讨论。Windows似乎也忽略了这个问题。openat
的讨论,尽管我还没有检查它的结果。 - tne我编写了一个相当简单但功能强大的cpaio C实用程序,使用Linux本地aio+O_DIRECT(io_submit,io_getevents)复制一堆文件。我只是尽早打开文件,排队初始aio读取,并且只在打开足够的文件(或者如果文件很少,则全部打开)后才会查找读取结果。异步打开文件的方法会更好,但最终这并不重要。
我用这个工具复制了数十TB的数据。
最终,我认为没有异步打开是有道理的。这是一个复杂的操作,内核本质上必须启动一个线程来处理它。
O_NONBLOCK
打开,您仍需要select
或某种轮询机制来查看文件是否准备好进行I/O操作。否则,您可能会简单地排队AIO R/W请求,这些请求可能永远不会成功。如果需要并发性,则可以生成另一个线程来打开文件,或继续提供其他I/O操作。 - Brett Hale