有人可以解释如何计算“真实”进程优先级(即 的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
来自内核的值。这是被形容为
进程的优先级从 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 之间的值。
答案2
我对此很陌生(不是专家)。我看到 0 和 139,这表明范围至少为 140。我看到您将实时优先级设置为 1 和 99,但看到它报告为 0 和 98。我看到范围 40 的好处,两者都适合您要求以及报告的内容。所以可能涉及一些-1。但我觉得99没什么特别的。
它可以设置的最高值为chrt -r
99。此报告为 98。
看起来有人在某个地方的实现中犯了一个严重的错误。