スケジューラーについて

ちょっと、最近スケジューラーについて個人的にみていているので、忘れないように簡単にメモっておく。

注意:
このエントリは、書いている人がLinuxカーネル解読質の1章で気になった内容をたんたんとメモっておくだけのエントリです。過度な期待はしないでください。

  • 実行可能なプロセスは、RUNキューと呼ばれるキューにつながれる
    • RUNキューは、CPU単位で存在する
      • CPU単位なのでCPUが独立して動きやすくなり、スケーラビリティが向上する
        • 2.4のころは、RUNキューは全体で一つだったので、マルチプロセッサでは同期が必要となり無駄があった
  • RUNキューの構造は、activeキューとexpiredキューという2つのキューからなる
    • それぞれのキューは、実行優先度のスロットをもっており、キューから取り出されるときは実行優先度の高い物からとりだされる
    • activeキューには実行可能な状態のプロセスが、expiredには実行された実行可能プロセスがつながれている
    • activeキューから、実行可能なプロセスを取り出し実行、プロセスが実行時間を使い切ったらexpiredキューにつなげる
    • activeキューが空になったら、activeキュートexpiredキューを入れ替えて、実行していく
    • RUNキューがもっているプロセスがactive,expired共にからであった場合で、他のCPUが実行可能なプロセスを持っていると、それを実行する
    • とりだせるプロセスが無くなった場合は、IDLEプロセスを実行する
  • 通常プロセスが実行されるCPUは固定される

現状の疑問点
pthreadでスレッドを立ち上げた際、Linuxだとスレッド単位でスケジュールされるわけだけど、同一のスレッドが同じCPUに貼り付けになってしまい、マルチプロセッサの使用効率があがらないんじゃまいか。(ただし、プロセスからforkされたプロセスが同一のCPUで実行されると思っている僕の仮定が正しければの疑問点)


O(1)スケジューラーの概要を初めて知ったのは、大学時代にカーネル2.6のドラフトを眺めていたときなんだけど、そのときすごく感動したのを覚えています。こんな単純な構造なんだって。

参考:
2008-02-14 - ちくわプログラマの作業履歴@はてな

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室