実行中のプロセスが自発的または非自発的にCPUを放棄するのはなぜですか? CPU/コアではいつでも1つのプロセスしか実行できないからです。
答え1
ほとんどのシステムコール(デフォルトでは、プロセスをサービスキューに入れる呼び出し)は、カーネルスケジューラが次に最も緊急なプロセスをキャッチして実行するようにします。マルチコアの場合はもう少し複雑で、プロセスを特定のコアまたはCPUに割り当てることができます。
プロセッサ時間も最大タイムスロットに割り当てられ、各クロックサイクルごとに、スケジューラは現在のプロセスがフルタイムフラグメントを使用したかどうかを確認します。そうであれば、サスペンドされ(つまり、チック割り込みから返されません)、一時的なnice値が増加し、ディスパッチキューの先頭から遠くなります。これにより、I/O を多く実行するプログラムが短いタイムスロットを多く取得し、CPU 集約的なプログラムが長い時間スロットをいくつか持つようになります。
これらすべてはかなり初期のUnixシステムを説明していますが(最近そのレベルで作業したことがないため)、おそらくあまり変わっていないでしょう。元のデザインでは大幅に改善できません。