Le pipe in Unix hanno un buffer, quindi anche se il processo del lato destro (RSP) non consuma alcun dato, il processo del lato sinistro (LSP) è in grado di produrre alcuni kilobyte prima del blocco.
Quindi, se il buffer si riempie, l'LSP viene infine bloccato. Quando l'RSP legge i dati, libera parte o tutto lo spazio del buffer e l'LSP riprende l'operazione.
Se invece di 2 processi ne hai 3, la situazione è più o meno la stessa:un producer più veloce viene bloccato da un consumer più lento. E ovviamente, un consumatore più veloce viene bloccato da un produttore più lento se la pipe si svuota:basti pensare a una shell interattiva, in attesa del produttore più lento di tutti:l'utente.
Ad esempio il seguente comando:
$ yes | cat | more
Dal more
si blocca quando lo schermo è pieno, finché l'utente non preme un tasto, il cat
il processo riempirà il suo buffer di output e andrà in stallo, quindi il yes
il processo riempirà il suo buffer e si bloccherà. Tutto in attesa che l'utente continui, come dovrebbe essere.
PS:Un fatto interessante è:cosa succede quando more
il processo finisce? bene, il lato destro di quel tubo è chiuso, quindi il cat
il processo otterrà un SIGPIPE
segnale (se mai scriverà di nuovo nella pipa, e lo farà) e morirà. Lo stesso accadrà al yes
processi. Tutti i processi muoiono, come dovrebbe essere.
A ha una pipe verso B e B ha una pipe verso C. Ogni pipe ha un buffer; Blocco B e C se tentano di leggere e non è disponibile alcun input (la fine del flusso conta come input). A e B si bloccano se hanno output da scrivere, ma il buffer della pipe è pieno.
Tutti e tre i processi vengono eseguiti contemporaneamente, utilizzando quanta più CPU possibile. Il sistema operativo li blocca nella chiamata di sistema di lettura/scrittura secondo necessità se il pipe buffer è rispettivamente esaurito/pieno.
Quindi, sono guidati sia dal consumatore che dal produttore, cioè il tasso è il minimo sia del tasso di consumo che del tasso di produzione. Se il consumatore è più veloce, la performance è guidata dal produttore, e vv.