本文是小编巩固自身而作,如有错误,欢迎指出!
目录
[1. NI < 0(负数,提升优先级)](#1. NI < 0(负数,提升优先级))
[2. NI = 0(默认值)](#2. NI = 0(默认值))
[3. NI > 0(正数,降低优先级)](#3. NI > 0(正数,降低优先级))
[1. 时间片用完(主动 / 被动)](#1. 时间片用完(主动 / 被动))
[2. 进程主动阻塞(主动)](#2. 进程主动阻塞(主动))
[3. 高优先级进程抢占(被动)](#3. 高优先级进程抢占(被动))
一、基本概念
进程优先级是操作系统调度器分配 CPU 资源的核心依据,数值越小优先级越高,决定进程获得 CPU 时间的先后与多少。
cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性 能
还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤ 改善 系统整体性能。
二、查看系统进程
在linux或者unix系统中,⽤ps ‒l命令则会类似输出以下⼏个内容:
我们很容易注意到其中的⼏个重要信息,如下:
- UID
- 全称:User ID
- 意思:谁启动、谁拥有这个进程
- 作用:决定进程能访问哪些文件、权限多大。
- PID
- 全称:Process ID
- 意思:进程的唯一身份证号
- 作用:系统靠 PID 区分、管理、杀死进程。
- PPID
- 全称:Parent PID
- 意思:父进程 ID
- 作用:表示这个进程是被谁创建出来的。
- 例:你在终端开程序,终端就是父进程,PPID 就是终端的 PID。
- PRI
- 全称:Priority
- 意思:内核真正用的优先级
- 规则:值越小,优先级越高,越先被 CPU 执行
- 普通进程默认 PRI 一般是 80 左右。
- NI
- 全称:Nice 值
- 意思:用户可以改的 "谦让值"
- 范围:-20 ~ 19
- -20:最不谦让,优先级最高
- 19:最谦让,优先级最低
- 默认:0
三、PRI与NI
在上网我们已经粗略了解了PRI与NI的含义,现在我们看看具体的使用。
PRI 本身无法直接修改,它是内核根据 NI(nice 值)动态计算的结果(
PRI = 基准值 + NI),所以修改 NI 就是间接调整 PRI

这点修改前我们查看到我们这个test01进程的NI是0

可以看到,我们在执行renice指令后,NI的值就发生了变化
1. NI < 0(负数,提升优先级)
- 影响:进程会 "插队" 获取 CPU 时间,系统会优先把 CPU 资源分配给它,响应速度更快、卡顿更少。
- 适用场景 :
- 实时性要求高的进程(比如视频直播推流、游戏、鼠标 / 键盘交互进程);
- 核心业务进程(比如服务器的核心服务、数据库查询)。
- 举例 :把 test01 的 NI 设为 - 5(
renice -5 -p 9766),如果此时系统同时运行 "视频播放" 和 "文件备份",CPU 会优先处理 test01,test01 的执行速度会明显比备份进程快。 - 风险:若给非核心进程设 NI=-20,可能会抢占系统关键进程(比如系统服务、终端)的 CPU,导致系统卡顿、响应变慢,甚至无响应(比如 NI=-20 的进程一直占用 CPU,鼠标都动不了)。
2. NI = 0(默认值)
- 影响:进程和其他默认优先级进程 "公平竞争" CPU,系统按时间片轮询分配资源,无特殊优待 / 限制。
- 适用场景:绝大多数普通进程(比如日常运行的脚本、编辑器、浏览器)。
- 举例:你的 test01 默认 NI=0,此时它和桌面程序、终端进程平等占用 CPU,谁都不会优先。
3. NI > 0(正数,降低优先级)
- 影响:进程会主动 "谦让" 其他进程,只有当高 / 默认优先级进程空闲时,它才会获得 CPU 时间,执行速度变慢,但不会影响其他进程的响应。
- 适用场景 :
- 后台非紧急任务(比如文件备份、日志分析、大文件压缩);
- 耗 CPU 但不紧急的任务(比如数据批量处理、下载)。
NI(Nice 值)的大小直接决定进程对 CPU 资源的 "争抢能力",核心规律是:NI 越小,进程优先级越高,获得的 CPU 时间越多;NI 越大,进程越 "谦让",获得的 CPU 时间越少。
四、概念补充------独立,竞争,并行,并发
独立(Independent)
进程之间互不干扰,各玩各的。
- 每个进程有自己的 PID、内存、文件
- A 崩溃、死掉,不影响 B
- 操作系统把它们隔离开
例子:你开 QQ、开浏览器、开 test01→ 它们互不影响,这就是独立。
并发(Concurrent)
CPU 只有 1 个核心,快速切换跑多个进程,看起来像同时跑。
- 同一时间真正只跑一个
- 操作系统飞快切换(毫秒级)
- 人感觉不出来,以为同时运行
特点:宏观同时,微观交替。
并行(Parallel)
多个 CPU 核心,真的同时跑多个进程。
- 2 核 → 可以同时跑 2 个进程
- 4 核 → 同时跑 4 个
- 是真正的同时执行
特点:宏观同时,微观也同时。
竞争(Competition)
多个进程抢 CPU 资源,谁优先级高谁先跑。
这就和你刚学的 PRI、NI 直接相关:
- 进程都想占用 CPU
- 谁 PRI 越小、NI 越小,谁抢得越厉害
- 谁先被 CPU 执行
NI 越小 → 越不谦让 → 竞争能力越强NI 越大 → 越谦让 → 竞争能力越弱

五、进程切换
进程切换的概念
进程切换(Context Switch) 就是:CPU 从一个进程的工作中停下来,立马去执行另一个进程。
进程切换的三个关键阶段
CPU 切换不是瞬间完成的,分三步:
- 保存现场(Save Context)
- 把当前进程 A 的 CPU 寄存器 、程序计数器(PC) 等数据存到内存里。
- 目的:下次切回来还能接着干,知道刚才算到哪了。
- 恢复现场(Restore Context)
- 从内存里把进程 B 之前保存的数据,读回 CPU 寄存器。
- 目的:让 B 回到它上次离开的状态。
- 执行新进程
- CPU 开始执行进程 B 的代码。

进程切换的触发场景
1. 时间片用完(主动 / 被动)
- 场景:进程 A 用满了分配给它的 CPU 时间(比如 10ms)。
- 动作:定时器中断,强制把 CPU 拿走,切换到下一个进程。
- 关联:这是普通进程(CFS)默认的切换方式。
2. 进程主动阻塞(主动)
- 场景:进程 A 要读磁盘 / 网络,需要等待数据(I/O 等待)。
- 动作:A 主动放弃 CPU,操作系统立马切到进程 B。
- 结果:A 进入睡眠状态(S 状态),直到数据准备好。
3. 高优先级进程抢占(被动)
- 场景 :系统正在运行低优先级进程 A,突然来了一个高优先级进程 B(比如 NI=-20 的实时进程)。
- 动作 :
- 不管 A 时间片用完没用完,CPU 立刻打断 A。
- 保存 A 的现场,立刻切换给 B。
- 关键点 :这就是 PRI/NI 的作用! 优先级高的会抢占低优先级的 CP
总结
- 本质 :CPU 在不同进程间的寄存器 / 内存数据来回搬运。
- 原因:要么是时间到了,要么是在等 IO,要么是有更高优先级的任务来了。
- 你的操作:你修改 NI 值,就是在告诉操作系统:"这个任务更重要 / 更不重要,请多给 / 少给它切换机会。"
本次分享就到这里结束了,后续会继续更新,感谢阅读!