计算机操作系统(三)- 处理机调度

文章目录

    • 处理机调度的基本概念
      • 处理机调度的层次
        • 高级调度(作业调度)
        • 低级调度(进程调度)
        • 中级调度(内存调度)
      • 处理机调度算法的目标
        • 处理机调度算法的共同目标
        • 批处理系统的目标
        • 分时系统的目标
        • 实时系统的目标
    • 作业调度
      • 批处理系统中的作业
        • 作业和作业步
          • 作业(Job)
          • 作业步(Job Step)
        • 作业控制块
        • 作业运行的三个阶段和三种状态
      • 作业调度的主要任务
        • 接纳多少个作业
        • 接纳哪些作业
    • 进程调度
      • 进程调度的任务
      • 进程调度机制
      • 进程调度方式
        • 非抢占方式
        • 抢占方式
    • 调度算法
      • 先来先服务算法(FCFS)
      • 短作业优先(SJF)
      • 优先级调度算法(PSA)
      • 高响应比优先调度算法(HRRN)
      • 时间片轮转法(RR)
      • 多级队列调度算法
      • 多级反馈队列调度算法(FB)
    • 实时调度
      • 实现实时调度的基本条件
      • 实时调度算法的分类
      • 实时调度算法
        • 最早截止时间优先(EDF)算法
        • 最低松弛度优先(LLF)算法
      • 优先级倒置

处理机调度的基本概念

在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配

处理机调度算法:是指根据处理机分配策略所规定的处理机分配算法。

在多道程序环境下,内存中存在的进程数目往往多于处理机的数目,因此,需要通过处理机调度,动态地将 CPU 按某种算法分配给处于就绪状态的一个进程。

处理机调度的层次

在多道批处理系统中,一个作业从提交到获得处理机执行,直至作业运行完毕,可能需要经历多级处理机调度,这就是处理机调度的层次问题。

在下述三种调度中:

  • 进程调度的运行频率最高,在分时系统中通常仅 10~100ms 便进行一次进程调度,因此把它称为短程调度。
    • 为避免调度本身占用太多的 CPU 时间,不宜使进程调度算法太复杂。
  • 作业调度往往是发生在一批作业已运行完毕并退出系统,又需要重新调入一批作业进入内存时,作业调度的周期较长,大约几分钟一次,因此把它称为长程调度。
    • 由于其运行频率较低,故允许作业调度算法花费较多的时间。
  • 中级调度的运行频率基本上介于上述两种调度之间,因此把它称为中程调度。

高级调度(作业调度)

高级调度又称为作业调度或长程调度,它的调度对象是作业

其主要功能是,根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。

高级调度主要用于多道批处理系统中,而在分时和实时系统中不设置高级调度。

低级调度(进程调度)

低级调度又称为进程调度或短程调度,其所调度的对象是进程(或内核级线程)。

其主要功能是,根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。

进程调度是最基本的一种调度,在多道批处理、分时和实时三种类型的 OS 中,都必须配置这级调度。

进程调度可采取抢占方式和非抢占方式两种方式。

中级调度(内存调度)

中级调度又称为内存调度。

其主要功能是,提高内存利用率和系统吞吐量,按一定的算法将外存中已具备运行条件的进程换入内存,而将内存中处于阻塞状态的某些进程换至外存。

中级调度的目的是解决内存紧张问题,它常用在分时系统及具有虚拟存储器的系统中。它的运行频率介于上述两种调度之间。

处理机调度算法的目标

在一个操作系统的设计中,应如何选择调度方式和算法,在很大程度上取决于操作系统的类型及其设计目标。

例如,在批处理系统、分时系统和实时系统中,通常都采用不同的调度方式和算法。

处理机调度算法的共同目标

  • 资源利用率
    • 为提高系统的资源利用率,应使系统中的处理机和其它所有资源都尽可能地保持忙碌状态
  • 公平性
    • 公平性是指应使诸进程都获得合理的 CPU 时间,不会发生进程饥饿现象。
    • 公平性是相对的,对相同类型的进程应获得相同的服务;但对于不同类型的进程,由于其紧急程度或重要性的不同,则应提供不同的服务。
  • 平衡性
    • 由于在系统中可能具有多种类型的进程,有的属于计算型作业,有的属于I/O型。为使系统中的CPU和各种外部设备都能经常处于忙碌状态,调度算法应尽可能保持系统资源使用的平衡性。
  • 策略强制执行
    • 对所制订的策略其中包括安全策略,只要需要,就必须予以准确地执行,即使会造成某些工作的延迟也要执行。

批处理系统的目标

  • 平均周转时间短

    • 周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔(称为作业周转时间)。
    • 它包括四部分时间,其中的后三项在一个作业的整个处理过程中,可能发生多次。
      • 作业在外存后备队列上等待(作业)调度的时间
      • 进程在就绪队列上等待进程调度的时间
      • 进程在 CPU 上执行的时间
      • 进程等待 I/O 操作完成的时间
  • 系统吞吐量高

    • 由于吞吐量是指在单位时间内系统所完成的作业数,因而它与批处理作业的平均长度有关。
    • 事实上,如果单纯是为了获得高的系统吞吐量,就应尽量多地选择短作业运行。
  • 处理机利用率高

    • 对于大、中型计算机,CPU 价格十分昂贵,致使处理机的利用率成为衡量系统性能的十分重要的指标

分时系统的目标

  • 响应时间快
    • 响应时间:是从用户通过键盘提交一个请求开始,直到屏幕上显示出处理结果为止的一段时间间隔。
    • 响应时间包括三部分时间:
      • 请求信息从键盘输入开始,直至将其传送到处理机的时间;
      • 处理机对请求信息进行处理的时间;
      • 将所形成的响应信息回送到终端显示器的时间。
  • 均衡性
    • 用户对响应时间的要求并非完全相同,用户对较复杂任务的响应时间允许较长,而对较简单任务的响应时间则要短。
    • 所谓均衡性,是指系统响应时间的快慢应与用户所请求服务的复杂性相适应。

实时系统的目标

  • 截止时间的保证
    • 截止时间:是指某任务必须开始执行的最迟时间,或必须完成的最迟时间。
  • 可预测性
    • 例如,在多媒体系统中,无论是电影还是电视剧都应是连续播放的,这就提供了请求的可预测性。
    • 如果系统中采用了双缓冲,则因为可实现第 i 帧的播放和第 i+1 帧的读取并行处理,进而可提高其实时性。

作业调度

在多道批处理系统中,作业是用户提交给系统的一项相对独立的工作。

操作员把用户提交的作业通过相应的输入设备输入到磁盘存储器,并保存在一个后备作业队列中。再由作业调度程序将其从外存调入内存。

批处理系统中的作业

作业和作业步

作业(Job)

作业不仅包含了通常的程序和数据,而且还应配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。

在批处理系统中,是以作业为基本单位从外存调入内存的。

作业步(Job Step)

通常,在作业运行期间,每个作业都必须经过若干个相对独立,又相互关联的顺序加工步骤才能得到结果。

我们把其中的每一个加工步骤称为一个作业步,各作业步之间存在着相互联系,往往是上一个作业步的输出作为下一个作业步的输入。

例如,一个典型的作业可分成:“编译”作业步,“链接装配”作业步和“运行”作业步。

作业控制块

作业控制块(Job Control Block,JCB),是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。

通常在 JCB 中包含的内容有:作业标识、用户名称、用户账号、作业类型(CPU繁忙型、I/O繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业运行时间)、资源需求(预计运行时间、要求内存大小等)、资源使用情况等。

每当一个作业进入系统时,便由“作业注册”程序为该作业建立一个作业控制块 JCB。再根据作业类型,将它放到相应的作业后备队列中等待调度。调度程序依据一定的调度算法来调度它们,被调度到的作业将被装入内存。在作业运行期间,系统就按照 JCB 中的信息和作业说明书对作业进行控制。当一个作业执行结束进入完成状态时,系统负责回收已分配给它的资源,撤销该作业控制块。

作业运行的三个阶段和三种状态

作业从进入系统到运行结束,通常需要经历收容、运行和完成三个阶段。相应的作业也就有**“后备状态”、“运行状态”和“完成状态”**。

  • 收容阶段
    • 操作员把用户提交的作业通过某种输入方式或 SPOOLing 系统输入到硬盘上,再为该作业建立 JCB,并把它放入作业后备队列中。
    • 此时作业的状态为“后备状态”。
  • 运行阶段
    • 当作业被作业调度选中后,便为它分配必要的资源和建立进程,并将它放入就绪队列。
    • 一个作业从第一次进入就绪状态开始,直到它运行结束前,在此期间都处于“运行状态”。
  • 完成阶段
    • 当作业运行完成、或发生异常情况而提前结束时,作业便进入完成阶段。
    • 此时系统中的“终止作业”程序将会回收已分配给该作业的作业控制块和所有资源,并将作业运行结果信息形成输出文件后输出。
    • 作业状态为“完成状态”。

作业调度的主要任务

作业调度的主要任务是:根据 JCB 中的信息,检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程排在就绪队列上等待调度。

也把作业调度称为接纳调度(Admission Scheduling)。在每次执行作业调度时,都需做出以下两个决定。

接纳多少个作业

在每一次进行作业调度时,应当从后备队列中选取多少作业调入内存,取决于多道程序度(Degree of Multiprogramming),即允许多少个作业同时在内存中运行。

对系统来说,希望装入较多的作业,有利于提高 CPU 的利用率和系统的吞吐量。但如果内存中同时运行的作业太多时,进程在运行时因内存不足所发生的中断就会急剧增加。这将会使平均周转时间显著延长,影响到系统的服务质量。

因此,多道程序度的确定是根据计算机的系统规模、运行速度、作业大小,以及能否获得较好的系统性能等情况作出适当的抉择的。

接纳哪些作业

应选择后备队列中的哪些作业调入内存,取决于所采用的调度算法。

进程调度

进程调度是OS中必不可少的一种调度。因此在三种类型的 OS 中,都无一例外地配置了进程调度。此外它也是对系统性能影响最大的一种处理机调度,相应的,有关进程调度的算法也较多。

进程调度的任务

  • 保存处理机的现场信息
    • 在进行调度时首先需要保存当前进程的处理机的现场信息,如程序计数器、多个通用寄存器中的内容等。
  • 按某种算法选取进程
    • 调度程序按某种算法从就绪队列中选取一个进程,将其状态改为运行状态,并准备把处理机分配给它。
  • 把处理器分配给进程
    • 由分派程序把处理器分配给该进程,此时需要将选中进程的进程控制块内有关处理机现场的信息装入处理器相应的各个寄存器中,把处理器的控制权交予该进程,让它从上次的断点处恢复运行。

进程调度机制

为了实现进程调度,在进程调度机制中,应具有如下三个基本部分,如图所示:

计算机操作系统(三)- 处理机调度_第1张图片

  • 排队器

    • 为了提高进程调度的效率,应事先将系统中的所有就绪进程按照一定的策略排成一个或多个队列,以便调度程序能最快地找到它。以后每当有一个进程转变为就绪状态时,排队器便将它插入到相应的就绪队列。
  • 分派器

    • 分派器依据进程调度程序所选定的进程,将其从就绪队列中取出,然后进行从分派器到新选出进程间的上下文切换,将处理机分配给新选出的进程。
  • 上下文切换器

    • 在对处理机进行切换时,会发生两对上下文的切换操作:
      • 第一对上下文切换时,OS 将保存当前进程的上下文,即把当前进程的处理机寄存器内容保存到该进程的进程控制块内的相应单元,再装入分派程序的上下文,以便分派程序运行;
      • 第二对上下文切换是移出分派程序的上下文,而把新选进程的CPU现场信息装入到处理机的各个相应寄存器中,以便新选进程运行。
    • 在进行上下文切换时,需要执行大量的 load 和 store 等操作指令,以保存寄存器的内容。即使是现代计算机,每一次上下文切换所花费的时间大约可执行上千条指令。
    • 为此,现在已有靠硬件实现的方法来减少上下文切换时间。一般采用两组(或多组)寄存器,
      • 一组寄存器供处理机在系统态时使用,
      • 一组寄存器供应用程序使用。
      • 在这样条件下的上下文切换,只需改变指针,使其指向当前寄存器组即可。

进程调度方式

进程调度可采取抢占方式和非抢占方式两种方式。

非抢占方式

采用这种调度方式时,一旦进程获得 CPU,它将一直执行,直至该进程完成或发生某事件而阻塞时,才将 CPU 分配给其他进程。

在采用非抢占调度方式时,可能引起进程调度的因素可归结为:

  • 正在执行的进程运行完毕,或因发生某事件而使其无法再继续运行;
  • 正在执行中的进程因提出 I/O 请求而暂停执行;
  • 在进程通信或同步过程中,执行了某种原语操作,如 Block 原语。

这种方式的优点是简单、系统开销小,但它难以满足紧急任务的要求,故不适宜用于要求比较严格的实时系统中。

抢占方式

采用这种调度方式时,当一进程正在处理机上执行时,系统可根据某种原则暂停它的执行,并将已分配给它的处理机重新分配给另一个进程。

在现代 OS 中广泛采用抢占方式,这是因为:

  • 对于批处理机系统,可以防止一个长进程长时间地占用处理机,以确保处理机能为所有进程提供更为公平的服务。
  • 在分时系统中,只有采用抢占方式才有可能实现人一机交互。
  • 在实时系统中,抢占方式能满足实时任务的需求。但抢占方式比较复杂,所需付出的系统开销也较大。

抢占不是一种任意性行为,必须遵循一定的原则。主要原则有:

  • 优先权原则。就绪的高优先权进程有权抢占低优先权进程的CPU。
  • 短作业优先原则。就绪的短作业(进程)有权抢占长作业(进程)的CPU。
  • 时间片原则。一个时间片用完后,系统重新进行进程调度。

调度算法

最简单的是先来先服务调度算法,它是将最早进入外存的作业优先调入内存。

较常用的一种算法是短作业优先调度算法,是将外存上所需执行时间最短的作业优先调入内存。

另一种较常用的是基于作业优先级的调度算法,该算法是将外存上作业优先级最高的作业优先调入内存。

比较好的一种算法是“响应比高者优先”的调度算法。我们将在后面对上述的几种算法作较详细的介绍。

先来先服务算法(FCFS)

系统将按照作业到达的先后次序来进行调度。

  • 既可用于作业调度,也可用于进程调度。

  • 属于非抢占调度方式,其特点是简单、易于实现,但不利于短作业和 I/O 型的作业的运行。

  • 很少作为进程调度的主算法,但常作为辅助调度算法。

短作业优先(SJF)

以作业的长短来计算优先级,作业越短,其优先级越高,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。作业的长短是以作业所要求的运行时间来衡量的。

  • 既可用于作业调度,也可用于进程调度。

  • 在把短作业优先调度算法用于作业调度时,它既可采用抢占方式,也可采用非抢占方式

    • 抢占的 SJF 算法通常也叫作最短剩余时间优先算法。
  • SJF 算法能有效地缩短作业的平均周转时间,提高系统的吞吐量,但不利于长作业和紧迫作业的运行。由于估计的运行时间不一定准确,它不一定能真正做到短作业优先。

短作业优先算法的缺点:

  • 必须预知作业的运行时间
    • 在采用这种算法时,要先知道每个作业的运行时间。
    • 即使是程序员也很难准确估计作业的运行时间,如果估计过低,系统就可能按估计的时间终止作业的运行,但此时作业并未完成,故一般都会偏长估计。
  • 对长作业非常不利
    • 长作业的周转时间会明显地增长。
    • 更严重的是,该算法完全忽视作业的等待时间,可能使作业等待时间过长,出现饥饿现象。
  • 该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理。

优先级调度算法(PSA)

系统根据进程的紧迫程度赋予每个进程一个优先权,并将选择就绪队列中优先权最高的进程投入执行。

  • 既可用于作业调度,也可用于进程调度。
  • 既可采用抢占方式,也可采用非抢占方式。

进程优先权的设置通常分成静态和动态两种:

  • 静态优先权
    • 静态优先权是指在创建进程时,根据进程的类型、进程对资源的要求和用户的要求等确定它的优先权,以后该优先权便不再变化。
    • 静态优先权法简单易行,但随着进程的推进,其优先权可能与进程的情况不再相符。
  • 动态优先权
    • 动态优先权是指在创建进程时所确定的优先权,可以随着进程的推进而改变。
    • 例如,可以规定:就绪进程的优先权,随着等待时间的增长以速度a增加;正在执行进程的优先权以速度b下降,这样既可避免一个低优先权的进程长期处于饥饿状态,又可防止一个长作业长期垄断处理机。

高响应比优先调度算法(HRRN)

该算法实际上是一种动态优先权调度算法,它以响应比作为作业或进程的动态优先权,其目的是既照顾短作业,又考虑到作业的等待时间,使长作业不会长期等待;但每次调度前,都要进行响应比的计算,会增加系统开销。

时间片轮转法(RR)

在分时系统中都采用时间片轮转算法进行进程调度。

时间片是指一个较小的时间间隔,通常为 10ms~100ms。

在简单的轮转算法中,系统将所有的就绪进程按 FIFO 规则排成一个队列,将 CPU 分配给队首进程,且规定它最多只能连续执行一个时间片,若时间片用完时进程仍未完成,也必须将其插入就绪队列末尾,并把 CPU 交给下一个进程。

  • 只用于进程调度
  • 属于抢占调度方式
  • 其特点是简单易行、平均响应时间短,但它不利于处理紧急作业。

多级队列调度算法

多级队列调度算法将系统中不同类型或性质的就绪进程固定分配到不同的就绪队列中,每个就绪队列可采用自己的调度算法;而在队列之间,通常采用固定优先权的抢占调度方式。

这种调度算法可针对不同用户进程的需求,提供不同的调度策略。

多级反馈队列调度算法(FB)

在采用多级反馈队列调度算法的系统中,设置了多个不同优先级的就绪队列,并赋予各个队列大小不同的时间片,使优先级愈高的队列时间片愈小。

实时调度

实现实时调度的基本条件

在实时系统中,可能存在着两类不同性质的实时任务,即 HRT 任务(硬实时操作系统)和 SRT (软实时操作系统)任务,它们都联系着一个截止时间。为保证系统能正常工作,实时调度必须能满足实时任务对截止时间的要求。为此,实现实时调度应具备一定的条件。

  • 提供必要的信息,为了实现实时调度,系统应向调度程序提供有关任务的信息:

    • 就绪时间,是指某任务成为就绪状态的起始时间,在周期任务的情况下,它是事先预知的一串时间序列。
    • 开始截止时间和完成截止时间,对于典型的实时应用,只须知道开始截止时间,或者完成截止时间。
    • 处理时间,一个任务从开始执行,直至完成时所需的时间。
    • 资源要求,任务执行时所需的一组资源。
    • 优先级,如果某任务的开始截止时间错过,势必引起故障,则应为该任务赋予“绝对”优先级;
  • 系统处理能力强

    • 在实时系统中,若处理机的处理能力不够强,则有可能因处理机忙不过,而致使某些实时任务不能得到及时处理,从而导致发生难以预料的后果。
  • 采用抢占式调度机制

  • 具有快速切换机制

    • 进行任务的快速切换

实时调度算法的分类

对不同的实时系统,其调度方式和算法的选择也各不相同。

  • 非抢占式调度方式
    • 非抢占式轮转调度方式
      • 在一些小型实时系统或要求不太严格的实时控制系统中,它仅可获得数秒至数十秒的响应时间;
    • 非抢占式优先权调度算法
      • 在有一定要求的实时控制系统中,它仅可获得数秒至数百毫秒级的响应时间。
  • 抢占调度方式
    • 在要求比较严格(响应时间为数十毫秒以下)的实时系统中
    • 基于时钟中断的抢占式优先权调度算法
      • 可获得几十毫秒至几毫秒的响应时间,可用于大多数的实时系统;
    • 立即抢占的优先权调度算法
      • 可将响应时间降到几毫秒至100微秒,甚至更低,适用于要求更严格的实时系统。

实时调度算法

最早截止时间优先(EDF)算法

EDF 算法根据任务的开始截止时间来确定任务的优先级,即任务的开始截止时间愈早,其优先级愈高。

在实现该算法时,要求系统中保持一个实时任务就绪队列,该队列按各任务的截止时间的早晚排序。

EDF 算法既可采用非抢占调度方式,也可采用抢占调度方式。在采用抢占调度方式时,如果新到达的任务的开始截止时间比正在执行的任务早,则它将立即抢占 CPU。

最低松弛度优先(LLF)算法

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 的进程抢占。

你可能感兴趣的:(操作系统)