操作系统——处理机调度


一、处理机调度的层次

1. 高级调度(作业调度)

  • 高级调度又称为长程调度或者作业调度,它的调度对象是作业。
  • 主要功能是根据某种算法,决定将外存上处于后备队列中那几个作业调入内存,为它们创建进程,分配必要的资源,并将它们放入就绪队列。
  • 高级调度主要用于多道批处理系统,而在分时和实时系统中不设置高级调度。
  • 作业调度的频率很低,周期很长,大于几分钟一次。

2. 低级调度(进程调度)

  • 低级调度又称进程调度或者短程调度,它的调度对象是进程。
  • 其主要功能是,根据某种算法,决定就绪队列中的那个进程获得处理机。并由分派程序将处理机分派给选择的进程。
  • 进程调度这是一种最基本的调度,在多道批处理,实时和分时三种类型的OS中,都必须配置这级调度。
  • 进程调度的频率很高,周期很短,在分时系统中大概仅10~100nm.

3. 中级调度(内存调度)

  • 中机调度又称为内存调度
  • 引入中级调度的主要目的是,提高内存利用率和系统吞吐量。
  • 中级调度的作用就是将暂时不能运行的进程,调至外存等待(挂起转台),和将外存上已经满足条件的就绪进程在调入内存中。
  • 内存调度的频率和周期处于,作业调度和进程调度之间

二、处理机调度算法的目标

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

  • 资源利用率:为了提高资源的利用率,应使系统中的处理机和其他所有资源尽可能保持忙碌状态。
  • 公平性:公平性是指应使诸进程都获得合理的CPU时间,不会发生进程饥饿现象。但公平是相对的,对于相同类型的进程应获得相同的服务,对于不同类型的进程,由于其紧急程度和重要性不同,提供不同的服务。
  • 平衡性:为使系统中CPU和各种外部设备都能经常处于忙碌状态,调度算法应保存系统资源使用的平衡性。
  • 策略强制执行: 对所指定的策略其中也包括安全策略,只要需要,就必须提供。

2. 批处理系统的目标

  • 平均周转时间短:周转时间是指,从作业被提交给系统开始,到作业完成时间这段时间的间隔。它包括:作业在外存后备队列上等待调度的时间,进程在就绪队列等待的调度的时间,进程在CPU上执行的时间,以及进程等待I/O操作完成的时间。
  • 系统吞吐量高:吞吐量是指单位时间内系统完成的作业数,如果单纯为了获得高的系统吞吐量,那么就应该尽可能选择短作业运行。
  • 处理机利用率高:如果单纯为获得处理机利用率高,那么应该尽可能选择长作业运行。

3. 分时系统的目标

  • 响应时间快:响应时间是指,是从用户通过键盘提交一个请求开始,直到屏幕上显示处理结果为止那一段时间。
  • 均衡性:用户对于响应时间的要求并非完全相同,用户对于简单的任务要求响应时间短,复杂任务时间允许较长。

4. 实时系统的目标

  • 截止时间的保证:截止时间是指:某任务必须开始执行的最迟时间,或者必须完成的最初时间。对于严格的实时系统,其调度方式和调度算法必须要保证这一点。
  • 可预测性:在实时系统中,这一点非常重要。

三、作业与作业调度

1. 批处理系统中的作业

  • 作业
    • 作业是一个比系统更广泛的概念,它不仅包含了通常的程序和数据,而且还应配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。
    • 在批处理系统中,是以作业为基本单位从外存调入内存
  • 作业步
    • 在作业运行期间,每个作业都必须经过若干相互独立又相互关联的顺序加工步骤才能得到结果。我们把其中每一步称为一个作业步。
    • 例如,一个典型的作业步可以分为:“编译”作业步,“链接装配”作业步,和“运行”作业步。
  • 作业控制块(JCB)
    • 和进程线程类似,作业中也包含一个作业控制块(JCB)。
    • 通常JCB包含:作业标识,用户名称,用户账号,作业类型,作业专业,调度信息,资源需求,资源使用情况。
  • 作业运行的阶段和状态
    • 收容状态:操作员把用户提交的作业通过某种方式或SPOOLing系统输入到硬盘上,在为该作业建立JCB,并把它放入作业后备对列中。
    • 运行状态:当作业被作业调度选中后,边为它分配必要的资源和建立进程,并把他放入就绪队列。
    • 完成状态:当作业运行完成,或发生异常情况而提前结束时,作业便进入了完成阶段。

2. 作业调度的主要任务

  • 作业调度的主要任务就是根据JCB中的信息,检查系统中的资源能否满足作业队资源的要求,以及按照一定的调度算法,从外存的后备队列选取某些作业调入内存
  • 在每次执行作业调度时,都需要做出以下两个决定:
    • 接纳多少个作业:接纳多少作业取决于 多道程序度。而多道程序度取决于 计算机系统规模,运行速度,作业大小,以及能否获得较好的系统性能;
    • 接纳哪些作业:选择哪些作业取决于 作业调度采用哪种算法。

3. 先来先服务调度算法(FCFS)

  • 既可以用于作业调度,也可以用于进程调度。
  • 作业调度中采取该算法时,系统将按照作业到达的先后次序来进行调度。
  • 进程调度中采用该算法时,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或者阻塞时,进程调度程序才会将处理机分配给其他进程。
  • 说明:该算法在单处理机系统中已经很少作为主调度算法,但经常把它和其他调度算法结合使用,形成一种更为有效的调度算法。例如,可以在系统中按进程的优先级设置多个队列,每一个优先级一个队列,其中每一个队列的调度都基于FCFS。

4. 短作业优先调度算法(SJF)

  • 该算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的时间来衡量的。
  • 该算法也可以分别用于作业调度进程调度。但用于进程调度时优于作业调度。
  • 缺点
    SJF相比FCFS算法,有很大的改进,但依然有以下缺点
    • 必须预先知道作业的运行时间;
    • 对于长作业非常不利,很可能出现饥饿现象;
    • 无法进行人机交互;
    • 没有考虑作的紧迫程度,不能保证紧迫性的作用能够得到及时的处理。

5. 优先级调度算法(PSA)

  • 该算法也是既可以用于作业调度,也可以用于进程调度
  • 优点
    FSFC和SJF算法都无法使紧迫性的作业得到尽快的处理,而PSA正是基于作业的紧迫程度,由外部赋予的作业优先级,进行作业调度。

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

  • FSFC算法考虑的只是作业的等待时间,忽略了运行时间;
  • SJF算法考虑的只是作业的运行时间,忽略了等待时间;
  • HRRN算法既考虑了作业的等待时间,又考虑的作业的运行时间,从而改善了处理机调度的性能。
  • HRRN为每一个作业引入了一个动态优先权。该优先权的变化规律如下:
    在这里插入图片描述

同时,等待时间+要求服务的时间 = 相应时间。所以优先权也可以表示为:
在这里插入图片描述
从上式可以看出:

  • 如果作业的等待时间相同,则要求服务的时间越短,优先权越大。此时类似于SJF算法
  • 要求服务的时间相同时,作业的优先权又决定于其等待时间。此时类似于FCFS算法
  • 对于长作业的优先权,可以随等待时间的增加而提高。当其等待时间足够长,也可以获得处理机。避免出现饥饿现象。

四、进程调度

1. 进程调度的任务

  • 保存处理机的现场信息。
  • 按某种算法选取进程。
  • 把处理机分配给进程。

2. 进程调度的机制

在这里插入图片描述
为了实现进程调度,在进程调度中应该有以下三个部分:

  • 排队器:为了提高进程调度的效率。应事先将系统中的所有就绪进程按照一定策略排成一个或多个队列,以便调度程序能最快的找到它。以后每当有一个进程转换为就绪状态时,排队器便把它插入到相应的就绪队列中。
  • 分派器:分派器依据调度程序所选定的进程,将其从就绪队列取出,然后进行从分派器到新选的进程间的上下文切换,将处理机分配给新选出的进程。
  • 上下文切换器:在对处理机进行切换时,会发生两对上下文的切换操作。
    • 第一对上下文切换时,OS保存当前进程的上下文,即把当前进程的处理机寄存器内部保存到该进程的PCB中,再装入分派程序的上下文。以便分派程序运行。
    • 第二对上下文切换,是移出分派程序的上下文。把新选进程的CPU现场信息装入到处理机的各个相应寄存器中,以便新选进程运行。

3. 进程调度的方式

  • 非抢占式
    • 采用这种调度方式时,一旦把处理机分配给某进程后,就一直让他运行下去,绝不会因为时钟中断或者其他原因抢占当前处理机,直到该进程完成或者阻塞,才把处理机分配给其他进程。
    • 这种方式的好处就是实现简单,系统开销小适用于大部分批处理系统
    • 但是无法适应于分时系统和大部分的实数系统
    • 这种方式下,会引起调度的原因:
      • 正在执行的进程执行完毕,或者因为某些事无法继续执行;
      • 执行的进程提出I/O请求,而暂停执行;
      • 在进程通信或者同步过程中,执行了某种原语操作,比如Block原语。
  • 抢占式
    • 这种调度方式允调度程序根据某种原则,去暂停某个正在执行的进程,将已经分给该进程的处理机重新分给另一进程。
    • 广泛采用抢占式,是因为对于批处理系统,可以防止一个长进程长时间的占用处理机,以确保处理机能够为所有进程提供更为公平的服务。
    • 分时系统中,只有采用抢占式才能实现人机交互,在实时系统中,抢占式能满足实时任务的要求
    • 但同时抢占式比较复杂,所需要的系统开销比较大
    • “抢占式”抢占时也需要按照一定的原则,主要原则有:
      • 优先权原则,指允许优先级高的新到进程抢占当前长进程的处理机,即新进进程到达时,如果他的优先度比正在执行的进程优先度高,则调度程序剥夺当前进程的处理机。
      • 短进程优先原则,指允许新到的短进程抢占当前的长进程的处理机,即新进 进程到达时,如果他的比正在执行的(尚需运行)时间明显短,则调度程序剥夺当前进程的处理机。
      • 时间片原则, 即各进程按时间片轮转运行时,当正在执行的进程的一个时间片段用完后,便停止该进程的执行,而重新进行调度。

4. 轮转调度算法(RR)

  • 轮转法的基本原理
    在RR中,系统将所有的就绪进程按照FCFS策略排成一个就绪队列,系统可设置每隔一定时间便产生一次中断,去激活进程调度程序进行调度把CPU分配队首进程,并令其执行一个时间片。运行完毕后,又把处理机分配给就绪队列的新的队首。
  • 进程切换时机
    在RR算法中,切换时机有两种情况
    • 若一个时间片未用完,正在运行的进程便已完成,就立即激活调度进程,将它从就绪队列删除,调度就绪队列的队首进程。
    • 在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完成,调度程序将它送往就绪队列的末尾。
  • 时间片大小的确定
    在RR算法中,时间片的大小对系统性能有很大影响
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5. 优先级调度算法

  • 优先级调度算法的类型
    优先级进程调度算法,是把处理机分配给就绪队列中优先级最高的进程。同时又可以进一步把该算法分为:
    • 非抢占式优先级调度算法
    • 抢占式优先级调度算法
  • 优先级类型
    • 静态优先级。静态优先级是在创建进程时确定,在进程的整个运行时间不变。优先级的大小确定的依据有:
      • 进程类型;
      • 进程对资源的需求;
      • 用户要求;
    • 动态优先级。动态优先级是指在进程创建之初,先赋予其一个优先级,然后其值随进程的推进或者等待时间的增加而改变,以获得更好的调度性能。

6. 多队列调度算法

  • 之前所述的各种调度算法,在应用于进程调度时,由于系统中仅设置一个进程的就绪队列,即低级调度的算法是单一的,固定的,无法满足系统中不同用户对进程调度策略的不同要求,在多处理机系统中,这种单一调度策略实现机制缺点更加明显。因此多级队列算法能够在一定程度上弥补这一缺点
  • 多级队列算法将进程就绪队列拆分成若干个不同的就绪队列采用不同的调度算法,所以可以很好的满足不同用户对进程调度策略的不同需求,同时也可以满足多处理机系统的需求。

7. 多级反馈队列调度算法

  • 多级反馈队列不同与之前的调度算法,他可以不需确定各进程运行的时间,还可以较好的满足各种类型进程的需求。
  • 调度机制
    多级反馈进程调度算法机制可以描述如下:
    • 设置多个就绪队列
    • 每个队列都采用FCFS算法。当新进程进入内存后,首先将它放在第一队列末尾,按照FCFS原则等待调度,当轮到该进程执行时,如果能在该时间片内完成,便可撤离系统否则,调度程序便把他转入第二队列末尾等待。如果他在第二队列运行一个时间片认为完成,在一次放入第三队列…以此类推。当进程最后被降到第n队列后,在第n队列中便采用RR方式运行。
    • 按照队列优先级调度。调度程序首先调度最高优先级队列中的诸进程,仅当第一队列空闲时才调度第二队列中的进程运行。换而言之,仅当第1~(i-1)队列均为空时,才会调度第i队列中的进程运行,如果处理机正在为第i队列中的某进程服务时,有新进程进入较高级的队列,此时必须把正在运行的进程放回第i队列的末尾,而把处理机分配给新到的高优先级队列。
      在这里插入图片描述

8. 保证调度算法(一种基于公平原则的调度算法)

是一种 基于公平原则的调度算法。

  • 保证调度算法是另一种类型的调度算法,它想用户所作出的保证并不是优先运行,而是明确的性能保证,该算法可以做到调度的公平性。一种比较容易的性能保证是处理机的公平性,如果在系统中有n个类型相同的进程同时运行,为了公平期间,每个进程都获得相同的处理机时间1/n
  • 在实施保证调度算法时,系统必须具备这样一些功能
    • 跟踪计算每个进程自创建以来已经执行的处理时间。
    • 计算每个进程应获得的处理机时间,即自创建以来的时间除以n。
    • 计算进程获得处理机时间的比率,即进程实际执行的处理时间和应获得的处理机时间之比。
    • 比较各进程获得处理机时间的比率。如进程A的比率最低,为0.5,而进程B的比率为0.8,进程C的比率为1.2等。
    • 调度程序应选择比率最小的进程将处理机分配给它,并让该进程一直运行,直到超过最接近它的进程比率为止。

9. 公平分享调度算法(一种基于公平原则的调度算法)

是一种 基于公平原则的调度算法。

  • 分配给每个进程相同的处理机时间,显然,这对诸进程而言,是体现了一定程度的公平,但如果各个用户所拥有的进程数不同,就会发生对用户的不公平问题
  • 在该算法中,调度的公平性是体针对于用户而言。使所有的用户获得相同的处理机时间,或要求的时间比例。

五、实时调度

在实时系统中,可能存在着两类不同性质的实时任务,即HRT任务和SRT任务,它们都联系着一个截止时间。为保证系统能正常工作,实时调度必须能满足实时任务对截止时间的要求。

1. 实现实时调度的基本条件

  • 提供必要的信息
    为了实现实时调度,系统应向调度程序提供以下信息:
    • 就绪时间,是指任务成为就绪状态的起始时间。
    • 开始截至时间和完成截至时间
    • 处理时间,即一个任务从开始执行到完成所需要的程序
    • 资源要求,任务执行是所需要的一组
    • 优先级,如果某任务的开始指向截至时间错过,势必引起故障,则应为该任务赋予“绝对”的优先级;如果其开始截至时间的错过,对任务的继续运行无重大影响,则赋予“相当”优先级。
  • 系统处理能力强
    • 在实时系统中,若处理机的处理能力不够强,则有可能因处理机忙不过,而致使某些实时任务不能得到及时处理,从而导致发生难以预料的后果。假定系统中有m个周期性的硬实时任务HRT,它们的处理时间可表示为Ci,周期时间表示为Pi,则在单处理机情况下,必须满足下面的限制条件系统才是可调度的:
      在这里插入图片描述
      提高系统处理能力的途径有二:
      一是采用单处理机系统,但须增强其处理能力,以显著地减少对每一个任务的处理时间;
      二是采用多处理机系统。假定系统中的处理机数为N,则应将上述的限制条件改为:
      在这里插入图片描述
  • 采用抢占式调度机制
    • 在含有HRT任务的实时系统中,广泛采用抢占机制。这样便可满足HRT任务对截止时间的要求。
    • 但这种调度机制比较复杂。 对于一些小的实时系统,如果能够预知任务法开始截止时间,则对于实时任务的调度可以采用非抢占式调度。
  • 具有快速切换的机制
    为保证硬实时任务能及时运行,在系统中还应具有快速切换机制,使之能进行任务的快速切换。该机制应具有如下两方面的能力:
    • 对中断的快速响应能力。对紧迫的外部事件请求中断能及时响应,要求系统具有快速硬件中断机构,还应使禁止中断的时间间隔尽量短,以免耽误时机(其它紧迫任务)。
    • 快速的任务分派能力。为了提高分派程序进行任务切换时的速度,应使系统中的每个运行功能单位适当的小,以减少任务切换的时间开销。

2. 实时调度算法的分类

实时调度算法按照调度方式可分为:

  • 抢占式
    • 非抢占式轮转调度算法(同上)
    • 非抢占式调度优先算法(同上)
  • 非抢占式
    可根据抢占发生时间的不同而进一步分成以下两种调度算法:
    • 基于时钟中断的抢占式优先级调度算法。
    • 立即抢占(Immediate Preemption)的优先级调度算法。
      在这里插入图片描述

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

该算法是根据任务的截止时间确定任务的优先级,任务的截止时间越早,其优先级越高,具有最高优先级的排在队首。EDF既可以用于抢占式也可以用于非抢占式。

  • 非抢占式调度方法用于非周期实时任务
    在这里插入图片描述
  • 抢占式用于周期实时任务
    下图有两个周期任务,任务A和任务B的周期时间分别为20 ms和50 ms,每个周期的处理时间分别为10 ms和25 ms。
    在这里插入图片描述

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

  • 该算法在确定任务的优先级时,根据的是任务的紧急(或松弛)程度。任务紧急程度愈高,赋予该任务的优先级就愈高,以使之优先执行。 该方式主要用可抢占式调度。
  • 假如在一个实时系统中有两个周期性实时任务A和B,任务A要求每20 ms执行一次,执行时间为10 ms,任务B要求每50 ms执行一次,执行时间为25 ms。由此可知,任务A和B每次必须完成的时间分别为:A1、A2、A3、…和B1、B2、B3、…,如下图
    在这里插入图片描述
    在这里插入图片描述

5. 优先级倒置

  • 优先级倒置是什么:
    系统中存在着影响进程运行的资源而可能产生“优先级倒置”的现象,即高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。
  • 优先级倒置的解决方法:
    • 一种较简单的解决方法就是,规定进程进入临界区后,该进程占用的处理机不允许被抢占;
    • 另一个比较实用的方法建立在动态优先级基础的基础上:该方法规定,当高优先级进程要进入临界区时,去使用临界资源R时,如果已有一个低优先级进程正在使用该资源。此时高优先进程被阻塞,另一方面低优先级进程继承高优先进程的优先级,直到低优先进程退出临界区。

猜你喜欢

转载自blog.csdn.net/pary__for/article/details/113564733
今日推荐