image.png

1.字段说明

PR:任务的动态调度优先级,取值范围是[-100,39],值越小优先级越高。
NI:任务的静态调度优先级,取值范围是[-20,19],值越小优先级越高。这也基本符合nice值的特点,就是当nice值设定好了之后,除非我们用renice去改它,否则它是不变的。
VIRT: 任务使用虚拟内存大小,单位是kb,包含代码、库以及交换出去的page等,没啥参考价值
RES: 任务使用物理内存大小,单位是kb
SHR: 任务使用共享内存大小,单位是kb
S: 任务的状态,可以为以下值:
‘R’ = running,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
‘D’ = uninterruptible sleep,不可中断状态睡眠,一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
‘S’ = sleep,可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
‘I’ = ‘Idle’ ,也就是空闲状态,用在不可中断睡眠的内核线程上。硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
‘T’ = traced or stopped,表示进程处于暂停或者跟踪状态。向一个进程发送 SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行)。
‘Z’ = zombie,它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。

2.PR和NI的区别

PR和NI都表示优先级,但是含义有些不同。在操作系统中,进程分为两种类型:用户进程和实时进程。Linux实际上实现了140个优先级范围,取值范围是从0~139,这个值越小,优先级越高。nice值的-20到19,映射到实际的优先级范围是100-139。

top命令中的PR与NI - 图2
用户进程:
nice命令就是修改的用户进程的优先级,表示的是NI的值,范围是[-20,19],此时PR=20+NI,它对应的就是[100, 139]的优先级,优先级较低。
在linux内核2.6.23以及之后的版本,PR=NI+20。(在linux内核2.6.23之前,PR=NI+20+x,x可以为负数。x是动态调整进程执行优先级的参数。比如说,某个进程有大量的sleep,那么x会降低导致PR降低,导致优先级上升。再比如,某个进程占用了大量CPU时间,那么x会升高导致PR升高,导致优先级下降。)
实时进程:
chrt命令就是修改实时进程的优先级。所有优先级值在[0, 99]范围内的,都是实时进程。
此时PR=-1-real_time_priority,实时优先级取值范围是[1,99],它对应的就是0-99的优先级,优先级较高。

参考链接

[1] top命令显示信息之谜 https://zhuanlan.zhihu.com/p/91843204
[2] Linux的进程优先级 https://pengrl.com/p/21535/
[3] Linux的进程优先级 NI 和 PR 有什么区别? https://kknews.cc/tech/j85ngl.html
[4] Quora: What is the difference between the NI and PR values in the top(1) command’s output?