É possível gravar em backdure de stdout em um processo?

5

No processamento e enfileiramento de fluxo, temos essa noção de contrapressão , que é que se um processo do produtor estiver indo mais rápido do que um processo do consumidor, devemos ter um mecanismo para desacelerar o produtor para evitar Exceder a memória / armazenamento disponível (sem eliminar mensagens, o que pode ou não ser aceitável).

Estou curioso há algum tempo sobre se o stdio pode ser usado para exercer pressão reversa nesse sentido em um processo Unix de produção (por exemplo, foo in foo | bar ). Parece que, mesmo que as gravações no stdout fossem bloqueadas quando um buffer atingisse a capacidade, ainda seria necessário que o processo do produtor fizesse o Right Thing (TM) e não acumulasse dados na memória esperando para serem gravados no stdout. Um único programa de bloqueio encadeado parece passar no teste, mas um programa assíncrono pode ter que ter seu próprio mecanismo interno de buffering e backpressure para não explodir com dados esperando para serem gravados.

Então; até que ponto isso é possível e quais são os detalhes?

    
por metasoarous 23.01.2017 / 01:45

1 resposta

3

Um pipe tem um tamanho de buffer limitado. Se o produtor for à frente do consumidor, os dados preencherão progressivamente o buffer do tubo. Se o buffer estiver cheio, a chamada write nos blocos do produtor até que haja espaço. Então, a contrapressão está embutida no sistema.

O tamanho do buffer é de pelo menos 512 bytes em qualquer sistema compatível com POSIX, e geralmente maior e potencialmente configurável em unidades modernas. Veja Qual é o tamanho do buffer de tubos? para mais detalhes.

    
por 25.01.2017 / 03:14