複数のサブシェルを作成してパイプラインを並列に実行する

複数のサブシェルを作成してパイプラインを並列に実行する

|私はこの答えの違いを読んだ。; https://unix.stackexchange.com/a/159492/318084;

2つのコマンドAとBを考えてみましょう。書くとき

A | B
A と B は並列に実行され、A の標準出力は B の標準入力に送信されます。

この言葉は混乱しています。parallel

説明を見るとわかります。パイプ(Unix) - ウィキペディア

Unixファミリーのコンピュータオペレーティングシステムでは、パイプは標準ストリームを介して一緒に接続された一連のプロセスであるため、各プロセスの出力(stdout)は入力(stdin)として次のプロセスに直接渡されます。

パイプは出力を入力として次に渡します。

それにもかかわらず、答えは「並列」です。順次ではなく同時に実行されます。

このメカニズムはどのように機能しますか?

|親シェル(エクスポート変数)のAから変数を取得するサブシェルを作成し、操作が完了したら自動的にサブシェルを閉じる必要があると思います。

答え1

パイプはストリーム処理の例です。パイプラインが構築されると、データがすべてのプロセスに到達すると、処理には複数のプロセスが同時に含まれます。 3つのデータa b cと2つのプロセスがあると想像してAくださいB。次に、次のステップを見てください。

  1. a@A B- Enter a、まだ中にA何もありませんB

  2. b@A a@B-aパススルーBb入力A

  3. c@A b@B- 到着時にc到着AbB

  4. A c@B-それだAcB

非常に大きいと想像してみてくださいa。大きすぎて、一度に2つの要素しかマシンに存在できません。順次処理では、まず処理してから同時に保存する必要があります。並列処理は、ストレージ要件が低いだけでなく、複数のプロセッサが必要であることを意味します。ただし、時間配布によって単一プロセッサで並列処理をシミュレートできるため、これは必須ではありません。bcAB

パイプラインの各ステップは、サブシェルで実行される別々のプロセスです。通常、特定のプロセス内の出力はバッファリングされます。つまり、出力が大きなチャンクで送信されることを意味します。これは動作を最適化できますが、オフになっている可能性があり、出力が準備されるとすぐに消えます。しかし、より大きな塊があっても、まだ平行です。

関連情報