高级调度
高级调度又称为长程调度或者作业调度;其调度对象是作业;主要功能是根据调度算法决定从外存中的后备队列中选择哪几个作业调入内存,为它们创建进程、分配必要的资源,然后将其放入就绪队列。高级调度主要用于多道批处理系统中,在分时系统和实时系统中不设置高级调度;
低级调度
低级调度又称为短程调度或者进程调度;其调度的对象是进程;主要功能是根据调度算法决定哪个进程可以获得处理机而运行,由分派程序将处理机分配给被选中的进程;进程调度是一种基本调度,多道批处理系统、分时系统和实时系统都需要设置这种调度;
中级调度
中级调度又称为中程调度或者内存调度;其调度对象是进程;主要功能是将暂时不能运行的进程调至外存等待,此时进程即处于就绪驻外存状态(挂起状态);当它们具备运行条件而且内存空间又允许的时候,由中级调度来决定把处于外存上的那些具备运行条件的就绪进程再调入内存,修改其状态为就绪状态; 中级调度其实就是存储器管理中的对换功能。
长程调度、中程调度以及短程调度是根据程序的运行频率和周期来划分的;长程调度运行频率最低,所以其周期较长;短程调度最为频繁,为避免调度本身占用过多CPU时间,其调度算法不能过于复杂,即运行周期最短;而中程调度不论运行频率还是运行周期都在两者之间;
一般而言,一个操作系统采用什么样的调度方式和算法,取决于系统的类型以及设计目标;
平均周转周期短。作业的周转周期是指从作业提交给系统到作业完成为止这段时间;周转周期通常由四部分组成:作业在外存上后备队列中的等待时间、进程在就绪队列中的时间、执行时间和等待IO操作等阻塞的时间;
对于用户而言,希望自己的作业周转周期尽可能地短;对于系统而言,希望作业的平均周转周期短,这样不但有利于提高系统资源的利用率也可以使大多数用户满意;总的来说,应使作业的周转周期和平均周转周期都较短;
平均周转周期T=(所有作业的周转周期之和)/作业总数;
为了进一步反映调度的性能,更清晰地描述进程在其周转时间中等待和执行时间的具体分配状况,通常使用加权周转时间W,即作业的周转时间T与系统为它提供服务的时间Ts之比:W=T/Ts;平均加权周转周期为各个作业的加权周转时间之和/作业总数;
系统吞吐量大。如果单纯为了提高系统的吞吐量,应尽量执行较短的作业运行;吞吐量被定义为单位时间里,系统完成的作业数;
处理机效率高。由于CPU十分昂贵,使得处理机的利用率成为衡量系统性能的重要指标;而调度方式和调度算法由对处理机的利用率起着十分重要的作用。如果单纯提高处理机效率,那么应选择计算量大的作业运行。
作业是比程序更加广泛的概念,其中包括程序、数据和作业说明书,系统根据作业说明书来对程序的运行进行控制;
作业调度的主要任务就是根据JCB中的内容,检查系统资源情况是否满足作业的要求,并按照一定的调度算法,从外存的后备队列中选择某些作业调入内存,为它们创建进程、分配资源,然后将进程插入到就绪队列中等待调度;其实归根到底需要解决两个问题:
接纳多少个作业
这是由系统的多道程序度(Degree of Multiprogramming)决定的,即允许多少个作业同时出现在内存中;对系统而言,当然希望装入较多的作业以提高CPU的利用率和系统的吞吐量,但是内存中的作业过于多时,由于内存不够而引发的中断就会急剧增加,从而影响系统效率和服务质量;因此,多道程序度是由计算机系统的规模、运行速度、作业大小、以及能否获得较好的系统性能等确定的;
接纳那些作业
最简单的调度算法是先到先服务算法;较常见的一中调度算法是短作业优先算法;另一种常见的算法是基于作业优先级的调度算法;比较好的调度算法是响应比高者优先算法;
值得注意的是,作业调度只有在多道批处理系统中才有;因为分时系统因为要保证较高的响应性,所以用户输入的命令和数据被直接送入内存;所以分时系统中需要考虑的是如何控制用户的数量,无需考虑长程调度问题。实时系统也是类似;
FCFS调度算法中,优先选择先到的作业或者进程进行服务,或者说,它选择的是在队列中等待时间最长的作业或者进程,而没有考虑作业自身的情况,比如作业的优先级、作业的预计运行时间等;基本上FCFS算法很少作为系统的主调度算法,但经常把它和其他调度算法相结合使用。
该调度算法既可以用于作业调度也可以用于进程调度(即适用于长程调度和短程调度);
短作业优先算法使用作业或者进程的长短来标记它们的优先级,越短的作业(进程)其优先级越高;
短作业优先调度算法相比先来先服务算法有了明显的感改进(考虑了作业或者进程自身的相关信息),但是仍然有缺点:
该调度算法既可以用于作业调度也可以用于进程调度;
优先级调度算法中选择作业或者进程的标准是它们的优先级,优先级越高,越早获得调度而执行;其实FCFS中,作业或者进程的等待时间就相当于其优先级;SJF中,作业的长度就相当于其优先级;但是这种优先级并不能反映作业或者进程的紧急程度;PSA算法就是要保证紧迫性任务得到优先运行;
该调度算法既可以用于作业调度也可以用于进程调度;
FCFS算法中,只考虑作业或者进程等待的时间;SJF算法中,只考虑了作业或者进程的运行时间;高响应比优先调度算法既考虑了等待时间也考虑了作业或者进程的要求时间;是一种动态优先级设定;其优先权计算公式:优先权=(要求服务的时间+等待时间)/要求服务的时间;这样,当两个作业或者进程等待了相同时间时,短作业将获的较大的优先级,类似SJF调度方式;当两个进程要求服务时间相同时,等待时间长的作业将获得较大的优先级,类似于FCFS调度方法;这种调度方法的问题就在于每次进行调度时需要进行响应比的计算,于是会增加一定的系统开销;
进程调度的主要任务有三:
为实现进程调度,进程调度机制中,应具有以下三个部分:排队器、分派器和上下文切换器;
由于一次上下文切换中需要执行大量的load和store命令,所以比较费时,现代系统以实现靠硬件来减少上下文切换时间;当然也可以采用两组寄存器,其中一组寄存器供处理机在系统态时使用,另一组寄存器供应用程序使用。这样只需改变指针即可实现上下文的切换;
早期系统大多采用非抢占式调度方式,但是这很难满足交互性作业和实时任务的需求,后来在进程调度方式中又引入了抢占式调度方式;
非抢占式调度
非抢占式调度方式中,一旦把处理机分配给某个进程,就让它一直运行下去,绝不会因为时钟中断或其他原因而抢占当前正在运行进程的处理机,直到该进程完成或者因某事件而阻塞,才将处理机分配给其他进程;非抢占方式中,引起进程调度的原因有:
这种调度方法的特点是系统开销小,简单,适合大多数批处理系统,但是不能用于分时系统和实时系统;
抢占式调度
抢占式调度中,允许调度程序按照某种原则,暂停某个正在执行的进程;将已分配给该进程的处理机分配给另一进程;现代OS中广泛采用抢占式调度,这是因为,抢占式调度方法可以防止一个长进程长时间占用CPU,以确保处理机能为各个进程提供更为公平的服务,另外在分时系统中,只有抢占式调度才能实现人-机交互。实时系统中,抢占式可以满足实时任务的要求。但是抢占式实现起来比较复杂,系统开销较大;
抢占不是一种任意的行为,它必须遵守一定的规则:
轮转调度算法(RR,Round Robin)
分时系统中最简单也是最常用的算法;该方式采用非常公平的处理机分配方法,即采用FCFS策略组织就绪队列,让就绪队列中的每一个进程每次都运行一个时间片;这种方法中,进程的切换发生在:
时间片大小的选取对系统性能有着很大的影响;若选择小的时间片,那么短作业则可能在一次时间片中就结束运行,但是时间片过小,那么系统将频繁发生进程调度和处理机上下文切换,增加系统开销;反之,若时间片太长,则RR退化为FCFS,无法满足短作业和交互式作业的需求;一个可取的策略就是时间片大小应略大一一次交互所需要的时间,这样使大多数交互式作业可以在一个时间片里完成,从而获得较小的响应时间;
优先级调度算法
优先级调度算法中,将处理机分配给就绪队列中优先级最高的进程。按照是否允许抢占,分为抢占式和非抢占式;
非抢占式优先级调度算法
该算法中,一旦将处理机分配给就绪队列中优先级最高的进城后,该进程便一直执行下去,直到结束(正常结束或者被阻塞、挂起等)才将处理机分配给就绪队列中另一优先级最高的进程;
抢占式优先级调度算法
该算法中,把处理机分配给优先级最高的进程,使之执行,但是如果在其执行期间出现优先级更高的进程,调度程序就将处理机分配给新的优先级最高的进程;抢占式优先级调度算法常用于对实时性要求较高的系统中;
优先级的类型——静态优先级和动态优先级:
多队列调度算法
多列调度算法中,将就绪队列组织为多个按照不同调度算法调度的就绪队列,以满足不同用户对调度策略的不同要求,并且这些就绪队列本身也可以设定优先级,方便在多处理机系统中为每个处理机设置一个单独的就绪队列;避免了仅有一个就绪队列时调度算法的固定、单一。这样对于含有多个线程的进程,可以将这些线程分配在一个就绪队列中,全部在一个处理机上运行;对于一组需要相互合作的进程而言,可以将其安排在一组处理机所对应的多个就绪队列中,使它们可以同时获得处理机并发执行;
多级反馈队列调度算法(Multileved feedback queue)
前面介绍的进程调度算法,或多或少都有一定的局限性,如果未能指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。多级反馈队列不用提前知道各种进程的执行时间,还可以较好地满足各种类型进程的需要,是目前公认的一种较好地进程调度算法;它的核心为
多级反馈队列中,可以使短作业较早的完成,而且长作业经过第1,2,3…队列的执行,到最后一个队列时,采用RR调度算法,也不用担心过其作业长期得不到处理;
基于公平原则调度算法
以上几种调度算法,保证了优先运行,但是并不能保证作业占用多少处理时间。另外也没有考虑调度的公平性;这里有两种相对公平的调度算法
保证调度算法,它向用户所做出的保证不是优先运行而是明确的性能保证,一种比较容易实现的性能保证算法是处理机分配的公平。如果系统中有n个进程,那么需要保证每个进程都获得相同的处理机时间1/n;实施公平调度算法时,系统需要:
公平分享调度算法
公平的角度不同,所使用的算法也就不同;保证调度算法对进程是公平的,但是对用户就不一定:有的用户拥有的进程多,有的用户拥有的进程少。公平分享算法是用户层面的公平调度算法。
实时系统中存在两类不同的任务:硬实时任务和软实时任务;它们都关联着一个截止时间;实时调度算法必须能够满足实时任务对截止时间的要求;所以实时调度算法有一定的条件。
按照任务类型可以分为:硬实时任务调度算法和软实时任务调度算法;按照调度方式可以分为:抢占式调度算法和非抢占式调度算法;
该调度算法中,根据任务的截止时间确定任务的优先级,任务截止时间越早,优先级越大;具有最早截止时间的任务排在队列队首;调度程序选择任务时,直接选择就绪队列中的第一个即可;按照非抢占式和抢占式可以分为:抢占式最早截止时间优先和非抢占式最早截止时间优先这两种。非抢占式算法是指在某个任务执行的过程中,如果新到的任务的截止时间早于正在执行的任务的截止时间,并不会发生抢占;而抢占式则相反,会立即将处理机分配给优先级大的任务;通常而言,非抢占式常用于非周期性任务;抢占式常用于周期性任务;
该调度算法中,根据任务的紧急程度来确定任务的优先级,越紧急的任务,其优先级越大;而越紧急也意味着它的松弛度越低;在该算法中,任务的松弛度由任务的完成截止时间减去任务要求的处理时间来确定;该算法通常用于可抢占方式中;一般来说,抢占发生在某一任务的最低松弛度为0的时候,即该任务不得不执行,而考虑到任务切换的时间,通常还会提前一点;所以调度发生的情况为:某一任务正常结束或者某一任务的最低松弛度变为0;
由于进城之间存在两种约束(直接约束和间接约束),所以有可能出现具有高优先级的进程因低优先级的进程而阻塞的情况;这种情况被称为优先级倒置;比如,低优先级A首先获得了临界资源R(因为比它高级的进程还没到),然后有比它优先级高的进程B到来,A被剥夺处理机,但是临界资源并没有被释放,之后用于最高优先级的进程C到来,B被抢占处理机,而C由于请求临界资源R失败而阻塞(进入阻塞队列),之后B开始运行,结束后A再运行临界区代码,进程A释放临界资源R后,C才能执行。这样B进程比C进程优先级低,但是先得到处理;常见的解决方法有两种:一是当进程处于临界区的时候,不允许中断,这样A执行完毕后,因为C的优先级高,处于就绪队列的前面,所以C可以在B之前执行;但是当A的临界区非常长,则C还是要等待较长时间;另一种办法是建立在动态优先级继承基础上的,该方法规定,当优先级较高的进程要进入临界区,使用临界资源,如果有一个低优先级进程正在使用该资源,那么高优先级进城被阻塞,而低优先级进程将继承高优先级进程的优先级,直到低进程退出临界区;这样就可以避免低进程被中等进程阻塞而出现优先级倒置现象;