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

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

「実際の」プロセス優先順位(例: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個の優先順位値のみを提供することがわかります。

ベストアンサー1

psの出力からpri_baz次のように計算されます pp->priority + 100はカーネルの値pp->priorityです。prioこれは~と記述

プロセス優先順位はMAX_PRIO0..-1から始まり、有効RT優先順位は0..- MAX_RT_PRIO1で、SCHED_NORMAL/SCHED_BATCH 作業範囲はMAX_RT_PRIO..- MAX_PRIO1です。優先順位の値は逆です。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までの値を提供します。

おすすめ記事