iti*_*avi 50 linux io asynchronous aio linux-kernel
我似乎明白了:
POSIX AIOAPI是原型<aio.h>并且您将程序与librt(-lrt)链接,而libaioAPI <libaio.h>和您的程序中的API 与libaio(-laio)链接.
我无法弄清楚:
1.内核是否以不同的方式处理这两种方法中的任何一种?
2. O_DIRECT使用其中任何一个标志是强制性的吗?
正如在这篇文章中提到的,libaio 在没有O_DIRECT使用的情况下工作正常libaio.但是,理解但是:
根据R.Love的Linux系统编程书,Linux只支持常规文件上的aio(我假设它是POSIX AIO).只有在打开O_DIRECT的小程序(使用aio.h,与-lrt链接)调用aio_write时没有O_DIRECT标志打开的文件没有问题.
Arv*_*vid 64
在linux上,两个AIO实现从根本上是不同的.
POSIX AIO是一个用户级实现,它在多个线程中执行正常的阻塞I/O,因此给出了I/O异步的错觉.这样做的主要原因是:
主要缺点是你的队列深度(即你在实践中可以拥有的未完成操作的数量)受到你选择的线程数量的限制,这也意味着一个磁盘上的慢速操作可能会阻止一个操作进入不同的磁盘.它还会影响内核和磁盘调度程序看到的I/O(或多少).
内核AIO(即io_submit()et.al.)是异步I/O操作的内核支持,其中io请求实际上在内核中排队,按照您拥有的任何磁盘调度程序排序,可能是其中一些被转发(我们希望将实际的磁盘作为异步操作(使用TCQ或NCQ).这种方法的主要限制是,并非所有文件系统都能很好地工作,或者根本不能使用异步I/O(并且可能会回到阻塞语义),因此必须使用O_DIRECT打开文件,而O_DIRECT还带有许多其他限制. I/O请求.如果您无法使用O_DIRECT打开文件,它可能仍然"正常",就像您获得正确的数据一样,但它可能不是异步完成,而是回到阻止语义.
还要记住,在某些情况下,io_submit()实际上可以阻塞磁盘.
| 归档时间: |
|
| 查看次数: |
20109 次 |
| 最近记录: |