プリエンプション処理

プロセスがwake_up_process関数などにより走行可能となったとき、RUNキューにリンクされる。ただし、RUNキューにリンクしただけでは、そのプロセスのプライオリティが幾ら高くてもCPUの実行権を与えられることはない。

このプロセスが現在走行中のプロセスよりプライオリティが高い時、スケジューラに対してCPUの明け渡し要求(プリエンプト要求)を出さねばならない(reschedule_idle関数*1)。プリエンプト要求は、カレントプロセスのtask_structのneed_reschedメンバに印を付けることで実現している。*2

プリエンプト要求を受けたスケジューラは、Linuxカーネルの処理が一区切りついたところで再スケジューリングを行う(schedule関数)。再スケジューリングを行うのは、以下のポイントである。

  • システムコール終了時
  • 割り込みハンドラ終了時
  • idle処理

また、これはLinuxカーネルのコード実行中にはプリエンプションが発生しないことを意味している。Linuxカーネル内走行中のプロセスは明示的にスケジューラを呼び出さない限り、他のプロセスにCPUを奪われることはない。これはLinuxカーネル内の資源排他を単純化することに役立っている。*3


(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1


  1. *1ほんの少ししかプライオリティ差が無いときは、要求を出さない
  2. *2マルチプロセッサ対応以前は、システムグローバルなデータだったようだ。マルチプロセッサ化したときにタスクの状態にしてしまったが、実はCPU個別の状態とすべきである。
  3. *3一方Linuxをリアルタイムシステムなどに提供する場合、応答性を稼ぐことができないことを意味している。リアルタイムプロセスであってもLinuxカーネル実行中にCPUを奪い取ることは不可能である