为什么管道的容量有限?

2024-01-29

我读到管道需要有有限的容量。但我不明白为什么。如果进程无限制地写入管道会发生什么?


这是由于缓冲。管道并不“神奇”,管道并不能确保所有进程都按步调一致地处理每个单独的字节或字符。相反,管道缓冲进程间输出,然后传递缓冲区。这个缓冲区大小限制就是您所指的。在许多 Linux 发行版和 macOS 中,缓冲区大小为 64KiB https://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer.

想象一下,有一个进程每秒向 stdout 输出 1GB 的数据 - 并且它通过管道传输到另一个进程,该进程每分钟只能在 stdin 上处理 100 字节的数据 - 考虑到这些 GB 的数据必须到达某个地方。如果存在无限大小的缓冲区,那么您将很快填满拥有该管道的任何操作系统组件的内存空间,然后开始分页到磁盘 - 然后磁盘上的页面文件将填满 - 这不好。

通过设置最大缓冲区大小,输出进程将在缓冲区填满时收到通知,并且可以自由地处理该事件,但是是适当的(例如,如果它是随机数生成器,则通过暂停输出;如果它是网络监视器,则通过删除数据;通过崩溃, ETC)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么管道的容量有限? 的相关文章

随机推荐