【操作系统】经典处理机调度算法
本篇文章学习自 强连通计算机考研
先来先服务(FCFS)调度算法
这个算法是操作系统中最简单的调度算法,顾名思义,就是谁先来谁先用处理机,就和我们食堂排队打饭一样。可以看的出来,这种算法是讲究公平的,不管你是什么进程,都得按照先来后到的顺序来用处理机。它适用于进程调度和作业调度。
虽然说这个算法体现了公平性,但是万一先到达的进程或者是作业需要的用时很长,那么就会使得后面的作业或进程(特别是后面的作业是短作业或短进程的时候)等待很久,这样就会大大的降低处理机调度以及处理机运行的效率。
所以说,这个算法虽然简单并且公平,但是总体来讲,对长作业或者长进程有利,而且效率比较低,特别是当一个进程需要多次请求I/O的时候,会对后面排队的进程造成很大的影响。
短作业优先(SJF)调度算法
虽然它叫短作业优先算法,但它同样适用于进程调度。而且,从名字上来看,这个调度算法是为短作业量身定做的,当进行作业调度的时候,该调度算法选择一个估计运行时间最短的作业进入内存,当进行进程调度的时候,该算法从就绪队列里面,挑一个估计运行时间最短的进程,并将处理机分配给它。
当然,这个名字我们也可以看出,这个算法,对长作业是很不利的,当我们的就绪队列里面有很多短作业的时候,我们的长作业就会很长时间都得不到调度(俗称饥饿现象),同时不知道大家注意到没有,短不等于重要,如果说重要的作业正是那些长作业,那么我们这个调度算法也就没有那么重要了。最后一点,就是我上面所说的,是估计运行时间,这个估计其实是用户提供的估计时间,实际的运行时间,其实大家都不知道,所以说其实这个算法也不能真的保证可以实现短作业优先。
优先级调度算法
在上一个算法中,我提到重要性这一个词,我们肯定是希望我们的处理机优先处理比较重要的事情,就像我们的人一样,肯定先处理重要的事情。
所以我们就有了优先级调度的算法,这个算法可以优先调度重要的进程或者作业。
如果说我们更仔细的考虑的话,我们可以将这个调度算法更细化。
\1. 如果说考虑高优先级能否抢占正在运行的进程,我们可以将调度算法分为:
非剥夺式优先级调度算法:它的思想就是,就算有个更高优先级的进程出现,我也会先运行完当前的进程
剥夺式优先级调度算法:它的就相反,当有个更高优先级的进程出现,就暂停当前运行的进程。
\2. 如果说根据进程创建后进程的优先级是否可以改变,可以将优先级分为两种:
静态优先级: 优先级在创建进程的时候就确定了,直到进程结束,这个优先级都不会改变
动态优先级: 在进程运行的过程中,根据进程运行的情况来调整优先级,比如说某个进程等待了很久,就可以考虑把这个进程的优先级调高,也可以根据进程占有cpu时间的长短,等待cpu的长短等。
一般来说,我们设置优先级可以根据以下原则:
(1)系统进程高于用户进程。
(2)交互型进程高于非交互型进程,因为交互型进程需要被快速的响应,比如说我们的游戏。
(3)I/O型进程高于计算型进程,因为I/O设备的处理速度比cpu慢的多,所以说我们如果让I/O设备尽快开始工作,我们的系统的运行效率会大大提高。
真题试做
某系统正在执行三个进程P1,P2,和P3,各个进程的计算(CPU)时间和I/O时间比例如下表所示。
为了提高系统资源利用率,合理的进程优先级设置应该为()
A. P1>P2>P3
B. P3>P2>P1
C. P2>P1=P3
D. P1>P2=P3
解析:根据进程优先级设置的规则,I/O型进程的优先级大于计算型进程,所以,正确的优先级设置应为P3>P2>P1,所以选B。
高响应比优先调度算法
这个调度算法,只用于作业调度,它考虑了每个作业的等待时间和估计的运行时间,构成我们的相应比。响应比如下:
可以看到当等待时间都相同的时候,我们的要求服务时间越短,我们的响应比越高,这个时候,就有点像我们的短作业优先调度算法。
当要求服务的时间都相同的时候,等待时间越长,那我们的响应比就越高,此时就像我们的先来先服务算法一样。
同时,可以注意到的是,如果说我们某个作业的等待时间很长(长作业),那么这个作业的响应比就会提高,也就说,不会出现长作业饥饿的现象。
所以才有人说,高相应比优先调度算法是先来先服务和短作业优先两种算法的融合。
时间片轮转调度算法
这个算法是在之前介绍分时系统的时候提到过。
简单的介绍一下这个算法的流程:进程按照到达时间进行排队,然后调度程序每次都选队列的第一个进程执行,但是每次每个运行的进程仅仅只能运行一个时间片,当时间片完了后,当前进程释放处理机,如果说当前进程没有完成的话,那么这个进程就会到等待队列的末尾,继续等待下一次时间片
可以看到的是,时间片的大小对我们的系统性能影响很大。如果时间片足够大到恰好所有进程都可以在一个时间片内执行完,那么这个算法就和我们之前说的先来先服务调度算法没有什么区别了。
如果说时间片很小,那么处理机就会频繁的在进程之间切换。这样真正留给进程运行的时间就会变少。
但时间片的长度也不是固定的,通常我们都是按照:系统响应时间,就绪队列中的进程数,系统的处理能力这几个因素来确定时间片的大小。
多级反馈队列调度算法
这个算法相比与之前的算法,就比较高级了,它综合了时间片轮转调度算法和优先级调度算法,可以达到动态调整进程优先级和时间片大小的目的。
它的调度机制如下:
(1)设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先级,从第一个开始逐个降低。
(2)不同队列进程中所赋予的执行时间也不同,优先级越高,时间片越小。
(3)每个队列都采用FCFS(先来先服务)算法。轮到该进程执行时,若在该时间片内完成,便撤离操作系统,否则调度程序将其转入第二队列的末尾等待调度,.......。若进程最后被调到第N队列中时,便采用时间轮转片方式运行。
按队列优先级调度。调度按照优先级最高队列中各进程运行,仅当第一队列空闲时才调度第二队列进程执行。若优先级低队列执行中有优先级高队列进程执行,应立刻将此进程放入队列末尾,把处理机分配给新到高优先级进程。
真题试做
进程调度算法采用固定时间片轮转调度算法,当时间片过大的时候,就会使时间片轮转法转化为()调度算法
A. 高响应比优先
B. 先来先服务
C. 短进程优先
D. 以上选项都不对
解析:当时间片过大的时候,因为我们的进程也是按照排队顺序来进行处理机调度的,这个时候我们会认为先来先服务调度算法。