首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux磁盘文件AIO

Linux磁盘文件AIO
EN

Stack Overflow用户
提问于 2011-12-15 08:30:29
回答 2查看 8.7K关注 0票数 10

根据this tutorial,至少从编程/应用程序接口的观点来看,可以使用AIO在linux上容易地实现异步磁盘文件io。但在本教程之前和之后,我读了很多帖子和文章,认为这要么不能做,要么你应该使用libevent与补丁和许多其他问题。另一件事是我应该等待信号的循环,但基于本教程,我可以使用回调机制,这显然使AIO更容易使用。

现在,我不是一个linux程序员,我只是想找到一种简单的方法来支持linux上的异步磁盘文件io,学习它并将其添加到我个人项目所需的异步磁盘io库中。目前,我在windows上使用overlapped io,在非windows平台上使用io worker线程。由于多线程解决方案可能比较棘手,因此我想在linux上将其替换为AIO。

那么,本教程中描述的AIO有什么问题呢?这是性能问题吗?对可以使用AIO完成的操作有限制吗?

附注:我不关心代码是否不能移植到其他兼容POSIX的平台上,只要它能在主要的linux发行版上工作即可。我只关心普通的磁盘文件io。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-19 12:53:07

本教程概述了异步I/O,并讨论了内核如何支持异步I/O。然后讨论posix AIO (这是用于访问异步I/O的标准化API ),这意味着在linux上使用posix AIO API将使您能够访问内核对AIO的支持。事实并非如此。

在linux上,实际上有两个独立的AIO实现:

使用io_submit()等人的

  1. 内核AIO。)
  2. posix是glibc的一个特性,本质上与内核无关。它通过进行阻塞磁盘I/O调用的用户级线程来实现posix。

因此,简而言之,如果您已经有了用于磁盘I/O的多线程的通用实现,那么使用它可能比使用glibc的实现更好(因为您可能对它有更多的控制)。

如果您致力于实际使用io_submit()系列函数,那么您可能需要做大量工作来规避对这些函数的限制。

kernel AIO 需要你的文件才能用O_DIRECT打开。这反过来要求您的所有文件偏移量、读取和写入大小与磁盘上的块对齐。如果您只使用一个大文件,并且可以使其工作方式与操作系统中的页面缓存非常相似,则这通常是很好的。对于以任意偏移量和长度读取和写入任意文件,它会变得混乱。

如果您最终尝试了内核AIO,我强烈建议您考虑将一个或多个eventfd绑定到您的iocb上,这样您就可以使用epoll/select等待完成,而不必在io_getevents()中阻塞。

票数 14
EN

Stack Overflow用户

发布于 2011-12-15 10:01:30

POSIX AIO的Linux实现为您执行的每一次写入都派生一个线程。这通常是不好的,您最好使用自己的工作线程来进行写入,这样您就可以控制有多少线程在运行。换句话说,坚持你所拥有的,AIO不会为你买到任何东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8513663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档