写入标准输出可以给进程带来背压吗?

写入标准输出可以给进程带来背压吗?

在流处理和队列中,我们有这样的概念背压,也就是说,如果生产者进程比消费者进程快,我们应该有一种机制来减慢生产者的速度,以避免超出可用内存/存储(不丢弃消息,这可能是可接受的,也可能是不可接受的)。

我现在很好奇 stdio 是否可以用于在这个意义上对生产者 Unix 进程施加背压(例如foofoo | bar)。看起来,即使当缓冲区达到容量时对 stdout 的写入被阻止,生产者进程仍然有必要做正确的事情(TM),而不是在内存中累积数据等待写入 stdout。单线程、阻塞程序似乎可以通过测试,但异步程序可能必须拥有自己的内部缓冲和反压机制,以免因等待写入的数据而发生爆炸。

所以;这在多大程度上是可能的?具体情况是什么?

答案1

管道的缓冲区大小是有限的。如果生产者领先于消费者,数据将逐渐填充管道的缓冲区。如果缓冲区已满,write生产者中的调用将阻塞,直到有空间为止。因此,系统中内置了背压。

在任何 POSIX 兼容系统上,缓冲区的大小至少为 512 字节,并且在现代 unice 上通常更大并且可能可配置。看管道缓冲区有多大?更多细节。

相关内容