先来先服务算法(FCFS,First Come First Serve)(考虑等待时间)
下面给出例子来计算一下
按照先到先服务原则可以画出下面的示意图
周转时间=完成时间-到达时间:P1=7-0=7; P2=11-2=9;P3=12-4=8;P4=16-5=11
带权周转时间:周转时间/运行时间:P1=7/7=1;P2=9/4=2.25;P3=8/1=8;P4=11/4=2.75
等待时间=周转时间-运行时间:P1=7-7=0;P2=9-4=3;P3=8-1=7;P4=11-4=7
平均周转时间=(7+9+8+11)/4=8.75
平均带权时间=(1+2.25+8+2.75)/4=2.56
平均等待时间=(0+5+7+7)/4=4.75
其中排队买奶茶的例子是这样的,当你只想买一杯奶茶时,前面却出现一个人要一下子买30杯,本来你的奶茶只需要做1分钟,但因为那个”长作业”导致你要等很久,所以用户体验感很差,也就是上面计算中P3的带权周转时间,我们看到,他大很多倍。
为了解决这个问题,就有了下面的这一种算法
短作业优先算法(SJF,Shortest Job First)(考虑运行时间)
同样也是上面的计算例子
注意短进程优先算法是说,已经到达的进程中,运行时间最短的先服务,0时刻只有P1,所以P1先服务,而在0-7这中间P2,P3,P4都已经到达,因此可以画出下面图示
周转时间=完成时间-到达时间:P1=7-0=7; P2=12-2=10;P3=8-4=4;P4=16-5=11
带权周转时间:周转时间/运行时间:P1=7/7=1;P2=10/4=2.5;P3=4/1=4;P4=11/4=2.75
等待时间=周转时间-运行时间:P1=7-7=0;P2=10-4=6;P3=4-1=3;P4=11-4=7
平均周转时间=(7+10+4+11)/4=8
平均带权时间=(1+2.25+8+2.75)/4=2.56
平均等待时间=(0+5+7+7)/4=4
对比FCFS的后三项指标:8.75,3.5,4.75发现的确降低了很多
下面再来看看抢占式的短作业优先调度算法,最短剩余时间优先算法
即当有进程加入就绪队列改变,新到达的进程剩余时间比当前运行的进程剩余时间更短或正在运行的进程完成时,新进程抢占处理机
Pn(m) n表示第n个进程,m表示剩余时间
0时刻(P1到达):P1(7)
2时刻(P2到达):P1(5) P2(4)
4时刻(P3到达):P1(5) P3(1) P2(2)
5时刻(P3完成,P4刚好到达):P1(5) P2(2) P4(4)
7时刻(P2完成):P1(5) P4(4)
11时刻(P4完成):P1(5)
因此可以画出以下图示
周转时间=完成时间-到达时间:P1=16-0=16; P2=7-2=5;P3=5-4=1;P4=11-5=6
带权周转时间:周转时间/运行时间:P1=16/7=2.28;P2=5/4=1.25;P3=1/1=1;P4=6/4=1.5
等待时间=周转时间-运行时间:P1=16-7=9;P2=5-4=1;P3=1-1=0;P4=6-4=2
平均周转时间=(16+5+1+6)/4=7
平均带权时间=(2.28+1.25+1+1.5)/4=1.5
平均等待时间=(9+1+0+2)/4=3
对比非抢占式的后三项指标:8 2.56 4
我们发现,这才是最小的
因此我们来总结一下,在所有进程同时可运行/几乎同时到达时,SJF的调度算法的平均等待时间,平均周转时间最少
若没有上述条件,则抢占式的短时间优先算法即SRTN的平均等待时间,平均周转时间最少
这也就是为什么一开始那个只是总览中的最少···打双引号
高响应比优先算法(HRRN,Highest Response Ratio Next)(都考虑)
同样是上面的计算例子,我们来分析一下,
0时刻:只有P1到达就绪队列,P1上处理机
7时刻(P1完成):就绪队列中有P2,P3,P4,响应比分别为P2=(5+4)/4=2.25;P3=(3+1)/1=4;P4=(2+4)/4=1.75
8时刻(P3完成):P2=(6+4)/4=2.5;P4=(4+1)/4=1.25
12时刻(P2完成):只剩P4
时间片轮转算法(RR,Round-Robin)
同样我们也可以像上面那样举个计算栗子来验证,且不需要算平均周转时间什么的,只看响应时间,画出图就好了,但这里表述不清,就省略了,只是提醒一点,当同一时刻既有处理机上下来的进程,又有新来的进程,则把从处理机上下来的进程挂在后面
动手试试之后,不妨将时间片分别设置大一点,小一点
这里只给出图示
当时间片为2时
当时间片为5时
你会发现时间片过大的话就和FCFS没什么区别,且会增大响应时间(比如上图P4五个小格后因超过时间片,所以要再响应一下)
时间片过小的话,需要频繁的切换进程,开销大,也导致进程的实际执行时间比例减少
因此,时间片既不能过大也不能过小,通常情况下,设计时间片大小时,应保证切换进程的比例不超过1%
优先级调度算法
同样给出下面这个小栗子,给出优先数,本例子是优先数越大,优先级越大,有的可能是优先数越大优先级越小,注意区分
非抢占式:进程主动放弃处理机(运行完或异常停止或I/O中断)后进行调度,在当前已经到达的进程中选择优先级最高的,当需判断两个优先级相同,则谁先到达就选谁
抢占式:当就绪队列改变时会发生调度,比如2时刻,由只有P1变为P1和P2,这个时候就会判断谁的优先级高,谁运行,当需判断两个优先级相同,则谁先到达就选谁
补充:
根据优先级是否可以动态改变将优先级分为静态优先级,动态优先级(创建进程时有一个初始值,之后根据情况动态改变)
如何合理设置优先级:系统进程优先级高于用户进程;前台进程高于后台进程;操作系统更偏好I/O型进程
是么时候调整动态优先级:若进程在就绪队列中等待了很长时间,则可以适当提升其优先级;若某进程在处理机内占用太长时间,就适当降低优先级;若进程频繁进行I/O操作,应适当提高优先级
以上的算法多多少少都有点瑕疵,下面给出折中的一种算法——多级反馈队列调度算法
多级队列调度算法(最优,用于进程调度,抢占式,会饥饿)
算法思想:设计多级就绪队列
给出实例来分析算法流程
新进程先到优先级高的队列即第一级队列,待这一级时间片用完后就到下一级队尾,若已经在最后一级队尾则重新放入最后一级队尾,只有k级为空才会为k+1级分配时间片,具体实现过程如下图
(第五幅图开始少了个P1)
会饥饿:若源源不断地有短进程到达第一级队列,拿在底下队列的进程长期得不到服务就会饥饿