有人能解释如何计算“真实”进程优先级(即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似乎未使用。发布于 2020-02-17 13:03:27
在ps
的S输出中,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的值。
发布于 2020-02-17 10:21:40
我是新手(不是专家)。我看到0和139,这意味着至少140。我看到您将实时优先级设置为1和99,但它被报告为0和98。我看到了40的好范围,无论你要求什么,以及什么是报告。所以可能牵涉到-1人。但我觉得99年没什么特别的。
使用chrt -r
可以设置的最高值是99。这份报告为98。
看起来好像有人在实现中犯了一个错误。
https://unix.stackexchange.com/questions/568029
复制相似问题