根据this tutorial,至少从编程/应用程序接口的观点来看,可以使用AIO在linux上容易地实现异步磁盘文件io。但在本教程之前和之后,我读了很多帖子和文章,认为这要么不能做,要么你应该使用libevent与补丁和许多其他问题。另一件事是我应该等待信号的循环,但基于本教程,我可以使用回调机制,这显然使AIO更容易使用。
现在,我不是一个linux程序员,我只是想找到一种简单的方法来支持linux上的异步磁盘文件io,学习它并将其添加到我个人项目所需的异步磁盘io库中。目前,我在windows上使用overlapped io,在非windows平台上使用io worker线程。由于多线程解决方案可能比较棘手,因此我想在linux上将其替换为AIO。
那么,本教程中描述的AIO有什么问题呢?这是性能问题吗?对可以使用AIO完成的操作有限制吗?
附注:我不关心代码是否不能移植到其他兼容POSIX的平台上,只要它能在主要的linux发行版上工作即可。我只关心普通的磁盘文件io。
谢谢。
发布于 2011-12-19 12:53:07
本教程概述了异步I/O,并讨论了内核如何支持异步I/O。然后讨论posix AIO (这是用于访问异步I/O的标准化API ),这意味着在linux上使用posix AIO API将使您能够访问内核对AIO的支持。事实并非如此。
在linux上,实际上有两个独立的AIO实现:
使用io_submit()等人的
因此,简而言之,如果您已经有了用于磁盘I/O的多线程的通用实现,那么使用它可能比使用glibc的实现更好(因为您可能对它有更多的控制)。
如果您致力于实际使用io_submit()系列函数,那么您可能需要做大量工作来规避对这些函数的限制。
kernel AIO 需要你的文件才能用O_DIRECT打开。这反过来要求您的所有文件偏移量、读取和写入大小与磁盘上的块对齐。如果您只使用一个大文件,并且可以使其工作方式与操作系统中的页面缓存非常相似,则这通常是很好的。对于以任意偏移量和长度读取和写入任意文件,它会变得混乱。
如果您最终尝试了内核AIO,我强烈建议您考虑将一个或多个eventfd绑定到您的iocb上,这样您就可以使用epoll/select等待完成,而不必在io_getevents()中阻塞。
发布于 2011-12-15 10:01:30
POSIX AIO的Linux实现为您执行的每一次写入都派生一个线程。这通常是不好的,您最好使用自己的工作线程来进行写入,这样您就可以控制有多少线程在运行。换句话说,坚持你所拥有的,AIO不会为你买到任何东西。
https://stackoverflow.com/questions/8513663
复制相似问题