陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235 / 19906632509 / 19906733890 / 19905812933(微信同号)

客服微信

【操作系统】深入解析 Linux top 命令中的 PR 和 NI:进程优先级与调度机制

作者:云贝学院
发布时间:2025-02-14 15:48
浏览量:80

本文为云贝教育 刘老师 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。


在 Linux 系统中,top 命令是监控系统资源和进程状态的重要工具。在 top 的交互界面中,PR(Priority)和 NI(Nice)是与进程调度优先级相关的两个关键参数。许多用户对它们的含义和关系感到困惑。本文将详细解释这两个参数,并探讨它们如何影响系统的进程调度。


1. PR(Priority):进程的动态优先级

PR 表示进程的 实时优先级(Real-time Priority),它是内核调度器在分配 CPU 时间片时的重要依据。取值范围和含义如下:

PR 值范围

含义

039

普通进程(非实时进程),数值越低,优先级越高(与 NI 共同决定)。

RT 或负值(如 -2

实时进程(Real-time Process),优先级高于所有普通进程。


普通进程:默认情况下,大多数进程属于此类,PR 值由 NI(Nice 值)动态计算得出,通常为 20 + NI。例如,若 NI=0,则 PR=20;若 NI=-5,则 PR=15。

实时进程:通过 SCHED_FIFO 或 SCHED_RR 调度策略运行的进程(如某些高实时性任务),其 PR 显示为 RT 或负数。实时进程的优先级高于所有普通进程。


2. NI(Nice):用户可调整的优先级偏移量

NI 是用户态进程的 友好值(Nice Value),允许用户间接调整进程的优先级。取值范围为 -20 到 19,默认值为 0。关键规则如下:

NI 越低,进程优先级越高:将 NI 设置为 -20 会让进程更频繁地获得 CPU 时间。

NI 越高,进程优先级越低:设置为 19 会让进程更“谦让”,减少对 CPU 的占用。


3. PR 与 NI 的关系

普通进程:PR = 20 + NI 例如:

NI=0 → PR=20

NI=-5 → PR=15

NI=10 → PR=30

实时进程NI 无效

实时进程的优先级由 chrt 命令直接设置(范围为 1~99,1 为最低,99 为最高),此时 PR 显示为 RT 或负数(如 -2 对应实时优先级 98)。


4. 如何查看和修改 NI 与 PR

查看进程优先级:

top -p [PID]         # 在 top 中查看特定进程的 PR 和 NI


示例如下

# top -p 1895                                                
top - 11:27:18 up  1:55,  2 users,  load average: 0.00, 0.00, 0.00
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1960.7 total,   1230.0 free,    326.5 used,    404.2 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1556.6 avail Mem 
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND   
    1895 root      20   0  225616   4604   3852 S   0.0   0.2   0:00.43 top


修改 NI(普通进程):

# ps -eo pid,ni,pri,cmd | grep 1352 | grep -v grep  
   1352  0  19 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups   
# renice 10 1352
1352 (process ID) old priority 0, new priority 10    # 修改运行中进程的 NI=10
# ps -eo pid,ni,pri,cmd | grep 1352 | grep -v grep
   1352  10   9 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups


注意:普通用户只能降低优先级(NI ≥ 0),需 sudo 权限提升优先级(NI < 0)。

设置实时进程优先级:

这里,-f表示固定优先级调度策略,而99是最高优先级级别。请注意,这种操作通常需要超级用户权限,并且应当谨慎使用,以避免影响系统的整体稳定性。


5. 常见问题与误区

为什么修改 NI 后 PR 没有变化?

进程可能是实时进程(PR 显示为 RT),此时 NI 无效。

系统负载低时,优先级差异可能不明显。

PR 值为什么超过 39?

普通进程的 PR 理论最大值为 39(NI=19)。若看到更大的值,可能是内核版本差异或显示方式不同。

实时进程会“饿死”其他进程吗?

是的!实时进程若不主动释放 CPU(如循环执行 sleep),可能导致普通进程无法运行。需谨慎使用。


6. 总结

PR(Priority):动态优先级,决定内核调度顺序。

NI(Nice):用户可调的偏移量,仅影响普通进程。

实时进程:通过 chrt 设置,优先级高于普通进程,但需谨慎使用。

理解这两个参数,可以帮助你更高效地管理系统资源,优化关键任务的性能。如果需要临时提高某个进程的优先级,优先调整 NI;若需极致的实时性,再考虑实时进程策略。



想了解更多相关的学习资料(技术文章和视频),可以微信公众号或B站搜索《云贝教育》,免费获取。

需要课程资料的同学可以私聊课程顾问:19906733890(微信同号)