都来源于内核中task优先级的取值,计算方式不同。
内核内部变量(p->prio)的取值,在<linux/sched.h>定义
1)MAX_RT_PRIO为100
2)RT tasks为0到99
3)非RT task取值100到139
TOP命令显示非RT线程时,PR字段的取值是把task的prio减去100,所以看到的值是0~39
PS命令显示的优先级,根据显示选项、进程的调度策略与状态,采用以下几种计算方法之一:
- "priority":过去是-20..20, 当前是-100..39
- "intpri"和 "opri",过去是39..29,当前是 -40..99
- "pri_foo" -- match up w/ nice values of sleeping processes, (-120..19)
- "pri_bar" -- makes RT pri show as negative (-99..40)
- "pri_baz" -- the kernel's ->prio value, as of Linux 2.6.8 (1..140)
以上是传统的UNIX取值
- "pri" -- 过去是20..60,当前是 (0..139)
- "pri_api" -- match up w/ RT API (-40..99)
以上是非传统的UNIX取值
=============
详细的实现,可参见软件包procps-ng的源码。
就是用户输入命令还有显示信息的设备。