根据this tutorial,至少从编程/api的角度来看,可以在Linux上使用AIO轻松实现io异步磁盘文件io。但是在本教程之前和之后,我读了很多文章和文章,这些文章和文章要么无法完成,要么您应该将libevent与补丁一起使用以及其他许多问题。另一件事是我应该等待信号的循环,但是根据本教程,我可以使用回调机制,这显然使AIO更加易于使用。

现在,即使从长远来看,我也不是Linux程序员,我只是想找到一种直接的方法来支持linux上的异步磁盘文件io,学习并将其添加到个人项目所需的异步磁盘io库中。目前,我在Windows上使用重叠的io,在非Windows平台上使用io worker线程。由于多线程解决方案可能很棘手,因此我想在Linux上用AIO替换它。

因此,本教程中描述的AIO有什么问题?是表演吗?使用AIO可以执行的操作是否受到限制?

p.s.只要代码可以在主要的Linux发行版上运行,我都不会在乎该代码是否可以移植到其他POSIX兼容平台上。我只关心普通的磁盘文件io。

谢谢。

最佳答案

本教程总体上概述了异步I/O,并讨论了如何对其进行内核支持。然后继续讨论posix AIO(这是用于访问异步I/O的标准化API),这意味着在Linux上使用posix AIO API将使您能够访问内核对AIO的支持。不是这种情况。

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

  • 使用io_submit()等的内核AIO,仅在内核2.6(或实际上是2.5)中受支持,并且可能会将其反向移植到2.4。
  • posix AIO是glibc功能,与内核基本无关。它通过阻止磁盘I/O调用的用户级线程来实现posix API。

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

    如果您 promise 实际使用io_submit()系列函数,则可能需要做很多工作来规避对这些函数的限制。

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

    如果最终给内核AIO了一个机会,我强烈建议您考虑将一个或多个eventfds与您的iocb绑定(bind)在一起,以便您可以使用epoll/select等待完成,而不必阻塞io_getevents()。

    关于Linux磁盘文件AIO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8513663/

    10-10 22:32