Linux 进程优先级详解(2025 最新面试必备)
Linux 进程优先级决定 CPU 资源分配,是操作系统调度核心。面试中常被问到 nice、renice、优先级范围、实时进程、CPU 亲和性等。下面系统梳理所有知识点,一次性讲透。
1. 两个优先级概念(面试必区分)
| 概念 | 取值范围 | 含义 | 谁能设置 | 典型命令 |
|---|---|---|---|---|
| nice 值(普通优先级) | -20 ~ +19 | 值越小,优先级越高(-20 最高,19 最低) | 普通用户可调高自己进程的 nice(降低自己优先级),root 可任意调整 | nice, renice |
| 实时优先级(Real-Time Priority) | 1 ~ 99 | 值越大,优先级越高(99 最高) | 必须 root + SCHED_FIFO / SCHED_RR 调度策略 | chrt |
记住口诀:
- nice 值:负贵正贱(-20 最“贵”,19 最“贱”)
- 实时优先级:越大越狠(99 最强)
2. 查看进程优先级
# 查看 nice 值(NI 列)
ps -eo pid,ppid,user,nice,pri,comm,cmd | grep java
# 查看实时优先级(需要 chrt)
chrt -p <pid>
# 综合查看(top/htop 交互式)
top # 按 Shift+P 按 PRI 排序,按 Shift+N 按 NI 排序
htop # F2 → Columns → 加 NI 和 PRI 列
top 中两列含义:
- PRI:最终调度优先级(内核内部值),普通进程通常是 0~139
- NI:用户态 nice 值(-20~19)
3. 修改进程优先级(高频面试操作)
# 1. 启动时直接指定 nice(推荐)
nice -n 10 java -jar app.jar # nice=10(降低优先级)
nice -n -15 ./stress --cpu 8 # nice=-15(提高,需要 root)
# 2. 运行中调整 nice
renice 15 -p 12345 # 把 pid=12345 的 nice 改成 15
renice -10 -u tom # 把用户 tom 的所有进程 nice 调高
# 3. 修改实时进程优先级(必须 root)
chrt -r -p 50 12345 # 设置为实时 RR 策略,优先级 50
chrt -f -p 99 12345 # 设置为 FIFO 实时,优先级 99(极危险!)
调度策略对照表(chrt 使用):
| 策略 | 命令 | 说明 |
|---|---|---|
| SCHED_OTHER(默认) | chrt -o | 普通分时调度,受 nice 影响 |
| SCHED_FIFO | chrt -f | 实时先到先得,可抢占 |
| SCHED_RR | chrt -r | 实时轮转(同优先级内时间片轮转) |
| SCHED_BATCH | chrt -b | 批量处理,nice 影响更大 |
| SCHED_IDLE | chrt -i | 极低优先级,CPU 空闲时才跑 |
4. 真实调度优先级计算公式(面试可写)
最终优先级(PRI) = 120 + nice 值 + 20(普通进程)
- nice = -20 → PRI = 100(最高)
- nice = 0 → PRI = 120
- nice = 19 → PRI = 139(最低)
实时进程 PRI = 实时优先级(1~99),永远高于普通进程!
5. 典型面试题 & 标准答案
- 普通用户能把进程 nice 调成 -20 吗?
不能。普通用户只能调高 nice 值(降低自己优先级),不能调负值。
只能 root 用renice -n -20 -p pid或nice -n -20启动。 - nice 值 -20 和 19 实际性能差距有多大?
理论上相差 39 级,CPU 分配比例约 1:10~1:20(取决于 CFS 调度器权重表),实际差距非常明显。 - 如何让一个关键 Java 服务永远不被抢占 CPU?
chrt -f -p 50 $(pgrep java) # 实时优先级 50
taskset -c 0-3 <pid> # 再绑定到专用核心
- 生产环境能随便用实时进程吗?
绝对不行!实时进程会饿死普通进程,导致系统卡死(软锁死)。除非音频、工业控制等硬实时场景。 - 如何防止重要后台任务被“饿死”?
- 给它一个较低的 nice 值(比如 -5)
- 使用 ionice 提升 IO 优先级
- 用 cgroup 限制其他进程资源
# 提升 IO 优先级(防止被高 IO 任务拖死)
ionice -c 1 -n 0 -p 12345 # 实时 IO 优先级(最高)
ionice -c 2 -n 0 mysqld # Best-effort 最高级
6. 一句话总结(背下来面试必加分)
“Linux 进程优先级分普通(nice -20~19,值越小越高)和实时(1~99,值越大越高)两套体系。普通用户只能调高自己进程的 nice,实时进程必须 root 且极度危险。生产环境调优首选 nice + ionice + cgroup,慎用实时调度。”
掌握以上内容,京东、阿里、字节、华为等大厂 Linux 进程优先级相关问题基本无压力!