誰かが「実際の」プロセスの優先順位を説明できますか(つまり、pri_baz
ps
のフィールドが計算されますか?
私の推測は:
pri_baz = 99 - static_priority # if static_priority > 0 (real-time process)
pri_baz = 100 + min(20 + Nice + dynamic_adjustment, 39) # if static_priority = 0 (time-shared process)
これは、次のテストでサポートされています。
# chrt -r 1 sleep 1 \
> & chrt -r 99 sleep 1 \
> & Nice --20 sleep 1 \
> & Nice -19 sleep 1 \
> & ps -C sleep -O pri_baz
[1] 25408
[2] 25409
[3] 25410
[4] 25411
PID BAZ S TTY TIME COMMAND
25408 98 S pts/3 00:00:00 sleep 1
25409 0 S pts/3 00:00:00 sleep 1
25410 100 S pts/3 00:00:00 sleep 1
25411 139 S pts/3 00:00:00 sleep 1
しかし、私は困惑しています:
pri_baz
= 99は未使用のようです。
Linuxが(デフォルトで)140の優先度キューを処理することを知っていました。このスキームでは、139の優先度値しか与えられません。
ps
の出力では、 pri_baz
は次のように計算されますpp->priority + 100
、pp->priority
はカーネルからのprio
値です。これは 説明 です
プロセスの優先度は0 ..
MAX_PRIO
- 1から有効ですRT優先度は0 ..MAX_RT_PRIO
- 1であり、SCHED_NORMAL
/SCHED_BATCH
タスクはMAX_RT_PRIO
..MAX_PRIO
- 1の範囲内にあります。優先度の値は逆になります:p->prio
の値が小さいほど優先度が高くなります。
MAX_USER_RT_PRIO
値により、実際の最大RT=優先順位をユーザー空間にエクスポートされた値から分離できます。これにより、カーネルスレッドは優先順位をユーザータスクよりも高い値に設定できます注:MAX_RT_PRIO
はMAX_USER_RT_PRIO
より小さくすることはできません。
したがって、カーネルの範囲は0からMAX_PRIO
– 1(139)までの140の値をカバーします。
ただし、 最小FIFOおよびRT優先度は1 であり、これは欠落値を説明します:入力値(少なくとも、 sched_setscheduler
)を使用してユーザー空間から設定できます。1から99に移動し、カーネル 式を使用してそれらをprio
値に変換しますMAX_RT_PRIO
– 1 –priority、0〜98の値を提供します。
私はこれに不慣れです(専門家ではありません)。 0と139が表示されます。これは、少なくとも140の範囲を示しています。リアルタイムの優先度を1と99に設定しているようですが、0と98として報告されています。40の範囲のニースが表示されています。要求され、何が報告されます。したがって、-1が関係している可能性があります。しかし、99について特別なことは何もありません。
chrt -r
で設定できる最高値は99です。これは98として報告されます。
誰かが実装のどこかでout-by-one-errorをしたようです。