Pipes in Unix haben einen Puffer, selbst wenn der rechte Prozess (RSP) keine Daten verbraucht, kann der linke Prozess (LSP) einige Kilobyte produzieren, bevor er blockiert.
Wenn der Puffer dann voll wird, wird der LSP schließlich blockiert. Wenn der RSP Daten liest, gibt er einen Teil oder den gesamten Pufferspeicherplatz frei und der LSP nimmt die Operation wieder auf.
Wenn Sie statt 2 Prozesse 3 haben, ist die Situation mehr oder weniger dieselbe:Ein schnellerer Erzeuger wird von einem langsameren Verbraucher blockiert. Und offensichtlich wird ein schneller Verbraucher von einem langsameren Erzeuger blockiert, wenn die Pipe leer wird:Denken Sie nur an eine interaktive Shell, die auf den langsamsten Erzeuger von allen wartet:den Benutzer.
Zum Beispiel der folgende Befehl:
$ yes | cat | more
Seit more
blockiert, wenn der Bildschirm voll ist, bis der Benutzer eine Taste drückt, die cat
Prozess wird seinen Ausgabepuffer füllen und anhalten, dann yes
Prozess wird seinen Puffer füllen und auch anhalten. Alles wartet darauf, dass der Benutzer fortfährt, wie es sein sollte.
PS:Als interessanter Fakt gilt:was passiert bei der more
Prozess endet? Nun, die rechte Seite dieser Röhre ist geschlossen, also die cat
Der Prozess erhält einen SIGPIPE
Signal (wenn es jemals wieder in die Pipe schreibt, und es wird) und wird sterben. Dasselbe wird mit yes
passieren Prozess. Alle Prozesse sterben, wie es sein sollte.
A hat eine Leitung zu B und B hat eine Leitung zu C. Jede Leitung hat einen Puffer; B und C blockieren, wenn sie versuchen zu lesen, und es ist keine Eingabe verfügbar (das Ende des Streams zählt als Eingabe). A und B blockieren, wenn sie eine Ausgabe zum Schreiben haben, aber der Puffer der Pipe voll ist.
Alle drei Prozesse werden gleichzeitig ausgeführt und verbrauchen so viel CPU wie möglich. Das Betriebssystem blockiert sie im Lese-/Schreibsystemaufruf nach Bedarf, wenn der Pipe-Puffer erschöpft bzw. voll ist.
Sie werden also sowohl vom Verbraucher als auch vom Produzenten angetrieben, das heißt, die Rate ist das Minimum sowohl der Konsumrate als auch der Produktionsrate. Wenn der Konsument schneller ist, wird die Leistung vom Produzenten bestimmt, und vv.