进程优先级是如何计算的?

进程优先级是如何计算的?

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

然而我很困惑,因为:

  1. pri_baz= 99 似乎未使用。

  2. 我知道 Linux(默认情况下)处理 140 个优先级队列,而该方案仅提供 139 个优先级值。

答案1

ps的输出中,pri_baz计算为 pp->priority + 100pp->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 之间的值。

答案2

我对此很陌生(不是专家)。我看到 0 和 139,这表明范围至少为 140。我看到您将实时优先级设置为 1 和 99,但看到它报告为 0 和 98。我看到范围 40 的好处,两者都适合您要求以及报告的内容。所以可能涉及一些-1。但我觉得99没什么特别的。

它可以设置的最高值为chrt -r99。此报告为 98。

看起来有人在某个地方的实现中犯了一个严重的错误。

相关内容