Führt Piping Befehle parallel aus?

Führt Piping Befehle parallel aus?

Ich versuche, Piping und Umleitung besser zu verstehen. In jeder Anleitung steht, dass cmd1 cmd1 | cmd2ausgeführt wird und stdout mit stdin von cmd2 geteilt wird. Aber das passt mir nicht so recht, also habe ich es getestet:

Es sieht also so aus, als ob beide ./test.shUndgrep laufen inparallel!

Hier ist der Quellcode:

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done

Der Versuch mit verschiedenen Befehlen zeigt ähnliche Ergebnisse. Verläuft das Rohr parallel?

Wie funktionieren Pipe und Umleitung „unter der Haube“?

Antwort1

Ja, alle Befehle werden gleichzeitig ausgeführt. In Ihrem Fall grepstartet der gleichzeitig mit test.sh, aber da er seine Standardeingabe liest, wird er blockiert, bis test.sher etwas hineinlegt, was nicht sofort passieren wird. Die beiden Prozesse takten sich gegenseitig. Wenn der zweite langsam ist, füllt der erste seinen Standardausgabepuffer und muss warten, bis der zweite etwas gelesen hat. Wenn der erste langsam ist, wird der zweite blockiert, während er Eingaben liest, wenn keine verfügbar sind.

In der Praxis wird die Standardausgabe des ersten Prozesses in ziemlich großen Blöcken (ca. 4 KB) geschrieben (*), sodass der zweite Prozess nichts zu lesen hat, bis der erste Prozess mindestens 4 KB an Daten geschrieben hat. Ihre test.shVerwendung echokönnte etwas anders sein und eine zeilengepufferte Ausgabe erzeugen.

(*) Die Regel lautet, dass die Ausgabe an ein „tty“ (also ein Terminal) zeilenweise gepuffert wird: Ein LF in der Ausgabe führt zur eigentlichen Ausgabe. Andernfalls wird sie in 4K-Blöcken gepuffert. Der erste Prozess kann auch explizit die gesamte Pufferung unterdrücken, dies ist jedoch schlecht für die Leistung.

Antwort2

Sie sehen sich tatsächlich das an, was als flow control, und/oder (Um-)Umleitung bezeichnet wird – noch einmal; flow control, oder stdin, stdout(Standard-Eingang / Standard-Ausgang).

Ich hoffe, meine obige Aussage hilft Ihnen besser zu verstehen, wasbeabsichtigtauftreten, und was können Sie bessererwarten.

Rohroder "Piping" stdoutlediglichleitet stdoutin den meisten Fällen.

Parallel istWirklichein anderer Name fürTandem. Du kannstversuchen2 verschiedene/gleiche Befehle/Ausgaben gleichzeitig auszuführen. Aber die Erwartung einessynchronisiertEin Run wäre unklug, da er unwahrscheinlich ist.

Zu Ihrem Beispiel: Hier führen Sie ein sogenanntesbedingt. Ähnlich wie ein Verkehrsschild oder eine Ampel. Diesebedingt(S)Direkte fließenbasierend auf einemZustand. In Ihrem Beispielwährend"Zustand" --während Das, TunDasBedingungen im Allgemeinenumleiten stdin, stdout.

Als direkte Antwort auf Ihre 2 direkten Fragen

  1. Verläuft das Rohr parallel

Nein, nicht unbedingt. Zumindest nicht in dernormalSinn von „parallel“ (Tandem).

Aber pipe dürfenFeuer (einleiten) 2Arbeitsplätzezur gleichen Zeit. Sogar dieDasselbeArbeitzweimal.

  1. Wie funktionieren Pipe und Umleitung „unter der Haube“?

Ich hoffe, ich habe es dir oben besser veranschaulicht. :)

oder

cat ./ASCII | grep somename >./output

Das Obige cat ./ASCIIistAusgabe( stdout). Das wirdEingang( stdin) durchRohr( |) für grep somename. Welches ist(um)geleitet( >) zu seiner endgültigen Ausgabe ./output.

verwandte Informationen