首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mkfifo -磁盘I/O真的发生了吗?

mkfifo -磁盘I/O真的发生了吗?
EN

Unix & Linux用户
提问于 2014-09-08 15:10:24
回答 2查看 6.2K关注 0票数 12

我有两份申请:

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

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

我想尽量减少这个I/O通过“流”的输出从生产者直接到消费者。

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

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2014-09-08 15:32:34

没有磁盘i/o (可能在浏览文件系统以打开fifo文件时除外)。

来自Linux (7)手册页

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

票数 13
EN

Unix & Linux用户

发布于 2014-09-08 15:25:33

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

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

您应该注意的是,由于您有多个生产者,所以您的写操作需要是原子的,这样它们就不会交织在队列中。有关如何确保写是原子的详细信息,请参阅man 7 pipe

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/154398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档