
Linux进程优先级与进程切换:调度背后的核心原理
一、进程优先级基础概念
进程优先级,简单来说就是CPU分配时间片的先后权重。优先级越高,进程越容易被调度器选中,获取更多CPU执行机会。
Linux系统有一条关键规则:优先级的数值越小,代表优先级越高。
注意:优先级只改变CPU调度顺序,和文件权限、访问权限没有任何关系。
操作系统为什么需要优先级?
CPU属于稀缺资源,当大量进程同时就绪竞争CPU,内核调度器不能完全“平均分配”。通过优先级机制,可以保障交互类进程(终端、桌面)优先响应,后台备份、压缩任务适当谦让,兼顾系统响应速度与整体吞吐量。
1.1 PRI 和 NI(Nice)
很多人会混淆PRI与Nice值,这是面试最常挖坑的地方。
- PRI(Priority):内核真正使用的调度优先级。 由Linux内核动态计算维护,用户不能直接修改PRI。普通用户进程PRI范围100~139,数值越小优先级越高。
- NI(Nice)谦让值:用户可以修改的偏移修正量。 Nice翻译为“谦让”,代表进程有多愿意把CPU让给其他进程。 取值范围: – 20 ~ 19
- -20:最高谦让等级,进程抢占能力最强
- 19:最低谦让等级,最大限度把CPU让给别人
权限限制:
二者计算公式: 新PRI = 旧PRI + Nice
⚠️重要误区:不要以为修改Nice=-20,PRI就固定等于80‑20。Nice仅仅是偏移量,PRI是内核综合多种因素动态算出,nice只能间接影响,不能完全锁定PRI的值。
| 本质 | 内核实际调度优先级 | 用户可控的偏移修正值 |
| 维护方 | Linux内核动态计算 | 用户/管理员手动修改 |
| 能否直接修改 | ❌不可直接修改 | ✅可修改 |
| 取值范围 | 普通进程100‑139 | -20 ~ +19 |
| 关系 | 调度器真正看PRI做决策 | 通过NI间接改变PRI |
1.2 查看&修改优先级实战命令
ps -l
输出可以直接看到PRI、NI两列。
#启动备份脚本,设置nice=19,尽量少抢占CPU
nice -n 19 ./backup.sh
#将PID为2345的进程nice设置为5
renice -n 5 -p 2345
生产场景:
对于数据备份、日志压缩这类CPU密集但对时延不敏感的后台任务,调高nice值,避免抢占业务进程CPU资源。
二、基础概念辨析:竞争、独立、并发、并行
这四个概念是理解多进程模型的基石,面试经常要求口述区分。
竞争
多个进程抢夺有限的系统资源,CPU、内存、IO都属于竞争资源。一颗CPU核心同一时刻只能运行一个进程,进程之间天然存在CPU竞争。
独立性
进程是操作系统资源分配最小单位。每个进程拥有独立虚拟地址空间、PCB进程控制块、独立文件描述符表。 进程之间相互隔离,一个进程崩溃,默认情况下不会直接导致其他进程崩溃。
补充:独立性不是绝对,共享内存、消息队列等IPC机制可以打破隔离,实现进程通信。
并发(Concurrency)
单核CPU就可以实现并发。 宏观一段时间内,多个任务都得到推进;微观同一个CPU核心,同一时刻只有一个进程在运行。依靠CPU时间片快速切换,制造出“多个程序同时跑”的效果。简单理解:人少活多,来回切换干活。
并行(Parallelism)
必须依赖多个CPU物理核心。在同一个时间点,多个进程真正在不同CPU核心上同时执行。微观、宏观都是同时运行。简单理解:人手充足,多人同时干活。
面试一句话记忆:
并发是交替执行,单核即可;并行是真正同时执行,必须多核。
并发不一定等于并行。
| 并发 | 单核/多核都支持 | 单核心上进程交替执行 |
| 并行 | 必须多核CPU | 多个CPU核心真正同时运行进程 |
三、进程切换 —— 上下文切换
当内核调度器决定停止当前进程,让另外一个进程占用CPU,这个动作就叫进程切换,也就是上下文切换 Context Switch。
3.1 触发进程切换的时机
3.2 什么是上下文?
上下文就是进程的运行现场环境,主要分为三部分:
3.3 一次完整进程切换流程
Linux内核关键源码路径:__schedule()调度入口,调用context_switch(),最终由汇编switch_to()完成寄存器切换。
3.4 上下文切换的开销(面试重点)
上下文切换不是无代价,频繁大量切换会消耗CPU,降低系统整体吞吐量:
排查工具:vmstat,输出中cs列代表每秒上下文切换次数,如果cs数值持续很高,说明系统进程切换过于频繁,需要排查业务。
进程切换 VS 线程切换
- 进程切换:需要切换页表,TLB失效,开销大;
- 同一进程下多线程切换:线程共享同一个虚拟地址空间,不需要切换页表,TLB不用刷新,切换开销小很多。
四、面试高频考点汇总
PRI和Nice(NI)的区别?能不能直接修改PRI?
PRI是内核真正调度使用优先级,用户不能直接修改;
Nice是用户可以修改的偏移量,只能间接改变PRI。
Nice的取值范围,root用户与普通用户权限差异?
范围‑20~19;root可以设置全部区间,普通用户只能设置0‑19,只能让进程谦让,不能调高优先级。
nice与renice命令区别?
nice:进程启动时设置nice;
renice:修改已经运行进程的nice。
并发和并行区别,单核CPU可以做到并行吗?
并发是交替运行,单核就可以;并行需要多核硬件,单核CPU无法实现并行。
什么是上下文切换?开销来自哪里?
调度器换下当前进程、运行新进程,需要保存恢复进程运行现场;
开销来自寄存器保存恢复、TLB缓存失效、内核代码执行。
什么场景触发进程切换?
时间片耗尽、高优先级进程就绪、进程阻塞等待资源主动放弃CPU。
线程切换为什么比进程切换快?
同进程线程共享地址空间,不需要切换页表,不会造成TLB失效。
小结


