4.2. CPU のスケジューリング
スケジューラー には、システム内の CPU を無駄なく稼働させる役割があります。Linux スケジューラーは多くのスケジューリングポリシー を実行し、これらのポリシーが特定の CPU コア上でスレッドがいつ、どれくらい長く実行するかを決定します。
スケジューリングポリシーは 2 つのカテゴリーに分けられます。
- リアルタイムポリシー
- SCHED_FIFO
- SCHED_RR
- 通常のポリシー
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. リアルタイムのスケジューリングポリシー
最初にリアルタイムスレッドがスケジュールされ、すべてのリアルタイムスレッドの後で通常のスレッドがスケジュールされます。
リアルタイムポリシーは、割り込みなしで完了する必要のある、時間的にクリティカルなタスクに使用されます。
SCHED_FIFO
- このポリシーは static priority scheduling (静的優先順位スケジューリング) とも呼ばれます。これは、各スレッドの固定優先順位 (1 から 99 の間で) を定義するためです。このスケジューラーは、SCHED_FIFO スレッド一覧を優先順位でスキャンして、実行準備ができているもので最も優先順位が高いスレッドをスケジュールします。このスレッドは、ブロックまたは終了するか、実行準備ができたより優先順位の高いスレッドに取って代わられるまで実行します。優先順位が一番低いリアルタイムスレッドでも、非リアルタイムポリシーのスレッドよりも先にスケジュールされます。リアルタイムスレッドが 1 つだけの場合は、
SCHED_FIFO
の優先順位の値は無関係になります。 SCHED_RR
SCHED_FIFO
ポリシーのラウンドロビン版です。SCHED_RR
スレッドも固定優先順位 (1 から 99 の間で) が与えられます。しかし、優先順位が同じスレッドは、特定のクォンタム、または時間枠内でラウンドロビンでスケジュールされます。sched_rr_get_interval(2)
システムコールはこの時間枠の値を返しますが、時間枠の長さをユーザーが設定することはできません。このポリシーは、同じ優先順位で複数のスレッドを実行する必要がある場合に有用です。
リアルタイムスケジューリングポリシーの定義済みセマンティクスについての詳細情報は、システムインターフェース — リアルタイムにある 『IEEE 1003.1 POSIX standard』 を参照してください。http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html で見ることができます。
スレッド優先順位付けの定義におけるベストプラクティスは、初めは順位を低く設定し、正当な待ち時間が特定された時にだけ優先順位を高くするという方法です。リアルタイムスレッドは、通常のスレッドのように時間枠があるものではありません。
SCHED_FIFO
スレッドは、ブロックまたは終了するか、より優先順位の高いスレッドに取って代わられるまで実行します。このため、優先順位を 99 に設定することは推奨されません。これだと、プロセスをマイグレーションやウォッチドッグスレッドと同じ優先順位とすることになってしまいます。スレッドが演算ループに入ってしまったためにこれらのスレッドがブロックされると、実行不可能となってしまいます。この状況では、ユニプロセッサーシステムは最終的にはロックアップしてしまいます。
Linux カーネルでは、
SCHED_FIFO
ポリシーには帯域幅制限メカニズムが含まれます。これによりリアルタイムのアプリケーションプログラマーを、CPU を独占する可能性のあるリアルタイムタスクから保護します。このメカニズムは、以下の /proc
ファイルシステムパラメーターで調整できます。
/proc/sys/kernel/sched_rt_period_us
- CPU 帯域幅の 100% と考えられる時間をマイクロ秒で定義します (「us」はプレーンテキストで「µs」に一番近いもの)。デフォルト値は 1000000µs もしくは 1 秒です。
/proc/sys/kernel/sched_rt_runtime_us
- リアルタイムスレッドの実行に当てられる時間をマイクロ秒で定義します (「us」はプレーンテキストで「µs」に一番近いもの)。デフォルト値は 950000µs もしくは 0.95 秒です。