首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算进程优先级?

如何计算进程优先级?
EN

Unix & Linux用户
提问于 2020-02-17 09:05:24
回答 2查看 871关注 0票数 4

有人能解释如何计算“真实”进程优先级(即pri_baz字段的ps)吗?

我猜是:

代码语言:javascript
运行
复制
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)

以下测试支持这一点:

代码语言:javascript
运行
复制
# 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个优先级值。
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-02-17 13:03:27

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

票数 6
EN

Unix & Linux用户

发布于 2020-02-17 10:21:40

我是新手(不是专家)。我看到0和139,这意味着至少140。我看到您将实时优先级设置为1和99,但它被报告为0和98。我看到了40的好范围,无论你要求什么,以及什么是报告。所以可能牵涉到-1人。但我觉得99年没什么特别的。

使用chrt -r可以设置的最高值是99。这份报告为98。

看起来好像有人在实现中犯了一个错误。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/568029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档