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

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

我有2个应用程序:

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

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

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

我遇到了命名管道(mkfifo)和随后的示例这里。这看起来很棒,但我无法确定它实际上是如何实现的? FIFO 队列只是通过文件进行缓冲吗?如果是这样,那可能对我没有帮助。我希望内容完全“通过内存”流式传输,而不使用磁盘。也许这不可能跨进程?

答案1

无磁盘 I/O(除非在文件系统中导航以打开 fifo 文件。)

Linux fifo(7) 手册页:

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

答案2

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

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

您应该注意的是,由于您有多个生产者,因此您的写入需要是原子的,以便它们不会在队列中交错。看man 7 pipe有关如何确保写入是原子的详细信息。

相关内容