【操作系统】_7种进程调度算法

书中一共描述了七种进程调度算法,为了学到这几种调度算法,后边做了几道练习题。

1. 先来先服务(FCFS)调度算法

先来先服务调度算法是最简单的调度方法。其基本原则是,按照进程进入就绪队列的先后次序进行选择。对于进程调度来说,一旦一个进程得到处理机,它就一直运行下去,直到该进程完成任务或者因等待某事件而不能继续运行,才会让出处理机。先来先服务调度算法属于非剥夺方式。
从表面上看,这个方法对于所有进程都是公平的,并且一个进程的等待时间是可以预先估计的。但是从另一方面来说,这个方法并非公平,因为当一个大进程先到达就绪状态时,就会使许多小进程等待很长时间,增加了进程的平均周转时间,会引起许多小进程用户的不满。
今天,先来先服务调度算法已很少用作主要的调度算法,尤其是分时和实时系统中。但它常被结合在其他的调度算法中使用。例如,在使用优先级作为调度依据的系统中,往往对许多具有相同优先级的进程使用先来先服务的原则。

2. 优先级调度算法

按照进程的优先级高低来进行调度,使高优先级进程优先得到处理机的调度算法称为优先级调度算法。进程的优先级可以由操作系统按一定原则赋予,也可以在操作系统外部安非,甚至可由用户支付高额费用来购买。
但在许多采用优先级调度算法的系统中,通常使用动态优先级。一个进程的优先级不是固定的,可能会随许多因素的变化而变化,例如,进程的等待时间、已使用的处理机时间或其他资源的使用情况。
优先级调度算法又可分为下述两种:
①非剥夺的优先级调度算法。一旦某个高优先级的进程得到处理机,就一直运行下去,直到由于其自身的原因(任务完成或等待事件)而主动让出处理机,才让另一个高优先级进程运行。
②可剥夺的优先级调度算法。任何时刻都严格按照优先级高的进程在处理机上运行的原则进行调度,或者说,在处理机上运行的进程永远是就绪进程队列中优先级最高的进程。在进程运行过程中,一旦有另一个优先级更高的进程出现(如一个高优先级的等待状态进程因事件的到来而成为就绪状态),进程调度程序就迫使原运行进程让出处理机给更高优先级的进程使用,或称为抢占处理机。在UNIX系结中,其讲程调度算法属于“可剥夺的优先级调度算法”。每个进程的优先级都是动态优先级,由系统为各进程每隔一个时间间隔计算一次优先级。

3. 时间片轮转调度算法

时间片轮转调度算法也多用于进程调度。采用此算法的系统,其进程就绪队列往往按进程到达的时间来排序。进程调度程序总是选择就绪队列中的第一个进程,也就是说,按照先来先服务原则进行调度,但进程仅占用处理机一个时间片。在使用完一个时间片后,即使进程还没有完成其运行,它也必须让出(被剥夺)处理机给下一个就绪的进程。而被剥夺的进程返回就绪队列的末尾重新排队,等候再次运行。时间片轮转调度算法特别适合分时系统使用。当多个进程驻留主存时,在进程间转接的开销一般不是很大。
由于时间片值对计算机系统的有效操作影响很大,所以在设计此算法时,应考虑下列问题:时间片值如何选择?它是固定值还是可变值?它对所有用户都相同还是随不同用户而不同?显然,如果时间片值很大,大到一个进程足以完成其全部任务所需的时间,那么此时间片轮转调度算法就退化为先来先服务调度算法了。如果时间片值很小,那么处理机在进程间的切换工作过于频繁,使处理机的开销变得很大,而处理机真正用于运行用户程序的时间将会减少。通常,最佳的时间片值应能使分时用户得到好的响应时间,因此时间片值应大于大多数分时用户的询间时间,即当一个交互进程正在执行时,给它的时间片值相对来说略大些,使它足以产生一个IO请求:或者时间片值略大于大多数进程从计算到IO请求之间的间隔时间。这样可使用户进程工作在最高速度上,并且也减少了进程间切换的不必要的开销,提高了处理机和I/O设备的利用率,同时也能提供较好的响应时间。
各系统的最佳时间片值是不同的,而且随着系统负荷不同而有所变化。关于时间片值的更进一步考虑和时间片轮转调度算法参阅“多级反馈队列调度算法”。
特别要注意的是,时间片是否用完的判定程序是由时钟中断处理程序激活的,因此时间片值必须大于时钟中断间隔。

4. 短进程优先(SPF)调度算法

短进程优先调度算法从进程的就绪队列中挑选那些运行时间(估计时间)最短的进程进入主存运行。这是一个非剥夺算法。它一旦选中某个短进程,就应该保证该进程尽可能快地完成运行并退出系统。这样减少了在就绪队列中等待的进程数,同时也缩短了进程的平均等待时间,提高了系统的吞吐量。但从另一方面来说,各进程的等待时间的变化范围较大,并且进程(尤其是大进程)的等待时间难以预先估计。也就是说,用户对他的进程什么时候完成心里没底。这样,当后续短进程过多时,大进程可能没有机会运行,导致“饿死”。而在先来先服务调度算法中,进程的等待和完成时间是可以预期的。
短进程优先调度算法要求事先能正确地了解一道作业或进程将运行多长时间。但通常一个进程没有这方面可供使用的信息,只能估计。在生产环境中,对于一道类似的作业可以提供大致合理的估计;而在程序开发环境中,用户难以知道他的程序大致将运行多长时间。
正因为此算法明显偏向短进程,而且进程的运行时间是估计的,所以用户可能把他的进程运行时间估计得过短,从而争取优先运行。为此,当一个进程的运行时间超过所估计的时间时,系统将停止这个进程,或对超时部分加价收费。
短进程优先调度算法和先来先服务调度算法都是非剥夺算法,因此均不适用于分时系统,因为不能保证对用户及时响应。

5. 最短剩余时间优先调度算法

最短剩余时间优先调度算法是将短进程优先调度算法用于分时环境的变形。其基本思想是,让“运行到任务完成时所需的运行时间最短”的进程优先得到处理,包括新进入系统的进程。在最短进程优先调度算法中,一个进程一旦得到处理机,就一直运行到任务完成(或等待事件)而不能被剥夺(除非主动让出处理机)。而最短剩余时间优先调度算法允许被一个新进入系统的且其运行时间短于当前运行进程的剩余运行时间的进程所抢占。
该算法的优点是,可以用于分时系统,保证及时响应用户要求。缺点是,系统开销增加。首先,要保存进程的运行情况记录,以比较其剩余时间长短:其次,剥夺本身也要消耗处理机时间。毫无疑问,这个算法使短进程一进入系统就能立即得到服务,从而缩短进程的平均等待时间。

6. 最高响应比优先调度算法

Hansen针对短进程优先调度算法的缺点提出了最高响应比优先调度算法。这是一个非剥夺的算法。按照此算法,每个进程都有一个动态优先数,该优先数不但是要求的服务时间的函数,而且是该进程得到服务所花费的等待时间的函数。进程的动态优先数计算公式如下:
优先数=(等待时间+要求的服务时间)/要求的服务时间
要求的服务时间是分母,所以对短进程是有利的,因为区的优先数高,可优先运行。另外,因为等待时间是分子,所以长进程由于其等待了较长时间,从而提高了其优先致,终于得到了处理机。进程一旦得到处理机,它就一直运行到进程完成任务(或因等待事件而主动让出处理机),中间不被抢占。
可以看出,“等待时间+要求的服务时间”是系统对作业的响应时间,所以在优先数公式中,优先数的值实际上也是响应时间与服务时间的比值,称为响应比。响应比高者得到优先调度。

7. 多级反馈队列调度算法

短进程优先调度算法或最短剩余时间优先调度算法均是在估计的进程运行时间基础上进行调度的,但在程序开发环境或其他情况下,往往难以估计进程的运行时间。这里所研究的算法是时间片轮转调度算法的发展,不必估计进程运行时间。但是本算法仍然基于以下考虑:
①为提高系统吞吐量和缩短进程的平均等待时间而照顺短进程。
②为得到较好的I/O设备利用率和对交互用户的及时响应而照顾I/O型进程。
③在进程运行过程中,按进程运行情况动态地考虑进程的性质(I/O型进程还是处理机型
进程),并且要尽可能快地决定进程当时的运行性质(以I/O为主还是以计算为主),同时进行相应的调度。
具体来说,多级反馈队列的概念如下图所示。系统中有多个进程就绪队列,每个就绪队列对应一个调度级别。第1级队列的优先级最高,以下各级队列的优先级逐次降低。调度时,选择高优先级队列中的第1个就绪进程。

【操作系统】_7种进程调度算法_第1张图片
各级队列中的进程具有不同的时间片值。优先级最高的第1级队列中的进程的时间片值最少;题看队列级别的增高,其进程的优先级降低了,但时间片值却增大了。通常,下放一级,其时间片值增大1倍。各级队列均按先来先服务原则排序。
调度方法:当一个新进程进入系统后,它被放入第1级队列的末尾。该队列中的进程按先来先服务原则得到处理机,并使用一个相应于该队列的时间片。假如进程在这个时间片内完成了其全部任务,或因等待事件或/O而主动放弃了处理机,该进程就撤离系统(任务完成)或进入相应的等待队列,从而离开就绪队列。若进程使用完了整个时间片后,其运行任务并未完成(也没有产生V/O请求),仍然要求运行,则该进程被剥夺处理机,同时它被放入下一级队列的末是,当第1级队列为空后,调度程序才去调度第2级队列中的进程。其调度方法同前。当第1、2爱队列全部为空后,才去调度第3级队列中的进程……当前面各级队列全部为空后,才去调度最后第n级队列中的进程。第n级(最低优先级)队列中的进程采用时间片轮转调度算法进行调度。当比运行进程更高级别的队列中到来一个新的进程时,它将抢占处理机,而被抢占的进程回到原队列的末尾。
多级反馈队列的调度操作如上所述,它根据进程运行情况的反馈信息而对队列进行组织并调度进程。但对此调度算法需要说明如下。
①照顾I/O型进程的目的在于充分利用外部设备,以及对终端交互用户及时地予以响应。
为此,通常L/O型进程会进入最高优先级队列,从而能很快得到处理机。另一方面,第1级队列
中进程的时间片值也应大于大多数I/O型进程产生一个I/O请求所需的运行时间。这样,既能
使I/O型进程得到及时处理,也避免了不必要的过多的在进程间转接处理机的操作,以减少系统开销。
②处理机型(计算型)进程由于总是用尽时间片(有些计算型进程一直运行几小时也不会产生一个IO请求),而由最高优先级队列逐次进入低优先级队列。虽然运行优先级降低了,等待时间也较长,但终究会得到较大的时间片值来运行,直至在最低一级队列中轮转。
③在有些分时系统中,一个进程由于IO操作完成而要求重新进入就绪队列,并不是将它
放入最高优先级队列,而是让它进入因I/O请求而离开的原来那一级队列。这就需要对进程所在的队列序号进行记录。这样做的好处是,有些计算型进程偶然产生一次I/O请求,I/O操作完成后仍然需要很长的处理机运行时间,为减少进程的调度次数和系统开销,就不要让它们从最高级队列逐次下移,而是直接放入原来所在队列。
但在一个大的程序中,不同的程序段有不同的运行特点。有时计算多,有时I/O操作多。
也就是说,一个计算型进程有时也可以看成IO型进程,为此在有些系统中,当进程每次由于I/0操作完成而重新进入就绪队列时,就将它放入比原来高一级的就绪队列,这样就能体现出进程由计算型向I/O型变化的状态。

一道练习题

【操作系统】_7种进程调度算法_第2张图片
解析
在“可抢占的最高优先级”调度中,任何时刻内核都将处理机分配给当前最高优先级的就绪进程。也就是说,只有当高优先级进程主动放弃CPU时,低优先级进程才有机会运行,并且,一旦高优先级进程需要CPU时,内核就会剥夺低优先级进程的CPU,分配给它使用。

在本例中,由于进程P1和P2在开始执行时,需要进行IO,因此最低优先级的P3得到处理机。但是P3运行了20ms之后被P2(IO已完成)抢占了,P2运行了10S后(还剩10s)被P1抢占了CPU;
【操作系统】_7种进程调度算法_第3张图片
P1 P2 P3 从开始到结束所用的时间分别为:90ms 110ms 80ms,总共完成需要110ms。
CPU的使用率:(30 + 20 +10 + 10 )/ 110 = 63.6%
IO1的利用率:(20 + 30 + 40) / 110 = 81.8%
IO2的利用率:(30 + 20 + 10 )/ 110 = 54.5

你可能感兴趣的:(操作系统,进程调度,优先级调度算法,FCFS先来先服务,时间片轮转,短进程优先SPF)