procfs 中的进程优先级值不同

procfs 中的进程优先级值不同

例如我们用ps查看firefox的PRI值,然后看看procfs中存储的值是多少。

$ ps -o pid,comm,pri,ni 7000
  PID COMMAND         PRI  NI
 7000 firefox          19   0

$ cat /proc/7000/stat
7000 (firefox) S 1 6447 6447 0 -1 4194304 3162595 624998 158 10 30467 6903 3360 488 20 0 63 0 464836 9472659456 123045 18446744073709551615 94866409246720 94866409429052 140727418541056 0 0 0 0 4096 33572095 0 0 0 17 2 0 0 342 0 0 94866411526576 94866411528296 94866422095872 140727418542495 140727418542520 140727418542520 140727418544095 0

根据man proc,我们会在第18个值(从1开始数)找到PRI的值,所以此时PRI = 20

我想知道为什么命令的输出ps和 /proc stat 文件中存储的值之间存在如此大的差异?

答案1

呃,显然该pri字段正好是 39 减去中可见的值/proc/$pid/stat(因此 39 - 20 = 19)。它也被评论为“不像 UNIX“PRI”那样合法”,因为

Unix98只规定高“PRI”优先级低。

但这并不适用于此。

但!有不少于优先级的其他输出格式,所有这些格式都有原始值或否定或否定,加上一些常量。选一个。这是三只具有不同值的猫nice

$ ps -o pid,rtprio,pri,opri,priority,pri_foo,pri_bar,pri_baz,pri_api,ni,args -Ccat
  PID RTPRIO PRI PRI PRI FOO BAR BAZ API  NI COMMAND
18418      -   0  99  39  19  40 139 -40  19 cat /dev/zero
18419      -  19  80  20   0  21 120 -21   0 cat /dev/zero
18420      -  39  60   0 -20   1 100  -1 -20 cat /dev/zero

代码中的注释是这么说的

Sun 和 SCO 添加了该-c行为。 Sun 定义了“pri”和“opri”。

因此,可能有一些历史原因需要修复输出范围以匹配。ps -c使用pri此处的值。priority是内核呈现的原始值。

相关源代码文件为ps/output.c
https://gitlab.com/procps-ng/procps/blob/master/ps/output.c#L585

还:https://superuser.com/questions/286752/unix-ps-l-priority/286761
https://stackoverflow.com/questions/18829350/linux-thread-priority-value

相关内容