sched_setscheduler は言う:
すべてのスケジューリングはプリエンプティブです。より高い静的優先度を持つプロセスが実行可能になると、現在実行中のプロセスが優先され、静的優先度レベルの待機リストに戻ります。
while setpriority は言う
これにより、Nice値が非常に低い(+19)ので、システムに他の優先度の高い負荷がある場合は、CPUが本当にほとんどプロセスに提供されず、Nice値が高い(-20)の場合、CPUのほとんどがそれを必要とするアプリケーションに提供されます。
では、Nice値を変更すると、プログラムの実行にどのように影響しますか? RTスケジューリング(ニース値が高いプログラムがニース値が低いプログラムを中断する)と似ていますか?
インターネット上のすべての情報は、Nice
の使用方法とプロセスの優先順位を変更する方法です。優先度の異なるプロセスがどのように機能するかを正確に説明するリンクはありません。私もソースコードを見つけることができませんでした。
特定のプロセスが受け取るプロセッサ時間の割合は、そのプロセスと他の実行可能なプロセスとの間の快適さの相対的な違いによって決まります。
Linux Completely Fair Scheduler(CFS)は、ナイスネスに基づいてweightを計算します。重みは、おおよそ1024 / (1.25 ^ Nice_value)
と同等です。ニース値が減少するにつれて、重みは指数関数的に増加します。プロセスに割り当てられたタイムスライスは、プロセスの重みを実行可能なすべてのプロセスの合計重みで割った値に比例します。 CFSの実装はkernel/sched/fair.c
にあります。
CFSには、スケジューリング期間のターゲットレイテンシがあります。ターゲットレイテンシが小さいほど対話性は向上しますが、ターゲットレイテンシが減少すると、スイッチングオーバーヘッドが増加し、全体的なスループットが低下します。
たとえば、20ミリ秒のターゲットレイテンシと、同等のナイスネスの2つの実行可能なプロセスが与えられた場合、両方のプロセスは、他のプロセスに優先してプリエンプトされる前に、それぞれ10ミリ秒間実行されます。同等の良さのプロセスが10個ある場合、各プロセスはそれぞれ2ミリ秒実行されます。
ここで、2つのプロセスを考えます。1つはnicenessが0(デフォルト)、もう1つはnicenessが5です。対応する重み間の比例差は約1/3です。つまり、優先順位の高いプロセスは約15ミリ秒のタイムスライスを受け取ります。一方、優先順位の低いプロセスは5ミリ秒のタイムスライスを受け取ります。
最後に、それぞれniceness値が5と10の2つのプロセスを考えます。この場合、絶対的なnicenessは大きくなりますが、niceness値間のrelativeの差は前の例と同じであり、同じタイムスライス分割になります。