スケジューラ

スケジューラは プロセスとスレッドを全く区別せずに扱う。実行可能なプロセス(スレッド)は下図のRUNキューにリンクされている。スケジューラはこのRUNキューに継っているプロセスのうち最も高い優先度を持つプロセスを選び出しCPU(実行権)を与える。現在実行中のプロセスはcurrentというポインタにより指されている。

何も実行するプロセスがなくなると、スケジューラはidleと呼ばれる何もしないプロセスに実行権を渡す。

img4.gif
  schedule()
     タスクキューtq_schedulerの実行(run_task_queue関数) <詳しくは後述>
     BHハンドラ呼び出し(do_softirq関数) <詳しくは後述>
     プリエンプション要求をクリア
     if(スケジューラを呼び出したプロセスの状態がTASK_RUNNINGでない){
           プロセスをRUNキューから外す(del_from_runqueue関数)
     }
     while(RUNキューに継っている全てのプロセスに対して) {
           最も高いプライオリティのプロセスを探す(goodness関数)
     }
     while(システム上の全てのプロセスに対して) {
           プライオリティ再計算
     }
     プロセスコンテキストの切替え(switch_to関数)

補足

Linuxのスケジューラは非常にシンプルな作りになっている。RUNキューも一つしか無く、毎回全てを線形サーチしているため、巨大なシステムでは少々非効率だと思われる。


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