web-dev-qa-db-ja.com

プロセスの優先度はどのように計算されますか?

誰かが「実際の」プロセスの優先順位を説明できますか(つまり、pri_bazpsのフィールドが計算されますか?

私の推測は:

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

しかし、私は困惑しています:

  1. pri_baz = 99は未使用のようです。

  2. Linuxが(デフォルトで)140の優先度キューを処理することを知っていました。このスキームでは、139の優先度値しか与えられません。

4
Jorge Lopez

psの出力では、 pri_bazは次のように計算されますpp->priority + 100pp->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_PRIOMAX_USER_RT_PRIOより小さくすることはできません。

したがって、カーネルの範囲は0からMAX_PRIO– 1(139)までの140の値をカバーします。

ただし、 最小FIFOおよびRT優先度は1 であり、これは欠落値を説明します:入力値(少なくとも、 sched_setscheduler )を使用してユーザー空間から設定できます。1から99に移動し、カーネル 式を使用してそれらをprio値に変換しますMAX_RT_PRIO – 1 –priority、0〜98の値を提供します。

6
Stephen Kitt

私はこれに不慣れです(専門家ではありません)。 0と139が表示されます。これは、少なくとも140の範囲を示しています。リアルタイムの優先度を1と99に設定しているようですが、0と98として報告されています。40の範囲のニースが表示されています。要求され、何が報告されます。したがって、-1が関係している可能性があります。しかし、99について特別なことは何もありません。

chrt -rで設定できる最高値は99です。これは98として報告されます。

誰かが実装のどこかでout-by-one-errorをしたようです。

1
ctrl-alt-delor