パイプがある場合:
process1 | process2
プロセス1はギガバイトのデータを非常に高速に生成しますが、プロセス2はそのデータをネットワーク経由で転送する必要があるため、はるかに遅くなります。以下を実行してください。
- process1の実行速度を遅くしますか? ;または
- プロセス2が読み取れるまでデータをどこかにバッファリングしますか?
データがバッファリングされている場合、カーネルによってバッファリングされますか?メモリにありますか、それともディスクにありますか?このバッファはどれくらい大きいですか?バッファがオーバーフローするとどうなりますか?
ベストアンサー1
遅いプロセスは高速プロセスの速度を制限します。パイプはwrite()
、バイトをバッファに入れるプロセスとバッファからバイトを取得するプロセスとの間のバッファ(カーネルとfcntl(2)操作を使用するプロセスの調整に応じて、サイズは512〜64kバイト)です。異なるプロセス間でバイトを呼び出して呼び出しでバッファリングしますread()
。
write()
read()
どちらもカーネルのコントロールを呼び出します。したがって、読み取りプロセスが空のread()
パイプバッファを呼び出すと、カーネルは他のプロセスがバイトを入れるread()
まで(または標準出力ファイル記述子を閉じるまで)そのバッファから返されません。一方、書き込みプロセスがパイプバッファ全体を呼び出す場合、カーネルは他のプロセスがバイトを取得するか標準入力ファイル記述子を閉じるまで、バッファに新しいバイトを追加せずにバッファwrite()
から返されます。write()
したがって、より速いプロセスの性能は、遅いプロセスの性能によって制限される。カーネルはパイプバッファオーバーフローやアンダーフローを許可しません。