Linux进程调度以prio值为依据,越小优先级越高;nice是用户可调的偏移量(-20~19),影响普通进程静态优先级static_prio=120+nice,最终prio≈static_prio(100–139);实时进程则由rt_priority(1–99)独立决定。

Linux进程调度策略和优先级不是靠猜的,关键看内核怎么用数值说话。调度器真正比大小的是 prio 值,越小越先跑;而用户能直接接触、也最常调的,是 nice 值——它不等于优先级,但会“撬动”优先级。
怎么看当前进程的调度策略和优先级
用 ps -eo pid,comm,cls,pri,ni,rtprio,sched 可一次性看清核心字段:
- cls:调度类(如 TS 表示 CFS 普通进程,FF/RR 是实时进程)
- sched:数字编码(0=normal,1=fifo,2=rr,3=deadline,4=iso,5=idle)
- pri:内核使用的动态优先级(注意:这里显示的是传统 PRI,范围 60–99,非 0–139 的 raw prio)
- ni:就是 nice 值,-20 到 19
- rtprio:仅对实时进程有效,值越大优先级越高(0 表示非实时)
例如看到某进程 cls=TS, ni=5, pri=85,说明它是普通调度类,nice=5,实际调度优先级按 80+5=85 计算(默认基线 PRI=80)。
nice 值到底怎么影响优先级
nice 不是优先级本身,而是偏移量。Linux 把用户可见的优先级“折叠”进一套映射关系里:
- 普通进程(SCHED_OTHER)的 静态优先级 static_prio = 120 + nice(所以 nice=-20 → static_prio=100,nice=19 → static_prio=139)
- 内核最终调度用的 prio 值,在 CFS 下 ≈ static_prio,范围 100–139
- 实时进程(SCHED_FIFO/SCHED_RR)走另一套:rt_priority 直接决定 prio(0–99),与 nice 无关
- 你用 top 看到的 PRI 列,是传统展示方式(60–99),本质是把 100–139 映射压缩后显示,便于人读
怎么改?权限和限制必须清楚
普通用户只能调低自己进程的优先级(即增大 nice 值),不能提权;root 才能设负 nice 或调其他用户进程:
- 启动时指定:nice -n -10 command(需 root)或 nice -n 10 command(普通用户可用)
- 运行中调整:renice -n -5 PID(root)或 renice -n 8 PID(仅限自己进程)
- 交互式改:top → 按 r → 输入 PID → 输入新 nice 值
- 注意:renice 0 并不恢复“默认”,只是设为 nice=0;原始默认对应 PRI=80,即 nice=0
别混淆:PRI、NI、prio、rt_priority 各司何职
它们在不同层级起作用,混用会导致误判:
- NI(nice):用户空间可调的整数,-20~19,只影响普通进程
- PRI(ps/top 显示):传统 PRI,60~99,是 80 + nice 的结果(近似),方便肉眼判断
- prio(内核态):真实调度值,0~139,0–99 给实时,100–139 给普通
- rt_priority:仅实时进程有,1–99,值越大越优先,与 nice 完全无关










