Pipe v Unixu mají vyrovnávací paměť, takže i když proces na pravé straně (RSP) nespotřebovává žádná data, proces na levé straně (LSP) je schopen před zablokováním vyprodukovat několik kilobajtů.
Pokud se pak vyrovnávací paměť zaplní, LSP je nakonec zablokován. Když RSP čte data, uvolní část nebo celý prostor vyrovnávací paměti a LSP obnoví operaci.
Pokud místo 2 procesů máte 3, je situace víceméně stejná:rychlejšího výrobce blokuje pomalejší spotřebitel. A je zřejmé, že rychlejší spotřebitel je zablokován pomalejším výrobcem, pokud se potrubí vyprázdní:jen si představte interaktivní shell, který čeká na nejpomalejšího výrobce ze všech:na uživatele.
Například následující příkaz:
$ yes | cat | more
Od more
blokuje, když je obrazovka plná, dokud uživatel nestiskne klávesu cat
proces zaplní výstupní vyrovnávací paměť a zastaví se, pak yes
proces zaplní svůj buffer a také se zastaví. Vše čeká na to, až uživatel bude pokračovat, jak má být.
PS:Zajímavým faktem je:co se stane, když more
proces končí? no, pravá strana té roury je uzavřená, takže cat
proces dostane SIGPIPE
signál (pokud ještě někdy zapíše do potrubí, a bude) a zemře. Totéž se stane s yes
proces. Všechny procesy umírají, jak by měly být.
A má potrubí do B a B má potrubí do C. Každé potrubí má vyrovnávací paměť; B a C blokují, pokud se pokusí číst a není k dispozici žádný vstup (konec proudu se počítá jako vstup). Bloky A a B, pokud mají výstup pro zápis, ale vyrovnávací paměť roury je plná.
Všechny tři procesy běží souběžně a využívají tolik CPU, kolik mohou. Operační systém je podle potřeby zablokuje v systémovém volání pro čtení/zápis, pokud je vyrovnávací paměť potrubí vyčerpána/plná.
Takže jsou poháněny jak spotřebitelem, tak výrobcem, to znamená, že míra je minimální mírou spotřeby i rychlosti produkce. Pokud je spotřebitel rychlejší, výkon řídí výrobce a vv.