まず、スケジューリング ポリシーは、カーネルに実装されているスケジューリング アルゴリズムに他ならないことを理解してください。したがって、SCHED_FIFO、SCHED_RR、SCHED_OTHER はカーネル内の異なるアルゴリズムです。SCHED_FIFO と SCHED_RR は、リアルタイム スケジューリング アルゴリズムの「クラス」に属します。SCHED_OTHER は、CFS (Completely Fair Scheduler) アルゴリズムとしてより一般的に知られている、システム内の通常のプロセスのスケジューリング アルゴリズムに他なりません。
SCHED_OTHER の優先度ははるかに低い
正確には、優先度が「大幅に」低いわけではありませんが、リアルタイム スケジューリング クラスよりも「a」低い優先度です。Linux スケジューラには、リアルタイム スケジューリング クラス、通常プロセス スケジューリング クラス、アイドル タスク スケジューリング クラスの 3 つのスケジューリング クラスがあります。優先度は次のとおりです。
- リアルタイムスケジューリングクラス。
- 通常のタスク スケジューリング クラス。
- アイドル タスク スケジューリング クラス。
システム上のタスクは、これらのクラスのいずれかに属します。(クラスは変更できますが、タスクは常に 1 つのスケジューリング クラスにしか属することができないことに注意してください)。Linux のスケジューラーは、まずリアルタイム クラスにタスクがあるかどうかをチェックします。存在する場合は、システムで構成されている内容に応じて、SCHED_FIFO または SCHED_RR アルゴリズムを呼び出します。リアルタイム タスクがない場合、スケジューラは通常のタスクをチェックし、実行する準備ができている通常のタスクがあるかどうかに応じて CFS アルゴリズムを呼び出します。また
2 つの異なるスケジューリング クラスで同じプロセスを実行すると、コンテキスト スイッチが増えるのはなぜですか。次の 2 つのケースがあります。
- 一般に、単純なシステムでは、リアルタイム タスクはほとんどなく、ほとんどのタスクは通常のタスク クラスに属します。したがって、そのプロセスをリアルタイム クラスで実行すると、すべてのプロセッサがこのプロセス専用になります (リアルタイム スケジューリング クラスは通常のタスク スケジューリング クラスよりも優先度が高く、リアルタイム タイムがまったくない (/非常に少ない) ため)。 CPU を共有するタスク)。通常のタスク クラスで同じプロセスを実行すると、そのプロセスは他のさまざまなプロセスとプロセッサを共有する必要があるため、より多くのコンテキスト スイッチが発生します。
- システムに多くのリアルタイム タスクが存在する場合でも、問題のリアルタイム スケジューリング アルゴリズムである FIFO と RR の性質により、コンテキスト スイッチが少なくなります。FIFO では、プロセッサは現在のタスクが完了するまで他のタスクに切り替えられません。RR では、プロセスに与えられる一定の間隔 (時間量) があります。CFS を見ると、プロセスが取得するタイムスライスは、プロセッサのランキューにあるタスクの数に比例します。これは、その重みとプロセッサ ランキューの合計重みの関数です。OSクラスを受講しているので、FIFOとRRに精通していると思います。CFS の詳細については、Google で検索するか、勇気がある場合はソース コードを確認することをお勧めします。
答えが完全であることを願っています:)