-
进程优先级:
1.2. 进程优先级的定义是什么?
进程优先级指的是CPU资源分配的先后顺序,即进程的优先权(priority)。
1.3. 为何存在进程优先级的概念?
根本原因在于资源的稀缺性。
在linux环境中,默认优先级为80,且Linux的优先级是可调的,范围在【60,99】之间,共有40个级别。
Linux优先级的本质是数字,数字越小,优先级越高!
Linux系统允许用户调整优先级,但不能直接修改pri,而是通过修改nice值(不是优先级,而是进程优先级的修正数据)来实现。
pri = pri(old) + nice
1.4. 为什么Linux调整优先级需要受限制?
如果不加限制,用户可以将自己进程的优先级设得极高,而将他人的优先级设得极低,高优先级的进程会优先获得资源,导致后续产生的进程难以享受到CPU资源,从而引发进程饥饿问题。
1.5. PRI与NICE的区别需要特别强调的是什么?
进程的nice值不是进程的优先级,它们是不同的概念,但nice值会影响进程优先级的变化。可以将nice值理解为进程优先级的修正数据。
在Linux下,调整进程优先级就是调整进程的nice值,nice值的范围是-20至19,共有40个级别。
使用top命令更改已存在进程的nice值:进入top后按“r”->输入进程PID->输入nice值。
-
Linux的调度与切换:
2.1. 概念准备:
-
进程在运行时,是否必须在CPU上运行完整个代码?
不是!现代操作系统是基于时间片进行轮转执行的(时间片:给每个进程规定的最大运行时间)。
-
进程的竞争性、独立性、并行性和并发性:
竞争性:系统中进程数量众多,而CPU资源有限,进程之间具有竞争属性。为了高效完成任务和合理竞争资源,便有了优先级。
独立性:多进程运行时,需要独享各种资源,多进程运行期间互不干扰。
并行:多个进程在多个CPU下分别、同时进行运行,称之为并行。
并发:多个进程在一个CPU下通过进程切换,在一段时间内让多个进程都得以推进,称之为并发。
2.2. 如何完成进程的调度和切换?
当一个进程的时间片到期后,如何保存进程以便下次调用?
CPU内部有许多寄存器,进程在运行过程中会产生大量临时数据,存放在CPU的寄存器中。这些CPU内部的临时数据称为进程的硬件上下文。通过硬件上下文的保存,进程可以被再次调度时恢复运行。
因此,当进程再次被调度时,将之前保存的硬件上下文恢复,使进程继续从上次运行的位置进行。
上下文并不是寄存器,而是寄存器的内容。CPU的寄存器只有一套,但寄存器内部保存的数据可以有多套。
所以,寄存器 ≠ 寄存器的内容。
虽然寄存器数据放在共享的CPU设备中,但所有数据实际上是进程私有的。
小结:所有的保存都是为了最终的恢复,所有的恢复都是为了继续上次的运行位置继续进行。
2.4 Linux实现进程调度的算法需要考虑哪些因素?
Linux实现进程调度的算法需要考虑优先级、进程饥饿问题和效率问题。
解决优先级问题:
普通优先级:100~139(对应nice值的取值范围)
实时优先级:0~99(不关心)
时间片未结束的所有进程都按优先级放在队列中。nr_active表示总共有多少个运行状态的进程,queue[140]表示一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,数组下标即优先级。
从0下标开始遍历queue[140],找到第一个非空队列,该队列必定是优先级最高的队列。选中队列的第一个进程开始运行,调度完成,优先级问题解决。
解决进程饥饿问题:
采用引入活动队列和过期队列来解决。
过期队列和活动队列结构相同,过期队列上放置的是时间片耗尽的进程。当活动队列上的进程都被处理完毕后,对过期队列的进程进行时间片重新计算。
我们先将活动队列中的进程都运行完毕,注意活动队列上的进程运行完毕后会减少,不会增加,而过期队列里的进程只会越来越多。此时需要将活动队列的内容与过期队列的内容进行交换。
交换方式:有两个指针分别指向活动队列和过期队列,active指针永远指向活动队列,expired指针永远指向过期队列。活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直存在。只要在合适的时候交换active指针和expired指针的内容,就相当于获得了一批新的活动进程。注意交换时只是交换指针的内容。
解决效率问题:
遍历queue[140]的时间复杂度是常数,但仍然不够高效。
于是采用位图方法解决:
bitmap[5]:一共140个优先级,一共140个进程队列。为了提高查找非空队列的效率,可以用5*32个比特位表示队列是否为空。我们每次可以先遍历一个整数,如果这个整数是0,就可以直接跳过,到下一个整数,直到发现不等于0,再遍历内部。
位图将对数组的遍历转化为对比特位的遍历,效率会高很多。
-
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧