スケジューラーについて
ちょっと、最近スケジューラーについて個人的にみていているので、忘れないように簡単にメモっておく。
注意:
このエントリは、書いている人がLinuxカーネル解読質の1章で気になった内容をたんたんとメモっておくだけのエントリです。過度な期待はしないでください。
- 実行可能なプロセスは、RUNキューと呼ばれるキューにつながれる
- RUNキューは、CPU単位で存在する
- CPU単位なのでCPUが独立して動きやすくなり、スケーラビリティが向上する
- 2.4のころは、RUNキューは全体で一つだったので、マルチプロセッサでは同期が必要となり無駄があった
- CPU単位なのでCPUが独立して動きやすくなり、スケーラビリティが向上する
- RUNキューは、CPU単位で存在する
- RUNキューの構造は、activeキューとexpiredキューという2つのキューからなる
- それぞれのキューは、実行優先度のスロットをもっており、キューから取り出されるときは実行優先度の高い物からとりだされる
- activeキューには実行可能な状態のプロセスが、expiredには実行された実行可能プロセスがつながれている
- activeキューから、実行可能なプロセスを取り出し実行、プロセスが実行時間を使い切ったらexpiredキューにつなげる
- activeキューが空になったら、activeキュートexpiredキューを入れ替えて、実行していく
- RUNキューがもっているプロセスがactive,expired共にからであった場合で、他のCPUが実行可能なプロセスを持っていると、それを実行する
- とりだせるプロセスが無くなった場合は、IDLEプロセスを実行する
- 通常プロセスが実行されるCPUは固定される
- キャッシュやTLb(アドレス変換バッファ)の利用効率をたかめるため
- CPUのbusy状態の偏りがあるばあいは、ロードバランスする
- sched_setaffinityシステムコールでプロセスを特定のCPUに固定しておくことが可能
現状の疑問点
pthreadでスレッドを立ち上げた際、Linuxだとスレッド単位でスケジュールされるわけだけど、同一のスレッドが同じCPUに貼り付けになってしまい、マルチプロセッサの使用効率があがらないんじゃまいか。(ただし、プロセスからforkされたプロセスが同一のCPUで実行されると思っている僕の仮定が正しければの疑問点)
O(1)スケジューラーの概要を初めて知ったのは、大学時代にカーネル2.6のドラフトを眺めていたときなんだけど、そのときすごく感動したのを覚えています。こんな単純な構造なんだって。
参考:
2008-02-14 - ちくわプログラマの作業履歴@はてな
- 作者: 高橋浩和,小田逸郎,山幡為佐久
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/11/18
- メディア: 単行本
- 購入: 14人 クリック: 197回
- この商品を含むブログ (118件) を見る