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