Brian Kernighan erklärt in diesem Video die frühe Anziehungskraft von Bell Labs auf kleine Sprachen / Programme, die auf Speicherbeschränkungen basieren
Eine große Maschine würde 64 kByte groß sein - K, nicht M oder G - und das bedeutete, dass jedes einzelne Programm nicht sehr groß sein konnte, und so gab es eine natürliche Tendenz, kleine Programme zu schreiben, und dann den Pipe-Mechanismus. Grundsätzlich Eingabe Ausgabe Umleitung, ermöglicht es, ein Programm zu einem anderen zu verknüpfen.
Ich verstehe jedoch nicht, wie dies die Speichernutzung einschränken könnte, wenn man bedenkt, dass die Daten im RAM gespeichert werden müssen, um zwischen Programmen übertragen zu können.
Aus Wikipedia :
In den meisten Unix-ähnlichen Systemen werden alle Prozesse einer Pipeline gleichzeitig gestartet.Die Streams sind ordnungsgemäß verbunden und werden vom Scheduler zusammen mit allen anderen auf dem Computer ausgeführten Prozessen verwaltet. Ein wichtiger Aspekt dabei, der Unix-Pipes von anderen Pipe-Implementierungen unterscheidet, ist das Konzept der Pufferung: Beispielsweise kann ein Sendeprogramm 5000 Bytes pro Sekunde erzeugen, und ein Empfangsprogramm kann möglicherweise nur 100 Bytes pro Sekunde akzeptieren, aber keine Daten gehen verloren. Stattdessen wird die Ausgabe des Sendeprogramms im Puffer gehalten. Wenn das empfangende Programm zum Lesen von Daten bereit ist, liest das nächste Programm in der Pipeline aus dem Puffer. Unter Linux beträgt die Größe des Puffers 65536 Byte (64 KB). Ein Open-Source-Filter von Drittanbietern namens bfr ist verfügbar, um bei Bedarf größere Puffer bereitzustellen.
Das verwirrt mich umso mehr, als dies den Zweck kleiner Programme völlig zunichte macht (obwohl sie bis zu einem gewissen Ausmaß modular sein würden).
Das einzige, was ich mir als Lösung für meine erste Frage vorstellen kann (die Speicherbeschränkungen sind problematisch und hängen von den Größenangaben ab), ist, dass große Datenmengen damals einfach nicht berechnet wurden und das eigentliche Problem, das Pipelines lösen sollten, das war Speicherplatz, der von den Programmen selbst benötigt wird. Aber angesichts des fettgedruckten Textes im Wikipedia-Zitat verwirrt mich auch das: Es wird immer nur ein Programm gleichzeitig implementiert.
All dies wäre sehr sinnvoll, wenn temporäre Dateien verwendet würden, aber ich verstehe, dass Pipes nicht auf die Festplatte schreiben (es sei denn, Swap wird verwendet).
Beispiel:
sed 'simplesubstitution' file | sort | uniq > file2
Mir sed
ist klar, dass ich die Datei lese und zeilenweise ausspucke. Aber sort
, wie BK in dem verlinkten Video feststellt, ist es ein Punkt, also müssen alle Daten in den Speicher eingelesen werden (oder?), Dann wird es an weitergeleitet uniq
, was (meiner Meinung nach) eine Eins wäre -Zeilen-zu-Zeit-Programm. Aber zwischen der ersten und der zweiten Pipe müssen sich alle Daten im Speicher befinden, oder?
unless swap is used
Swap wird immer dann verwendet , wenn nicht genügend RAM