2番目のコマンドが最初のコマンド(パイプライン)の出力を待たないのはなぜですか?

2番目のコマンドが最初のコマンド(パイプライン)の出力を待たないのはなぜですか?

私は現在、M. Bachの「The Design of the UNIX® Operating System」を読んでいます。

メインシェルループについて読みました。if (/* piping */)ブロックを見てください。私が正しく理解した場合、パイプは最初のコマンド出力を2番目のコマンド入力として扱うことができます。それでは、2番目のコマンドに最初のコマンドが終了するのを待つコードがないのはなぜですか?このコマンドがなければ、パイピングは無意味に見えます。 2 番目のコマンドは、入力の準備ができていない状態で実行を開始できます。

メインシェルループ

ベストアンサー1

2 番目のコマンドは、入力の準備ができていない状態で実行を開始できます。

もちろん。何の問題もありません。

パイプラインでは、producer | consumer両方が同時に実行されます。消費者は、生産者が作業を完了するのを待ちません。プロデューサーが始まっても構いません。消費者が必要とするすべては、入力内容を読むことができる場所です。呼び出しがパイプを作成すると、この場所が存在しますpipe

パイプから読むのはブロックする仕事。データがまだパイプに書き込まれていない場合、リーダーはブロックされます。データがパイプに書き込まれると、リーダーのブロックが解除されます。より一般的には、パイプにデータがない場合、リーダーはブロックされます。パイプからデータを読み取ると、そのデータが消費されます。したがって、消費者が読み始める場合、生産者がすでに書き込みを開始しているかどうかは問題ではない。消費者は、生産者がいくつかのデータを書き込むのを待ちます。

消費者は、データが提供されるとすぐにデータを受け取ります。 ²通常、データをチャンクで読み取って処理します。ほとんどの消費者は、処理を開始する前にすべてのデータを保持する必要はありません。消費者が利用可能なすべてのデータが必要な場合は、それをメモリまたは一時ファイルに保存し、入力が完了するのを待ちます。

生産者と消費者は独立したプロセスなので、同時に実行されます。一方が実行中であっても、他方が実行されるのを防ぎません。プロデューサとコンシューマの両方がCPU時間を必要とする場合、カーネルは2つの間(およびCPU時間を必要とする他のプロセス間)でCPUを共有します。したがって、消費者が一部のデータを初期化または処理しても、生産者はより多くのデータを実行して生成できます。

1並列に実行されると言えます。これは技術的に正確ではありませんが、十分に近いです。
²実際、生産者は次のことができます。バッファー内部データ。ただし、生産者が実際にデータをパイプに書き込むと、消費者はそれを読み取ることができます。

おすすめ記事