第2章 RHEL for Real Time のスケジューリングポリシー

リアルタイムでは、スケジューラーは、実行する実行可能なスレッドを決定するカーネルコンポーネントです。各スレッドには、関連付けられたスケジューリングポリシーおよび静的スケジューリング優先度 (sched_priority) があります。スケジューリングはプリエンプティブであるため、静的優先度の高いスレッドの実行の準備ができると、現在実行中のスレッドは停止します。その後、実行中のスレッドは静的優先度の waitlist に戻ります。

すべての Linux スレッドには、以下のいずれかのスケジューリングポリシーがあります。

  • SCHED_OTHER または SCHED_NORMAL: デフォルトのポリシーです。
  • SCHED_BATCH: SCHED_OTHER に似ていますが、増分指向です。
  • SCHED_IDLE: SCHED_OTHER より優先度の低いポリシーです。
  • SCHED_FIFO: 先入れ先出しのリアルタイムポリシーです。
  • SCHED_RR: ラウンドロビンのリアルタイムポリシーです。
  • SCHED_DEADLINE: ジョブの期限に従ってタスクに優先度を割り当てるスケジューラーポリシーです。絶対期限が最も早いジョブが最初に実行されます。

2.1. スケジューラーポリシー

リアルタイムスレッドは標準スレッドよりも優先度が高くなります。ポリシーには、最小値 1 から最大値 99 までの範囲のスケジューリング優先順位値があります。

次のポリシーは、リアルタイムにとって重要です。

  • SCHED_OTHER または SCHED_NORMAL ポリシー

    これは、Linux スレッドのデフォルトスケジューリングポリシーです。スレッドの特性に基づいてシステムによって変更される動的な優先度があります。SCHED_OTHER スレッドの nice 値は、最高の優先度である 20 と最低の優先度である 19 の間です。SCHED_OTHER スレッドのデフォルトの nice 値は 0 です。

  • SCHED_FIFO ポリシー

    SCHED_FIFO を持つスレッドは、SCHED_OTHER タスクよりも高い優先度で実行されます。SCHED_FIFO は、nice 値を使用する代わりに、最低が 1 で最高が 99 の固定された優先度を使用します。優先度 1 の SCHED_FIFO スレッドは、SCHED_OTHER スレッドよりも常に先にスケジュールされます。

  • SCHED_RR ポリシー

    SCHED_RR ポリシーは、SCHED_FIFO ポリシーに似ています。同じ優先度のスレッドは、ラウンドロビン方式でスケジュールされます。SCHED_FIFO および SCHED_RR スレッドは以下のイベントのいずれかが発生するまで実行されます。

    • スレッドはスリープ状態になるか、イベントを待機します。
    • 優先度の高いリアルタイムスレッドを実行する準備が整います。

      上記のイベントのいずれかが発生しない限り、スレッドは指定されたプロセッサーで無期限に実行されますが、優先度の低いスレッドは実行を待機しているキューに残ります。これにより、システムサービススレッドが常駐し、スワップアウトが妨げられ、ファイルシステムデータのフラッシュが失敗する可能性があります。

  • SCHED_DEADLINE ポリシー

    SCHED_DEADLINE ポリシーはタイミング要件を指定します。タスクの期限に従って各タスクをスケジュールします。Earliest Deadline First (EDF) スケジュールを持つタスクが最初に実行されます。

    カーネルは、runtime⇐deadline⇐period が true である必要があります。必要なオプション間の関係は、runtime⇐deadline⇐period です。