Linux 进程优先级与 O(1) 调度算法解析
一、进程优先级的概念
CPU 资源有限,无法让运行队列中的进程同时执行。因此,操作系统需要决定谁先获得时间片,这个先后顺序就是进程优先级。
二、查看优先级信息
使用 ps -l 命令可以查看系统中更详细的进程信息:

其中与进程优先级相关的核心字段是 PRI 和 NI,它们也是存在于 task_struct 结构体中的两个整型成员变量。
- PRI:代表进程可被执行的优先级,数值越小越优先。
- NI:代表进程的 nice 值。
1. PRI 与 NI 的理解
PRI 直观反映程序被 CPU 执行的先后顺序。NI 则是进程优先级的修正数值。
两者的关系公式为:进程 PRI 值 = 80 + 进程 nice 值。 nice 值变小,PRI 随之变小,进程优先级变高;反之亦然。调整进程优先级,在 Linux 下本质上就是调整 nice 值。 nice 值的取值范围是 -20 到 19,共 40 个级别。对应的 PRI 取值范围则是 [60, 99]。
2. 修改 nice 值
我们可以跑一个循环程序进行演示,此时查看 PRI 和 NI 默认分别为 80 和 0。

一种修改方式是通过 top 命令动态调整已存在进程的 nice 值:输入 top 回车,再按 r 键,输入进程 PID,最后输入新的 nice 值。

这里我将 nice 值尝试修改为 20。退出 top 后再次查询:

可以看到 nice 值变成了 19,这是因为 20 超过了规定范围,最高只能修改到 19。此时 PRI 值也就变成了 19 + 80 = 99,符合预期。不过生产环境中,频繁调整 nice 值需谨慎。
三、进程调度切换
系统会给每个进程分配时间片,执行完毕后自动让出 CPU。CPU 寄存器由所有进程共享,每次保存一个进程的上下文数据。当轮转回来时,临时数据再转移回寄存器。这种机制被称为分时操作系统。
那么,系统是如何高效切换调度进程的呢?以 Linux 2.6 内核为例,其核心调度机制采用了 O(1) 算法。









