mkfifo-磁盘I / O是否实际发生?


10

我有2个应用程序:

  • 生产者(N个实例)
  • 消费者(1个实例)

我目前从生产者那里写出中间结果,然后消费者从磁盘读取这些文件并产生最终结果。

我想通过将生产者的输出直接“流化”到消费者来最小化此I / O。

我碰到命名管道(mkfifo)和随后的例子在这里。这看起来不错,但我无法确定这是如何实现的?FIFO队列是否只是通过文件进行缓冲?如果是这样,那可能对我没有帮助。我希望内容在不使用磁盘的情况下完全“通过内存”传输。也许跨进程不可能吗?

Answers:


10

没有磁盘I / O(也许在文件系统中导航以打开fifo文件时除外)。

Linux的FIFO(7)手册页

FIFO特殊文件(命名管道)类似于管道,不同之处在于它是作为文件系统的一部分进行访问的。[...]当进程通过FIFO交换数据时,内核会在内部传递所有数据,而无需将其写入文件系统。因此,FIFO特殊文件在文件系统上没有内容。文件系统条目仅充当参考点,以便进程可以使用文件系统中的名称访问管道。


完善。我阅读了mkfifo的手册页,但没有想到要在“ fifo”上查找页面-谢谢!
Jmoney38年

3

您的结果是否实际是磁盘备份并不重要,因为如果有足够的内存可用,它将被缓存并且不执行实际的磁盘IO。相反,如果它有内存支持并且没有足够的可用内存,则可以将其交换到磁盘。

如果我猜到了,我会说管道实际上是基于内存的,但是,这仅应更改是否在重新启动之间保留排队的数据。

您应该注意的是,由于您有多个生产者,因此您的写操作必须是原子的,这样它们才不会在队列中交错。man 7 pipe有关如何确保写入为原子的详细信息,请参见。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.