私が理解したのは、Linuxプロセスにはスケジューリング目的のための「良い」値とリアルタイムの優先順位の値があり、これとnice
コマンドを使用してchrt
明示的に変更できます。ユーザーがプロセスのリアルタイム優先順位を明示的に設定していない場合、どのように設定されますか?
答え1
ロバート・ラブの言葉を引用するには:
スケジューラは、プロセスがインタラクティブかどうかを魔法のように知ることはできません。タスクがI / O中心かプロセッサ中心かを正確に反映するいくつかの経験的な方法が必要です。最も代表的な指標は作業期間です。眠る。仕事がほとんどの時間を過ごして過ごしたら、I/O制限。ジョブがスリープモードに入るよりも実行に時間がかかる場合、そのジョブは失敗します。インタラクティブ。これは非常に拡張され、ほぼ常に眠りにつくことです。 完全にI/Oに縛られている、ほぼ常に実行できるタスクは次のとおりです。プロセッサが完全に制限されている。
これらの経験的方法を実装するために、Linuxはプロセスがスリープ状態で費やした時間と、プロセスが実行可能状態で費やした時間を記録する[実行]タブを維持します。値は
sleep_avg member
に保存されますtask_struct
。MAX_SLEEP_AVG
デフォルトでは、範囲は0〜10ミリ秒です。ジョブがスリープモードの後に実行可能になると、sleep_avg
この値に達するまでスリープ期間だけ増加しますMAX_SLEEP_AVG
。ジョブが実行されるタイマーティックごとに、ジョブはsleep_avg
ゼロに達するまで減少します。
したがって、私はカーネルが上記のヒューリスティックに基づいてスケジューリングポリシーを決定すると信じています。私が知っている限り、リアルタイムプロセスの場合、スケジューリングポリシーはまたはいずれかSCHED_FIFO
ですSCHED_RR
。両方の戦略は、SCHED_RR
時間フラグメントの代わりに時間フラグメントがあることを除いて同様ですSCHED_FIFO
。
ただし、リアルタイムのプロセススケジュールを変更することもできます。あなたは参照することができますこれリアルタイムプロセススケジューリングの変更方法に関する質問です。
引用する
http://www.informit.com/articles/article.aspx?p=101760&seqNum=2
答え2
カーネルのコンポーネントであるプロセススケジューラは、優先順位ベースのスケジューリングアルゴリズムを使用して、特定のシステムのプロセス間にプロセッサ時間を割り当てる方法を決定します。最初の基本優先順位または基本優先順位0(私の意見では)から始めて、スケジューラはプロセスがI / OまたはCPU集約的であるかどうかに基づいて、スケジューリング目標を達成するために優先順位を動的に増減できます。 I/O ジョブを待つのに時間を費やす I/O プロセスは優先順位が動的に増加しますが、タイム スライス (タスクがプリエンプトされるまで実行できる時間) を継続的に使用する CPU 集約的プロセスは優先順位が動的に減少します。
アプリケーションの種類(ブラウザ/IDEなどの対話型)に応じて、スケジューラはポリシーを使用して優先順位を設定し、それに応じて設定します。エンドユーザーはこれらからの応答を期待しているため、対話型の優先順位が高くなります。