Linux open(path,O_NONBLOCK | O_RDONLY | O_DIRECT)阻止pread on file

时间:2013-04-04 10:09:29

标签: linux file asynchronous posix aio

我想在我的程序中读取异步磁盘。

服务器上有很多硬盘,如果一个硬盘很慢,程序就会阻塞。我想打电话给异步。

如果我打电话:

打开(路径,O_NONBLOCK | O_RDONLY | O_DIRECT)

然后pread,然后pread使用最多8000微秒,但阻止我的程序。

是否可以在没有线程池的情况下启用异步磁盘读取?

1 个答案:

答案 0 :(得分:5)

O_NONBLOCK标志对普通文件没有任何影响(在大多数情况下至少是这样),因为它们不被认为是I / O可以阻塞的东西 - 是的它会阻塞一段时间用于从磁盘读取数据,但它不会像套接字或管道那样无限期地阻塞。

一个例外是当启用强制锁定时 - 锁定区域的读取或写入可能会无限期地阻塞(直到锁定被释放),O_NONBLOCK将影响此类调用的行为。

关于在没有线程的情况下是否可以进行异步I / O,答案是肯定的(请参阅aio(7)io_setup(2)io_submit(2)和朋友)但如果你看到我会感到惊讶从中受益匪浅。