计算机操作系统-第三章 处理机调度与死锁 上——处理机调度

文章目录

3.1 处理机调度概述

在多道程序系统中,调度的实质是一种资源分配处理机调度是对处理机进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。在多道批处理系统中,一个作业从提交到获得处理机执行,直至作业运行完毕,可能需要经历多级处理机调度。

3.1.1 处理机调度的层次

1.高级调度

高级调度(high level scheduling)又称为长程调度或作业调度,它的调度对象是作业,主要功能是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。高级调度主要用于多道批处理系统中,而在分时系统和实时系统中,不设置高级调度。

2.低级调度

低级调度(low level scheduling) 又称为短程调度或进程调度,其所调度的对象是进程(或LWP)。其主要功能是,根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。低级调度是最基本的一种调度,在多道批处理、分时和实时这3种系统中,都必须配置这种调度。

3.中级调度

中级调度(intermediate scheduling) 又称为内存调度。引入中级调度的主要目的是提高内存利用率和系统吞吐量。为此,应把那些暂时不能运行的进程调至外存等待,此时进程的状态称为就绪驻外存状态(或挂起状态)。当它们已具备运行条件且内存稍有空闲时,由中级调度来决定把外存上的那些已具备运行条件的就绪进程再重新调入内存,并修改它们的状态为就绪状态,挂在就绪队列上等待。中级调度实际上就是存储器管理中的对换功能

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

3.1.2 作业和作业调度

在多道批处理系统中,作业是用户提交给系统的一项相对独立的工作。操作员把用户提交的作业通过相应的输入设备输入磁盘存储器,并保存在一个后备作业队列中,再由作业调度程序将其从外存调入内存。

1.作业

作业是一个比程序更为广泛的概念,它不仅包含了通常的程序和数据,而且配有一份作业说明书,系统根据该说明书对程序的运行进行控制。在多道批处理系统中,会将作业作为基本单位从外存调入内存。

2.作业控制块

为了管理和调度作业,在多道批处理系统中,为每个作业设置了一个作业控制块(job control block,JCB),它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。JCB中包含的内容通常有:作业标志、用户名称、用户账号、作业类型(CPU繁忙型、I/O繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业运行时间)、资源需求情况(预计运行时间、要求内存大小)、资源使用情况等。
每当一个作业进入系统时,“作业注册”程序便会为该作业建立一个JCB,然后根据作业类型将其放到相应的作业后备队列中等待调度。调度程序依据一定的调度算法来调度它们,被调度到的作业将被装入内存。在作业运行期间,系统会按照JCB中的信息和作业说明书对作业进行控制。当一个作业执行结束并进入完成状态时,系统便会回收已分配给它的资源,并撤销其JCB。

3.作业调度的主要任务

作业调度的主要任务是,根据JCB中的信息,检查系统中的资源能否满足作业的需求,以及按照一定的调度算法从外存的作业后备队列中选取某些作业调入内存,并为它们创建进程和分配必要的资源。然后,将新创建的进程排在就绪队列上等待调度。因此,也把作业调度称为接纳调度(admission scheduling)。在每次执行作业调度时,都须做出以下两个决定。

  • (1)接纳多少个作业
    在每次进行作业调度时,应当从后备队列中选取多少作业调入内存,取决于多道程序度(degree of multiprogramming),其表示允许多少个作业同时在内存中运行。对系统而言,其希望装入内存较多的作业,因为这样有利于提高资源利用率和系统吞吐量。但如果内存中同时运行的作业太多,那么进程在运行时因内存不足所发生的中断就会急剧增加,这将会使进程的平均周转时间显著延长,进而影响系统的服务质量。因此,多道程序度的确定方法是:综合考虑计算机系统规模、计算机运行速度、作业大小以及所能获得的系统性能好坏等情况后,做出适当的抉择。
  • (2)接纳哪些作业
    应选择后备队列中的哪些作业调入内存,取决于所采用的调度算法。最简单的调度算法是先来先服务调度算法,它会将最早进入外存的作业优先调入内存。较常用的一种调度算法是短作业优先调度算法,它会将外存上(执行时间)最短的作业优先调入内存。另一种较常用的调度算法是基于作业优先级的调度算法,它会将外存上作业优先级最高的作业优先调入内存。调度性能比较好的一类调度算法是“响应比高者优先”的调度算法。

3.1.3 进程调度

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

1.进程调度任务

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

2.进程调度机制

为了实现进程调度,在进程调度机制(如图3-2所示)中,应具有以下3个基本部分。

  • (1)排队器。为了提高进程调度的效率,应事先将系统中的所有就绪进程,按照一定的策略排成一个或多个队列,以便调度程序能最快地找到它们。以后每当有一个进程转变为就绪状态时,排队器便将它插入相应的就绪队列
  • (2)分派器。分派器将进程调度程序所选定的进程从就绪队列中取出,然后进行从分派器到新选进程间的上下文切换,以将CPU分配给新选进程。
  • (3)上下文切换器。在对处理机进行切换时,会发生两对上下文的切换操作:①第一对上下文切换时,OS将保存当前进程的上下文,即把当前进程的CPU寄存器内容保存到该进程的PCB内的相应单元,而装入分派程序的上下文,则可以方便分派程序运行;②第二对上下文切换是移出分派程序的上下文,把新选进程的CPU现场信息装入CPU的各个相应寄存器中,以便新选进程运行。
  • 在进行上下文切换时,需要执行大量的load和store等操作指令,以保存寄存器的内容。即使是现代计算机,用每次上下文切换所花费的时间大约也可以执行上千条指令。为此,现在已有通过硬件实现来减少上下文切换时间的方法了,一般采用两组(或多组)寄存器,其中一组寄存器供处理机在内核态时使用,而另一组寄存器供应用程序使用。在这样的条件下的上下文切换,只须改变指针以使其指向当前寄存器组即可。
    在这里插入图片描述

3.进程调度方式

早期所采用的非抢占调度方式(non-preemptive mode) 存在着很大的局限性,很难满足交互性作业和实时任务的需求。为此,在进程调度中又引入了抢占调度方式(preemptive mode)。下面分别对它们进行介绍。

  • (1)非抢占调度方式
    在采用非抢占调度方式时,一旦把处理机分配给某进程,就会一直让它运行下去,而决不会因为时钟中断或其他原因抢占该进程的处理机,直至该进程完成或发生某事件而被阻塞时,才会把分配给该进程的处理机分配给其他进程。
    在采用非抢占调度方式时,可能会引起进程调度的因素可归结为:

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

    非抢占调度方式的优点是实现简单、系统开销小,其适用于大多数批处理系统。但它不能用于分时系统和大多数实时系统

  • (2)抢占调度方式
    抢占调度方式允许调度程序根据某种原则去暂停某个正在执行的进程,并将已分配给该进程的处理机重新分配给另一进程。在现代OS中广泛采用抢占调度方式,这是因为:对于批处理机系统,抢占调度方式可以防止一个长进程长时间地占用处理机,以确保处理机能为所有进程提供更为公平的服务。在分时系统中,只有采用抢占调度方式才有可能实现人机交互。在实时系统中,抢占调度方式能满足实时任务的需求。但抢占调度方式比较复杂,所须付出的开销也较大。
    “抢占”不是一种任意性行为,必须遵循一定的原则,主要原则有:

    • 优先级原则,允许优先级高的新到进程抢占当前进程的处理机,即当有新进程到达时,如果它的优先级比当前进程的优先级高,则调度程序将剥夺当前进程的运行,并将处理机分配给新到进程;
    • 短进程优先原则,允许新到的短进程抢占当前长进程的处理机,即当新到进程比当前进程(尚须运行的时间)明显短时,将处理机分配给新到的短进程;
    • 时间片原则,各进程按时间片轮转运行时,当正在执行的进程的一个时间片用完后,便停止该进程的执行而重新进行调度。

3.1.4 处理机调度算法的目标

一般而言,在设计一个OS时应如何选择调度算法,这在很大程度上取决于OS的类型及其设计目标,例如,在批处理系统、分时系统和实时系统中,通常会采用不同的调度算法。

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

  • (1)资源利用率。为了提高系统的资源利用率,应使系统中的处理机和其他所有资源都尽可能地保持忙碌状态,其中最重要的资源——CPU的利用率可用以下公式计算。
    在这里插入图片描述
  • (2)公平性。公平性是指应使各进程都获得合理的CPU时间,以防止发生进程饥饿现象。公平性是相对的,相同类型的进程应获得相同的服务;但对于不同类型的进程,由于它们的紧急程度或重要性不同,为它们提供的服务也应不同。
  • (3)平衡性。系统中可能具有多种类型的作业,有的属于CPU繁忙型作业,有的属于I/O繁忙型作业。为使系统中的CPU和各种I/O设备都能经常处于忙碌状态,调度算法应尽可能保证系统资源使用的平衡性。
  • (4)策略强制执行。对于所制定的策略(其中包括安全策略),只要有需要,就必须予以准确的执行,即使会造成某些工作的延迟也要执行。

2.批处理系统中处理机调度算法的目标

  • (1)平均周转时间短。所谓周转时间(亦称为作业周转时间),是指从作业被提交给系统开始到作业完成为止的这段时间间隔
    • 它包括4部分时间:
      • 作业在外存后备队列上等待作业调度的时间,
      • 进程在就绪队列上等待进程调度的时间,
      • 进程在CPU上执行所耗费的时间,
      • 以及进程等待I/O操作完成的时间。
    • 其中,后3项在一个作业的整个处理过程中可能会发生多次。
    • 对每个用户而言,他们都希望自己作业的周转时间最短。但作为计算机系统的管理者,则总是希望作业的平均周转时间最短,因为这不仅可以有效提高系统资源的利用率,还可以使大多数用户都感到满意。事实上,计算机系统的管理者应使作业的周转时间和作业的平均周转时间都尽可能短,否则,许多用户的等待时间过长会引起他们(特别是 短作业用户)的不满。可把平均周转时间表示为:
      在这里插入图片描述
    • 为了进一步反映调度的性能,以更清晰地描述各进程在周转时间中“等待时间和执行时间”的具体分配状况,引入了带权周转时间,即作业的周转时间Ti与系统为它提供服务的时间之比,表示为Wi=Ti/ Tsi。因此,平均带权周转时间可表示为:
      在这里插入图片描述
  • (2)系统吞吐量高。系统吞吐量是指单位时间内系统所完成的作业数,因而它与批处理作业的平均长度有关。事实上,如果仅为了获得高的系统吞吐量,则应尽量多地选择短作业运行。
  • (3)处理机利用率高。对于大、中型计算机,CPU价格十分昂贵,致使处理机的利用率成为了衡量系统性能的重要指标;而调度算法又对处理机的利用率起着十分重要的作用。如果仅为了使处理机的利用率高,则应尽量多地选择计算量大的作业运行。
  • 综上所述可知,这些目标的实现之间存在着一定的矛盾

3.分时系统中处理机调度算法的目标

  • (1)保证响应时间快。响应时间快是选择分时系统中进程调度算法的重要准则
    • 响应时间,是指从用户通过键盘提交一个请求开始,到屏幕上显示出处理结果为止的这段时间间隔。它包括3部分时间:
      • 请求信息从键盘输入开始直至传送到处理机的时间,
      • 处理机对请求信息进行处理的时间,
      • 以及将所形成的响应信息回送到终端显示器的时间。
  • (2)保证均衡性。用户对响应时间的要求并非完全相同。通常用户对较复杂任务的响应时间允许较长,而对较简单任务的响应时间要求较短。
    • 均衡性系统响应时间的快慢应与用户所请求服务的复杂性相适应

4.实时系统中处理机调度算法的目标

  • (1)保证满足截止时间的要求
    • 所谓截止时间,是指某任务必须开始执行的最迟时间,或必须完成的最迟时间
    • 对于严格的实时系统而言,其调度算法必须要保证这一点,否则将会造成难以预料的后果。对于实时系统而言,调度算法的一个主要目标是保证实时任务满足截止时间的要求。对于HRT任务,其调度算法必须满足截止时间的要求,否则将会造成难以预料的后果;而对于SRT任务,其调度算法也应基本上满足截止时间的要求。
  • (2)保证可预测性。在实时系统中,可预测性显得非常重要。例如,在多媒体系统中,无论是电影还是电视剧,都应是连续播放的,这就保证了请求的可预测性。如果系统中采用了双缓冲区,则因为可实现第i帧播放和第i+1帧读取的并行处理,所以可提高系统的实时性。

3.2 调度算法

  • 进程调度算法
    先来先服务调度算法(FCFS)
    短作业优先调度算法(SF)
    优先权调度算法(PR)

    时间片轮转调度算法(RR)
    多级队列调度算法
    多级反馈队列调度算法
    基于公平原则的调度算法

3.2.1 先来先服务调度算法

  • 先来先服务(first come first server,FCFS) 调度算法是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它会优先考虑在系统中等待时间最长的作业,而不管该作业执行时间的长短。FCFS调度算法会从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,并为它们分配资源和创建进程;最后,把它们放入就绪队列。
  • 当在进程调度中采用FCFS调度算法时,每次调度都是从就绪的进程队列中选择一个最先进入该队列的进程,并为之分配处理机,使之投入运行。在该进程一直运行到完成或发生某事件而阻塞后,进程调度程序才会将处理机分配给其他进程
  • 需要补充说明的是,FCFS调度算法在单处理机系统中已很少作为主调度算法了,但通常会将它与其他调度算法结合使用,进而形成一种更为有效的调度算法。例如,可以在系统中按进程的优先级设置多个队列,每个优先级对应一个队列,其中每个队列的调度都基于FCFS调度算法。

3.2.2 短作业优先调度算法

由于在实际情况中,短作业(进程)占有很大比例,为了使它们能比长作业优先执行,产生了短作业优先(short job first,SJF) 调度算法。

1.SJF 调度算法简介

  • SJF调度算法是以作业的长短来计算优先级的,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。
  • SJF调度算法可以分别用于作业调度和进程调度。当把SJF调度算法用于作业调度时,它将从外存的作业后备队列中选择估计运行时间最短的作业,并优先将它调入内存运行。当SJF调度算法用于进程调度时,它将从就绪队列中选择估计运行时间最短的进程,并为之分配CPU运行。
  • 非抢占式SJF
    在这里插入图片描述
  • 抢占式SJF
    在这里插入图片描述

2.SJF 调度算法的缺点

  • SJF调度算法较FCFS调度算法有了明显的改进,但仍然存在不容忽视的缺点,介绍如下。
    • 必须预先知道作业的运行时间。当采用SJF调度算法时,要预先知道每个作业的运行时间,但即便是程序员也很难对其进行准确估计;如果估计偏短,系统就可能会按估计的时间终止作业的运行,但此时作业并未完成,故一般都会偏长估计。
    • 对长作业非常不利,长作业的周转时间会明显增长。更严重的是,SJF调度算法完全忽视作业的等待时间,这可能会使作业的等待时间过长,进而出现饥饿现象。
    • ③当采用FCFS调度算法时,无法实现人机交互
    • ④SJF调度算法完全没有考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理。

3.2.3 优先级调度算法

  • 我们可以这样来看进程或作业的优先级。对于FCFS调度算法,进程的等待时间就是进程的优先级,等待时间越长,其优先级越高。对于SJF调度算法,进程的长短就是进程的优先级,进程所须运行的时间越短,其优先级越高。但上述两种优先级,都不能反映进程的紧迫程度。
  • 优先级调度算法(priority-scheduling algorithm) 是基于进程的紧迫程度,由外部赋予进程相应的优先级的,其会根据该优先级进行调度。这样就可以保证紧迫性进程优先运行默认:小的优先数具有高优先级。目前主流的操作系统调度算法。
  • 优先级调度算法可用于作业调度,也可用于进程调度。当把该算法用于作业调度时,系统将从后备队列中选择优先级最高的作业装入内存。当把该算法用于进程调度时,系统将从就绪队列中选择具有最高优先级的进程在CPU上运行。

1.优先级调度算法的类型

优先级调度算法,是把处理机分配给就绪队列中优先级最高的进程。因此,可进一步把该算法分成以下两种。

  • (1)非抢占式优先级调度算法。该算法规定,一旦把处理机分配给就绪队列中优先级最高的进程,该进程便会一直执行下去直至完成,或者当该进程因发生某事件而放弃处理机时,系统方可将处理机重新分配给优先级次高的进程。
  • (2)抢占式优先级调度算法。该算法规定,在把处理机分配给优先级最高的进程并使之执行时,只要出现了另一个优先级更高的进程,调度程序就会将处理机分配给新到的优先级更高的进程。因此,在采用这种调度算法时,每当系统中出现一个新的就绪进程i时,系统就会将其优先级Pi同正在执行的进程j的优先级Pj进行比较,如果Pi≤Pj,则原进程j继续执行;但如果Pi>Pj,则立即停止原进程j的执行并进行进程切换,使新进程i投入执行。抢占式优先级调度算法常用于对实时性要求较高的系统中。

2.优先级的类型

优先级调度算法的关键在于如何确定进程的优先级,以及如何确定应当使用静态优先级,还是动态优先级。

  • (1)静态优先级。静态优先级是在创建进程时确定的,其在进程的整个运行期间保持不变。优先级是利用某一范围内的一个整数(如0~255的某一整数)来表示的,我们把该整数称为优先数。
    确定进程优先级大小的依据有3个:
    • 进程类型,通常系统进程(如接收进程、对换进程等)的优先级要高于一般用户进程的优先级;
    • 进程对资源的需求,对资源要求少的进程应被赋予较高的优先级;
    • 用户要求,根据进程的紧迫程度以及用户所付费用的多少,确定优先级。静态优先级这一方法简单易行,系统开销小,但不够精确,可能会出现优先级低的进程长期未被调度的情况。
  • (2)动态优先级。动态优先级是指在创建进程之初先赋予进程一个优先级,然后优先级会随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。例如,可以规定在就绪队列中的进程,其优先级能随等待时间的增长而提高。若所有的进程都具有相同的优先级初值,则最先进入就绪队列的进程会因优先级变得更高而优先获得处理机,这相当于FCFS调度算法。若所有的就绪进程均具有各不相同的优先级初值,那么对于优先级初值较低的进程,在等待了足够长的时间后也可获得处理机。当采用抢占式优先级调度算法时,若再规定当前进程的优先级随运行时间的推移而下降,则可防止一个长作业长期垄断处理机。

3.高响应比优先调度算法

  • 高响应比优先(highest response ratio next,HRRN) 调度算法是优先级调度算法的一个特例,通常用于作业调度。在批处理系统中,FCFS调度算法所考虑的只是作业的等待时间,而忽视了作业的运行时间。而SJF调度算法正好相反,其只考虑了作业的运行时间,而忽视了作业的等待时间。HRRN调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间,因此其既照顾了短作业,又不会致使长作业的等待时间过长,从而改善了处理机调度的性能。
  • HRRN调度算法是如何实现的呢?如果能为每个作业引入一个动态优先级,即优先级是可以改变的,例如令它能够随等待时间的延长而增加,那么长作业的优先级就会在等待期间不断提高,且在等待足够长的时间后,长作业其必然会获得处理机。该优先级的变化规律可表示为:
    在这里插入图片描述
  • 由于等待时间与要求服务时间之和就是系统对该作业的响应时间,故该优先级又相当于响应比RP,其可表示为:
    在这里插入图片描述
  • 由上式可以看出:
    • 如果作业的等待时间相同,则要求服务时间越短,优先级越高,此时HRRN调度算法类似于SJF调度算法,有利于短作业;
    • 当作业的要求服务时间相同时,其优先级又取决于等待时间,此时HRRN调度算法又类似于FCFS调度算法;
    • ③对于长作业的优先级,其可随等待时间的增加而提高,当作业的等待时间足够长时,其也可获得处理机。因此HRRN调度算法实现了较好的折中。当然在利用该算法时,每次调度之前都需要先计算响应比,这显然会增加系统的开销

3.2.4 轮转调度算法

在分时系统中,最简单也是较常用的进程调度算法是基于时间片的轮转(round robin,RR)调度算法。该算法采取了非常公平的处理机分配方式,即让就绪队列上的每个进程每次仅运行一个时间片。如果就绪队列上有n个进程,则每个进程每次大约可获得1/n的处理机时间。

1.RR 调度算法的基本原理

在RR调度算法中,系统会将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30ms)便产生一次中断,去激活进程调度程序进行调度,把处理机分配给队首进程,并令其执行一个时间片。当它运行完后,再把处理机分配给就绪队列中新的队首进程,同样地让它也执行一个时间片。这样,就可以保证就绪队列中的所有进程,在确定的时间段内,都能获得一个时间片的处理机时间。

2.进程切换时机

  • 在RR调度算法中,应在何时进行进程切换,可分为两种情况。
    • 若一个时间片尚未用完而正在运行的进程便已经完成,则立即激活调度程序,将已经运行完成的进程从就绪队列中删除,再调度就绪队列中新的队首进程运行,并启动一个新的时间片。
    • 当一个时间片用完时,计时器中断处理程序会被激活,此时,如果进程尚未运行完毕,调度程序就把它送往就绪队列的末尾

3.时间片大小的确定

在RR调度算法中,时间片的大小对系统性能有很大的影响。若选择很小的时间片,则将有利于短作业,因为它能在该时间片内完成。但是,若时间片选择得太小,则意味着系统会频繁地执行进程调度和进程上下文的切换,这无疑会增加系统的开销;若时间片选择得太大,且为使每个进程都能在一个时间片内完成,RR调度算法便会退化为FCFS调度算法,无法满足短作业和交互式用户的需求。一个较为可取的时间片大小是略大于一次典型的交互所需要的时间,使大多数交互式进程能在一个时间片内完成, 从而可以获得很小的响应时间。一般准则:时间片/10>进程上下文切换时间图3-3所示为时间片大小对响应时间的影响,图3-3(a)所示为时间片大于典型交互的时间,图3-3(b)所示为时间片小于典型交互的时间。图3-4所示为时间片分别为q=1和q=4时进程的周转时间。
在这里插入图片描述
在这里插入图片描述

到达时间、等待时间、服务时间、完成时间、周转时间、带权周转时间

3.2.5 多级队列调度算法

  • 如前所述的各种调度算法,当它们被应用于进程调度时,由于系统中仅设置了一个进程就绪队列,换言之,低级调度算法是固定的、单一的,因此其无法满足系统中不同用户对进程调度策略的不同要求,且在多处理机系统中,这种低级调度算法实现机制的缺点更为突出,而多级队列(multileved queue) 调度算法恰好能够在一定程度上弥补这一缺点。
  • 多级队列调度算法将系统中的进程就绪队列从一个拆分为若干个将不同类型或性质的进程固定分配在不同的就绪队列不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级(1.固定优先级调度,即前台运行完后再运行后台有可能产生饥饿。2.给定时间片调度,即每个队列得到一定的CPU时间,进程在给定时间内执行;如80%的时间执行前台的RR调度,20%的时间执行后台的 FCFS调度)。
  • 多级队列调度算法由于设置了多个就绪队列,对每个就绪队列可以实施不同的调度算法,因此,系统针对不同用户进程的需求,很容易提供多种调度策略。例如,系统可以有两个队列分别用于前台进程和后台进程。前台队列可以采用RR调度算法进行调度,而后台队列可以采用FCFS调度算法进行调度,前台队列可以绝对地优先于后台队列
  • 在多处理机系统中,多级队列调度算法由于安排了多个就绪队列,因此可以很方便地为每个处理机设置一个单独的就绪队列。这样,不仅对每个处理机的调度可以实施各自不同的调度策略,而且对于一个含有多个线程的进程而言,可以根据其要求将其所有线程分配在一个就绪队列上,并全部在一个处理机上运行;再者,对于一组需要相互合作的进程或线程而言,也可以将它们分配到一组处理机所对应的多个就绪队列上,使它们能同时获得处理机并行执行

3.2.6 多级反馈队列调度算法

前面介绍的各种用于进程调度的算法,都有一定的局限性。如果未指明进程长度,则短进程优先和基于进程长度的抢占式优先调度算法都将无法使用。而多级反馈队列(multileved feedback queue) 调度算法,则不必事先知道各种进程所需的执行时间,还可以较好地满足各种进程的需要,因而它是目前公认的一种较好的进程调度算法。

1.多级反馈队列调度算法的调度机制

多级反馈队列调度算法的调度机制介绍如下。

  • (1)设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余队列的优先级依次降低。该算法为不同队列中的进程所赋予的执行时间片的大小也各不相同,在优先级越高的队列中,其时间片越小。例如,第二个队列的时间片要比第一个队列的时间片长1倍,……,第i+1个队列的时间片要比第i个队列的时间片长1倍。图3-5所示为多级反馈队列调度算法的示意。
    在这里插入图片描述
  • (2)每个队列都采用FCFS调度算法。当新进程进入内存后,首先将它放入第一个队列的末尾,按FCFS策略等待调度。当轮到该进程执行时,如果它能在该时间片内完成,则可撤离系统。否则(即它在该时间片结束时尚未完成),调度程序将其转入第二个队列的末尾等待调度;如果它在第二个队列中运行一个时间片后仍未完成,则再将它放入第三个队列,依此类推。当进程最后被降到第n队列后,在第n队列中便采取RR方式运行。
  • (3)按队列优先级调度。调度程序首先调度最高优先级队列中的各进程运行,仅当第一队列空闲时,才调度第二队列中的进程运行;换言之,仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机在第i队列中为某进程服务时,又有新进程进入任一优先级较高的队列,则须立即把正在运行的进程放回到第i队列的末尾,并把处理机分配给新到的高优先级进程

2.多级反馈队列调度算法的性能

在多级反馈队列调度算法中,如果规定第一个队列的时间片略大于多数人机交互所需的处理时间,则能较好地满足各类用户的需要。①终端型用户。由于终端型用户提交的作业多属于交互型作业,通常较小,系统只要能使这些作业在第一队列规定的时间片内完成,便可使终端型用户感到满意。②短批处理作业用户。对于这类作业,如果可在第一队列中执行完成,则能获得与终端型作业一样的响应时间。对于稍长的短作业,也只须在第二和第三队列各执行一个时间片即可完成,其周转时间仍然较短。③长批处理作业用户。对于这类作业,其将依次在第1, 2, …, n个队列中运行,然后再按RR方式运行,用户不必担心其作业长期得不到处理。

3.2.7 基于公平原则的调度算法

前面介绍的几种调度算法所保证的只是满足要求的进程优先运行,如优先级调度算法可以保证优先级最高的进程优先运行,但并不保证进程占用了多少处理机时间;另外也未考虑调度的公平性。本小节将介绍两种相对公平的调度算法。

1.保证调度算法

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

2.公平分享调度算法

  • 分配给每个进程相同的处理机时间,显然,这对各进程而言体现了一定程度的公平,但如果各用户所拥有的进程数不同,就会发生对用户的不公平问题。假如系统中仅有两个用户,用户1启动了4个进程,用户2只启动了1个进程,采用RR调度算法让每个进程轮流运行一个时间片的时间,这对进程而言很公平,但用户1和用户2得到的处理机时间分别为80%和20%,即对用户2有失公平。
  • 在公平分享调度算法中,调度的公平性主要是针对用户的,即所有用户能获得相同的处理机时间或所要求的时间比例。然而调度又以进程为基本单位。为此,必须考虑每个用户所拥有的进程数目。例如,系统中有两个用户,用户1有4个进程A、B、C、D,用户2有1个进程E。为保证两个用户能获得相同的处理机时间,则必须执行如下强制调度序列:
    A E B E C E D E A E B E C E D E …
  • 如果希望用户1所获得的处理机时间是用户2的两倍,则必须执行如下强制调度序列:
    A B E C D E A B E C D E A B E C D E …

3.3 实时调度

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

3.3.1 实现实时调度的基本条件

1.提供必要的信息

  • 为了实现实时调度,系统应向调度程序提供与任务相关的信息,包括:
    • 就绪时间,指某任务的状态转换为就绪状态的起始时间,在周期任务的情况下,它是事先预知的一串时间序列;
    • 开始截止时间和完成截止时间,对于典型的实时应用,只须知道开始截止时间或者完成截止时间;
    • 处理时间,一个任务从开始执行直至完成所需的时间;
    • ④资源要求,任务执行时所需的一组资源;
    • 优先级,如果某任务的开始截止时间被错过了(势必引起故障),则应赋予该任务“绝对”优先级;如果其开始截止时间的错过对任务的继续执行无重大影响,则可赋予其“相对”优先级以供调度程序参考。

2.系统处理能力强

在实时系统中,若处理机的处理能力不够强,则有可能因处理机忙不过来而致使某些实时任务不能得到及时处理,从而导致发生难以预料的后果。假定系统中有m个周期性的HRT任务,它们的处理时间表示为Ci,周期时间表示为Pi,则在单处理机情况下,必须满足下式所示的限制条件,系统才可调度。顺便说明一下,该限制条件并未考虑任务切换所花费的时间,因此,当利用该限制条件时,还应适当地留有余地。
在这里插入图片描述
提高系统处理能力的途径有二:①采用单处理机系统,但须增强其处理能力,以显著减少对每个任务的处理时间;②采用多处理机系统,假定系统中的处理机个数为N,则应将上式所示的限制条件改为:
在这里插入图片描述

3.采用抢占式调度机制

在含有HRT任务的实时系统中,广泛采用抢占式调度机制,这样便可满足HRT任务对截止时间的要求。但这种调度机制比较复杂。对于一些小的实时系统,如果能预知任务的开始截止时间,则对实时任务的调度可采用非抢占式调度机制,以简化调度程序和任务调度时所花费的系统开销。但在设计这种调度机制时,应使所有的实时任务都比较小,并在执行完关键性程序和临界区代码后能及时地将自己阻塞起来,以便释放处理机并供调度程序去调度开始截止时间即将到达的任务。

4.采用快速切换机制

为保证HRT任务能及时运行,在系统中还应采用快速切换机制,使之能进行任务的快速切换。该机制应具有如下两方面的能力。①对中断的快速响应能力。对紧迫的外部事件请求中断能及时响应,要求系统具有快速硬件中断机构,此外,还应使禁止中断的时间间隔尽量短,以免耽误时机(影响其他紧迫任务的执行)。②快速的任务分派能力。为了提高分派程序的任务切换速度,应使系统中的每个运行功能单位适当地小,以减少任务切换的时间开销。

3.3.2 实时调度算法分类

可以按不同方式,对实时调度算法加以分类:①根据实时任务性质,可将实时调度算法分为HRT调度算法和SRT调度算法;②根据调度方式,可将实时调度算法分为非抢占式调度算法和抢占式调度算法。

1.非抢占式调度算法

  • (1)非抢占式轮转调度算法。由一台计算机控制若干个相同的(或类似的)对象,为每个被控对象建立一个实时任务,并将它们排成一个轮转队列。调度程序每次选择队列中的第一个任务投入运行。当该任务完成后,便把它挂在轮转队列的末尾进行等待,调度程序再选择下一个队首任务运行。这种调度算法可获得数秒至数十秒的响应时间,可用于要求不太严格的实时控制系统。
  • (2)非抢占式优先级调度算法。如果在系统中还含有少数具有一定要求的实时任务,则可采用非抢占式优先级调度算法,系统会为这些任务赋予较高的优先级。当这些实时任务到达时,系统会把它们安排在就绪队列的队首等待当前任务自我终止或运行完成后,再通过调度执行队首的高优先级进程。这种调度算法在做了精心的处理后,有可能使进程的响应时间减少到数百毫秒至数秒,因而可用于有一定要求的实时控制系统。

2.抢占式调度算法

可根据抢占发生时间的不同,将抢占式调度算法进一步分成以下两种算法。

  • (1)基于时钟中断的抢占式优先级调度算法。在某实时任务到达后,如果它的优先级高于当前任务的优先级,则此时并不立即抢占当前任务的处理机,而是等到时钟中断发生后,调度程序才会剥夺当前任务的执行,将处理机分配给新到的高优先级任务。该算法能获得较好的响应效果,其调度时延可降低到几毫秒至几十毫秒,可用于大多数的实时系统。
  • (2)立即抢占的优先级调度算法。在这种调度算法中,要求OS具有快速响应外部中断事件的能力。一旦出现外部中断,只要当前任务未处于临界区,便能立即剥夺当前任务的执行,把处理机分配给请求中断的紧迫任务。该算法能获得非常快的响应,其调度时延可降低到几百微秒至几毫秒。图3-6所示为4种实时调度算法所对应的调度时间情况。
    在这里插入图片描述

3.3.3 最早截止时间优先算法

最早截止时间优先(earliest deadline first,EDF)算法根据任务的截止时间确定任务的优先级,任务的截止时间越早,其优先级越高,具有最早截止时间的任务排在队列的前面。调度程序在选择任务时,总是选择就绪队列中的第一个任务,并为之分配处理机。EDF算法既可用于抢占式调度方式中,也可用于非抢占式调度方式中。

1.非抢占式调度方式用于非周期实时任务

图3-7所示为将EDF算法用于非抢占式调度方式之例。该例中具有4个非周期实时任务,它们先后到达。系统先调度任务1执行,在任务1执行期间,任务2、任务3又先后到达。由于任务3的开始截止时间早于任务2的,故系统在执行完任务1后先调度任务3执行。在此期间任务4又到达了,其开始截止时间仍早于任务2的,故在任务3执行完后,系统又会先调度任务4执行,最后才调度任务2执行。
在这里插入图片描述

2.抢占式调度方式用于周期实时任务

  • 图3-8所示为将EDF算法用于抢占式调度方式之例。在该例中有两个周期实时任务,任务A和任务B的周期时间分别为20ms和50ms,每个周期的处理时间分别为10ms和25ms。图3-8中的第一行给出了两个任务的到达时间、截止时间和执行时间图,其中任务A的到达时间为0ms、20ms、40ms……任务A的最晚截止时间为20ms、40ms、60ms……任务B的到达时间为0ms、50ms、100ms……任务B的最晚截止时间为50ms、100ms……
  • 为了说明通常的优先级调度不能适用于实时系统,该图增加了第二行和第三行。在第二行中,假定任务A具有较高的优先级,因此在t=0ms时先调度A1执行,在A1完成后t=10ms)
  • 才调度B1执行。在t=20ms时,又重新调度A2执行,在t=30ms时,A2完成,又调度B1执行。在t=40ms时,又调度A3执行,在t=50ms时,虽然A3已完成,但B1已错过了它的最后期限。这说明利用通常的优先级调度已经失败。第三行与第二行类似,只是假定任务B具有较高的优先级
  • 第四行是采用EDF算法的时间图。在t=0ms时,A1和B1同时到达,由于A1的截止时间比B1,故调度A1执行。在t=10ms时,A1完成,又调度B1执行。在t=20ms时,A2到达,由于A2的截止时间比B1早,故B1被中断而调度A2执行。在t=30ms时,A2完成,又重新调度B1执行。在t=40ms时,A3又到达,但B1的截止时间要比A3早,因此仍让B1继续执行直到完成(t=45ms),然后再调度A3执行。在t=55ms时,A3完成,又调度B2执行。在该例中,利用EDF算法可以满足系统的要求。

3.3.4 最低松弛度优先算法

  • 最低松弛度优先(least laxity first,LLF) 算法在确定任务的优先级时,根据的是任务的紧急程度(或松弛度)。任务紧急程度越高,赋予该任务的优先级就越高,以使其可被优先执行。例如,一个任务在200ms时必须完成,而它本身所需的运行时长是100ms,因此调度程序必须在100ms之前调度执行,该任务的松弛度为100ms。再如,另一任务在400ms时必须完成,它本身需要运行150ms,因此其松弛度为250ms。在实现该算法时,要求系统中有一个按松弛度排序的实时任务就绪队列,松弛度最低的任务排在最前面,调度程序会选择队列中的队首任务执行。
  • 该算法主要用于抢占式调度方式中。假如在一个实时系统中有两个周期性实时任务A和B,任务A要求每20ms执行一次,执行时长为10ms,任务B要求每50ms执行一次,执行时长为25ms。由此可知,任务A和任务B每次必须完成的子任务A1、A2、A3…和B1、B2、B3…的时间情况如图3-9所示。为保证不遗漏任何一次截止时间,应采用最低松弛度优先的抢占式调度机制。
    在这里插入图片描述
  • 在刚开始(t1=0)时,A1必须在20ms时完成,而它本身运行又需10ms,因此可算出A1的松弛度为10ms。B1必须在50ms时完成,而它本身运行又需25ms,因此可算出B1的松弛度为25ms,故调度程序应先调度A1执行。在t2=10ms时,A1执行完毕,此时,A2的松弛度可按下式算出:
    A2的松弛度=必须完成时间-其本身的运行时长-当前时间
    =40ms-10ms-10ms
    =20ms。
  • 类似地,可算出B1的松弛度为15ms(小于A2的松弛度),故调度程序应选择B1运行。在t 3=30ms时,A2的松弛度已减为0ms(即40-10-30),而B1的松弛度为15ms(即50-5-30),于是调度程序应抢占B1的处理机而调度A2运行。在t 4=40ms时,A3的松弛度为10ms(即60-10-40),而B1的松弛度仅为5ms(即50-5-40),故又应重新调度B1执行。在t5=45ms时,B1执行完毕,而此时A3的松弛度已减为5ms(即60-10-45),而B2的松弛度为30ms(即100-25-45),于是又应调度A3执行。在t6=55ms时,任务A尚未进入第4周期,而任务B已进入第2周期,故再调度B2执行。在t7=70ms时,A4的松弛度已减至0ms(即80-10-70),而B2的松弛度为20ms(即100-10-70),故此时调度程序又应抢占B2的处理机而调度A4执行。图3-10所示为利用LLF算法进行调度(具有两个周期性实时任务)的情况,图中括注内容表示运行时长。
    在这里插入图片描述

3.3.5 优先级倒置

1.优先级倒置的形成

  • 当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源,因此可能产生“优先级倒置”(priority inversion problem) 现象,即高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。下面通过一个例子来说明该问题。
    假如有3个完全独立的进程P1、P2、P3,P1的优先级最高,P2次之,P3最低。P1和P2通过共享的一个临界资源进行交互。相关代码如下(说明:临界资源、P操作、V操作等的具体介绍参见本书第4章的内容)。
    P1 : … P (mutex); CS_1 ; V(mutex) ;…
    P2 : … program2… ;
    P3 : … P (mutex); CS_3 ; V(mutex) ;…
    在这里插入图片描述
    假如P3最先执行,在执行了P(mutex)操作后,进入临界区CS_3。在时刻a,P2就绪,因为它比P3的优先级高,所以P2抢占了P3的处理机而运行,如图3-11所示。在时刻b,P1就绪,因为它又比P2的优先级高,所以P1抢占了P2的处理机而运行。在时刻c,P1执行P(mutex)操作,试图进入临界区CS_1,但因为相应的临界资源已被P3占用,所以P1被阻塞。此时P2继续运行,直到时刻d运行结束。然后由P3接着运行,到时刻e时P3退出临界区,并唤醒P1。因为P1比P3的优先级高,所以P1抢占了P3的处理机而运行。
    根据优先级原则,高优先级进程应当优先执行,但在此例中,P1和P3共享着“临界资源”而出现了不合常理的现象,高优先级进程P1因进程P3而被阻塞又因进程P2的存在而延长了被阻塞的时间,而且被延长的时间是不可预知和无法限定的。由此所产生的“优先级倒置”现象是非常有害的,它不应出现在实时系统中。

2.优先级倒置的解决方法

优先级倒置的一种简单的解决方法是规定:在进程进入临界区后,其所占用的处理机就不允许被抢占。由图3-11可以看出,P2即使优先级高于P3也不能执行。于是,P3就有可能会较快地退出临界区,而不会出现上述情况。如果系统中的临界区都较短且不多,则该方法是可行的。如果P3临界区非常长,则高优先级进程P1仍会等待很长的时间,其效果是无法令人满意的。
优先级倒置的一种比较实用的解决方法是建立在动态优先级继承的基础上的。该方法规定:当高优先级进程P1要进入临界区去使用临界资源R时,如果已有一个低优先级进程P3正在使用该资源,则此时一方面P1会被阻塞,另一方面会由P3继承P1的优先级,并一直保持到P3退出临界区。这样做的目的在于,不让比P3优先级稍高但比P1优先级低的进程(如P2)插进来,导致延缓P3退出临界区。图3-12所示为采用了动态优先级继承方法后,P1、P2、P3三个进程的运行情况。由图3-12可以看出,在时刻c,P1被阻塞,但由于P3已继承了P1的优先级,它比P2优先级高,这样就避免了P2的插入,使P1在时刻d进入临界区。该方法已在一些OS中得到了应用,且在实时系统中是一定会用到的。
在这里插入图片描述

3.4 实例:Linux进程调度

  • Linux进程调度经历了一个发展过程。Linux内核在2.5版本之前,采用传统的UNIX调度算法。然而,由于2.5版本之前的Linux内核不支持SMP系统,因此传统的UNIX调度算法没有考虑SMP系统。此外,当有大量可运行进程时,系统性能表现欠佳。在Linux内核2.5版本中,调度程序进行了大幅度改动,采用了称为O(1)的调度算法,它的运行时间为常量,与系统内任务数量无关。O(1)调度算法也增加了对SMP系统的支持。然而在实践中,虽然O(1)调度算法在SMP系统中具有出色的性能,但是其在许多桌面计算机系统中的交互进程响应时间欠佳。在Linux内核2.6版本的开发中,调度算法再次修改;在Linux内核v2.6.23版本的发布中,完全公平(completely fair scheduler,CFS) 调度算法成为默认的Linux进程调度算法。
  • Linux系统的调度基于总体调度结构,称之为调度器类(scheduler class)。它允许不同的可动态添加的调度算法并存,每个类都有一个特定的优先级。
    • 总调度器:根据调度器类的优先顺序,依次对调度器类中的进程进行调度
    • 挑选完调度器类后,再在选中的调度器类内:使用所选的调度器类的算法(调度策略)进行内部的调度
    • 调度器类的默认优先级顺序为Stop_Task>Real_Time>Fair>Idle_Task,开发者可以根据自己的设计需求,把所属的Task配置到不同的调度器类中。在众多的调度器类中,Fair和Real_Time是最常用的,它们分别是采用了CFS调度算法默认调度类和实时调度类

1.普通进程调度

  • 对于一个普通进程,采用了CFS调度算法的调度器在调度执行SCHED_NORMAL调度策略时,须考虑如何分配优先级,如何挑选一个进程并使其运行,以及使其运行多久等问题。
  • CFS调度算法并不会采用严格的规则来为一个任务分配某个长度的时间片,而是会为每个任务分配一定比例的CPU处理时间。每个任务分配的具体比例是根据友好值(nice value)来计算的友好值的范围为-20到+19,数值较低的友好值表示相对优先级较高。具有较低友好值的任务与具有较高友好值的任务相比,会得到更高比例的处理机时间。默认友好值为0
    • 需要说明的是,友好一词来自于以下想法:当一个任务增加了自身的友好值(如从0增至+10)后,其优先级会降低,进而对其他任务会更加友好。
  • CFS调度算法没有使用离散的时间片,而是采用了目标延迟(target latency),这是每个可运行任务应当运行一次的时间间隔。CFS调度算法会根据目标延迟按比例分配处理机时间。除了默认值和最小值外,随着系统内的活动任务数量超过一定的阈值,目标延迟可以增加。
  • CFS调度算法没有直接分配优先级,相反,它通过每个任务的变量vruntime来维护虚拟运行时间(virtual run time),进而记录每个任务运行了多久。虚拟运行时间与基于任务优先级的衰减因子有关:更低优先级的任务比更高优先级的任务具有更高的衰减速率。对于正常优先级的任务(友好值为0),虚拟运行时间与实际物理运行时间相同。因此,如果一个默认优先级的任务运行100ms,则它的vruntime也为100ms。如果一个较低优先级的任务运行100ms,则它的vruntime将大于100ms。如果一个较高优先级的任务运行100ms,则它的vruntime将小于100ms。当决定下一步运行哪个任务后,CFS调度算法就只须选择具有最小vruntime值的任务了。此外,一个更高优先级的任务如果成为可运行任务,其就会抢占低优先级任务。进程运行的时间是根据进程的权重进行分配的。

2.实时进程调度

  • Linux系统也实现了实时调度。采用SCHED_FIFOSCHED_RR实时策略来调度的任何任务,与普通(非实时的、采用SCHED_NORMAL调度的)任务相比,均具有更高的优先级。
  • SCHED_FIFO:这种策略对应的进程若处于可执行的状态,就会一直执行,直到它自己被阻塞或者主动放弃CPU;它不基于时间片,可以一直执行下去,只有更高优先级SCHED_FIFO或者SCHED_RR才能抢占它的任务;如果存在两个同样优先级的SCHED_FIFO任务,则它们会轮流执行,其他低优先级的任务只有等它们变为不可执行状态后才有机会执行。
  • SCHED_RR:与SCHED_FIFO大致相同,只是SCHED_RR级的进程在耗尽其时间片后,不能再执行,而是需要接受CPU的调度。当SCHED_RR耗尽时间片后,同一优先级的其他实时进程将被轮流调度。
  • 上述两种实时策略都采用了静态优先级。Linux内核不会为给定优先级的实时进程计算动态优先级,以保证给定优先级的实时进程总能抢占到优先级比它低的进程。实时任务分配的静态优先级为0~99,而正常任务分配的静态优先级为100~139。这两个值域合并后形成了一个全局的优先级方案,其中较低数值代表较高优先级。针对正常任务,系统会根据它们的友好值来为它们分配一个优先级。这里,友好值-20对应优先级100,而友好值+19对应优先级139

计算机操作系统-第三章 处理机调度与死锁 下——死锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值