![`ps` 的 `PRI` 列与手册页不一致](https://linux22.com/image/142143/%60ps%60%20%E7%9A%84%20%60PRI%60%20%E5%88%97%E4%B8%8E%E6%89%8B%E5%86%8C%E9%A1%B5%E4%B8%8D%E4%B8%80%E8%87%B4.png)
更新:我的理解是正确的,手册页ps
已更新为 PRI 列的以下内容:“进程的优先级。数字越大,优先级越高。”
我一直在尝试了解 Linux 中的调度优先级是如何工作的。这是我所得到的:
- 内核为每个进程使用一个优先级值,范围从0到139。数字越低,进程的优先级越高。
- 从 0 到 99 的优先级值被保留,所有用户空间进程的优先级从 100 到 139。
- Linux提供了
nice
接口,该接口是暴露给用户并且可以由用户修改的优先级。值nice
范围从-20到19,映射到优先级100到139。与优先级值一样,值越低nice
,进程的优先级越高。
我现在的问题是:PRI 栏表示什么ps
?
的手册页ps
说:
pri PRI priority of the process. Higher number means lower priority.
但该值的范围是 0 到 39,我根据经验确定它等于19 - nice
。
鉴于这种关系,不可能使列nice
中显示的优先级都PRI
满足“数字越大优先级越低”。
我缺少什么?
显示此行为的示例:
root@kali:~# ps -ao pid,comm,pri,nice
PID COMMAND PRI NI
6153 cat 19 0
(···)
root@kali:~# renice -n -10 -p 6153
6153 (process ID) old priority 0, new priority -10
root@kali:~# ps -ao pid,comm,pri,nice
PID COMMAND PRI NI
6153 cat 29 -10
(···)
答案1
fromPRI
是ps -o pri
,第 18 场是39 - priority
哪里。priority
/proc/PID/stat
如果您想要未损坏的字段proc/PID/stat
,您可以使用 获得它ps -o priority
。
如果你想要真正的优先级,您可以通过 获取它ps -o pri_baz
。
该值的其他有趣的修改可以通过ps -o pri_foo
,ps -o pri_bar
和获得ps -o opri
。
我没有骗你。你可以看一下源码这里。
注意/proc/PID/stat
:
中的优先级字段(第18位)/proc/PID/stat
由内核设置fs/proc/array.c
到task_struct->prio - 100
(通过task_prio()
;MAX_RT_PRIO
定义为100
)。