文章目录
- 1. 调度器/调度程序
- 2. 闲逛进程
- 3. 调度算法评价标准
- 4.调度算法
-
- 先来先服务(FCFS)
- 短作业优先服务(SJF)
- 高响应比优先算法(HRRN)
- 时间片轮转调度算法(RR)
- 优先级调度算法
- 多级反馈队列调度算法
- 多级队列调度算法
1. 调度器/调度程序
进程从就绪态转化为运行态,或者从运行态转化为就绪态都需要调度器
CPU运行哪个进程由调度算法决定。
一个进程在CPU上运行的时间由时间片决定。
执行调度器/调度程序的时机:
- 创建新进程
- 进程退出
- 运行进程阻塞
- IO中断发生,唤醒了某些阻塞进程
如果是非抢占式调度策略:只有在进程退出,或者进程阻塞的时候才会触发调度器
抢占式调度策略:每个或每K个时钟中断都会触发调度器。
需要注意:
- 在支持内核级线程操作系统,调度程序的操作对象是内核级线程
- 不支持内核级线程操作系统,调度程序的操作对象是进程
2. 闲逛进程
如果没有进程就绪时,此时CPU就会运行闲逛进程。
闲逛进程的特点:
- 优先级最低
- 能耗低
- 闲逛进程会反复执行0地址指令,不需要访存,不需要访问CPU寄存器。
- 指令周期结束后会检测中断。
3. 调度算法评价标准
CPU利用率: (CPU处于忙碌时间)÷(CPU总时间)(通常会考察多道程序并发执行的情况下CPU利用率)
系统吞吐量: 单位时间内完成的作业数目
系统吞吐量=(一段时间内完成的作业数目÷一段时间)
周转时间: 作业被提交到系统到作业完成的这段时间
- 平均周转时间:各个作业周转时间和÷作业数目
- 带权周转时间:作业周转时间÷作业实际运行时间(带权周转时间越小,用户效果越好)
- 平均带权周转时间:带权周转时间和÷作业数
等待时间: 进程/作业处于等待处理机状态的时间
- 进程等待时间:进程建立后等待被服务的时间和
- 作业等待时间:作业在外存后备队列等待时间+进程等待时间
相应时间: 用户提交请求到首次产生响应所用的时间
4.调度算法
先来先服务(FCFS)
思路:按照作业,进程到达的先后顺序进行服务
当用于作业调度时:考虑那个作业先到达后备队列。
当用于进程调度时:考虑那个进行先到达就绪队列。
FCFS调度算法是非抢占式的调度算法
解:这些进程都是纯计算型进程,首先采用先来先服务调度算法,进程的调度顺序为:
p1->p2->p3->p4
周转时间:(完成时间-到达时间)
- p1:7
- p2:(7+4)- 2=9
- p3:(7+4+1)- 4=8
- p4:(7+4+1+4)- 5=11
带权周转时间:周转时间÷运行时间
- p1:7÷7=1
- p2:9÷4=2.25
- p3:8÷1=8
- p4:11÷4=2.75
等待时间:周转时间-运行时间
需要注意:
如果涉及IO操作的进程,等待时间=周转时间-等待时间-I/O操作时间
- p1:0
- p2:9-4=5
- p3:8-1=7
- p4:11-4=7
平均等待时间:4.75
平均周转时间:8.75
平均带权周转时间:3.5
优点:
- 公平,算法实现简单
- 不会导致线程饥饿
缺点:
- 对长作业有利,短作业带权等待时间太长,短作业用户体验差
短作业优先服务(SJF)
思想:要求服务时间最短的优先调度
当用于作业调度时:称为SJF
当用于进程调度时:称为短进程优先算法SPF
SJF与SPF是非抢占式调度算法
但是也有其抢占式调度的变种:最短剩余时间优先算法(SRTN)
解:首先分析调度顺序
短作业/进程优先调度算法:每次调度时选择当前已到达且运行时间最短的作业/进程。
调度顺序为:p1->p3->p2->p4
具体计算过程省略:
平均周转时间= (7+4+10+11)/4 = 8
平均带权周转时间=(1+4+2.5+2.75)/4 = 2.56
平均等待时间= (0+3+6+7)/4 = 4
如果采用抢占式短作业优先算法(SRTN):
最短剩余时间优先算法:每当有进程加入就绪队列,就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。
进程调度顺序分析如下:
- p1先到达,过了两个时间后p2到达
- 2时刻,p1(5) 、p2(4),此时p2剩余时间短。CPU会调度p2
- 4时刻,p1(5)、p2(2),p3(1)此时调度p3
- 5时刻,p3完成任务,p4进程需要被调度。p1(5)、p2(2)、p4(4)调度p2
- p2调度后,调度剩下的p4->p1
平均周转时间=(16+5+1+6)/4 = 7
平均带权周转时间=(2.28+1.25+1+1.5)/4 = 1.50
平均等待时间=(9+1+0+2)/4 = 3
可以发现,采用抢占式短作业优先比非抢占式的短作业优先更加高效。
如果题目没有明确指明,提到的短作业优先默认是非抢占式的。
注意:
1. 在所有的进程同时可以运行的情况下(所有的进程近似同时到达),采用短作业优先调度算法平均等待时间,平均周转次数最短。
2. 如果没有限定条件,抢占式短作业优先算法(SRTN)平均等待时间,平均周转次数最短
优点:
- 可以得到最短的平均等待时间,平均周转次数
缺点:
- 对短作业比较好,对长作业用户体验差
- 可能会导致饥饿
高响应比优先算法(HRRN)
思路:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务(响应比:(等待时间+要求服务时间)÷要求服务时间。)
属于非抢占式调度算法,在进程主动放弃CPU(正常结束,异常结束,挂起阻塞)时才需要进行调度。
分析调度顺序:
- 0时刻:只有进程p1需要调度,p1上CPU进行调度
- 7时刻:p1进程结束,7时刻p2,p3,p4进程都到达
- 计算p2、p3、p4的响应比:p2([(7-2)+4]/4=2.25)、p3([(7-4)+1]/1=4)、p4([(7-5)+4]/4=1.5),优先调度相应比高的p3
- 8时刻:p3进程结束,计算相应比p2(2.5)、p4(1,75)调度p2
- 12时刻:p2进程结束,只剩下p4进程,调度p4
优点:
- 综合考虑了等待时间与运行时间
- 不会导致饥饿问题,长作业随着等待时间的提高,相应比会提高,避免了饥饿问题
前三种算法主要保证公平性,不区分任务的紧急程度对用户的交互性很差
时间片轮转调度算法(RR)
思想:按照进程进入就绪队列的顺序,轮流让进程在CPU中执行一个时间片长度。如果进程在一个时间段内没有完成任务,则剥夺处理机,让这个进程进入就绪队列尾部等待CPU调度。
需要注意:
- 时间片轮转调度算法仅仅适合进程调度,不适合作业调度。只有进程才会被系统分配时间片。
- 这种调度算法属于抢占式算法,由时钟装置发出时钟中断通知CPU时间片已经到
设时间片大小为2时
- 时刻0,p1进程到达,p1进程被调度
- 时刻2,p2进程到达,p1时间片到达,下CPU并到就绪队列尾部,此时就绪队列为p2(队头4)-p1(3),CPU调度p2进程
- 时刻4,p3进程到达,p2时间片到,此时就绪队列为p1(队头3)-p3(1)-p2(2),CPU调度p1
- 时刻5,p4进程到达,p1时间片未到,此时就绪队列为p1(队头2)-p3(1)-p2(2)-p4(6)
- 时刻6,p1时间片到,轮转调度,此时就绪队列为p3(队头1)-p2(2)-p4(6)-p1(1),CPU调度p3进程
- 时刻7,p3进程正常结束,CPU进行调度此时就绪队列为p2(队头2)-p4(6)-p1(1),CPU调度p2
- 时刻9,p2进程正常退出,此时就绪队列为p4(队头6)-p1(1),CPU调度p4进程
- 之后就是这个两个进程在调度,不在赘述
时间片为5的情况不在赘述
需要注意:
如果设置的时间片比较大时,会导致每个进程都在一个时间片内完成,此时时间片轮转调度算法和先进先服务算法调度顺序相同。
时间片大小不适合太大,也不适合太小。太大了会增加进程响应的时间,太小了回到是进程切换频繁,系统开销增大
优点:
- 对于每个进程来讲公平
- 进程响应快
- 不会导致饥饿问题
缺点
- 用于进程切换时有开销
- 不区分任务的紧急程度
优先级调度算法
思路:每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程
这个算法既可以用在进程调度,也可以用于作业调度(同时也适用于IO调度)
优先级调度算法可以由抢占式,也可以有非抢占式
- 非抢占式只需在进程主动放弃处理机时进行调度即可
- 抢占式还需在就绪队列变化时,检查是否会发生抢占。
非抢占式调度图:
抢占式优先级调度算法:
需要注意:
- 就绪队列不一定只有一个,可以按照优先级来组织就绪队列(把优先级高的进程放在靠近队头的位置)
- 根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种。(动态优先级在运行时优先级可能改变,静态优先级在进程创建后不会改变)
- IO繁忙进程优先级比计算繁忙进程优先级高,让IO繁忙进程快速运行,使IO设备能尽快的于CPU并行运行,提高系统吞吐量
- 系统进程优先级比用户优先级高
优点:
- 区分进程的优先级,可以灵活的处理各个进程或作业
缺点:
- 如果有很多优先级比较高的进程到来,可能会导致饥饿问题
多级反馈队列调度算法
这种算法是上述几种调度算法的综合
具体思路:
- 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
- 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
- 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
这种算法只适用于进程调度,不适用于作业调度。
此外这种调度算法属于抢占式调度算法
调度分析:
-
0时刻,此时只有p1进程,p1进程在第一级队列被调度
-
时刻1,此时p2进程到达,p1进程时间片到,p1进程到第二级队列队尾。p2进程进入第一级队列队尾。CPU处理p2进程
-
时刻2,此时p2进程时间片到达,进入第二级别队列队尾
-
此时第一级别队列为空,为第二级别队列分配时间片,此时p1在队头,CPU调度p1进程
-
时刻4,p1时间片到,执行调度算法,CPU调度p2进程
-
时刻5,进程p3进程到达,p3进入第一级队列,p2被抢占,p2回到原来队列的队尾,CPU调度p3
之后的调度过程与上面类似,就不在赘述了
最终调度顺序为:
P1(1)->P2(1)->P1(2)->P2(1)->P3(1)->P2(2)->P1(4)->P1(1)
优点:
- 对各类进程相对公平
- 进程响应比较快
- 短进程响应快,长进程也能得到积极的响应
- 进程具有优先级
缺点:
- 短进程如果很多的话,优先级低的进程会导致饥饿问题。
多级队列调度算法
思路:进程被后会对进程进行分类。不同类别的进程优先级不同
队列之间可以采用时间片轮转调度。
eg:如三个队列分配时间50%、40%、10%
每个队列自身可以采用上述的各种不同的调度算法
eg:
- 系统进程队列采用优先级调度
- 交互式队列采用RR
- 批处理队列采用FCFS