操作系统必须为多个进程分配计算机资源。
对于处理机而言,可分配的资源是在处理机上的执行时间。
处理机是计算机系统中的重要资源,处理机调度算法不仅对处理机的利用率和用户进程的执行有影响,同时还与内存等其他资源的使用密切相关,对整个计算机系统的综合性能指标也有重要影响。
一、调度的层次
在多道程序系统中,内存中有多个进程。每个进程或者正在使用处理机,或者正在等待I/O 的执行或其他事件的发生。处理机执行某个进程而保持忙碌状态,而此时其他进程处于等待状态。多道程序的关键是调度。处理机的调度有三种类型:高级调度、中级调度和低级调度,见图 2-33 调度的层次。
高级调度,也称作业调度。
它决定哪个程序可以进入到系统中处理,因此它控制多道程序的道数。
一旦一个程序进入系统,一个作业或一个用户程序就成为了一个进程,该进程被放入低级调度程序使用的队列中。
在批处理系统中,或者在一个通用操作系统的批处理部分,新提交的作业被发送到磁盘上,并形成一个后备队列。高级调度程序负责在这些作业中选择一个或多个进程,使它们进驻内存,并为这些作业创建进程。
至于何时创建新进程决定于系统期望的多道程序的道数。创建的进程越多,每个进程在处理机上执行时间的份额就越少。因此为了给当前的进程提供比较高的满意程度,高级调度可以限制多道程序的道数。一般来说,当一个作业终止时,高级调度程序会决定增加一个或多个新进程,此外如果处理机的空闲时间到达某个阈值时,也会调用高级调度程序。
对于分时系统,用户直接控制程序的执行,所以在分时系统中,并不要求需要运行的程序排队等待。相反,操作系统接受所有用户的运行请求,直到系统饱和为止。当系统到达一定的饱和度,不能再接受新的进程时,会向用户终端发送一个不能响应请求的消息,此时用户可以等一会儿再试。
中级调度程序也被称为对换程序。引入中级调度的目的是为了提高内存的利用率和系统的吞吐量。为了使暂时不能运行的进程不再占用宝贵的内存空间,系统将它们调到外存等待。
此时进程的状态是挂起状态,当这些进程重新具备了运行条件,且内存有空闲时,由中级调度程序决定将外存上的哪些具备条件的进程重新调入内存。中级调度实际上就是内存管理中的对换功能。
低级调度又称为进程调度。它决定就绪队列中的哪个进程获得处理机,然后由分派程序执行把处理机分配给该进程的操作。进程调度的频率很高,在分时系统中通常是十几个毫秒到几十个毫秒。进程调度是最基本的调度,在操作系统中必须配置这级调度。
进程调度有两种方式:
1.不可剥夺方式
不可剥夺方式也被称为非强占方式。采用这种调度方式时,一旦把处理机分配给某个进程,该进程将一直执行下去,直到运行完毕或因某种原因不能运行,才把处理机分配给其他进程,决不允许其他进程强占正在运行进程占有的处理机。
这种调度方式的优点是实现简单、系统开销小。但是难以满足有紧急任务的进程要求。所以比较适用于批处理系统,对时间要求比较严格的实时系统不适合使用。
2.可剥夺方式
可剥夺方式也被称为抢占方式。在这种方式下,允许一个进程按照某种原则,抢占其他进程占有的处理机。抢占采用优先权原则的比较多,也就是说,如果一个进程比正在运行进程的优先级高,则它可以抢占处理机而运行。
二、调度的性能准则
在一个操作系统中,调度的目标是按照可以优化系统行为的方式分配处理机时间。调度算法的优劣直接影响该操作系统的性能。下面我们讨论衡量调度算法好坏的准则。通常使用的调度准则,有些是面向用户的,有些是面向系统的。面向用户的准则与单个用户感知的系统行为有关。比如:响应时间、周转时间、优先权和截止时间保证等。面向系统的准则主要考虑系统的效率和性能。主要考虑因素有:系统吞吐量、处理机利用率和各类资源的平衡利用。
1.响应时间
响应时间是指用户提交一个请求到系统响应(通常是系统有一个输出)的时间间隔。这个时间对用户来说是可见的,也是用户感兴趣的。对于分时系统,一般要求响应时间为 2~3秒。那么在考虑调度策略时,要充分考虑到系统的响应速度,力求给用户提供优质的服务。
2.周转时间
周转时间是指一个用户作业被提交到完成的时间间隔。对于每个用户作业来讲,都希望自己作业的周转时间最短。但作为计算机系统的管理者——操作系统的目标是平均周转时间最短。这不仅有效地提高系统资源的利用率,而且还能使大多数用户满意。
平均周转时间
其中 Ti 是每个作业的周转时间,n 是作业的个数。
为了进一步衡量作业在处理机上的实际执行时间和等待时间,我们还定义带权周转时间Wi 为作业的周转时间 Ti 与它在处理机上实际执行时间 Tsi 之比,即带权周转时间
平均带权周转时间
3.优先权
在批处理系统、分时系统及实时系统中都可以引入优先权准则,以保证某些紧急的作业得到及时处理。优先权准则就是按照进程的紧急程度、进程的大小、进程的等待时间等多种因素给每个进程规定一个优先级,系统调度时,按照优先级的大小选择进程。
4.截止时间
截止时间是衡量实时系统性能的主要指标,因而也是选择实时系统调度算法的重要准则。具体地说,截止时间又可以分为截止开始时间和截止完成时间。
截止开始时间是指任务必须开始执行的最迟时间。
截止完成时间是指任务必须完成的最迟时间。
5.系统的吞吐量
系统吞吐量是用来评价批处理系统的重要指标。系统吞吐量是指单位时间内所完成的作业数。
6.处理机的利用率
由于在计算机系统中,价格最贵的是 CPU,所以处理机的利用率成为衡量操作系统性能的重要指标。而调度算法又对处理机的利用率有很大影响。在一般的系统中,处理机的利用率在 40%到 90%之间。
7.各类资源的平衡利用
在一个系统中,不仅要使处理机的利用率高,而且还应能够有效地利用系统中的其他各类资源,如内存、外存、I/O 设备等。一个好的调度算法应尽可能使系统中的所有资源都处于忙碌状态。
8.公平
在用户或系统没有特殊的要求时,进程应该被公平地对待,尽量避免发生进程被饿死的情况。
三、调度算法
调度算法是指根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法。下面是常用的一些调度算法。
1.先来先服务调度算法
先来先服务( First Come First Serivice, FCFS)是一种最简单的调度算法,可以用在进程调度和作业调度中。它的基本思想是按进程或作业到达的前后顺序进行调度。
作业调度中采用该算法时,每次从后备作业队列中,选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后将进程投入到就绪队列。
进程调度中采用该算法时,每次从就绪队列中,选择一个最先进入该队列的进程,把处理机分配给它,使之投入运行。一直到该进程运行完毕或被阻塞,才让出处理机。
FCFS 算法简单。由于它的处理机调度方式是非剥夺方式,因此操作系统不会强行暂停当前正在运行的进程。
FCFS 算法的特点:
(1)有利于长作业,不利于短作业。表 2-6 列出了 A、B、C、D 四个作业的情况,可以看出,其中短作业 C 的带权周转时间高达 100,而长作业 D 的带权周转时间仅为 1.5。
(2)有利于处理机繁忙的作业,不利于 I/O 繁忙的作业。
2.短作业(进程)优先调度算法
短作业(进程)优先(Shortest Job First,SJF 或 Shortest Process Next,SPN) 。是指对短
作业或短进程优先调度的算法。该算法可分别用于作业调度和进程调度。该算法的设计目标是改进 FCFS 算法,减少作业或进程的平均带权周转时间。
SJF 算法要求作业在开始执行之前预计作业的执行时间,对预计执行时间短的作业优先调入内存。
SPN 算法是从就绪队列中选出一估计运行时间最短的进程,并将处理机分派给它,后来的短进程不能剥夺正在运行的进程占有的处理机。
表 2-7 列出了 FCFS 和 SJF 算法的比较,可以看出, SJF 算法比起 FCFS 算法有以下优点:
(1)改善了平均周转时间和平均带权周转时间,缩短了等待时间。
(2)有利于提高系统的吞吐量。
SJF 和 SPN 算法存在以下缺点:
(1)对长作业或进程不利。
(2)该算法没有考虑作业或进程的紧迫程度,因而不能保证紧迫的作业或进程得到及时处理或响应。
(3)由于作业或进程的执行时间是用户估计而定的,因而准确性不高,从而影响调度性能。
(4)如果系统中持续不断地有更短作业或进程出现,可能导致长作业或进程被饿死,即永远得不到执行。
通过选用其他条件来分派处理机, SJF 算法可以有以下的变种:最短剩余时间优先(Shortest Remaining Time,SRT)和响应比高者优先(Highest Response Ratio Next,HRRN)。最短剩余时间优先调度算法是选择预计剩余时间最短的进程运行。对于响应比,它的定义为:(等待时间 + 要求执行时间)/ 要求执行时间。进程调度时选择响应比最高的进程运行,因为响应比的定义中既考虑了进程的长短,又考虑了进程的等待时间,因此比 SPN 算法更合理。
3.时间片轮转调度算法
时间片轮转法主要用于进程调度。通常,系统将所有的就绪进程按 FCFS 原则,排成一个队列,每次系统调度时,把处理机分配给队首的进程,并令其执行一个时间片,时间片的大小一般是几个毫秒到几百个毫秒。当一个进程被分配的时间片用完时,由系统时钟发出一个中断,调度程度暂停当前进程的执行,并将其送到就绪队列的末尾。同时从就绪队列队首选择另一个进程运行。
时间片轮转法中,时间片的长度是影响算法的一个主要指标,我们考虑两种极端的情况,如果时间片很长,长到大多数进程在一个时间片内都能够完成,该算法就退化为 FCFS。相反,如果时间片很短,短到用户的一次交互需要几次调度才能完成,系统切换的频率很高,频繁的系统切换,会导致用户程序响应时间的增长,见图2-34。因此,时间片长度的选择要适当,一般要保证一个基本的交互过程在一个时间片内完成。影响时间片的因素有:
(1)系统的处理能力。虽然处理机的速度不同,但是对于一个交互式系统来讲,要保证用户的一次键入能在一个时间片内处理完毕,这样用户才会有一个满意的响应时间。图 2-35 列出了时间片 q =1 和 q=4 时进程运行情况,表 2-8 列出了两种情况下进程的平均周转时间和平均带权周转时间。
(1)系统的处理能力。
虽然处理机的速度不同,但是对于一个交互式系统来讲,要保证用户的一次键入能在一个时间片内处理完毕,这样用户才会有一个满意的响应时间。
图 2-35 列出了时间片 q =1 和 q=4 时进程运行情况,表 2-8 列出了 图 2-34 时间片大小的影响两种情况下进程的平均周转时间和平均带权周转时间。
(2)系统的负载状况。
(3)系统对响应时间的要求。用户的响应时间 T=Nq,其中 N 是系统中的进程数目,q为时间片。因此当用户进程数稳定时,响应时间与时间片成正比,所以要根据系统对响应时间的要求来设置时间片的大小。
时间片轮转法在分时系统和事务处理系统中特别有效,它的不足是对于 I/O 频繁的进程不利,因为这些进程通常运行不完一个时间片就被阻塞了,等它完成了 I/O 后,又要和其他进程一样排队。所以这种进程的周转时间会比不需要 I/O 或 I/O 较少的进程要长得多。为了解决这个问题,可以采用一种改进的时间片轮转法,避免这种不公平性。图 2-36 说明了这个方案的实现方法。新进程到达进入就绪队列,按 FCFS 的原则进行调度。如果该进程的时间片用完后,仍然到就绪队列的队尾排队。但当进程因 I/O 而被阻塞时,它加入到一个等待队列。有所不同的是,当 I/O 完成时,进程不是进入就绪队列而是进入一个辅助队列。当进程调度程序调度时,辅助队列的进程优先于就绪队列的进程。
经过研究表明,这种改进后的算法在公平性方面确实优于一般的时间片轮转法。
4.优先权调度算法
为了照顾到进程的紧急程度,使得紧急的进程能够及时得到处理,很多的操作系统使用了优先权调度算法。优先权调度算法适用于作业调度和进程调度。当该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业调入内存。当用于进程调度时,把处理机分配给就绪队列中优先权最高的进程。进程调度中使用优先权调度算法时又可把算法分成两种方式:可剥夺方式和不可剥夺方式。
在使用可剥夺方式时,系统把处理机分配给优先权最高的进程,使之运行。一旦系统中出现了另一个优先权更高的进程,调度程序将停止正在运行的进程,把处理机分配给新出现的优先权更高的进程。
若系统使用不可剥夺方式,当系统中出现比正在运行的进程优先权更高的进程时,不会
剥夺正在运行进程对处理机的占有,该进程会一直运行下去,直到完成,或因发生某种事件放弃处理机。
对于优先权算法,其关键在于如何确定进程的优先权。优先权的确定方式有两种:静态和动态。
(1)静态优先权。静态优先权是在进程创建时确定该进程的优先权,且该进程的优先权在其整个运行期间保持不变。确定优先权的因素有:进程的类型、进程对资源的要求和用户的要求。系统进程的优先权通常高于用户进程;对处理机和内存等资源要求较少的进程具有较高的优先权;用户要求的紧迫程度也是确定进程优先权的一个因素。
(2)动态优先权。动态优先权是指进程的优先权可以根据进程的不断推进而改变,以期得到更好的性能。动态优先权的变化取决于进程的等待时间和占有处理机的时间,具体地说,随着进程等待时间的增加该进程的优先权将以某种速率增加。这样做的目的是使优先权较低的进程在等待足够的时间后,其优先权提高,进而被调度执行;当一个进程占有处理机的时间不断增长时,其优先权会以某种速率降低,这样做的目的是使持续执行的进程,在运行了一段时间后将处理机让给其他进程,以防止一个长进程长期地垄断处理机。
5.多级反馈队列调度算法
多级反馈队列调度算法是一种较好的进程调度算法,在 UNIX 及 OS/2 中都采用了类似的算法。在这种算法中,设置多个就绪队列,每个队列的优先权不同,第一个队列的优先权最高,第二个队列次之,依此类推,队列的优先权逐个降低,见图 2-37。
各个队列中进程执行的时间片的大小也不同,优先权越高的队列中的进程,其执行的时间片越短。
新创建的进程进入内存后,首先放入第一个队列的队尾,按 FCFS 原则进行调度,当进程调度到某各个进程时,该进程若能在一个时间片内完成,便可退出;若它在一个时间片内未能完成,则该进程被调到第二个队列的队尾等待;若它在第二个队列中被调度,该进程若能在一个时间片内完成,便可退出,但若在一个时间片内又未能完成,则该进程被调到第三个队列的队尾等待;如此下去。
系统在进行调度时,只有当第一个队列为空时,才在第二个队列中进行调度;同理,只有当前面(i−1)个队列都为空时,才在第 i 个队列中调度。
在实际系统中,还可以使用更复杂的动态优先权调整策略。
例如,为了保证 I/O 操作能及时完成,可以在进程发出 I/O 请求后进入最高优先权队列,并执行一个时间片,以及时响应 I/O 交互。
6.多种调度算法比较
每种调度算法都有其各自的优势和应用场合,表 2-9 列出了这些调度策略性能方面的比较。
表 2-10 列出了对于同一组进程,使用各种调度算法时,其平均周转时间和平均带权周转时间的比较。
本文摘自:清华大学出版社《计算机操作系统》郁红英、李春强编著