在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。
处理机调度算法:是指根据处理机分配策略所规定的处理机分配算法。
在多道程序环境下,内存中存在的进程数目往往多于处理机的数目,因此,需要通过处理机调度,动态地将 CPU 按某种算法分配给处于就绪状态的一个进程。
在多道批处理系统中,一个作业从提交到获得处理机执行,直至作业运行完毕,可能需要经历多级处理机调度,这就是处理机调度的层次问题。
在下述三种调度中:
高级调度又称为作业调度或长程调度,它的调度对象是作业。
其主要功能是,根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。
高级调度主要用于多道批处理系统中,而在分时和实时系统中不设置高级调度。
低级调度又称为进程调度或短程调度,其所调度的对象是进程(或内核级线程)。
其主要功能是,根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。
进程调度是最基本的一种调度,在多道批处理、分时和实时三种类型的 OS 中,都必须配置这级调度。
进程调度可采取抢占方式和非抢占方式两种方式。
中级调度又称为内存调度。
其主要功能是,提高内存利用率和系统吞吐量,按一定的算法将外存中已具备运行条件的进程换入内存,而将内存中处于阻塞状态的某些进程换至外存。
中级调度的目的是解决内存紧张问题,它常用在分时系统及具有虚拟存储器的系统中。它的运行频率介于上述两种调度之间。
在一个操作系统的设计中,应如何选择调度方式和算法,在很大程度上取决于操作系统的类型及其设计目标。
例如,在批处理系统、分时系统和实时系统中,通常都采用不同的调度方式和算法。
平均周转时间短
系统吞吐量高
处理机利用率高
在多道批处理系统中,作业是用户提交给系统的一项相对独立的工作。
操作员把用户提交的作业通过相应的输入设备输入到磁盘存储器,并保存在一个后备作业队列中。再由作业调度程序将其从外存调入内存。
作业不仅包含了通常的程序和数据,而且还应配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。
在批处理系统中,是以作业为基本单位从外存调入内存的。
通常,在作业运行期间,每个作业都必须经过若干个相对独立,又相互关联的顺序加工步骤才能得到结果。
我们把其中的每一个加工步骤称为一个作业步,各作业步之间存在着相互联系,往往是上一个作业步的输出作为下一个作业步的输入。
例如,一个典型的作业可分成:“编译”作业步,“链接装配”作业步和“运行”作业步。
作业控制块(Job Control Block,JCB),是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。
通常在 JCB 中包含的内容有:作业标识、用户名称、用户账号、作业类型(CPU繁忙型、I/O繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业运行时间)、资源需求(预计运行时间、要求内存大小等)、资源使用情况等。
每当一个作业进入系统时,便由“作业注册”程序为该作业建立一个作业控制块 JCB。再根据作业类型,将它放到相应的作业后备队列中等待调度。调度程序依据一定的调度算法来调度它们,被调度到的作业将被装入内存。在作业运行期间,系统就按照 JCB 中的信息和作业说明书对作业进行控制。当一个作业执行结束进入完成状态时,系统负责回收已分配给它的资源,撤销该作业控制块。
作业从进入系统到运行结束,通常需要经历收容、运行和完成三个阶段。相应的作业也就有**“后备状态”、“运行状态”和“完成状态”**。
作业调度的主要任务是:根据 JCB 中的信息,检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程排在就绪队列上等待调度。
也把作业调度称为接纳调度(Admission Scheduling)。在每次执行作业调度时,都需做出以下两个决定。
在每一次进行作业调度时,应当从后备队列中选取多少作业调入内存,取决于多道程序度(Degree of Multiprogramming),即允许多少个作业同时在内存中运行。
对系统来说,希望装入较多的作业,有利于提高 CPU 的利用率和系统的吞吐量。但如果内存中同时运行的作业太多时,进程在运行时因内存不足所发生的中断就会急剧增加。这将会使平均周转时间显著延长,影响到系统的服务质量。
因此,多道程序度的确定是根据计算机的系统规模、运行速度、作业大小,以及能否获得较好的系统性能等情况作出适当的抉择的。
应选择后备队列中的哪些作业调入内存,取决于所采用的调度算法。
进程调度是OS中必不可少的一种调度。因此在三种类型的 OS 中,都无一例外地配置了进程调度。此外它也是对系统性能影响最大的一种处理机调度,相应的,有关进程调度的算法也较多。
为了实现进程调度,在进程调度机制中,应具有如下三个基本部分,如图所示:
排队器
分派器
上下文切换器
进程调度可采取抢占方式和非抢占方式两种方式。
采用这种调度方式时,一旦进程获得 CPU,它将一直执行,直至该进程完成或发生某事件而阻塞时,才将 CPU 分配给其他进程。
在采用非抢占调度方式时,可能引起进程调度的因素可归结为:
这种方式的优点是简单、系统开销小,但它难以满足紧急任务的要求,故不适宜用于要求比较严格的实时系统中。
采用这种调度方式时,当一进程正在处理机上执行时,系统可根据某种原则暂停它的执行,并将已分配给它的处理机重新分配给另一个进程。
在现代 OS 中广泛采用抢占方式,这是因为:
抢占不是一种任意性行为,必须遵循一定的原则。主要原则有:
最简单的是先来先服务调度算法,它是将最早进入外存的作业优先调入内存。
较常用的一种算法是短作业优先调度算法,是将外存上所需执行时间最短的作业优先调入内存。
另一种较常用的是基于作业优先级的调度算法,该算法是将外存上作业优先级最高的作业优先调入内存。
比较好的一种算法是“响应比高者优先”的调度算法。我们将在后面对上述的几种算法作较详细的介绍。
系统将按照作业到达的先后次序来进行调度。
既可用于作业调度,也可用于进程调度。
属于非抢占调度方式,其特点是简单、易于实现,但不利于短作业和 I/O 型的作业的运行。
很少作为进程调度的主算法,但常作为辅助调度算法。
以作业的长短来计算优先级,作业越短,其优先级越高,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。作业的长短是以作业所要求的运行时间来衡量的。
既可用于作业调度,也可用于进程调度。
在把短作业优先调度算法用于作业调度时,它既可采用抢占方式,也可采用非抢占方式
SJF 算法能有效地缩短作业的平均周转时间,提高系统的吞吐量,但不利于长作业和紧迫作业的运行。由于估计的运行时间不一定准确,它不一定能真正做到短作业优先。
短作业优先算法的缺点:
系统根据进程的紧迫程度赋予每个进程一个优先权,并将选择就绪队列中优先权最高的进程投入执行。
进程优先权的设置通常分成静态和动态两种:
该算法实际上是一种动态优先权调度算法,它以响应比作为作业或进程的动态优先权,其目的是既照顾短作业,又考虑到作业的等待时间,使长作业不会长期等待;但每次调度前,都要进行响应比的计算,会增加系统开销。
在分时系统中都采用时间片轮转算法进行进程调度。
时间片是指一个较小的时间间隔,通常为 10ms~100ms。
在简单的轮转算法中,系统将所有的就绪进程按 FIFO 规则排成一个队列,将 CPU 分配给队首进程,且规定它最多只能连续执行一个时间片,若时间片用完时进程仍未完成,也必须将其插入就绪队列末尾,并把 CPU 交给下一个进程。
多级队列调度算法将系统中不同类型或性质的就绪进程固定分配到不同的就绪队列中,每个就绪队列可采用自己的调度算法;而在队列之间,通常采用固定优先权的抢占调度方式。
这种调度算法可针对不同用户进程的需求,提供不同的调度策略。
在采用多级反馈队列调度算法的系统中,设置了多个不同优先级的就绪队列,并赋予各个队列大小不同的时间片,使优先级愈高的队列时间片愈小。
在实时系统中,可能存在着两类不同性质的实时任务,即 HRT 任务(硬实时操作系统)和 SRT (软实时操作系统)任务,它们都联系着一个截止时间。为保证系统能正常工作,实时调度必须能满足实时任务对截止时间的要求。为此,实现实时调度应具备一定的条件。
提供必要的信息,为了实现实时调度,系统应向调度程序提供有关任务的信息:
系统处理能力强
采用抢占式调度机制
具有快速切换机制
对不同的实时系统,其调度方式和算法的选择也各不相同。
EDF 算法根据任务的开始截止时间来确定任务的优先级,即任务的开始截止时间愈早,其优先级愈高。
在实现该算法时,要求系统中保持一个实时任务就绪队列,该队列按各任务的截止时间的早晚排序。
EDF 算法既可采用非抢占调度方式,也可采用抢占调度方式。在采用抢占调度方式时,如果新到达的任务的开始截止时间比正在执行的任务早,则它将立即抢占 CPU。
LLF 算法根据实时任务的松弛度(松弛度=任务必须完成的时间-任务本身的运行时间-当前时间)来确定任务的优先权,即任务的松弛度越低,其优先权越高。
在实现该算法时,要求系统中有一个按松弛度排序的实时任务就绪队列。
该算法通常采用抢占方式,当一任务的最低松弛度为 0 时,它便立即抢占 CPU,以保证它的截止时间要求。
优先级倒置指的是高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞的现象。
例如,正在执行的进程 A 的优先级比较低,目前它已经进入与临界资源 R 相关的临界区内执行;此时,如果有一个优先权较高的进程 B 就绪,则 B 可以抢占 A 的 CPU 接着运行,如果 B 申请进入临界区内使用被 A 占用的临界资源 R,则 B 进程进入阻塞状态,等 A 进程释放临界资源 R。在这个阻塞过程中,考虑到很可能有某些优先权高于 A 但小于 B 的进程就绪,它们比 A 优先获得 CPU,那么 B 被延长的时间更是不可预知和无法限定的。
为了解决优先级倒置问题,当高优先级的 B 进程被低优先级的 A 进程阻塞时,可以让 A 进程暂时继承 B 进程的优先权,从而避免 A 进程被优先权高于 A 但低于 B 的进程抢占。