我已经阅读过,管道的容量必须有限。但是我不明白为什么。如果进程无限制地写入管道会发生什么?
这是由于缓冲。管道不是“魔术”的,管道不能确保所有进程都以锁步的方式处理每个单独的字节或字符。取而代之的是,管道缓冲进程间输出,然后将缓冲区传递。这个缓冲区大小限制就是您所指的。 In many Linux distros and in macOS the buffer size is 64KiB。
想象一下,有一个进程每秒将1GB数据输出到stdout-它通过管道传送到另一个进程,该进程在stdin上每分钟只能处理100字节的数据-考虑到这些千兆字节的数据必须存放在某个地方。如果存在无限大小的缓冲区,那么您将很快填满拥有管道的任何OS组件的内存空间,然后开始分页到磁盘-然后磁盘上的页面文件将被填满-这不好。
通过具有最大的缓冲区大小,将在缓冲区已满时通知输出过程,并且可以适当地自由处理该事件(例如,如果是随机数生成器,则暂停输出;如果是网络监视器,则删除数据,通过崩溃等)。
除了内部机制,我怀疑问题背后的根本原因是术语之一。管道的capacity受限制,但传输的数据总量不受限制。
类似于一条物理管道非常好:给定的水管具有特征性的内部容积,该容积由其长度,形状和内部横截面定义。在任何给定时间,它所容纳的水都无法容纳该容积内的水,因此,如果您在阀门的下游端关闭阀门,则水最终(也许立即)会停止流入另一端,因为管道内的所有可用空间容量-已满。但是,直到并且除非该管道永久地]关闭,否则在其使用寿命期间可以穿越多少水没有限制。