gpt4 book ai didi

linux - Linux 上 POSIX AIO 和 libaio 的区别?

转载 作者:IT老高 更新时间:2023-10-28 12:35:04 33 4
gpt4 key购买 nike

似乎明白了什么:

POSIX AIO API 的原型(prototype)位于 <aio.h>并且你用 librt(-lrt) 链接你的程序,而 libaio <libaio.h> 中的 API并且您的程序与 libaio (-laio) 链接。

我想不通:

1.内核对这两种方法的处理方式不同吗?

2.是O_DIRECT使用它们中的任何一个都必须标记?

this post 中所述, libaio 在没有 O_DIRECT 的情况下可以正常工作使用 libaio 时.好的,明白了,但是:

根据 R.Love 的 Linux System Programming 一书,Linux 支持 aio(我假设是 POSIX AIO)在常规文件上如果打开 O_DIRECT .但是我编写的一个小程序(使用aio.h,与-lrt链接)调用aio_write在没有 O_DIRECT 的情况下打开的文件上标志可以正常工作。

最佳答案

在 linux 上,这两种 AIO 实现是根本不同的。

POSIX AIO 是一种用户级实现,它在多个线程中执行正常的阻塞 I/O,因此给人一种 I/O 是异步的错觉。这样做的主要原因是:

  1. 它适用于任何文件系统
  2. 它(基本上)可以在任何操作系统上运行(请记住,gnu 的 libc 是可移植的)
  3. 它适用于启用缓冲的文件(即未设置 O_DIRECT 标志)

主要缺点是您的队列深度(即您在实践中可以拥有的未完成操作的数量)受到您选择拥有的线程数量的限制,这也意味着一个磁盘上的缓慢操作可能会阻塞操作转到另一个磁盘。它还会影响内核和磁盘调度程序看到的 I/O(或数量)。

内核 AIO(即 io_submit() 等)是对异步 I/O 操作的内核支持,其中 io 请求实际上在内核中排队,按您拥有的任何磁盘调度程序排序,大概其中一些被作为异步操作(使用 TCQ 或 NCQ)转发(以人们希望的某种最佳顺序)到实际磁盘。这种方法的主要限制是并非所有文件系统都可以很好地工作或根本无法使用异步 I/O(并且可能会退回到阻塞语义),必须使用 O_DIRECT 打开文件,这对I/O 请求。如果您无法使用 O_DIRECT 打开文件,它可能仍然“工作”,因为您可以取回正确的数据,但它可能不是异步完成的,而是退回到阻塞语义。

另外请记住,io_submit() 在某些情况下实际上会阻塞磁盘。

关于linux - Linux 上 POSIX AIO 和 libaio 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768083/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com