スレッドと割り込みについて少し読みました。並列プログラミングにスレッドを使用すると、中断を心配する必要がないため、より簡単なセクションがあります。
しかし、割り込みでない場合、リリースブロックシステムコールを通知するメカニズムは何ですか?
はい
ディスクからファイルを読み取るためにブロックシステムコールを使用しているスレッドからファイルを読み込んでいます。
この間、他のスレッドが実行されています。
ある時点になると、ハードドライブからファイルを読み取る準備が整います。
ファイルを要求するスレッドでコンテキスト切り替えを実行できるように、ハードウェア割り込みを介してプロセッサに通知しますか?
答え1
割り込みはオペレーティングシステムによって処理され、スレッド(またはプロセス)はこれを知りません。
あなたが描いたシーンから:
- スレッドが
read()
システムコールを実行すると、カーネルが要求を受信し、データが到着するまでスレッドが何も実行しない(ブロック呼び出し)ことを認識するため、スレッドはブロックされます。 - カーネルは(必要に応じて)バッファにスペースを割り当て、「読み取るブロックを見つけてそのブロックをバッファに読み込むように要求する」ダンスを開始します。
- スケジューラは、解放されたCPUを使用するために別のスレッドを選択します。
- それまではすべてのことがうまく行われていました...
- ...ディスクから割り込みが届きました。カーネルが引き継がれ、以前に実行された読み取りが完了したことを示し、スレッドを準備済みとしてマークします。制御はユーザ空間に戻る。
- それまではすべてのことがうまく行われていました...
- ...誰かが何千もの理由の1つのためにCPUをあきらめましたが、偶然解放されたCPUがデータを待っていたスレッドに割り当てられました。
とにかくそうです。いいえ、転送完了を示すために割り込みが発生した場合、CPUは待機スレッドに割り当てられません。これは他のスレッドを中断する可能性があり、実行はそのスレッドを再開することができます(または他のスレッドが選択される可能性があります)。