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|
history
unix
process
pipelining
aoak
quelle
quelle
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. " :-)Antworten:
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
read
undwrite
Systemaufrufe 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.
quelle
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:
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.
quelle
sort -u
Kann die Arbeitsort | uniq
schneller erledigen .cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Sie sind vielleicht daran gewöhnt, aber ich würde es nicht einfach nennen. Besonders dasawk
Teil.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.
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.Vergleichen Sie den ersten Teil davon mit dem
cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Beispiel. 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.quelle
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.
quelle