-
进程调度
基本属性
1.多态性 从诞生、运行,直至消灭。
2.多个不同的进程可以包括相同的程序
3.三种基本状态 它们之间可进行转换
基本状态
1.等待态:等待某个事件的完成;
2.就绪态:等待系统分配处理器以便运行;
3.运行态:占有处理器正在运行。
运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。
等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行。
运行态→就绪态 不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。
就绪态→运行态 系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态
处理机
高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:
高级调度:(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;
低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;
中级调度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。
方式
非剥夺方式
分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。
剥夺方式
当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程优先原则、时间片原则。
例如,有三个进程P1、P2、P3先后到达,它们分别需要20、4和2个单位时间运行完毕。
假如它们就按P1、P2、P3的顺序执行,且不可剥夺,则三进程各自的周转时间分别为20、24、26个单位时间,平均周转时间是23.33个时间单位。
假如用时间片原则的剥夺调度方式,可得到:P1、P2、P3的周转时间分别为26、10、6个单位时间(假设时间片为2个单位时间),平均周转时间为14个单位时间。
衡量进程调度性能的指标有:周转时间、响应时间、CPU-I/O执行期。
算法
一、先来先服务和短作业(进程)优先调度算法
1.先来先服务调度算法
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
2.短作业(进程)优先调度算法
短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
二、高优先权优先调度算法
1.优先权调度算法的类型
为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。此算法常被用于批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度算法,还可用于实时系统中。当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种。
1) 非抢占式优先权算法
在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。
2) 抢占式优先权调度算法
在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
2.高响应比优先调度算法
在批处理系统中,短作业优先算法是一种比较好的算法,其主要的不足之处是长作业的运行得不到保证。如果我们能为每个作业引入前面所述的动态优先权,并使作业的优先级随着等待时间的增加而以速率a 提高,则长作业在等待一定的时间后,必然有机会分配到处理机。
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先权又相当于响应比RP。
由上式可以看出:
(1) 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业。
(2) 当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务。
(3) 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高,从而也可获得处理机。简言之,该算法既照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。因此,该算法实现了一种较好的折衷。当然,在利用该算法时,每要进行调度之前,都须先做响应比的计算,这会增加系统开销。
三、基于时间片的轮转调度算法
1.时间片轮转法
1) 基本原理
在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU 分配给队首进程,并令其执行一个时间片。时间片的大小从几ms 到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。
2.多级反馈队列调度算法
前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度算法的系统中,调度算法的实施过程如下所述。
(1) 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。
(2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。
(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。
实现
引起原因
- 正在执行的进程执行完毕或因发生某事件而不能再继续执行;
- 执行中的进程因提出I/O请求而暂停执行;
- 在进程通信或同步过程中执行了某种原语操作如P操作、阻塞、挂起原语等;
- 在可剥夺式调度中,有比当前进程优先权更高的进程进入就绪队列;
- 在时间片轮转法中,时间片完;
功能
记录系统中所有进程的执行情况
进程调度的具体功能可总结为如下几点:
作为进程调度的准备,进程管理模块必须进程调度将系统中各进程的执行情况和状态特征记录在各进程的PCB表中。并且,根据各进程的状态特征和资源需求等、进程管理模块还将各进程的PCB表排成相应的队列并进行动态队列转接。进程调度模块通过PCB变化来掌握系统中存在的所有进程的执行情况和状态特征,并在适当的时机从就绪队列中选择出一个进程占据处理机。
选择占有处理机的进程
进程调度的主要功能是按照一定的策略选择—个处于就绪状态的进程,使其获得处理机执行。根据不同的系统设计目的,有各种各样的选择策略,例如系统开销较少的静态优先数调度法,适合于分时系统的轮转法(Round RoLin)和多级互馈轮转法(Round Robin with Multip1e feedback)等。这些选择策略决定了调度算法的性能。
进行进程上下文切换
—个进程的上下文(context)包括进程的状态、有关变量和数据结构的值、机器寄存器的值和PCB以及有关程序、数据等。一个进程的执行是在进程的上下文中执行。当正在执行的进程由于某种原因要让出处理机时,系统要做进程上下文切换,以使另一个进程得以执行。当进行上下文切换时点统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程、并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。
时机
引起进程调度的原因有以下几类:
进程调度发生在什么时机呢?这与引起进程调度的原因以及进程调度的方式有关。
- 正在执行的进程执行完毕。这时,如果不选择新的就绪进程执行,将浪费处理机资源。
- 执行中进程自己调用阻塞原语将自己阻塞起来进入睡眠等状态。
- 执行中进程调用了P原语操作,从而因资源不足而被阻塞;或调用了v原语操作激活了等待资源的进程队列。
- 执行中进程提出I/O请求后被阻塞。
- 在分时系统中时间片已经用完。
- 在执行完系统调用等系统程序后返回用户进程时,这时可看作系统进程执行完毕,从而可调度选择一新的用户进程执行。
- 就绪队列中的某进程的优先级变得高于当前执行进程的优先级,从而也将引发进程调度。
以上都是在可剥夺方式下的引起进程调度的原因。在CPU执行方式是可剥夺时.还有两种占用CPU的方式
可剥夺式 (可抢占式preemptive):就绪队列中一旦有优先级高于当前执行进程优先级的进程存在时,便立即发生进程调度,转让处理机。
不可剥夺式 (不可抢占式non_preemptive):即使在就绪队列存在有优先级高于当前执行进程时,当前进程仍将占用处理机直到该进程自己因调用原语操作或等待I/O而进入阻塞、睡眠状态,或时间片用完时才重新发生调度让出处理机。
上下切换
进程上下文由正文段、数据段、硬件寄存器的内容以及有关数据结构等组成。硬件寄存器主要包括存放CPU将要执行的下条指令虚拟地址的程序计数器PC,指出机器与进程相关联的硬件状态的处理机状态寄存器PS,存放过程调用(或系统调用)时所传递参数的通用寄存器R以及堆栈指针寄存器S等。数据结构则包括PCB等在内的所有与执行该进程有关的管理和控制用表格、数组、链等。在发生进程调度时系统要做进程上下文切换。
在进程(上下文)中切换的步骤
- 保存处理器的上下文,包括程序计数器和其它寄存器
- 用新状态和其它相关信息更新正在运行进程的PCB
- 把原来的进程移至合适的队列-就绪、阻塞
- 选择另一个要执行的进程
- 更新被选中进程的PCB
- 从被选中进程中重装入CPU 上下文
性能评价
进程调度虽然是在系统内部的低级调度,但进程调度的优劣直接影响作业调度的性能。那么,怎样评价进程调度的优劣呢?反映作业调度优劣的周转时间和平均周转时间只在某种程度上反映了进程调度的性能,例如,其执行时间部分中实际上包含有进程等待(包括就绪状态时的等待)时间,而进程等待时间的多少是要依靠进程调度策略和等待事件何时发生等来决定的。因此,进程调度性能的商量是操作系统设计的一个重要指标。
我们说进程调度性能的衡量方法可分为定形和定量两种。在定形衡量方面,首先是调度的可靠性。包括一次进程调度是否可能引起数据结构的破坏等。这要求我们对调度时机的选择和保存CPU现场十分谨慎。另外,简洁性也是衡量进程调度的一个重要指标,由于调度程序的执行涉及到多个进程和必须进行上下文切换,如果调度程序过于繁琐和复杂,将会耗去较大的系统开销。这在用户进程调用系统调用较多的情况下,将会造成响应时间大幅度增加。
进程调度的定量评价包括CPU的利用率评价、进程在就绪队列中的等待时间与执行时间之比等。实际上由于进程进入就绪队列的随机模型很难确定,而且进程上下文切换等也将影响进程的执行效率,LL而对进程调度进行解析是很困难的。一般情况下,大多利用模拟或测试系统响应时间的方法来评价进程调度的性能。
实时系统
综述
实时系统与其他操作系统不同在于计算机要能及时响应外部事件的请求,在规定的严格时间内完成对该事件的处理,并控制所有实时设备和实时任务协调一致地工作,对于对时间要求严格性的不同,实时系统又分为硬实时系统和软实时系统,其中硬实时系统是指这种时限的要求是绝对的,任何一个实时任务都能够在时限之前完成;而软实时系统的要求就没有这么严格,允许偶尔有实时任务不满足时限的要求.实时系统一般用于嵌入式的系统中,分为实时过程控制和实时通信处理,其中实时过程控制主要用于工业控制,军事控制领域;时事通信用于电信,银行,飞机订票等领域,正是由于在这些特殊领域的运用使得实时操作系统设计时主要追求的是:对外部请求在严格时间范围内做出反应,有高可靠性和完备性.为达到时间要求,进程的调度策略就显得尤为重要.
优先级
最简单最直观的进程调度策略是基于优先级的调度,多数实时系统采用基于优先级的调度,每个进程根据它重要程度的不同被赋予不同的优先级,调度器在每次调度时,总选择优先级最高的进程开始执行.
首先要考虑的问题是如何分配优先级,对于进程优先级的分配可以采用静态和动态两种方式,静态优先级调度算法:这种调度算法给那些系统中得到运行的所有进程都静态地分配一个优先级.静态优先级的分配可以根据应用的属性来进行,比如进程的周期,用户优先级,或者其它的预先确定的策略.单调率算法(RM)调度算法是一种典型的静态优先级调度算法,它根据进程的执行周期的长短来决定调度优先级,那些具有小的执行周期的进程具有较高的优先级.动态优先级调度算法:这种调度算法根据进程的资源需求来动态地分配进程的优先级,其目的就是在资源分配和调度时有更大的灵活性.在实时系统中,最早期限优先算法(EDF)算法是使用最多的一种动态优先级调度算法,该算法给就绪队列中的各个进程根据它们的截止期限(Deadline)来分配优先级,具有最近的截止期限的进程具有最高的优先级.
分配好优先级之后下一个要考虑的问题是何时让高优先级进程掌握CPU的使用权,这取决于操作系统的内核,有不可抢占式和可抢占式两种.
不可抢占式内核要求每个进程自我放弃CPU的所有权,各个进程彼此合作共享一个CPU.异步事件还是由中断服务来处理.中断服务可以使一个高优先级的进程由挂起状态变为就绪状态.但中断服务以后控制权还是回到原来被中断了的那个进程,直到该进程主动放弃CPU的使用权时,那个高优先级的进程才能获得CPU的使用权.这就出现了响应时间的问题,高优先级的进程已经进入了就绪状态但不能执行,这样进程的响应时间变得不再确定这与实时系统的要求不符,因此一般的实时操作系统都要求是可抢占式的内核,当一个运行着的进程使一个比它优先级高的进程进入了就绪态,当前进程的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的进程立刻得到了CPU的控制权,如果是中断服务子程序使一个高优先级的进程进入就绪态,中断完成时,中断了的进程被挂起,优先级高的那个进程开始运行.在这种内核设置下,多个进程可能处于并发的状态,这就出现了多个进程共享资源的情况,因此我们需要设置信号量来保证临界资源的正确使用,任何一个想使用临界资源的进程在进入临界区之前必须拥有使用临界资源的信号量,否则不可以执行临界区代码.
这样基于优先级的可抢占式进程调度策略就基本架构完成,但此时仍然有系统崩溃的危险,假设系统中有3个进程,分别为p1,p2和p3. p1的优先权高于p2,而p2的优先权高于p3.恰在此时p1和p2 因某种原因被阻塞,这时候系统调度p3执行.p3执行一段时间后,p1被唤醒.由于采取的是PBP的调度策略,因此p1抢占 p3的CPU, p1执行.p1执行一段时间后要进入临界区,但此时p3占有此临界资源的信号量.因此p1被阻塞,处于等待状态,等待p3 释放此信号量.经过这么一段时间后,p2此时此刻处于就绪状态.因此系统调度p2执行.如果p3在p2的执行期间一直没有能够被调度执行的话,那p1和p3将一直等到p2执行完后才能执行,p1更要等到p3释放它所把持的信号量才能执行;而这段时间完全有可能超出p1的Deadline,使得p1崩溃.我们看到在这个过程中,由于临界资源的使用问题使得优先级低的进程先于优先级高的进程先执行,这就出现了优先级反转的问题,从而造成了系统崩溃,对于这个问题可以采用优先级继承的办法来进行解决.在优先级继承方案中,当高优先级进程在等待低优先级的进程占有的信号量时,让低优先级进程继承高优先级进程的优先级,即把低优先级进程的优先权提高到高优先级进程的优先级;当低优先级进程释放高优先级进程等待的信号量时,立即把其优先权降低到原来的优先权.采用这种方法可以有效地解决上面所述的优先权反转的问题.当高优先级进程p1想要进入临界区时,由于低优先级进程p3占有这个临界资源的信号量,导致p1被阻塞.这时候,系统把p3的优先权升到p1的优先权,此时优先权处于p1和p3之间的进程p2,即使处于就绪状态也不可以被调度执行,因为此时p3的优先权已经高于p2,所以p3此时被调度执行.当p3释放p1需要的信号量时,系统立即把p3的优先权降到原来的高度,来保证p1和p2正常有序执行,有许多实时系统是采用这种方法来防止优先级反转的,如VXWORKS.
比例共享
虽然基于优先级的调度简单而且易于实现,是目前使用最广泛的实时系统的进程调度策略,但对于一些软实时系统而言这种方法不再适用,比如实时多媒体会议,在这种情况下我们可以选择基于共享的进程调度算法,其基本思想就是按照一定的权重(比例)对一组需要调度的进程进行调度,让它们的执行时间与它们的权重完全成正比.我们可以通过两种方法来实现比例共享调度算法:第一种方法是调节各个就绪进程出现在调度队列队首的频率,并调度队首的进程执行;第二种做法就是逐次调度就绪队列中的各个进程投入运行,但根据分配的权重调节分配个每个进程的运行时间片.比例共享调度算法的一个问题就是它没有定义任何优先级的概念;所有的进程都根据它们申请的比例共享CPU资源,当系统处于过载状态时,所有的进程的执行都会按比例地变慢.所以为了保证系统中实时进程能够获得一定的CPU处理时间,一般采用一种动态调节进程权重的方法.
时间
对于那些具有稳定,已知输入的简单系统,可以使用时间驱动的调度算法,它能够为数据处理提供很好的预测性.这种调度算法本质上是一种设计时就确定下来的离线的静态调度方法.在系统的设计阶段,在明确系统中所有的处理情况下,对于各个进程的开始,切换,以及结束时间等就事先做出明确的安排和设计.这种调度算法适合于那些很小的嵌入式系统,自控系统,传感器等应用环境.这种调度算法的优点是进程的执行有很好的可预测性,但最大的缺点是缺乏灵活性,并且会出现有进程需要被执行而 CPU 却保持空闲的情况.
对于不同要求下的实时系统可以采用不同的进程调度策略来进行设计,也可以将这些方法进行综合之后得到更适合的调度策略.