Las tuberías en Unix tienen un búfer, por lo que incluso si el proceso del lado derecho (RSP) no consume ningún dato, el proceso del lado izquierdo (LSP) puede producir algunos kilobytes antes de bloquearse.
Luego, si el búfer se llena, el LSP finalmente se bloquea. Cuando el RSP lee datos, libera parte o todo el espacio del búfer y el LSP reanuda la operación.
Si en lugar de 2 procesos tienes 3, la situación es más o menos la misma:un productor más rápido es bloqueado por un consumidor más lento. Y obviamente, un consumidor más rápido es bloqueado por un productor más lento si la tubería se vacía:solo piense en un shell interactivo, esperando al productor más lento de todos:el usuario.
Por ejemplo, el siguiente comando:
$ yes | cat | more
Desde more
bloquea cuando la pantalla está llena, hasta que el usuario presiona una tecla, el cat
El proceso llenará su búfer de salida y se detendrá, luego el yes
El proceso llenará su búfer y también se detendrá. Todo a la espera de que el usuario continúe, como debe ser.
PD:Como dato interesante es:¿qué sucede cuando el more
termina el proceso? bueno, el lado derecho de esa tubería está cerrado, entonces el cat
el proceso obtendrá un SIGPIPE
señal (si alguna vez vuelve a escribir en la tubería, y lo hará) y morirá. Lo mismo pasará con el yes
proceso. Todos los procesos mueren, como debe ser.
A tiene una tubería hacia B y B tiene una tubería hacia C. Cada tubería tiene un amortiguador; B y C se bloquean si intentan leer y no hay ninguna entrada disponible (el final del flujo cuenta como entrada). A y B se bloquean si tienen salida para escribir, pero el búfer de la tubería está lleno.
Los tres procesos se ejecutan simultáneamente, utilizando la mayor cantidad de CPU posible. El sistema operativo los bloquea en la llamada al sistema de lectura/escritura según sea necesario si el búfer de tubería está agotado/lleno respectivamente.
Por lo tanto, están impulsados tanto por el consumidor como por el productor, es decir, la tasa es la mínima tanto de la tasa de consumo como de la tasa de producción. Si el consumidor es más rápido, el rendimiento lo impulsa el productor y vv.