4

我正在使用 Linux aio ( io_submit()/ io_getevents()) 进行文件 I/O。由于某些操作没有 aio 等效项 ( open(), fsync(), fallocate()),因此我使用了一个可能会阻塞而不影响主线程的工作线程。我的问题是,我应该添加close()到这个列表中吗?

所有文件都O_DIRECT在 XFS 上打开,但我对这个问题的一般答案以及关于我选择的文件系统和打开模式的具体答案都很感兴趣。

请注意,使用工作线程close()并非易事,因为close()通常在清理路径中调用,这不是启动工作线程请求并等待它的好地方。所以我希望这close()在这种情况下是非阻塞的。

对于这个问题,“阻塞”是指等待 I/O 操作,或者等待某个只有在 I/O 操作完成时才释放的锁,但不包括页面错误服务。

4

1 回答 1

2

close()可能会阻塞某些文件系统。在可能的情况下,代码应尽可能写成可移植的。因此,您绝对应该添加close()到仅从阻塞工作线程调用的调用列表中。

但是,您提到您经常需要调用close()清理路径。close()如果这些是在应用程序终止时执行的清理路径,那么即使直接调用它会阻塞,它也可能不会产生太大的影响。

或者,您可以做的是有一个队列,该队列被馈送到工作人员池中。在glibc AIO中,这是对许多调用所做的。当您使用 初始化 AIO 时aio_init(),会glibc设置一个队列和一个工作线程池。每次进行 AIO 调用时,glibc只需将相关任务和数据添加到队列中即可。在后台,工作线程等待队列并执行阻塞调用和代码,然后执行任何相关操作。

如果您确实需要非阻塞close()(和其他)调用,那么简单地设置任务队列和线程池并简单地将特定调用提交到队列并让线程池执行调用可能对您有利他们进来了。

于 2015-07-05T20:20:06.973 回答