25

今朝、Linux のリアルタイム スケジューリングについて読みました。「Robert Love による Linux システム プログラミング」という本によると、そこには 2 つの主要なスケジューリングがあります。1 つは SCHED_FIFO、fifo で、2 番目は SCHED_RR、ラウンド ロビンです。そして、fifo と rr アルゴリズムがどのように機能するかを理解しました。しかし、システムコールがあるので、

sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)

プロセスのスケジューリング ポリシーを明示的に設定できます。そのため、場合によっては、root によって実行される 2 つのプロセスが異なるスケジューリング ポリシーを持つことがあります。1 つのプロセスが SCHED_FIFO を持ち、別のプロセスが 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)
4

4 に答える 4

18

リアルタイム スケジューリングでは、FIFO と RR は、非リアルタイム スケジューリングとまったく同じ意味を持つわけではありません。プロセスは常に FIFO 方式で選択されますが、SCHED_RR のタイム クォンタムとは異なり、SCHED_FIFO のタイム クォンタムは制限されません。

SCHED_FIFO プロセスは、同じ優先度の SCHED_RR プロセスを横取りしません。

sched_setscheduler(2) - Linux の man ページ

...

「プロセスのスケジューリング ポリシーは、同じ静的優先度を持つプロセスのリストに挿入される場所と、このリスト内でどのように移動するかを決定します。すべてのスケジューリングはプリエンプティブです。より高い静的優先度を持つプロセスが実行可能になると、現在実行中のプロセスはプリエンプトされ、その静的優先度レベルの待機リストに戻されます。スケジューリング ポリシーは、静的優先度が等しい実行可能なプロセスのリスト内での順序のみを決定します。"

...

「SCHED_FIFO プロセスは、I/O 要求によってブロックされるか、より優先度の高いプロセスによって横取りされるか、sched_yield(2) を呼び出すまで実行されます。」

...

「SCHED_FIFO プロセスが実行可能になると、優先順位のリストの最後に挿入されます。」

...

"SCHED_RR: ラウンド ロビン スケジューリング

SCHED_RR は、SCHED_FIFO を単純に拡張したものです。上記の SCHED_FIFO に関する説明はすべて SCHED_RR にも適用されますが、各プロセスは最大時間単位でしか実行できないという点が異なります。SCHED_RR プロセスがタイム クォンタム以上の期間実行されている場合、優先順位のリストの最後に配置されます。より優先度の高いプロセスによってプリエンプトされた SCHED_RR プロセスは、実行中のプロセスとして実行を再開し、ラウンド ロビンのタイム クォンタムの期限切れになっていない部分を完了します。」

于 2012-02-21T09:23:02.947 に答える
10

man sched_setschedulerでは、これらのスケジューリング ポリシーについて詳しく説明しています。

この特定のケースでは、2 つのリアルタイム プロセスの優先度が同じであるため、どちらも他方をプリエンプトしません。SCHED_FIFOプロセスは、それ自体がブロックされるまで実行されます。プロセスは、それ自体がブロックSCHED_RRされるまで、またはそのタイム クォンタムが期限切れになるまで実行されます。

于 2012-02-21T09:11:54.430 に答える
1

マニュアルページによると、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 を先取りします。

于 2013-08-06T02:24:15.640 に答える
-1

2 つの異なるクラスについての私の理解では、プロセス SCHED_FIFO がカーネルによってプリエンプトされることはありません。別の「SCHED_FIFO」クラスのプロセスが順番を待っていても...

SCHED_RR ポリシーは CPU リソースをもう少し共有します。スケジューラは、SCHED_RR プロセスを一定時間実行させ、別の SCHED_RR プロセスを回すためだけに先取りします。まさにラウンドロビンです。

SCHED_FIFO は、SCHED_FIFO プロセスがカーネルに yield() したり、単一のコア デバイスでシステム コールを呼び出したりしない場合、他のすべてのリアルタイム プロセスが実行されない可能性があるという意味で「より強力」です。

于 2012-02-21T09:12:54.570 に答える