概述
作业调度
先来先服务(FCFS)和短作业优先(SJF)调度算法
先来先服务(first-come first-served,FCFS)调度算法
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。
当在进程调度中采用 FCFS 算法时,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后,进程调度程序才将处理机分配给其它进程。
顺便说明, FCFS 算法在单处理机系统中已很少作为主调度算法,但经常把它与其它调度算法相结合使用,形成一种更为有效的调度算法。例如,可以在系统中按进程的优先级设置多个队列,每个优先级一个队列,其中每一个队列的调度都基于 FCFS 算法。
短作业优先(short job first,SJF)
由于在实际情况中,短作业(进程)占有很大比例,为了能使它们能比长作业优先执行,而产生了短作业优先调度算法。
1)短作业优先算法
SJF 算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。 SJF 算法可以分别用于作业调度和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行,
2)短作业优先算法的缺点
SJF 调度算法较之 FCFS 算法有了明显的改进,但仍然存在不容忽视的缺点:
(1)必须预知作业的运行时间。在采用这种算法时,要先知道每个作业的运行时间。即使是程序员也很难准确估计作业的运行时间,如果估计过低,系统就可能按估计的时间终止作业的运行,但此时作业并未完成,故一般都会偏长估计。
(2)对长作业非常不利,长作业的周转时间会明显地增长。更严重的是,该算法完全忽视作业的等待时间,可能使作业等待时间过长,出现饥饿现象。
(3)在采用 SJF 算法时,人-机无法实现交互。
(4)该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理
优先级调度算法和高响应比优先调度算法
优先级调度算法(priority-scheduling algorithm,PSA)
我们可以这样来看作业的优先级,对于先来先服务调度算法,作业的等待时间就是作业的优先级,等待时间越长,其优先级越高。对于短作业优先调度算法,作业的长短就是作业的优先级,作业所需运行的时间越短,其优先级越高。但上述两种优先级都不能反映作业的紧迫程度。而在优先级调度算法中,则是基于作业的紧迫程度,由外部赋予作业相应的优先级,调度算法是根据该优先级进行调度的。这样就可以保证紧迫性作业优先运行。优先级调度算法可作为作业调度算法,也可作为进程调度算法。当把该算法用于作业调度时,系统是从后备队列中选择若干个优先级最高的作业装入内存。
高相应比优先调度算法(Highest Response Ratio Next,HRRN)
在批处理系统中, FCFS 算法所考虑的只是作业的等待时间,而忽视了作业的运行时间。而 SJF 算法正好与之相反,只考虑作业的运行时间,而忽视了作业的等待时间。高响应比优先调度算法则是既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。
高响应比优先算法是如何实现的呢?如果我们能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地増加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描述为:
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先级又相当于响应比Rp。据此,优先又可表示为:
由上式可以看出:
- 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而类似SJF算法,有利于短作业。
- 当要求服务的时间相同时,作业的优先级又决定于其等待时间,因而算法又类似于FCFS算法。
- 对于长作业的优先级,可以随等待时间的增加而提高,当其等待时间足够长时,也获得处理机。
因而该算法实现了较好的折中。当然在利用该算法时,每次要进行调度前,都需要先做相应比的计算,显然会增加系统开销。
进程调度
进程调度方式:
- 非抢占方式(Nonpreemptive Mode)
在采用这种调度方式时,一旦把处理机分配给某进程后,就一直让它运行下去,决不会因为时钟中断或任何其它原因去抢占当前正在运行进程的处理机,直至该进程完成,或发生某事件而被阻塞时,才把处理机分配给其它进程。
在采用非抢占调度方式时,可能引起进程调度的因素可归结为:
①正在执行的进程运行完毕,或因发生某事件而使其无法再继续运行;
②正在执行中的进程因提出 I/O 请求而暂停执行;
③在进程通信或同步过程中,执行了某种原语操作,如 Block 原语。
这种调度方式的优点是实现简单,系统开销小,适用于大多数的批处理系统。但它不能用于分时系统和大多数实时系统。 - 抢占方式( Preemptive Mode )
这种调度方式允许调度程序根据某种原则,去暂停某个正在执行的进程,将己分配给该进程的处理机重新分配给另一进程。在现代 OS 中广泛采用抢占方式,这是因为:对于批处理机系统,可以防止一个长进程长时间地占用处理机,以确保处理机能为所有进程提供更为公平的服务。在分时系统中,只有采用抢占方式才有可能实现人-机交互。在实时系统中,抢占方式能满足实时任务的需求。但抢占方式比较复杂,所需付出的系统开销也较大。
“抢占”不是一种任意性行为,必须遵循一定的原则。主要原则有:
①优先权原则,指允许优先级高的新到进程抢占当前进程的处理机,即当有新进程到达时,如果它的优先级比正在执行进程的优先级高,则调度程序将剥夺当前进程的运行,将处理机分配给新到的优先权高的进程。
②短进程优先原则,指允许新到的短进程可以抢占当前长进程的处理机,即当新到达的进程比正在执行的进程(尚须运行的时间)明显短时,将处理机分配给新到的短进程。
③时间片原则,即各进程按时间片轮转运行时,当正在执行的进程的一个时间片用完后,便停止该进程的执行而重新进行调度。
轮转调度算法
在分时系统中,最简单也是较常用的是基于时间片的轮转( round robin , RR )调度算法。该算法采取了非常公平的处理机分配方式,即让就绪队列上的每个进程每次仅运行一个时间片。如果就绪队列上有 n 个进程,则每个进程每次大约都可获得1/n的处理机时间。
1.轮转法的基本原理
在轮转( RR )法中,系统根据 FCFS 策略,将所有的就绪进程排成一个就绪队列,并可设置每隔一定时间间隔(如30 ms )即产生一次中断,激活系统中的进程调度程序,完成一次调度,将 CPU 分配给队首进程,令其执行。当该进程的时间片耗尽或运行完毕时,系统再次将 CPU 分配给新的队首进程(或新到达的紧迫进程)。由此,可保证就绪队列中的所有进程在一个确定的时间段内,都能够获得一次 CPU 执行。
2.进程切换时机
在 RR 调度算法中,应在何时进行进程的切换,可分为两种情况:
①若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。
②在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。
3.时间片大小的确定
在轮转算法中,时间片的大小对系统性能有很大的影响。若选择很小的时间片,将有利于短作业,因为它能在该时间片内完成。但时间片小,意味着会频繁地执行进程调度和进程上下文的切换,这无疑会增加系统的开销。反之,若时间片选择得太长,且为使每个进程都能在一个时间片内完成, RR 算法便退化为 FCFS 算法,无法满足短作业和交互式用户的需求。一个较为可取的时间片大小是略大于一次典型的交互所需要的时间,使大多数交互式进程能在一个时间片内完成,从而可以获得很小的响应时间。图3-2示出了时间片大小对响应时间的影响,其中图( a )是时间片略大于典型交互的时间,而图( b )是时间片小于典型交互的时间。
图3-3示出了时间片分别为 q =1和 q =4时对平均周转时间的影响。
优先级调度算法
在时间片轮转调度算法中,做了一个隐含的假设,即系统中所有进程的紧迫性是相同的。但实际情况并非如此。为了能满足实际情况的需要,在进程调度算法中引入优先级,而形成优先级调度算法。
1.优先级调度算法的类型
优先级进程调度算法,是把处理机分配给就绪队列中优先级最高的进程。这时,又进一步把该算法分成如下两种。
(1)非抢占式优先级调度算法。该算法规定,一旦把处理机分配给就绪队列中优先级最高的进程后,该进程便一直执行下去直至完成,或者因该进程发生某事件而放弃处理机时,系统方可将处理机重新分配给另一优先级最高的进程。
(2)抢占式优先级调度算法。把处理机分配给优先级最高的进程,使之执行。但在其执行期间,只要出现了另一个其优先级更高的进程,调度程序就将处理机分配给新到的优先级最高的进程。因此,在采用这种调度算法时,每当系统中出现一个新的就绪进程i时,就将其优先级 Pj 与正在执行的进程 j 的优先级巳进行比较,如果 P i≤ Pj ,原进程 Pj ,便继续执行;但如果是 Pi > Pj ,则立即停止 Pj 的执行,进行进程切换,使 i 进程投入执行。抢占式的优先级调度算法常用于对实时性要求较高的系统中。
2.优先级的类型
优先级调度算法的关键在于:应如何确定进程的优先级,以及确定是使用静态优先级还是动态优先级。
1)静态优先级
静态优先级是在创建进程时确定的,在进程的整个运行期间保持不变。优先级是利用某一范围内的一个整数来表示的,例如0~255中的某一整数,又把该整数称为优先数。确定进程优先级大小的依据有如下三个;
(1)进程类型。通常系统进程(如接收进程、对换进程)的优先级高于一般用户进程的优先级。
(2)进程对资源的需求。对资源要求少的进程应赋予较高的优先级。
(3)用户要求。根据进程的紧迫程度及用户所付费用的多少确定优先级。
静态优先级法简单易行,系统开销小,但不够精确,可能会出现优先级低的进程长期没有被调度的情况。
2) 动态优先级
动态优先级是指在创建进程之初,先赋予其一个优先级,然后其值随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。例如,可以规定在就绪队列中的进程随其等待时间的增长,使其优先级相应提高。若所有的进程都具有相同优先级初值,则最先进入就绪队列的进程会因其优先级变得最高,而优先获得处理机,这相当于 FCFS 算法。若所有的就绪进程具有各不相同的优先级初值,那么对于优先级初值低的进程,在等待了足够的时间后,也可以获得处理机。当采用抢占式调度方式时,若再规定当前进程的优先级随运行时间的推移而下降,则可防止一个长作业长期地垄断处理机。
多队列调度算法
如前所述的各种调度算法,尤其在应用于进程调度时,由于系统中仅设置一个进程的就绪队列,即低级调度算法是固定的、单一的,无法满足系统中不同用户对进程调度策略的不同要求,在多处理机系统中,这种单一调度策略实现机制的缺点更显突出,由此,多级队列调度算法能够在一定程度上弥补这一缺点。
该算法将系统中的进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级。
多队列调度算法由于设置多个就绪队列,因此对每个就绪队列就可以实施不同的调度算法,因此,系统针对不同用户进程的需求,很容易提供多种调度策略。
在多处理机系统中,该算法由于安排了多个就绪队列,因此,很方便为每个处理机设置一个单独的就绪队列。这样,不仅对每个处理机的调度可以实施各自不同的调度策略,而且对于一个含有多个线程的进程而言,可以根据其要求将其所有线程分配在一个就绪队列,全部在一个处理机上运行。再者,对于一组需要相互合作的进程或线程而言,也可以将它们分配到一组处理机所对应的多个就绪队列,使得它们能同时获得处理机并行执行。
多级反馈队列(multileved feedback queue)调度算法
前面介绍的各种用于进程调度的算法都有一定的局限性。如果未指明进程长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。而下述的多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,还可以较好地满足各种类型进程的需要,因而它是目前公认的一种较好的进程调度算法。
1.调度机制
多级反馈队列调度算法的调度机制可描述如下:
(1)设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先级。第一个队列的优先级最高,第二个次之,其余队列的优先级逐个降低。该算法为不同队列中的进程所赋予的执行时间片的大小也各不相同,在优先级愈高的队列中,其时间片就愈小。例如第二个队列的时间片要比第一个的时间片长一倍,……,第i+1个队列的时间片要比第 i 个的时间片长一倍。图3-4是多级反馈队列算法的示意图。
(2)每个队列采用FCFS算法。当新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统,否则,即它在一个时间片结束时尚未完成,调度程序将其转入第二队列的末尾等待调度;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,依此类推。当进程最后被降到第 n 队列后,在第 n 队列中便采取按 RR 方式运行。
(3)按队列优先级调度。调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行:换言之,仅当第1~( i - I )所有队列均空时,才会调度第 i 队列中的进程运行。如果处理机正在第 i 队列中为某进程服务时又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到第 i 队列的末尾,而把处理机分配给新到的高优先级进程。
2.调度算法的性能
在多级反馈队列调度算法中,如果规定第一个队列的时间片略大于多数人机交互所需之处理时间时,便能较好地满足各种类型用户的需要。
(1)终端型用户。由于终端型用户提交的作业多属于交互型作业,通常较小,系统只要能使这些作业在第一队列规定的时间片内完成,便可使终端型用户感到满意。
(2)短批处理作业用户。对于这类作业,如果可在第一队列中执行完成,便获得与终端型作业一样的响应时间。对于稍长的短作业,也只需在第二和第三队列各执行一时间片完成,其周转时间仍然较短。
(3)长批处理作业用户。对于长作业,它将依次在第1,2,…,n 个队列中运行,然后再按轮转方式运行,用户不必担心其作业长期得不到处理。
基于公平原则的调度算法
以上介绍的几种调度算法所保证的只是优先运行,如优先级算法是优先级最高的作业优先运行,但并不保证作业占用了多少处理机时间。另外也未考虑到调度的公平性。本小节将介绍两种相对公平的调度算法。
1.保证调度算法
保证调度算法是另外一种类型的调度算法,它向用户所做出的保证并不是优先运行,而是明确的性能保证,该算法可以做到调度的公平性。一种比较容易实现的性能保证是处理机分配的公平性。如果在系统中有 n 个相同类型的进程同时运行,为公平起见,须保证每个进程都获得相同的处理机时间1/n。在实施公平调度算法时系统中必须具有这样一些功能:
(1)跟踪计算每个进程自创建以来已经执行的处理时间。
(2)计算每个进程应获得的处理机时间,即自创建以来的时间除以 n 。
(3)计算进程获得处理机时间的比率,即进程实际执行的处理时间和应获得的处理机时间之比。
(4)比较各进程获得处理机时间的比率。如进程 A 的比率最低,为0.5,而进程 B 的比率为0.8,进程 C 的比率为1.2等。
(5)调度程序应选择比率最小的进程将处理机分配给它,并让该进程一直运行,直到超过最接近它的进程比率为止。
2.公平分享调度算法
分配给每个进程相同的处理机时间,显然,这对诸进程而言,是体现了一定程度的公平,但如果各个用户所拥有的进程数不同,就会发生对用户的不公平问题。假如系统中仅有两个用户,用户1启动了4个进程,用户2只启动1个进程,采用轮转法让每个进程轮流运行一个时间片时间,对进程而言很公平,但用户1和用户2得到的处理机时间分别为80%和20%,显然对用户2而言就有失公平。在该调度算法中,调度的公平性主要是针对用户而言,使所有用户能获得相同的处理机时间,或所要求的时间比例。然而调度又是以进程为基本单位,为此,必须考虑到每一个用户所拥有的进程数目。
例如:系统中有两个用户,用户1有4个进程 A 、 B 、 C 、 D ,用户2只有1个进程 E 。为保证两个用户能获得相同的处理机时间,则必须执行如下所示的强制调度序列:
A E B E C E D E A E B E C E D E …
如果希望用户1所获得的处理机时间是用户2的两倍,则必须执行如下所示的强制调度序列
A B E C D E A B E C D E A B E C D E …
最后
以上就是忧郁电源为你收集整理的os 作业调度与进程调度算法的全部内容,希望文章能够帮你解决os 作业调度与进程调度算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复