RunQueue
Rev.8を表示中。最新版はこちら。
RUNNING状態のプロセスがつながれる。RunQueueはCPU毎に存在する。さらに、RunQueueはプロセスの優先度毎(0-139)にリストを持ち、プロセスは自分の 動的優先度に該当するキューにつながれる。優先度毎にリストを持つことで最高優先度のプロセスを高速に取りだせる。
表1 struct runqueueのフィールド(一部)
フィールド | 意味 |
---|---|
nr_running | RUNNINGプロセス数(active,expireにつながれている総プロセス数) |
active | CPU時間が残っているRUNNINGプロセスが保持される。優先度毎にリストがある。 |
expire | CPU時間を使い切ったRUNNINGプロセスが保持される。優先度毎にリストがある。 |
expired_timestamp | expireに初めてプロセスを移動した時間。 active<->expireの入れ換えをしたり、IDLE状態になるとクリアされる。 |
Active,Expireリスト
RunQueueにはActiveリストとExpireリストがある(上記の優先度毎のリストはActive,Expireリストの中にそれぞれ収容されている)。Activeリストは、まだCPU時間が残っているプロセスがチェーンされ、ExpireリストにはCPU時間を使い切ったプロセスがチェーンされる。スケジューラはActiveリスト内のプロセス間でスケジューリングを行う。
CPU時間を使い切ったプロセスはExpireリストに移動されスケジューリングの対象外となり、ここで、全RUNNINGプロセスがCPU時間を使い切るのを待つ。
Activeリストの全プロセスがCPU時間を使いきってActiveリストが空になると、Active,Expireリストを入れ換えて、新たにCPU時間が割り当てられ(*1)、スケジューリングが再開される。
(*1) 正確にはExpireに移動した時に、次のCPU時間が設定されている。
Linux2.2ではActive,Expireリストはなく、リストが一つだったので、スケジューリングの際、CPU時間を使い切ったRUNNINGプロセスを毎回読み飛ばしていた。CPU時間が残っているプロセスと使いきったプロセスの区別を軽くするために用意された。
[関連ページ]
スケジューラ