[[PageNavi(internal24-navi)]]
{{{ comment
h2w-title:プリエンプション処理
}}}
= プリエンプション処理 = #SECTION02150000000000000000
プロセスがwake_up_process関数などにより走行可能となったとき、RUNキューにリンクされる。ただし、RUNキューにリンクしただけでは、そのプロセスのプライオリティが幾ら高くてもCPUの実行権を与えられることはない。
このプロセスが現在走行中のプロセスよりプライオリティが高い時、スケジューラに対してCPUの明け渡し要求(プリエンプト要求)を出さねばならない(reschedule_idle関数[[Footnote(ほんの少ししかプライオリティ差が無いときは、要求を出さない)]])。プリエンプト要求は、カレントプロセスのtask_structのneed_reschedメンバに印を付けることで実現している。[[Footnote(マルチプロセッサ対応以前は、システムグローバルなデータだったようだ。マルチプロセッサ化したときにタスクの状態にしてしまったが、実はCPU個別の状態とすべきである。)]]
プリエンプト要求を受けたスケジューラは、Linuxカーネルの処理が一区切りついたところで再スケジューリングを行う(schedule関数)。再スケジューリングを行うのは、以下のポイントである。
* システムコール終了時
* 割り込みハンドラ終了時
* idle処理
また、これはLinuxカーネルのコード実行中にはプリエンプションが発生しないことを意味している。Linuxカーネル内走行中のプロセスは明示的にスケジューラを呼び出さない限り、他のプロセスにCPUを奪われることはない。これはLinuxカーネル内の資源排他を単純化することに役立っている。[[Footnote(一方Linuxをリアルタイムシステムなどに提供する場合、応答性を稼ぐことができないことを意味している。リアルタイムプロセスであってもLinuxカーネル実行中にCPUを奪い取ることは不可能である)]]
----
''(NIS)HirokazuTakahashi [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1
[[PageNavi(internal24-navi)]]