一、进程优先级的概念
CPU 的资源是有限的,所以 CPU 的运行队列中的所有进程是不可能同时得到资源的。这就是为什么运行队列是一个'队列',而 CPU 分配资源的先后顺序,就是指进程的优先级。
二、查看优先级信息
使用 ps -l 命令,可以查看系统中更详细的进程信息:

其中,与进程优先级相关的信息是 PRI 与 NI,它们也是存在于 task_struct 中的两个整型成员变量。
- PRI:代表这个进程可被执行的优先级,这个值越小越早被执行
- NI:代表这个进程的 nice 值
1. PRI 与 NI 的理解
PRI 比较好理解,就是进程的优先级,也就是程序被 CPU 执行的先后顺序,此值越小进程的优先级越高。 NI,是进程的 nice 值,表示进程优先级的修正数值。
进程 PRI 值 = 80 + 进程 nice 值!
这是进程 PRI 的计算公式,nice 变小,PRI 会变小,进程优先级变高,反之亦然。 所以,调整进程优先级,在 Linux 下就是调整进程的 nice 值! 而优先级的变化范围是有限的!nice 值的取值范围是 -20~19,共 40 个级别。PRI 的取值范围就是 [60, 99] 了!
2. 修改 nice 值
我们还是跑一个循环程序进行演示,此时查看 PRI 和 NI 是默认 80 和 0,没有问题
一种修改 nice 的方式是:用 top 命令,修改已存在进程的 nice 值:输入 top 回车,再输入 r 回车,再输入进程 pid 回车,再输入修改后的 nice 值:

这里我将 nice 值修改为 20。回车,按 q 退出 top,再查询:

可以看到 nice 值成为了 19,这是因为 20 超过了规定的 nice 值范围,最高只能修改到 19。PRI 值也就变成了 19 + 80 = 99,没有问题。 但是,实际中我们不建议高频更改 nice 值。
三、进程调度切换
之前我们提到过,Linux 系统会给每一个进程分配一个时间片,它的时间片执行完,就会自动让出 CPU 另一个进程接着执行。CPU 内只有一套寄存器,由所有进程共享使用,每次保存着一个进程的私有上下文数据,它的时间结束后,这些数据转移到 task_struct 中的成员变量'上下文数据'中存放,寄存器中继续存放下一个进程的临时数据。再轮到这个进程执行时,临时数据再转移到寄存器中。这种操作系统,被称为分时操作系统,当代计算机大多数都是这种。
那么,系统是如何高效切换调度进程的呢?
下面讲解的,是 Linux2.6 内核进程的 O(1) 调度实现算法:
1. list_head 与 prio_array 结构
源码的 task_struct 定义中,有这样两个相关的成员变量:










