根据this tutorial异步磁盘文件,可以使用Linux上的AIO轻松实现io,至少从编程/ api的角度来看。但是在本教程之前和之后,我已经阅读了很多帖子和文章,这些都是无法完成的,或者你应该使用带有补丁和许多其他问题的libevent。另一件事是我应该等待信号的循环,但基于本教程,我可以使用回调机制,这显然使AIO更容易使用。
现在,我不是一个Linux程序员,即使是一个很长的镜头,我只是想找到一个简单的方法来支持Linux上的异步磁盘文件io,学习它并将其添加到我需要的异步磁盘库中项目。目前我在非Windows平台上的Windows和io工作线程上使用重叠io。由于mutithreaded解决方案可能很棘手,我想在Linux上用AIO替换它。
那么,本教程中描述的AIO有什么问题?是性能吗?是否可以使用AIO对操作进行限制?
P.S。我不关心代码是否不能移植到其他POSIX兼容平台,只要它适用于主要的Linux发行版。而我所关心的只是常规磁盘文件io。
感谢。
答案 0 :(得分:13)
本教程概述了异步I / O,并讨论了如何为它提供内核支持。然后继续讨论posix AIO(这是用于访问异步I / O的标准化API),暗示在linux上使用posix AIO API将允许您访问AIO的内核支持。事实并非如此。
在Linux上,实际上有两个独立的AIO实现:
因此,简而言之,如果您已经拥有磁盘I / O的多个线程的通用实现,那么使用它可能比使用glibc的实现更好(因为您可能对它有更多的控制权)。
如果您致力于实际使用io_submit()系列函数,则可能需要做很多工作来规避对这些函数的限制。
内核AIO 要求使用O_DIRECT打开文件。这反过来要求所有文件偏移量,读取和写入大小与磁盘上的块对齐。如果您只使用一个大文件,并且可以使其与操作系统中的页面缓存非常相似,那么这通常很好。对于以任意偏移和长度读取和写入任意文件,它会变得混乱。
如果你最终给内核AIO一个机会,我强烈建议你考虑将一个或多个eventfds绑定到你的iocbs,以便你可以使用epoll / select等待完成,而不必在io_getevents()中阻塞。
答案 1 :(得分:2)
POSIX AIO的Linux实现为您执行的每次写操作生成一个线程。这通常不好,最好使用自己的工作线程来执行写操作,这样就可以控制正在运行的线程数。换句话说,坚持你拥有的东西,AIO不会给你买任何东西。