今朝、私はLinuxのリアルタイムスケジューリングについて読みました。 「Robert LoveによるLinuxシステムプログラミング」という本のとおり、2つの主要なスケジューリングがあります。 1つはSCHED_FIFO、fifoで、もう1つはSCHED_RR、ラウンドロビンです。そして、私はfifoとrrアルゴリズムがどのように機能するかを理解しました。しかし、システムコールがあるので、
sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)
プロセスのスケジューリングポリシーを明示的に設定できます。そのため、場合によっては、2つのプロセスがルートで実行され、異なるスケジューリングポリシーを持つ可能性があります。 SCHED_FIFOを持つ1つのプロセスとSCHED_RRを持つ同じ優先順位の別のプロセスとして。その場合、どのプロセスが最初に選択されますか? FIFOクラス化プロセスまたはRRクラス化プロセス?なぜですか?
このケースを考えてみましょう。 A、B、Cの3つのプロセスがあります。すべてが同じ優先度を持っています。 AとBはRRクラス化されたプロセスであり、CはFIFO=クラス化されたものです。AとBは実行可能です(そのため、どちらかが交互に実行されます)現在Aが実行されています。今度はCが実行可能になります。この場合、
1. A will preempt for C, or
2. A will run until its timeslice goes zero and let C run. Or
3. A will run until its timeslice goes zero and let B run.
a) here after B runs till its timeslice becomes zero and let C run or
b) after B runs till its timeslice becomes zero and let A run again (then C will starve untill A and B finishes)
リアルタイムスケジューリングでは、FIFOとRRは、非リアルタイムスケジューリングと同じ意味ではありません。プロセスは常にFIFO方式で選択されますが、SCHED_FIFOのタイムクォンタムはSCHED_RRのタイムクォンタムとは異なり、制限されます。
SCHED_FIFOプロセスは、同じ優先順位のSCHED_RRプロセスに優先しません。
sched_setscheduler(2)-Linuxのマニュアルページ
...
「プロセスのスケジューリングポリシーは、静的優先度が等しいプロセスのリストに挿入される場所と、このリスト内での移動方法を決定します。すべてのスケジューリングはプリエンプティブです。静的優先度が高いプロセスが実行可能になると、現在実行中です。プロセスは横取りされ、静的優先度レベルの待機リストに戻されます。スケジューリングポリシーは、静的優先度が等しい実行可能プロセスのリスト内の順序のみを決定します。」
...
「SCHED_FIFOプロセスは、I/O要求によってブロックされるか、優先順位の高いプロセスによって横取りされるか、sched_yield(2)を呼び出すまで実行されます。」
...
「SCHED_FIFOプロセスが実行可能になると、その優先順位のリストの最後に挿入されます。」
...
"SCHED_RR:ラウンドロビンスケジューリング
SCHED_RRは、SCHED_FIFOの単純な拡張機能です。上記のSCHED_FIFOについての説明はすべて、SCHED_RRにも適用されます。ただし、各プロセスは最大タイムクォンタムでのみ実行できます。 SCHED_RRプロセスがタイムクォンタム以上の時間実行されている場合、その優先度のリストの最後に配置されます。優先順位の高いプロセスによってプリエンプトされたSCHED_RRプロセスは、実行中のプロセスがラウンドロビンタイムクォンタムの期限切れになっていない部分を完了するため、その後実行を再開します。
man sched_setscheduler
では、これらのスケジューリングポリシーについて詳しく説明しています。
この特定のケースでは、2つのリアルタイムプロセスの優先順位が同じであるため、どちらのプロセスも他のプロセスを優先しません。 SCHED_FIFO
プロセスは、それ自体がブロックされるまで実行され、SCHED_RR
プロセスは、それ自体をブロックするか、そのタイムクォンタムが期限切れになるまで実行されます。
Manページによると、1が答えだと思います。 A、BはRRポリシー、CはFIFOポリシーです。RRも拡張FIFOであるため、それらはすべてFIFOクラスです。
それらのすべてが同じ優先度を持ち、manページには「sched_setscheduler()またはsched_setparam(2)の呼び出しにより、pidで識別されるSCHED_FIFO(またはSCHED_RR)プロセスが実行可能であればリストの先頭に置かれます。結果として、同じ優先度の場合、現在実行中のプロセスを横取りする可能性があります(POSIX.1-2001では、プロセスがリストの最後に移動するように指定されています)。
Sched_setschedulerを呼び出してCのポリシーをFIFOとして設定すると、CはAをプリエンプトします。
2つの異なるクラスについての私の理解は、プロセスSCHED_FIFOがカーネルによって横取りされることは決してないということです。別の「SCHED_FIFO」クラスプロセスが順番を待っている場合でも...
SCHED_RRポリシーはcpuリソースを共有しますが、もう少しリソースを増やします。スケジューラーは、一定時間の間SCHED_RRプロセスを実行させてから、それを横取りして、別のSCHED_RRプロセスを実行させます。それはまさにラウンドロビンです。
SCHED_FIFOは、SCHED_FIFOプロセスがカーネルにyield()しない、またはシングルコアデバイスでシステムコールを呼び出さない場合、他のすべてのリアルタイムプロセスが実行されない可能性があるという意味で「より強力」です。