我有两份申请:
目前,我从生产者那里写出中间结果,然后使用者从磁盘读取这些文件并生成最终结果。
我想尽量减少这个I/O通过“流”的输出从生产者直接到消费者。
我看到了命名管道(mkfifo)和随后的示例这里。这看起来很棒,但我无法确定这是如何实际实现的?FIFO队列是否只是通过文件进行缓冲?如果是这样的话,那可能帮不了我。我希望内容流“通过内存”完全不使用磁盘。也许这在不同的过程中是不可能的?
发布于 2014-09-08 15:32:34
没有磁盘i/o (可能在浏览文件系统以打开fifo文件时除外)。
来自Linux (7)手册页:
FIFO特殊文件(命名管道)与管道类似,只是作为文件系统的一部分被访问。...当进程通过FIFO交换数据时,内核内部传递所有数据,而不将其写入文件系统。因此,FIFO特殊文件在文件系统上没有内容;文件系统条目只是作为一个参考点,以便进程可以使用文件系统中的名称访问管道。
发布于 2014-09-08 15:25:33
您的结果是否确实是磁盘支持并不重要,因为如果有足够的内存可用,它无论如何都会被缓存,并且不会执行实际的磁盘IO。相反,如果内存支持,并且没有足够的内存可用,则可以将其交换到磁盘上。
如果我猜的话,我会说管道实际上是基于内存的,但是这样做只应该改变在重新引导之间是否保留排队的数据。
您应该注意的是,由于您有多个生产者,所以您的写操作需要是原子的,这样它们就不会交织在队列中。有关如何确保写是原子的详细信息,请参阅man 7 pipe。
https://unix.stackexchange.com/questions/154398
复制相似问题