为什么Linux内核AIO不支持异步“开放”系统调用? 由于'open'可能会阻塞文件系统很长一段时间,可以吗?Linux内核AIO,开放系统调用
回答
首先,这是一个非常好的合法问题; downvote是不幸的,它可能会推开人们比我更知识渊博。
AFAICT,没有好的原因。你设法挖掘出来的讨论是相关的,但并不令人满意(这也许是你的结论)。尽管Torvald的观点在技术上是正确的,但他们清楚地忽略了房间中的大象 - GUI编程 - 以及其他许多用例,我敢肯定。
是的,网络服务器将受到网络延迟的约束。有点可疑,它应该是不关心所有其他IO的理由,但我可以接受。
是的,许多服务器工作负载将能够使用dentry/inode缓存,但不是全部,并且总会有错过。
是的,“购买更多内存”这个参数的作用。我从来没有发现它是一个很好的论据。
然后还有其他所有用例。对于包括GUI编程在内的很多人来说,我们有时或者很少阻止并不重要,我们永远不应该阻止。如果访问模式非常随机且时间很短,购买更多的内存也无济于事 - 它们的容量不如二级存储提供的容量。
“反正应该快”的想法也是错误的;始终考虑远程文件系统。
唯一引人注目的一点是:
简短而亲切: “aio_open()” 基本上都不应该是一个 问题。如果是这样,你错误地设计了一些东西,或者你也尝试了太多难以单线程的东西(和“隐藏”线程 确实发生,只需调用它“AIO”而不是 - 对自己说谎,简而言之)。
这里的要点正是为了避免穿线,所以这句话让我感到吃惊。其他论点甚至被列举的事实表明,这个论点太脆弱了,无法独立存在。
在同样的讨论挖周围,你可以找到这篇文章的林达Patocka:
您可以模拟异步IO与内核线程像FreeBSD和 一些商业Unix系统做,但你仍然需要尽可能多的(可能是 内核)线程尽可能多的请求,你正在服务。
(...)
制作真正的异步IO需要重写所有的文件系统和 整个VFS _from_scratch_。它不会发生。
http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0074.html
这听起来像一个适当的解释,但显然不是一个好。
请记住,这是一个古老的线程,自那以后发生了很多变化,所以这个答案没有什么价值。然而,它提供了有关为什么假设aio_open
不可用在历史上的洞察力。另外,要理解许多内核讨论(或针对任何项目的任何内部讨论)通常都希望所有参与者都从一大组假设开始。因此,我完全有可能不以正确的方式来看待这个问题。
话虽这么说,这是位有趣(斯蒂芬C.特威迪):
啊,但即使VMS SYS $ QIO是打开同步在做的, 的IO请求数据包的分配和映射文件位置到磁盘块。只有 数据IO永远是异步的(并且Ben的异步IO对于Linux的东西也提供了 )。
http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0139.html
为什么有意思?因为它强化了许多不同系统不会异步实现open
(和其他调用)的概念。此外,POSIX未指定aio_open
,我无法找到解释原因的讨论。 Windows似乎也忽略了这个问题。
这似乎是错误或困难的概念固有的东西,除非没有人似乎为最后的原因做出了很好的理由。
我的猜测是这只是低优先级,而且一直是。预先包含线程或打开文件的变通办法足以满足足够的使用情况,而提供该功能的案例永远不会被证明是合理的。
了解为什么POSIX不定义这样的调用会很有趣。但我期望有一个“超出范围”的理由。
如果你想深究这一点,我怀疑你必须把讨论带到更合适的渠道,比如LKML。
- 1. 开放系统调用 - Linux
- 2. linux内核aio功能
- 3. 冗余的Linux内核系统调用
- 4. Linux内核中的系统调用
- 5. 更改linux内核系统调用号
- 6. Linux内核模块(内核3.5)中的系统调用拦截
- 7. 写入磁盘时,Linux splice()+内核AIO
- 8. 哪个进程在Linux内核中调用系统调用?
- 9. 开放系统调用
- 10. 使用“int 0x80”进行Linux内核系统调用
- 11. Linux内核2.6中有多少系统调用?
- 12. linux内核中的系统调用表在哪里?
- 13. Linux内核3.3.4中的自定义系统调用
- 14. Linux内核中的系统调用错误处理
- 15. 在Linux内核3.3中添加一个新的系统调用
- 16. 在Linux内核源代码中执行系统调用/陷阱
- 17. 在linux 2.6.39.4内核中测试系统调用
- 18. Linux内核系统调用返回-1而不是{-1,-256}
- 19. 做一个简单的系统调用linux 2.6.39内核
- 20. 将系统调用添加到linux内核3.8.8
- 21. 在Linux内核寻找系统调用实现
- 22. Linux内核如何防止BIOS系统调用?
- 23. Linux内核系统调用命名约定
- 24. 在系统调用中访问Linux内核的SuperBlock对象
- 25. Linux内核系统调用返回没有给出的指针
- 26. Linux内核操作系统寄存器
- 27. 没有内核的Linux文件系统
- 28. 在Linux上使用C开放系统调用
- 29. Linux系统调用
- 30. MINIX 2 - 系统调用内核
无初始研究的痕迹。 –
它没有任何意义。即使你用'O_NONBLOCK'打开',你需要'选择'或者一些轮询机制来查看文件是否准备好了I/O。否则,您最终可能会排队等待可能永远不会成功的AIO R/W请求。如果您需要并发性,或者继续为其他I/O操作提供服务,请产生另一个线程来“打开”文件。 –
我的意思是只有Linux内核AIO(异步)。我不需要选择,epoll等 – andreych