进程优先级
什么是优先级?指定一个进程获取某种资源的先后顺序,本质是进程获取 CPU 资源的优先顺序。
为什么要有优先级?资源少,进程多,才需要竞争。
查看系统进程
ps 工具不仅能获得一个进程的 PID 和 PPID,还能获得一个进程的 nice 值、PRI 等。
- UID:用户的标识符
- PID:代表这个进程的代号
- PPID:代表这个进程是由哪个进程发展衍生而来的,即父进程的代号
- PRI:代表这个进程可被执行的优先级,其值越小越早被执行
- NI:代表这个进程的 nice 值
PRI 和 NI
- PRI 即进程的优先级,通俗点说就是程序被 CPU 执行的先后顺序,此值越小进程的优先级别越高。
- NI 即 nice 值,表示进程可被执行的优先级的修正数值。
- PRI 值越小越快被执行,加入 nice 值后,将会使得 PRI 变为:PRI(new)=PRI(old)+nice。
- nice 取值范围是 -20 至 19,一共 40 个级别。
- Linux 的进程优先级本身范围是【60,99】,一共 40 个级别。
使用 top 命令更改已存在进程的 nice:进入 top 后按'r'->输入进程 PID->输入 nice 值。
简单而言,PRI 越低代表进程优先级越高,而优先级调整是通过 NICE 值来调整。PRI(old) 是固定 80,这是一种覆盖式设置,因此只需要调整 NI 来改变进程优先级。
这里抛出三个问题:
- nice 值为什么要有范围?
- 为什么 nice 取值是从 -20 到 19 这 40 个级别呢?
- 如果一个 NICE 值足够的大,是否会让该进程得不到调度呢?如果进程因为长时间不被调整,就会造成饥饿问题。
问题 1:我们所接触到的操作系统叫做分时操作系统,这种系统的特性是需要尽可能地保证公平公正,即每个进程都要被调度到。 问题 2:与具体调度算法有关。
竞争、独立、并行、并发
- 竞争性: 系统进程数目众多,而 CPU 资源只有少量,甚至 1 个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
- 并行: 多个进程在多个 CPU 下分别同时进行运行,这称之为并行。
- 并发: 多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
进程切换
CPU 上下文切换:其实际含义是任务切换,或者 CPU 寄存器切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,也就是 CPU 寄存器中的全部内容。这些内容被保存在任务自己的堆栈中,入栈工作完成后就把下一个将要运行任务的当前状况从该任务的栈中重新装入 CPU 寄存器,并开始下一个任务的运行,这一过程就是 context switch。
时间片:当代计算机都是分时操作系统,每个进程都有它合适的时间片(其实就是一个计数器)。时间片到达,进程就被操作系统从 CPU 中剥离下来。
进程 O(1) 调度队列
那么,OS 是如何进行进程调度的?状态 + 优先级!!
下图是 Linux 2.6 内核中进程队列的数据结构。
活动队列
一个 CPU,有一个运行队列(可能一个电脑不只一个 CPU,但我们目前只探讨一个 CPU 的情况)。
- 时间片还没有结束的所有进程都按照优先级放在该队列。
- nr_active:总共有多少个运行状态的进程。
- queue[140]:一个元素就是一个进程队列,相同优先级的进程按照 FIFO 规则进行排队调度,所以,数组下标就是优先级!(需要注意的是 queue 数组中的 [0,99] 不用管,而 [100,139] 是进程的位置,这不正好也是 40 个位置吗???前面所学的 nice 值也是 40 个级别,那么只要将 PRI 值 [60,99]+40 不正好能对上进程的位置了。)
那 [0,99] 用来做什么呢?Linux 不仅仅在互联网中使用,在工业场景中也会被使用。如:实时操作系统,Linux 操作系统,支持实时操作系统的功能!! [0,99]
OS 调度进程,是如何选择进程的呢?从该结构中,选择一个最合适的进程,过程是怎么的呢?
- 遍历 queue 数组时


