Was ist der genaue Einfallsreichtum von Unix Pipe

52

Ich habe die Geschichte gehört, wie Douglas Mcllroy auf das Konzept gekommen ist und wie Ken Thompson es in einer Nacht umgesetzt hat.

Soweit ich weiß, ist pipe ein Systemaufruf, der einen Teil des Speichers zwischen zwei Prozessen teilt, von denen ein Prozess schreibt und ein anderer liest.

Als jemand, der sich nicht mit Betriebssysteminternalen oder -konzepten auskennt, habe ich mich gefragt, was genau das "Genie" in der Geschichte ist. Ist es die Idee von zwei Prozessen, die sich den Speicher teilen? Oder ist es die Umsetzung? Oder beides?

PS: Mir ist bekannt, wie nützlich die Pfeife ist oder wie sie in der Schale verwendet wird. Die Frage ist nach Konzept und Umsetzung der|

aoak
quelle
4
Ich denke, in jenen frühen Tagen war es ziemlich radikal, die Implementierung eines Mechanismus zum Erstellen von Anwendungen nachdrücklich voranzutreiben. Um dies zu erreichen, müssen Sie ein fundiertes Konzept zur Trennung von Schnittstelle und Implementierung haben und den Nutzen der funktionalen Komposition bei der Programmierung erkennen.
Chan-Ho Suh
4
Darüber hinaus verfügten bereits ausgeführte Anwendungen über ein Standardeingabe- und ein Standardausgabe-Handle, und die Unix-ähnlichen Betriebssystem-APIs verfügten über Lese- / Schreibfunktionen, die auf diese Handles angewendet werden konnten. Die geschickte Verwendung einiger orthogonaler und leistungsfähiger Konzepte (Handles, Ausgabe und Eingabe von diesen) führt nicht nur zu Pipes, sondern auch zu Sockets, Interaktionen zwischen Zeichen und Geräten und zu Dutzenden anderen Dingen. Nachdem wir nun Datei-Handles haben (für das Tty, das Tastatureingaben und Textausgaben bereitstellt), können wir Anwendungen so zusammenstellen, dass eine Anwendung zum Tty der anderen wird.
Warren P
6
@WarrenP Eigentlich Unix erhielt Standard-Eingabe- und Standard-Ausgang aufgrund des pipe()Syscall und den |Shell - Operator (Ref: McIlroy ). Oder, wie Voltaire vielleicht gesagt hätte: " Wenn [stdio] nicht existiert hätte, wäre es notwendig, [es] zu erfinden. " :-)
Ross Patterson,
Es gab kein Datei-Handle und kein In- und Out-Handle, bis AFTER Pipes?
Warren P
4
@WarrenP: Es hört sich so an, als würde Patterson folgendes sagen: Zuerst gab es Dateihandles. Dann kamen diese Leute auf die Idee, dass jedes Programm standardmäßig ein Eingabe- und ein Ausgabe-Handle hat, mit denen Programme trivial verkettet werden können. Diese wurden als "Standard" -Eingabe / Ausgabe bekannt.
Mooing Duck

Antworten:

109

Soweit ich weiß, ist pipe ein Systemaufruf, der einen Teil des Speichers zwischen zwei Prozessen teilt, von denen ein Prozess schreibt und ein anderer liest.

Eigentlich handelt es sich nicht um Shared Memory. Der Leser und der Schreiber teilen KEINEN Teil ihres Adressraums und verwenden keine explizite Synchronisation.

Die Lese- und Schreibvorgänge machen readund writeSystemaufrufe genau so, als würden sie aus einer Datei lesen / in eine Datei schreiben. DAS ist das Genie ... die Innovation: der Gedanke, dass (einfache) prozessübergreifende Kommunikation und Datei-E / A auf die gleiche Weise gehandhabt werden können ... aus der Sicht des Anwendungsprogrammierers und des Benutzers.

Sobald die Pipe eingerichtet wurde, kümmert sich das Betriebssystem (nicht der Anwendungscode oder die Bibliotheken im Benutzerbereich) um die Pufferung und die Koordination. Transparent.


Im Gegensatz dazu mussten Sie vor der Erfindung des Pipe-Konzepts, wenn Sie eine "Pipeline" -Verarbeitung durchführen mussten, in der Regel eine Anwendung in eine Datei schreiben und dann, wenn sie fertig ist, die zweite Anwendung ausführen, um aus der zu lesen Datei.

Wenn Sie eine echte Pipeline wünschen, können Sie alternativ beide Anwendungen codieren, um ein (reales) gemeinsames Speichersegment einzurichten, und Semaphoren (oder etwas anderes) verwenden, um das Lesen / Schreiben zu koordinieren. Kompliziert ... und in der Folge nicht oft gemacht.

Stephen C
quelle
34
"DAS ist das Genie ... die Innovation: Der Gedanke, dass Interprozesskommunikation und Datei-E / A auf die gleiche Weise gehandhabt werden können" - genau das. Es ermöglicht Ihnen die Interprozesskommunikation zwischen Programmen, die nie dafür entwickelt wurden und nicht einmal wissen (müssen), was passiert.
Guntram Blohm
6
Es ist auch nützlich zu bemerken, dass der Grund für die Verwendung von Datei-E / A für IPC hauptsächlich darin bestand, dass Unix für die Textverarbeitung entwickelt wurde - das Streaming von Textdaten von Programm zu Programm ermöglichte eine relativ schmerzlose Komposition, was wiederum bedeutete, dass das gesamte System aufgebaut werden konnte relativ einfache, kleine Programme, die Daten in (möglicherweise) langen Ketten einfacher Operationen von einem zum anderen streamen. Grundsätzlich bedeutete dies, dass Sie eine relativ flexible Sprache für die Textverarbeitung hatten.
Luaan
1
Und so ist der "Einfallsreichtum von Unix" der "Einfallsreichtum von Unix": Alle E / A-Vorgänge (einschließlich Interprozesskommunikation, Standarddateien und der Rest der Dateisystemobjekte) werden als Dateien behandelt.
Mark Hurd
Ein weiterer Geniestreich war, dass UNIX in einer Zeit, in der jedes Byte zählte, für menschenlesbare Dateistrukturen
eintrat
14

Meiner Meinung nach liegt das Genie der Idee von "Rohren" in der Einfachheit der Verwendung.

Sie müssen keine Systemaufrufe tätigen, keinen Speicher zuweisen, nichts Kompliziertes. In der Shell verwenden Sie ein einzelnes Zeichen: |. Dies gibt außergewöhnliche Kraft in der Kombination von einfachen (oder komplexen) Werkzeugen für eine bestimmte Aufgabe.

Nehmen Sie einige alltägliche Aufgaben wie das ordentliche Sortieren von Text an. Möglicherweise haben Sie einen Befehl, der eine ganze Reihe von Namen auflistet. (Für mein Beispiel verwende ich eine Datei, die eine Reihe von Namen enthält, mit freundlicher Genehmigung von listofrandomnames.com.) Mit Pipes können Sie Folgendes tun:

$ cat names.txt
Sally Weikel
Dana Penaflor
Christine Hook
Shaneka Flythe
Almeda Crook
Freddie Lindley
Hester Kersh
Wanda Ruse
Megan Mauzy
Samuel Mancha
Paris Phipps
Annika Accardo
Elena Nabors
Caroline Foti
Jude Nesby
Chase Gordy
Carmela Driggers
Marlin Ostendorf
Harrison Dauber
$ cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Accardo, Annika     Hook, Christine     Ostendorf, Marlin
Crook, Almeda       Kersh, Hester       Penaflor, Dana
Dauber, Harrison    Lindley, Freddie    Phipps, Paris
Driggers, Carmela   Mancha, Samuel      Ruse, Wanda
Flythe, Shaneka     Mauzy, Megan        Weikel, Sally
Foti, Caroline      Nabors, Elena
Gordy, Chase        Nesby, Jude

Dies ist nur ein Beispiel. es gibt Tausende. Im Abschnitt "Die Unix-Philosophie" auf dieser Seite finden Sie einige weitere spezifische Aufgaben, die durch die Verwendung von Pipes erheblich vereinfacht werden .


Um diese Antwort zu unterstreichen, lesen Sie die Folien 4 bis 9 der Präsentation "Warum Zsh cooler ist als Ihre Shell".


Mir ist bekannt, dass der obige Befehl ein UUOC enthält . Ich lasse es stehen, weil es ein Platzhalter für einen beliebigen Befehl ist, der Text generiert.

Platzhalter
quelle
3
Kleine winzige Notiz : sort -uKann die Arbeit sort | uniqschneller erledigen .
Ich werde nicht existieren Idonotexist
cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100Sie sind vielleicht daran gewöhnt, aber ich würde es nicht einfach nennen. Besonders das awkTeil.
Federico Poloni
Die Pfeifen sind einfach. Ich habe gesagt, "... außergewöhnliche Kraft in der Kombination von einfachen (oder komplexen) Werkzeugen zu einer bestimmten Aufgabe."
Wildcard
5

Daher habe ich versucht, ein bisschen nachzuforschen, indem ich nach Handbüchern für PDP-10 / TOPS-10 gesucht habe, um herauszufinden, wie der Stand der Technik vor Pfeifen war. Ich fand diese , aber TOPS-10 bemerkenswert schwer zu Google. Es gibt ein paar gute Referenzen auf der Erfindung des Rohres: ein Interview mit McIlroy , über die Geschichte und Wirkung von UNIX .

Sie müssen dies in einen historischen Kontext stellen. Es gab nur wenige moderne Werkzeuge und Annehmlichkeiten, die wir für selbstverständlich halten.

"Zu Beginn programmierte Thompson nicht einmal auf dem PDP selbst, sondern verwendete stattdessen eine Reihe von Makros für den GEMAP-Assembler auf einem GE-635-Computer." (29) Auf dem GE 635 wurde ein Papierband erzeugt und dann getestet der PDP-7, bis laut Ritchie "ein primitiver Unix-Kernel, ein Editor, ein Assembler, eine einfache Shell (Befehlsinterpreter) und einige Dienstprogramme (wie die Befehle Unix rm, cat, cp) fertiggestellt wurden Punkt, das Betriebssystem war selbsttragend, Programme konnten geschrieben und getestet werden, ohne auf Papierband zurückgreifen zu müssen, und die Entwicklung des PDP-7 selbst wurde fortgesetzt. "

Ein PDP-7 sieht so aus . Beachten Sie das Fehlen einer interaktiven Anzeige oder einer Festplatte. Das "Dateisystem" würde auf dem Magnetband gespeichert. Es gab bis zu 64 KB Speicher für Programme und Daten.

In dieser Umgebung tendierten Programmierer dazu, die Hardware direkt anzusprechen, beispielsweise durch Ausgabe von Befehlen, um das Band hochzufahren und Zeichen nacheinander zu verarbeiten, die direkt von der Bandschnittstelle gelesen wurden. Darüber lieferte UNIX Abstraktionen, sodass sie nicht als separate Schnittstellen "read from teletype" und "read from tape" zusammengefasst wurden, sondern mit dem entscheidenden Zusatz "read from output of other program", ohne eine temporäre Kopie auf der Festplatte zu speichern oder Band ".

Hier ist McIlroy über die Erfindung von grep. Ich denke, dass dies eine gute Arbeit ist, um den Arbeitsaufwand in der Umgebung vor UNIX zusammenzufassen.

"Grep wurde für mich erfunden. Ich habe ein Programm zum Vorlesen von Text mit einem Sprachsynthesizer erstellt. Während ich die phonetischen Regeln erfand, überprüfte ich das Wörterbuch von Webster auf Wörter, an denen sie scheitern könnten. Wie gehen Sie beispielsweise mit dem Digraphen um?" ui ', was auf viele verschiedene Arten ausgesprochen wird:' fruit ',' guile ',' guilty ',' qual ',' intuit ',' beguine '? Ich würde das Wörterbuch in Teile aufteilen, die in den begrenzten Puffer und die begrenzte Verwendung von ed passen ein globaler Befehl zum Auswählen einer Liste. Ich würde diese Liste durch wiederholtes Scannen mit ed verkleinern, um zu sehen, wie jede vorgeschlagene Regel funktioniert. "

"Der Vorgang war langwierig und furchtbar verschwenderisch, da das Wörterbuch geteilt werden musste (man konnte es sich nicht leisten, eine geteilte Kopie online zu lassen). Dann kopierte ed jeden Teil nach / tmp und scannte ihn zweimal, um den Befehl g auszuführen. und warf es schließlich weg, was auch Zeit braucht. "

"Eines Nachmittags fragte ich Ken Thompson, ob er den Erkenner für reguläre Ausdrücke aus dem Editor herausheben und ein One-Pass-Programm erstellen könne, um dies zu tun. Er sagte ja. Am nächsten Morgen fand ich eine Notiz in meiner Mail, in der ein Programm namens grep angekündigt wurde. Es funktionierte wie ein Zauber. Auf die Frage, was dieser lustige Name bedeutete, sagte Ken, dass es offensichtlich sei. Es stand für den von ihm simulierten Editorbefehl g / re / p (globaler Ausdruck für reguläre Ausdrücke). "

Vergleichen Sie den ersten Teil davon mit dem cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100Beispiel. Wenn Sie die Option "Befehlszeile erstellen" oder "Programm eigens für diesen Zweck in Assembler von Hand schreiben" wählen, lohnt es sich, die Befehlszeile zu erstellen. Auch wenn es einige Stunden dauert, die (Papier-) Handbücher zu lesen. Sie können es dann zur späteren Bezugnahme aufschreiben.

pjc50
quelle
1

Das Genie von Pipes ist, dass es drei wichtige Ideen vereint.

Erstens sind Pfeifen eine praktische Implementierung von "Co-Routinen", ein Begriff, der von Conway im Jahr 1958 geprägt wurde und vielversprechend war, aber vor Pfeifen wenig praktische Verwendung fand.

Zweitens erfanden Thompson et al. Durch die Implementierung von Pipes in der Shell-Sprache die erste echte "Klebesprache".

Mit diesen beiden Punkten können wiederverwendbare Softwarekomponenten effizient in einer optimierten Sprache auf niedriger Ebene entwickelt und dann zu einer viel größeren, komplexeren Funktionalität zusammengefügt werden. Sie nannten dies "Programmieren im Großen".

Drittens ermöglichte die Implementierung von Pipes mit denselben Systemaufrufen, die für den Dateizugriff verwendet wurden, das Schreiben von Programmen mit universellen Schnittstellen. Dies ermöglichte wirklich universelle Lösungen für Softwareprobleme, die interaktiv, mithilfe von Daten aus Dateien und als Teil größerer Softwaresysteme verwendet werden konnten, ohne dass die Softwarekomponenten einmal geändert werden mussten. Kein Kompilieren, keine Konfiguration, nur ein paar einfache Shell-Befehle.

Wenn Sie die Lernkurve durchlaufen möchten, ist die UNIX-Software heute genauso nützlich wie vor 40 Jahren. Wir erfinden ständig Dinge neu, für die sie bereits gewusst und Lösungen entwickelt haben. Und der entscheidende Durchbruch war die einfache Pipe. Die einzige echte Innovation danach war die Schaffung des Internets in den 80er Jahren. Durch die Erstellung einer separaten API hat UNIX die Implementierung drastisch verfälscht. Wir leiden immer noch unter den Folgen ... Oh ja, es gab etwas mit Video-Displays und Mäusen, das in den späten 80ern populär wurde. Aber das ist für WIMPs.

EvertW
quelle