LinuxのSCHED_FIFOおよびSCHED_RR
-
03-07-2019 - |
質問
私は非常に小さなデーモンを書いています。これは、システムに深刻なストレスがかかっていても応答し続ける必要があります。私は、スケジュールに関してSCHED_FIFOとSCHED_RRの違いを検討しています。また、賢明な優先順位を決定しようとしています。
小規模ではあるが重要な監視デーモンに適しているスケジューラはどれですか? 2つの違いを理解しようとすると、まだ少しあいまいになります。
私のプログラムは3k未満で割り当て(mlockall()を使用)、約600バイトをxenbusに書き込んでからスリープしますが、実際にデータを書き込むのにかかる時間(ミリ秒単位)を知ることはできません。 。書き込まれる内容は構成ファイルに依存するため。
提案/説明をお寄せいただきありがとうございます。
解決
デジタルテレビ信号をキャプチャする悪名高い pchdtvr
プログラムは、 SCHED_FIFO
を使用して、テレビパケットがディスクに書き込まれることを確認します。古いコンピューターでDoomをプレイしながら、一度に4つのショーをキャプチャできます。
このプログラムはGPLの下でリリースされ、作者取り消そうとしたため、このプログラムは悪名高いです。 GPLを遡及的に。この行為は、小火事を引き起こしました。とにかく、 http://frequal.com/pmn/pchdtvr.html 。
他のヒント
SCHED_FIFOは、優先度の高い別のプロセスが実行キューに表示されない限り、プリエンプトできません(コンテキストを別のプロセスに切り替えます)。
SCHED_RRは、タイムクォンタム(実行するプロセスに与えられた遅延)によってプリエンプトできます。
これらは両方とも「リアルタイム」ですLinuxベースのスケジューラーの優先順位。
私はスケジューリングスキームの専門家ではありませんが、ご覧ください
man sched_setscheduler
さまざまなスケジューリングアルゴリズムの違いを詳しく説明し、他のスケジューリング機能へのリンクを提供します。 SCHED_FIFOは実際にはかなり危険に聞こえますが、最も積極的なスケジューリングとして説明されています。
SCHED_FIFOプロセスは、I / O要求によってブロックされるか、より高い優先順位のプロセスによってプリエンプトされるか、sched_yield(2)を呼び出すまで実行されます。
システムをロックしないように注意してください。私は個人的にいくつかの経験的テストを行い、どの優先度が最適で、どのように動作するかを確認します。
他のすべてのタスクが標準スケジューラを使用する場合、違いはありません。 SCHED_FIFOとSCHED_RRは、これらのタスクの相互のスケジューリングにのみ影響します。
通常のシステムでは違いはありません。 FIFOは理解するのが最も簡単なので、それを使用します。
優先順位の異なる複数のタスクがある場合、すべてのタスクの実行準備が整っていれば、高いタスクのみが実行されます(CPUコアが1つしかない)