目录
一.进程的切换
二.进程的调度
基本走向
调度算法
一.进程的切换
进程在运行的时候并非是放在cpu上让其全部跑完,而是基于时间片(比如每1ms就切换一个进程)进行轮转进行的~
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
二.进程的调度
基本走向
在cpu调度进程的时候会先让PCB各自接入运行队列接口链接在一起~
当有进程被cpu调度时在运行的时候会产生大量的临时数据~放在寄存器中!而处于cup内的临时数据外面称为进程的硬件上下文。
上下文不是指寄存器本身,而是指寄存器内部的数据~
寄存器只有一套,但内部的数据可以有很多套,各个进程被保存的数据互不干扰~
当我们的进程因时间片而离开时也会把这些临时数据存储在PCB开辟的空间中,等到该进程下一次被调度时可以恢复曾经保存的硬件上下文,然后继续执行首次调用未完成的操作~
而当有新进程被调用时,面对寄存器中上一个进程的临时数据也不用担心,它会自动把它的临时数据覆盖到寄存器中,然后让寄存器去记录,执行接下来的操作~
调度算法
往常进程调度一般是用FIOF先进先出的调度方式~
而在Linux中进程的调度算法需要考虑三种因素:优先级,饥饿性,效率~
我们基于内核中进程队列的数据结构来为大家讲述
首先先来讲述活跃队列,活跃队列就是当前处于运行队列中的进程~然后它们被安排在指针数组queue中,而在queue【140】里0-99的空间我们是不用的,因为通常那是代表实时操作(一直运行进程直到结束,没有时间片),所以我们取的是后面40个空间来划分出40个优先级(因为linux的优先级一共有40个等级,从低到高依次往上排)。
我们的进程就通过PCB查看自己的优先级然后对号入座到这40个空间中~
而我们还有一个队列,称为过期队列~唯一与活跃队列不同的是过期队列是在活跃队列进程还没全部调度完时突然有新进程加入进来,而新加入的进程不能马上到活跃队列中,而是来到过期队列按照优先级排列好~
我们可以理解为这三个数据存储在结构体q中,而数组array[0]存放的则是结构体q,我们有两个指针,一个是active指针,它会指向活跃队列所在的空间。一个是expried指针,它会指向过期队列所在的空间~
而处于运行队列中的进程(即活跃队列)终究会因为时间片而转人过期队列,当活跃队列没有进程时,这时候的active指针就会与expried指针交换指向的内容,那么原本过期队列的进程也开始进入cpu的运行队列进行调度了~
bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!
最终我们达成O(1)算法调度~