私は興味がある。私は何年も Python でプログラミングを行ってきました。I/O をブロックするコマンド (ハードディスクの読み取りかネットワーク要求か) を実行するか、ロックが解放されるのを待っている間にブロックするコマンドを実行すると、どのように実装されますか? スレッドは、GIL を再取得して再び実行を開始するタイミングをどのように知るのでしょうか?
これは、「出力は今ここにあるのか?今ここにあるのか?今はどうなのか?」と常にチェックすることで実装されているのだろうか。
私は興味がある。私は何年も Python でプログラミングを行ってきました。I/O をブロックするコマンド (ハードディスクの読み取りかネットワーク要求か) を実行するか、ロックが解放されるのを待っている間にブロックするコマンドを実行すると、どのように実装されますか? スレッドは、GIL を再取得して再び実行を開始するタイミングをどのように知るのでしょうか?
これは、「出力は今ここにあるのか?今ここにあるのか?今はどうなのか?」と常にチェックすることで実装されているのだろうか。
I/O の完了やロックの解除を繰り返し確認する必要はありません。
ドライバーへのハードウェア割り込みによって通知された I/O 完了、または別のスレッドからのソフトウェア割り込みによって通知されたロック解放により、これらの操作を待機しているスレッドが「すぐに」準備が整い、実行される可能性が高くなり、プリエンプトされる可能性が高くなります。実行中の別のスレッド。基本的に、ソフトウェアまたはハードウェアの割り込みの後、OS は、割り込みが発生したスレッドとは別のスレッドに割り込みを返すことを決定できます。
ポーリングやチェックを不要にするこのメカニズムの高い I/O パフォーマンスは、予防的なマルチタスカーの苦痛に耐える理由の 99% にあります。