linux进程调度优先级分实时(0–99,值越大越优先)和普通(100–139,值越小越优先)两大不重叠区间,调度类(如sched_fifo、sched_normal)决定优先级层级,类内才比较数值;用户可调nice值影响static_prio=120+nice,pri为内核计算的动态显示值。

Linux 进程调度优先级不是单一数字,而是一套分层映射机制。理解它关键在于区分“谁管谁”:调度类决定大优先级顺序,数值优先级在类内起作用。
实时 vs 普通:两大优先级区间互不重叠
内核用 0–139 共 140 个等级划分进程地位,但规则相反:
- 0–99 是实时优先级:数值越大越优先。比如 SCHED_FIFO 进程设为 99,会抢占所有普通进程,哪怕后者 nice=-20(静态优先级 100)
- 100–139 是普通优先级:数值越小越优先。默认 nice=0 → static_prio=120;nice=-20 → static_prio=100(最高普通级);nice=19 → static_prio=139(最低)
- 空闲进程(swapper)固定为 140,仅当 CPU 空闲时运行
调度类优先级高于数值:先分类,再比数
内核调度器不直接比较 120 和 50 哪个大,而是按调度类层级遍历:
- 先找 dl_sched_class(SCHED_DEADLINE),它高于一切
- 再找 rt_sched_class(SCHED_FIFO/SCHED_RR),其中数值 99 > 50
- 然后是 fair_sched_class(SCHED_NORMAL 等),其中 100 > 120 > 139
- 最后是 idle_sched_class(SCHED_IDLE)
所以一个 SCHED_DEADLINE 进程,哪怕 priority=1,也强过 priority=99 的 SCHED_FIFO 进程。
PRI 和 NI 的关系:用户能动的是 NI
终端里看到的 PRI(如 ps 输出中的 PRI 列)是内核计算出的动态优先级,用户不能直接改;能调的只有 NI(nice 值):
- 普通用户只能把 NI 调高(降低优先级),比如从 0 改成 10 → PRI 上升(变差)
- root 可以把 NI 调低(提升优先级),比如从 0 改成 -10 → PRI 下降(变好)
- 公式本质是:动态优先级 = static_prio = 120 + nice,不是 “PRI + nice” 累加
- ps -l 显示的 PRI 值通常在 60–99 区间,这是历史兼容显示,实际内核用的是 100–139 映射
查看与调整:命令背后的映射逻辑
常用命令背后都对应着内核优先级结构:
-
ps -eo pid,nice,pri,cls:同时看 nice 值、显示 PRI、调度类(cls),可验证 SCHED_FIFO 进程的 PRI 显示为 0–99,而 SCHED_NORMAL 显示为 100–139 -
top中按 r 修改的是 nice,不是 PRI;修改后内核自动重算 static_prio 和动态 prio -
renice -n -5 -p 1234:对已运行进程调高优先级,root 权限下才允许负值 -
nice -n -10 ./myapp:启动时指定初始 nice,影响其 static_prio 起点











