根据this tutorial异步磁盘文件,至少从编程/api的角度来看,在Linux上使用a io很容易实现IO。但是在本教程之前和之后,我读了很多文章和文章,这些文章和文章要么不能完成,要么您应该在补丁和许多其他问题中使用libevent。另一件事是我应该等待信号的循环,但是根据本教程,我可以使用回调机制,这显然使AIO更容易使用。
现在,我不是一个Linux程序员,即使从长远来看,我只是想找到一种简单的方法来支持Linux上的异步磁盘文件IO,学习它并将其添加到我个人项目所需的异步磁盘IO库中。目前我在Windows上使用重叠IO,在非Windows平台上使用IO工作线程。由于多线程解决方案可能很棘手,我想用aio在Linux上替换它。
那么,如本教程所述,AIO有什么问题?是表演吗?是否有使用AIO进行操作的限制?
另外,只要代码在主要的Linux发行版上工作,我不在乎代码是否可以移植到其他符合POSIX的平台上。我只关心普通的磁盘文件IO。
谢谢。
最佳答案:
本教程概括介绍了异步I/O,并讨论了如何对其提供内核支持。然后继续讨论posix aio(它是用于访问异步I/O的标准化API),这意味着在Linux上使用posix aio api将使您能够访问对aio的内核支持。事实并非如此。
在Linux上,有两种不同的AIO实现:
内核aio使用的是io_Submit()等),它仅在内核2.6(或真正的2.5)中受支持,并且可能有它的后移植版本到2.4。
posix aio是glibc特性,本质上与内核无关。它根据用户级线程来实现POSIX API,从而进行阻塞磁盘I/O调用。
因此,简而言之,如果已经为磁盘I/O提供了多个线程的通用实现,那么使用它可能比使用glibc的实现更好(因为您对它的控制可能稍微多一点)。
如果您致力于实际使用io_Submit()函数系列,那么您可能需要做大量的工作来规避对这些函数的限制。
内核AIO要求使用o_direct打开文件。而这又要求所有文件偏移量、读写大小与磁盘上的块对齐。如果您只使用一个大文件,并且可以使其工作起来非常类似于操作系统中的页面缓存,那么这通常是可以的。对于以任意偏移量和长度读取和写入任意文件,它会变得混乱。
如果您最后给内核AIO一次机会,我强烈建议您考虑将一个或多个eventfds绑定到IOCBs,这样您就可以使用epoll/select等待完成,而不必在io_GetEvents()中阻塞。