处理机调度算法详解----作业调度
在之前的理论篇中,我们也介绍了处理机调度的层次,不同的操作系统也会根据自己的设计目标来配置不同层次的调度算法,并且因为调度算法众多,如果全部糅杂在一起来讲,会让人比较困惑,因此将调度算法按照层次来讲解,本文会先讲作业调度算法。下文涉及到的一些名词,如果不明白,可以参考上一篇博文。
作业调度调度的对象是作业,作业在概念上和程序还是有些区别的,作业是处于外存中的,也就是在后备队列上的,作业调度的任务就是从外存的后备对列选取某些作业调入内存,并为他们创建进程、分配必要的资源,也只有作业被调入到内存中,并为之分配资源,才能完成进程的创建工作,OS才可以进行其他的调度。
作业调度其执行周期较长,大约几分钟一次,因此也称为长程调度。下面我们一起来看下作业调度的几种调度算法。
1.先来先服务(FCFS)调度算法
FCFS是最早期、最简单的调度算法,是一种非抢占式的调度算法,该算法既可用于作业调度也可用于进程调度。
在用于作业调度时,系统按照作业到达的先后次序来进行调度,从后备作业队列中选择几个最先进入该队列的作业,将他们调入内存,为他们创建进程和分配资源,并将进程插入到就绪队列中。
在用于进程调度时,把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便执行下去,直到该进程完成或阻塞时,才释放处理机。(非抢占式)
缺点:没考虑优先级。
FCFS有利于长作业而不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
FCFS有利于CPU繁忙型作业而不利于I/O繁忙型作业,因为对于I/O繁忙型作业,处理机需要等待I/O完成,这样会导致CPU的利用率降低。
2.短作业优先(SJF)调度算法
由于在实际情况中,短作业所占的比重较大,为了能使它们能比长作业优先执行,短作业优先算法由此产生。SJF以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF也是非抢占式的,同样可以分别用于作业调度和进程调度。
缺点:
- 必须预知作业的运行时间;
- 对长作业非常不利,长作业的周转时间会明显增长,长作业甚至会发生饥饿现象;
- 在采用SJF算法时,人-机无法实现交互;
- 该调度算法完全未考虑作业的紧迫程度。
对于上面的3、4两点,不只是SJF,FCFS同样存在类似的问题。
3.高响应比优先(HRRN)调度算法
综合上述两种调度算法的缺点,也就是综合考虑作业运行的时间和等待时间,产生了高响应比优先调度算法。因为HRRN既考虑了作业的等待时间,又考虑了作业运行时间的调度算法,因此既照顾了短作业,又不使长作业的等待时间过长,从而改善调度的性能。
HRRN因为综合考虑了作业运行的时间和等待时间,因此就需要为每个作业引入一个动态优先级,即优先级是可以改变的,令它随作业等待的时间延长而增加,这将使长作业的优先级在等待期间不断增加,当等待时间足够长时,必然有机会被作业调度算法选中,并将改作业调入内存中。
优先级的定义描述如下: 优 先 权 = 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 优先权=\frac{等待时间 + 要求服务时间}{要求服务时间} 优先权=要求服务时间等待时间+要求服务时间
由上式可以看出:1.如果作业的等待时间相同,则要求服务时间越短,其优先级越高,类似于SJF算法,有利于短作业。2.当要求服务时间相同时,作业的优先权有决定于其等待时间,因为有类似于FCFS算法。3.对于场作业的优先级,可以随等待的时间增加而增加,当等待时间足够长时,也可被选中。
不过该算法实现了FCFS与SJF两者的较好折中,但是因为增加的动态优先级,每次在进行调度之前,都需要先做响应比的计算,显然会增加系统开销。
4.例子
为了加深大家的理解,我给出一道例题,同样,为了简单起见,我们规定OS是单道批处理系统,即OS一次只能执行一个作业,被作业调度算法选中后,即可获得处理机并执行,无须等待进行调度程序为之分配处理机。
例题:假设一个系统中有5个作业,它们的到达时间和服务时间如下表所示,忽略I/O以及其他开销,若分别按先来先服务,短进程优先,高响应比优先进行CPU调度,请给出各进程的开始执行时间,完成时间,周转时间,带权周转时间,平均周转时间和平均带权周转时间。
作业名 | 到达时间/h | 服务时间/h |
A | 0 | 3 |
B | 2 | 6 |
C | 4 | 4 |
D | 6 | 5 |
E | 8 | 2 |
答案如下:
先来先服务调度算法:
进程名 | A | B | C | D | E |
开始时间 | 0 | 3 | 9 | 13 | 18 |
完成时间 | 3 | 9 | 13 | 18 | 20 |
周转时间 | 3 | 7 | 9 | 12 | 12 |
带权周转时间 | 1 | 7/6 | 2.25 | 2.4 | 6 |
平均周转时间为:T = (3+7+9+12+12)/5=8.6
平均带权周转时间为:W=(1+7/6+2.25+2.4+6)/5≈2.56
短作业优先调度算法:
进程名 | A | B | C | D | E |
开始时间 | 0 | 3 | 11 | 15 | 9 |
完成时间 | 3 | 9 | 15 | 20 | 11 |
周转时间 | 3 | 7 | 11 | 14 | 3 |
带权周转时间 | 1 | 7/6 | 2.75 | 2.8 | 1.5 |
平均周转时间为:T = (3+7+11+14+3)/5=7.6
平均带权周转时间为:W=(1+7/6+2.75+2.8+1.5)/5≈1.84
高响应比优先调度算法:
进程名 | A | B | C | D | E |
开始时间 | 0 | 3 | 9 | 15 | 13 |
完成时间 | 3 | 9 | 13 | 20 | 15 |
周转时间 | 3 | 7 | 9 | 14 | 7 |
带权周转时间 | 1 | 7/6 | 2.25 | 2.8 | 1.4 |
平均周转时间为:T = (3+7+9+14+7)/5=8
平均带权周转时间为:W=(1+7/6+2.25+2.8+1.4)/5≈1.72
注:在每次执行调度时,需要计算动态优先级,本题中省略计算过程。
又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。
如有兴趣,还可以查看我的其他几篇博客,都是OS的干货,喜欢的话还请点赞、评论加关注_。
操作系统武功修炼心法