如何计算进程优先级?

Jor*_*pez 4 linux process priority

有人可以解释如何计算“真实”进程优先级(即 的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)
Run Code Online (Sandbox Code Playgroud)

以下测试支持这一点:

# 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
Run Code Online (Sandbox Code Playgroud)

但是我很困惑,因为:

  1. pri_baz = 99 似乎未使用。

  2. 我知道 Linux 处理(默认情况下)140 个优先级队列,而这个方案只给出了 139 个优先级值。

Ste*_*itt 6

Inps的输出pri_baz计算为 pp->priority + 100,并且pp->priorityprio来自内核的值。这被描述为

进程的优先级从 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.

因此,内核中的范围确实涵盖了 140 个值,从 0 到MAX_PRIO–1 (139)。

然而,最小 FIFO 和 RT 优先级是 1,这解释了缺失值:输入值(至少,可以从用户空间设置,使用sched_setscheduler)从 1 到 99,内核使用公式将这些prio值转换为值 MAX_RT_PRIO– 1 –优先级,给出从 0 到 98 的值。