「ブロッキングシステムコール」の意味は何ですか?
私のオペレーティングシステムコースでは、マルチスレッドプログラミングを勉強しています。教科書を読んだときの意味がわからない「スレッドがブロッキングシステムコールを行うと、別のスレッドが実行される可能性がある」
ブロッキングシステムコールは、アクションが完了するまで待機する必要があるシステムコールです。 read()
は良い例です。入力の準備ができていない場合は、そこに座って、いくつかが完了するまで待機します(もちろん、非ブロッキングに設定していない場合、その場合、ブロッキングシステムコールではありません)。明らかに、あるスレッドがブロッキングシステムコールを待機している間、別のスレッドが別の処理を行っている可能性があります。
ブロッキングシステムコールの場合、呼び出し元はシステムコールが戻るまで何もできません。システムコールが長くなる可能性がある場合(たとえば、ファイルIOまたはネットワークIOを含む)は、悪いことになる可能性があります(たとえば、欲求不満のユーザーが、アプリケーションの「キャンセル」ボタンを叩いて、そのスレッドは、到着していないネットワークからのパケットを待ってブロックされているため、応答します。その問題を回避するには(ブロックするシステムコールが戻るのを待つ間、有用な作業を行うため)、スレッドを使用できます。他のスレッドをブロックすると、有用な作業を続行できます。
代替はノンブロッキングシステムコールです。この場合、システムコールは(ほぼ)すぐに戻ります。長いシステムコールの場合、システムコールの結果は後で発信者に送信されるか(ある種のイベント、メッセージ、シグナルなど)、または後で発信者によってポーリングされます。これにより、単一のスレッドが多くの異なるシステムコールが同時に完了するのを待機することができます。スレッドの煩わしさ(およびロック、競合状態、スレッド切り替えのオーバーヘッドなど)を回避します。ただし、システムコールの結果の取得と処理に伴う手間も増加します。
(ほとんどの場合)ブロッキングシステムコールの周りにノンブロッキングラッパーを書き込むことは可能です。ここで、ラッパーはスレッドを生成して(ほぼ)すぐに戻り、生成されたスレッドはブロッキングシステムコールを実行して、システムコールの結果を元の呼び出し元に送信するか、元の呼び出し元がポーリングできる場所に結果を保存します。
また、(ほとんどの場合)非ブロッキングシステムコールの周囲にブロッキングラッパーを記述することもできます。ここで、ラッパーはシステムコールを実行し、結果が戻る前に結果を待ちます。
この非常に短いテキストを読むことをお勧めします: http://files.mkgnu.net/files/upstare/UPSTARE_RELEASE_0-12-8/manual/html-multi/x755.html 特に並列処理だけでなく、システムコールのブロックがスレッドで心配になる理由については、こちらをご覧ください。
システムコールで1つのスレッドがブロックされると、別のスレッドのコードの更新が無期限に遅延する可能性があるため、これはマルチスレッドアプリケーションでは特に問題になります。
それが役に立てば幸い。