列出所有(带 DIO 的 AIO)操作

Listing all (AIO with DIO) operations

提问人:mhsquare 提问时间:11/3/2023 更新时间:11/3/2023 访问量:30

问:

我编写了一个程序,可以对文件进行AIO读取。它将一堆 aiocb 结构组合在一个列表中,并将其传递给 lio_listio(),后者负责 I/O。在这里,我使用了LIO_WAIT模式,以便完成所有 I/O。这在缓冲读取(仅打开O_RDWR的文件)的情况下工作正常。

我尝试了同样的方法,用O_DIRECT打开文件。这里 lio_listio() 返回 -1,errno 设置为 EIO。我认为 lio_listio() 不适用于 DIO。

是否有任何类似于 lio_listio() 的功能可以与 DIO 一起使用并等待我的所有请求完成。

C Linux 异步 UNIX

评论

1赞 Andrew Henle 11/3/2023
Linux 上的直接 IO 通常需要页面大小的 IO 操作,并且仅适用于页面对齐的用户空间缓冲区,但具体情况非常依赖于文件系统。请注意,Linux 上的 POSIX 异步 IO 只是一个 glibc bogg,它使用多个线程调用 pread() 或 pwrite()':“当前的 Linux POSIX AIO 实现由 glibc 在用户空间中提供。这有很多局限性......”它与普通 IO 没有什么不同。
1赞 Andrew Henle 11/3/2023
请注意,从同一链接中可以看出:“基于内核状态机的异步 I/O 实现的工作已经进行了一段时间(参见 io_submit(2)、io_setup(2)、io_cancel(2)、io_destroy(2)、io_getevents(2)),但这个实现还没有成熟到可以使用内核系统调用完全重新实现 POSIX AIO 实现的地步。

答: 暂无答案