前言
在Linux系统中,进程优先级决定了CPU资源的分配顺序,直接影响系统性能和关键任务的响应速度。无论是优化服务器负载、确保实时任务稳定运行,还是避免低优先级进程拖慢系统,合理调整进程优先级都是系统管理和性能调优的重要技能。
目录
一、进程优先级概述
1、基本概念
2、存在原因
二、查看进程优先级信息
1、PRI与NI的关系
2、PRI 与 NI 的区别
三、竞争、独立、并行、并发
1、进程相关核心概念
2、概念对比图
3、补充说明
四、通过top命令更改进程的nice值
步骤 1:启动 top
步骤 2:找到目标进程
步骤 3:进入 Nice 值修改模式
步骤 4:验证修改
五、两种不同的优先级系统
六、Nice优先级系统
1、Nice值范围
2、相关命令
nice 命令
renice 命令
七、验证NI和PRI的范围
1. 验证 NI(nice 值)的范围
实验方法
结论
2. 验证 PRI(进程优先级)的范围
实验方法
结论
3. 为什么范围是 -20 到 19?
4. 总结
八、实时优先级系统(了解即可,不掌握)
1、实时优先级范围
2、调度策略
3、相关命令
九、内核视角的优先级
十、调整优先级的注意事项
十一、实际应用示例(了解即可,不掌握)
示例1:启动一个低优先级的压缩任务
示例2:将正在运行的进程改为高优先级
示例3:设置实时音频处理进程
一、进程优先级概述
1、基本概念
优先级是指获取资源的先后顺序。进程优先级则特指进程获得CPU资源分配的优先顺序,即进程的优先权(priority)。优先权较高的进程享有优先执行的权利。
2、存在原因
优先级的产生源于资源的有限性。对于进程优先级而言,其存在的根本原因是CPU资源的稀缺性。由于单个CPU同一时间只能运行一个进程,而系统中往往存在多个并发进程,因此需要通过优先级机制来确定各进程获取CPU资源的先后顺序。
二、查看进程优先级信息
在Linux或Unix系统中,执行ps -l
命令通常会显示如下信息:
ps -l <PID>
关键信息如下:
-
UID:执行者的身份标识,用于系统识别和权限管理
- PID:进程的唯一标识符
- PPID:父进程的标识符(即创建该进程的进程ID)
- PRI:进程优先级,数值越小优先级越高
- NI:进程的nice值
小知识:
- 在Linux系统中,操作系统通过UID(用户标识符)来识别进程访问文件时的权限身份。
- 每个进程都代表特定用户运行,系统会根据进程所属用户的UID来判断其访问权限,包括文件所有者、所属组或其他用户的权限类别。
1、PRI与NI的关系
- PRI表示进程的CPU执行优先级,数值越小越优先执行
- NI是进程优先级的修正值,影响最终的PRI值
- 计算公式:PRI(new) = PRI(old) + NI
- 当NI为负值时,PRI降低(优先级提高)
- 在Linux系统中,PRI(old)默认值为80,即PRI = 80 + NI
- NI的取值范围:-20到19(共40个级别)
- 调整进程优先级实际上就是修改其nice值(NI)
2、PRI 与 NI 的区别
- 需要明确的是,进程的 nice 值(NI)并不等同于进程优先级(PRI),它们是两个不同的概念。但 nice 值会影响进程优先级的调整。
- 简单来说,nice 值是用于修正进程优先级的一个数值参数。
三、竞争、独立、并行、并发
1、进程相关核心概念
-
竞争性 (Competitive)
-
定义:系统进程数量众多,而CPU资源有限(如单核CPU),因此进程之间需要竞争获取计算资源。
-
延伸:为了优化资源分配,操作系统通过优先级调度算法管理竞争,确保关键任务优先执行。
-
示例:高优先级进程(如系统服务)可抢占低优先级进程(如后台应用)的CPU时间。
-
-
独立性 (Independent)
-
定义:每个进程拥有独立的虚拟地址空间和系统资源(如文件描述符、内存),多进程运行时互不干扰。
-
延伸:独立性由操作系统通过内存隔离和资源保护机制实现,确保进程崩溃不会影响其他进程。
-
例外:进程间通信(IPC)机制可打破独立性,如共享内存、管道等。
-
-
并行 (Parallelism)
-
定义:多个进程在多核CPU/多处理器上同时执行,每个进程独占一个计算核心。
-
条件:要求硬件支持(CPU核心数≥进程数)。
-
示例:4个进程在4核CPU上同时运行,每个核心处理一个进程。
-
-
并发 (Concurrency)
-
定义:多个进程在单核CPU上通过时间片轮转、上下文切换等机制交替执行,宏观上表现为“同时推进”。
-
关键:操作系统通过调度器(Scheduler)快速切换进程,用户感知为多任务并行(实际是伪并行)。
-
对比:并发是逻辑上的“同时”,并行是物理上的同时。
-
2、概念对比图
特性 | 竞争性 | 独立性 | 并行 | 并发 |
---|---|---|---|---|
核心 | 资源争用 | 隔离保护 | 多核物理同时执行 | 单核逻辑交替执行 |
依赖 | 资源稀缺 | 操作系统机制 | 多CPU/多核硬件 | 调度算法 |
表现 | 优先级调度 | 进程互不干扰 | 真正同步 | 快速切换的异步 |
3、补充说明
-
并发与并行的关系:并发是更广义的概念,并行是并发的子集(硬件允许多任务真正同步时)。
-
现代系统:通常并发与并行共存(如多核CPU上每个核心并发调度多个线程)。
四、通过top命令更改进程的nice值
步骤 1:启动 top
在终端输入:
top
你会看到一个动态刷新的进程列表,包含 PID
、USER
、NI
、PRI
等信息:
步骤 2:找到目标进程
-
在
top
界面中,可以使用按Shift + P
(按 CPU 使用率排序)或Shift + M
(按内存使用率排序)的方式,找到你要修改的进程。 -
记录进程的 PID(第一列)。
步骤 3:进入 Nice 值修改模式
-
在
top
运行时,按r
(代表 "renice")。 -
输入要调整的 PID,按回车。
PID to renice [default: 0]: 1234 # 替换为目标 PID
-
输入新的 Nice 值(范围:
-20
到19
),按回车。-
负值(如 -5):提高优先级(需 root 权限)。
-
正值(如 10):降低优先级(普通用户可设置)。
Renice PID 1234 to value: 5 # 示例:设置为 5
-
步骤 4:验证修改
-
修改后,在
top
界面中检查该进程的 NI 列是否已更新。 -
按
q
退出top
。
输入nice值后按“q”即可退出,如果我们这里输入的nice值为5,那么此时我们再用ps命令查看进程的优先级信息,即可发现进程的NI变成了5,PRI变成了85(80+NI):
注意: 若是想将NI值调为负值,也就是将进程的优先级调高,需要使用sudo top提升权限。
五、两种不同的优先级系统
在Linux操作系统中,进程优先级决定了进程获取CPU资源的顺序和频率。优先级高的进程会获得更多的CPU时间,从而更快地执行。Linux使用两种不同的优先级系统:
-
Nice值(NI):用户空间优先级,范围从-20(最高优先级)到19(最低优先级)
-
实时优先级:用于实时进程,范围从1(最低)到99(最高)
六、Nice优先级系统
1、Nice值范围
采用时间片机制的分时操作系统需兼顾公平性,允许优先级动态调整,但必须严格控制优先级的变化幅度:
-
默认值:0
-
可调整范围:-20(最高优先级)到19(最低优先级)
-
普通用户限制:只能调低优先级(增大nice值,0→19)
-
root用户:可以调高或调低优先级(-20→19)
2、相关命令
查看进程优先级信息:
ps -eo pid,ni,comm
或者我们也可以使用:
top # 然后按'r'键调整优先级
注意: 在Linux操作系统中,初始进程一般优先级PRI默认为80,NI默认为0。
启动时设置优先级:
nice 命令
-
用于以指定的优先级启动一个进程
-
语法:
nice -n [优先级值] [命令]
-
优先级范围通常为 -20 (最高优先级) 到 19 (最低优先级)
-
普通用户只能降低优先级(设为正值),只有root可以提升优先级(设为负值)
nice -n 10 ./test
启动程序,并设置 NI=10(较低优先级),然后验证优先级:
调整运行中进程的优先级:
renice 命令
-
用于修改已运行进程的优先级
-
语法:
renice [优先级值] -p [进程ID]
-
同样遵循-20到19的范围限制
renice 5 -p PID
注意: 若是想使用renice命令将NI值调为负值,也需要使用sudo renice命令提升权限。
七、验证NI和PRI的范围
在 Linux 系统中,进程的优先级(PRI
)和 nice
值(NI
)的范围是 -20 到 19(NI
),而 PRI
的范围通常是 0 到 139(但用户可见的 PRI
范围是 60 到 99)。我们可以通过简单的实验来验证这些范围:
1. 验证 NI
(nice 值)的范围
Linux 允许的 nice
值范围是 -20(最高优先级)到 19(最低优先级)。普通用户只能降低优先级(NI ≥ 0
),而 root
可以提升优先级(NI < 0
)。
实验方法
-
尝试用
nice
或renice
设置超出范围的NI
值:nice -n -21 [可执行程序]# 尝试设置 NI = -21(超出范围) nice -n 20 [可执行程序]# 尝试设置 NI = 20(超出范围)
-
系统会返回错误:
结论
-
NI
的范围确实是 -20 到 19,超出范围会被拒绝。
2. 验证 PRI
(进程优先级)的范围
Linux 的 PRI
值由内核动态调整,但用户可见的 PRI
范围是 60(最高优先级)到 99(最低优先级)。NI
会影响 PRI
的计算:
PRI=80+NIPRI=80+NI(80
是默认基准优先级)
实验方法
-
查看默认进程的
PRI
和NI
:ps -l
输出示例:
PRI = 80
,NI = 0
(默认情况)。
-
用
nice
启动一个低优先级进程:nice -n 19 [可执行文件]# 设置 NI = 19(最低优先级) ps -l PID
输出:
-
PRI = 99
(80 + 19 = 99
)。
-
-
用
renice
提高优先级(需要root
):sudo renice -n -20 -p PID # 设置 NI = -20(最高优先级) ps -l
输出bad value,这里观察不了,其实上面对NI观察已经可以证明结论了。
结论
-
PRI
的计算公式是PRI = 80 + NI
,所以:-
当
NI = -20
时,PRI = 60
(最高优先级)。 -
当
NI = 19
时,PRI = 99
(最低优先级)。
-
-
PRI
的可调整范围是 60–99(由NI
决定)。
3. 为什么范围是 -20 到 19?
-
这是 Linux 内核的默认设计:
-
NI
的范围 -20 到 19 提供了 40 个优先级级别(足够精细调整)。 -
PRI
的范围 60–99 是用户可见的优先级,而内核实际使用 0–139(其中 0–59 用于实时进程,60–99 用于普通进程)。
-
4. 总结
参数 | 范围 | 计算方式 | 实验验证方法 |
---|---|---|---|
NI | -20 到 19 | 直接设置 | nice -n -20 / nice -n 19 |
PRI | 60 到 99 | PRI = 80 + NI | ps -l 观察 NI 对 PRI 的影响 |
通过实验可以确认:
-
NI
的范围是 -20 到 19,超出会报错。 -
PRI
的范围是 60 到 99,由PRI = 80 + NI
决定。
八、实时优先级系统(了解即可,不掌握)
实时优先级用于需要严格调度控制的进程,如音频处理、工业控制系统等。
1、实时优先级范围
-
SCHED_FIFO和SCHED_RR策略:1(最低)到99(最高)
-
SCHED_OTHER(标准分时调度):不使用实时优先级
2、调度策略
策略 | 描述 |
---|---|
SCHED_OTHER | 标准分时调度(默认),使用nice值 |
SCHED_FIFO | 先进先出实时调度,高优先级进程会一直运行直到阻塞或退出 |
SCHED_RR | 轮转实时调度,同优先级进程按时间片轮转 |
SCHED_BATCH | 针对批处理作业的调度 |
SCHED_IDLE | 极低优先级,系统空闲时才运行 |
3、相关命令
查看进程调度策略和优先级:
chrt -p PID
设置实时优先级:
chrt -f -p 90 PID # 设置FIFO调度,优先级90
chrt -r -p 80 PID # 设置RR调度,优先级80
九、内核视角的优先级
在内核中,优先级通过以下方式表示:
-
静态优先级:由用户设置的nice值转换而来
-
动态优先级:内核根据进程行为调整的优先级
-
实时优先级:用于实时进程的特殊优先级
内核维护一个运行队列,将进程按优先级组织,调度器总是选择最高优先级的可运行进程。
十、调整优先级的注意事项
-
谨慎提高优先级:过高优先级可能导致系统资源被独占
-
实时进程风险:错误的实时进程可能导致系统无响应
-
权限限制:普通用户只能降低自身进程的优先级
-
系统监控:使用
top
或htop
监控优先级调整效果
十一、实际应用示例(了解即可,不掌握)
示例1:启动一个低优先级的压缩任务
nice -n 19 tar -czf backup.tar.gz /data
示例2:将正在运行的进程改为高优先级
sudo renice -10 -p 1234
示例3:设置实时音频处理进程
chrt -f -p 99 $(pidof pulseaudio)
理解Linux进程优先级对于系统性能调优和资源管理至关重要,特别是在多任务环境或资源受限的系统中。