
「実際の」プロセス優先順位(例: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個の優先順位値のみを提供することがわかります。
答え1
ps
の出力からpri_baz
次のように計算されます pp->priority + 100
はカーネルの値pp->priority
です。prio
これは~と記述
プロセス優先順位は
MAX_PRIO
0..-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 -優先順位、0から98までの値を提供します。
答え2
私はこれについて非常に新しいです(専門家ではありません)。 0と139が表示されます。これは範囲が少なくとも140であることを意味します。リアルタイム優先順位を1と99に設定しましたが、0と98と報告されていることを確認できます。お客様の要件と報告される内容の両方に合わせて範囲40の利点を確認しました。したがって、-1を含めることができます。しかし、99は特別ではないと思います。
設定できる最高値はchrt -r
99です。このレポートは98です。
誰かがどこかで実装に深刻なミスをしたようです。