Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
マルチプロセッサ動作時のスケジューラの動きを以下に示す。★印が、シングルプロセッサから追加される機能である。
schedule() タスクキューtq_schedulerの実行(run_task_queue関数) <詳しくは後述> BHハンドラ呼び出し(do_bottom_half関数) <詳しくは後述> プリエンプション要求をクリア if(スケジューラを呼び出したプロセスの状態がTASK_RUNNINGでない){ プロセスをRUNキューから外す(del_from_runqueue関数) } while(RUNキューに継っている全てのプロセスに対して) { ★ただし、現在CPUが割り当てられている(has_cpuフラグが立っている)プロセスを除き、 最も高いプライオリティのプロセスを探す(goodness関数) } while(システム上の全てのプロセスに対して) { プライオリティ再計算 } ★選ばれたプロセスのtask_structにCPU番号を格納(processorメンバ) ★選ばれたプロセスをCPU割当て状態にする(has_cpuフラグを立てる) プロセスコンテキストの切替え(switch_to関数) ★if(まさに今WAITするためCPUを放棄したプロセスにwake_upが行われた) ★カレントプロセスに再スケジーリング要求を出す ★CPUを放棄したプロセスのCPU割り当て状態を解除(has_cpuフラグのクリア)
スケジューラに対し、再スケジューリング要求を出す関数(reschedule_idle関数)もマルチプロセッサを意識した動作になる。CPU間通信はヘビーな為、 ほどほどのところで妥協した作りとなっている。以下のような方針でプリエンプト要求を出すCPUを選んでいる。二つのCPUが存在する時、優先度でみて上から二つのプロセスにCPUが割り当てられるわけではない。
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:11, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members