不同之处在于,PR是内核内部当前进程的真正优先级,而NI只是向内核提示进程应该具有的优先级。
在大多数情况下,PR值可通过以下公式计算:PR = 20 + NI。因此,具有良好感3的过程具有优先级23(20 + 3),具有良好感-7的过程具有优先级13(20-7)。您可以通过运行command检查第一个nice -n 3 top
。它将显示顶级进程具有NI 3和PR 23。但是对于nice -n -7 top
在大多数Linux系统上运行,您需要具有root特权,因为实际上PR值越低,实际优先级就越高。因此,具有PR 13的过程具有比具有标准优先级PR 20的过程更高的优先级。这就是为什么您需要扎根。但是,可以在/etc/security/limits.conf中配置允许非根进程使用的最小nice值。
理论上,内核可以自行更改PR值(但不能更改NI)。例如,如果它消耗过多的CPU,它可能会降低进程的优先级,或者如果该进程由于其他更高优先级的进程而没有机会长时间运行,则可能会增加该进程的优先级。在这些情况下,PR值将由内核更改,NI将保持不变,因此公式“ PR = 20 + NI”将不正确。因此,NI值可以解释为内核对进程应具有何种优先级的提示,但内核可以根据情况自行选择实际优先级(PR值)。但通常公式“ PR = 20 + NI”是正确的。
内核如何更改优先级的确切规则尚不清楚。setpriority(更改好的值的函数)手册说:
更改nice值的效果可能会因有效的流程计划算法而异。
Pthread手册指出以下内容:
动态优先级基于nice值(由nice(2),setpriority(2)或sched_setattr(2)设置),并在线程准备好运行但每次被调度程序拒绝运行时都增加。
看起来PR值对应于动态优先级。
NI值的范围是-20..19。因此,PR值可以具有从0(20-20)到39(20 + 19)的值。但这仅对具有默认调度策略(SHED_OTHER)的进程正确。可能还有所谓的进程 “实时”调度策略的。这些策略是SCHED_RR和SCHED_FIFO。这样的进程的PR值小于0。您可以通过运行chrt -r 1 top
命令(需要root)来检查它。最上面的进程将具有PR -2。您甚至可以chrt -r 90 top
在这种情况下运行顶部进程将具有PR -91。
似乎对于SCHED_RR进程,PR值可以通过以下公式计算:
PR =-1-sched_rr_priority。
因此 SCHED_RR进程至少具有PR -1,这意味着任何SCHED_RR进程都具有比任何SCHED_OTHER更高的优先级。这对应于pthread手册:
SCHED_FIFO只能在静态优先级高于0的情况下使用,这意味着当SCHED_FIFO线程变为可运行时,它将始终立即抢占任何当前正在运行的SCHED_OTHER,SCHED_BATCH或SCHED_IDLE线程。
SCHED_RR是SCHED_FIFO的简单增强。上面针对SCHED_FIFO所述的所有内容也适用于SCHED_RR,
实时进程的优先级称为静态优先级,内核无法更改。因此,正PR值可以视为非实时动态优先级(SCHED_OTHER,SCHED_BATCH)进程,级,对于实时进程(SCHED_RR,SCHED_FIFO),可以将负PR值视为静态优先级。
我还尝试运行nice -n 10 chrt -r 50 top
(和chrt -r 50 nice -n 10 top
)。该NI值为10,但PR仍是-51。因此,NI值似乎不会影响SCHED_RR进程的优先级。这对应于setpriority手册:
使用SCHED_FIFO或SCHED_RR的任何进程或线程都不会受到对setpriority()的调用的影响。这不被视为错误。随后恢复为SCHED_OTHER的进程不必受此类setpriority()调用影响。
一个有趣的笔记。如果运行chrt -r 99 top
,则会在PR列中看到RT值而不是数字。
PID用户PR NI VIRT RES SHR S%CPU%MEM TIME +命令
28489根RT 0 2852 1200 896 R 0 0.1 0:00.01顶部
我认为这并不意味着现在的过程特别。我认为这意味着top不会打印-100,因为要打印4个字符。
您也可以使用htop代替top在所有示例中,这样会更加方便。ps -l
也可以使用,但是将实时和非实时优先级分开的基准点不是0,而是60,因此nice -n -20 ps -l
将打印
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20-1176-积分/ 6 00:00:00 ps