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)
但是我很困惑,因为:
pri_baz = 99 似乎未使用。
我知道 Linux 处理(默认情况下)140 个优先级队列,而这个方案只给出了 139 个优先级值。
Inps的输出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 的值。
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |