计算机操作系统 慕课版 第3章 处理机调度与死锁

第三章 处理机调度与死锁

在多道程序系统中,一个作业从提交到执行, 通常都要经过多级调度,而系统运行的性能在很大程度上取决于调度,因此调度便成为操作系统设计的一个中心问题之一。

3.1、 处理机调度概述

3.1.1、 处理机调度的层次

1、高级调度--作业调度,长程调度

作业调度的主要功能是根据作业控制块中的信息, 审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内 存,并为它们创建进程、分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。因此,有时也把作业调度称为接纳调度(Admission Scheduling)。

2、 低级调度

低级调度的功能---进程调度,短程调度

(1)保存处理机的现场信息

(2)按某种算法选取进程

(3)把处理机分配给进程

3、中级调度---交换调度

1、目的:提高内存利用率和系统吞吐量。

2、方法:

(1)将暂时不能运行的进程调至外存上去等待, 此时进程状态为:就绪驻外存状态或挂起状态。

(2)再次满足运行条件时,由中级调度把外存上 的具备运行条件的进程,调入内存,挂在就绪队列上等待进程调度

3.1.2、作业与作业调度

1 、作业

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

(2) 作业步(Job Step)。通常,在作业运行期间,每个作业都必须经过若干个相对独立,又相互关联的顺序加工步 骤才能得到结果,我们把其中的每一个加工步骤称为一个作业步,各作业步之间存在着相互联系,往往是把上一个作业 步的输出作为下一个作业步的输入。

例如,一个典型的作业 可分成三个作业步:① “编译”作业步,通过执行编译程序 对源程序进行编译,产生若干个目标程序段;② “连结装配” 作业步,将“编译”作业步所产生的若干个目标程序段装配 成可执行的目标程序;③ “运行”作业步,将可执行的目标程序读入内存并控制其运行。

(3)作业流。若干个作业进入系统后,被依次存放在外存 上,这便形成了输入的作业流;在操作系统的控制下,逐个 作业进行处理,于是便形成了处理作业流。

2、作业控制块JCB

为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,如同进程控制块是进程在系统中存 在的标志一样,它是作业在系统中存在的标志,其中保存了 系统对作业进行管理和调度所需的全部信息。

在JCB中所包含 的内容因系统而异,通常应包含的内容有:作业标识、用户 名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量 型、终端型)、作业状态、调度信息(优先级、作业已运行时 间)、资源需求(预计运行时间、要求内存大小、要求I/O设备 的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。

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

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

image-20211024122232964

4、作业调度的任务

  1. 接纳多少个作业
  2. 接纳哪些作业

对用户而言,总希望自己作业的周转时间尽可能的少, 最好周转时间就等于作业的执行时间。然而对系统来说,则希望作业的平均周转时间尽可能少,有利于提高CPU 的利用率和系统的吞吐量。为此,每个系统在选择作业调度算法时, 既应考虑用户的要求,又能确保系统具有较高的效率。在每次执行作业调度时,都须做出以下两个决定。

1) 决定接纳多少个作业作业调度每次要接纳多少个作业进入内存,取决于多道 程序度(Degree of Multiprogramming),即允许多少个作业同时 在内存中运行。当内存中同时运行的作业数目太多时,可能 会影响到系统的服务质量,比如,使周转时间太长。但如果 在内存中同时运行作业的数量太少时,又会导致系统的资源 利用率和系统吞吐量太低,因此,多道程序度的确定应根据 系统的规模和运行速度等情况做适当的折中。

2)决定接纳哪些作业 应将哪些作业从外存调入内存,这将取决于所采用的调度算法。最简单的是先来先服务调度算法,这是指将最早进 入外存的作业最先调入内存;较常用的一种算法是短作业优先调度算法,是将外存上最短的作业最先调入内存;另一种 较常用的是基于作业优先级的调度算法,该算法是将外存上 优先级最高的作业优先调入内存;比较好的一种算法是“响 应比高者优先”的调度算法。我们将在后面对上述几种算法 作较为详细的介绍。

在批处理系统中,作业进入系统后,总是先驻留在外存的后备队列上,因此需要有作业调度的过程,以便将它们分批地装入内存。然而在分时系统中,为了做到及时响应,用 户通过键盘输入的命令或数据等都是被直接送入内存的,因 而无需再配置上述的作业调度机制,但也需要有某些限制性措施来限制进入系统的用户数。即,如果系统尚未饱和,将接纳所有授权用户,否则,将拒绝接纳。类似地,在实时系统中通常也不需要作业调度。

3.1.3、进程调度

1、低级调度的任务

(1)保存处理机的现场信息

(2)按某种算法选取进程

(3)把处理机分配给进程

2、进程调度的三个基本机制

(1)排队器(进程队列);

(2)分派器(分派程序)(调度程序)

(3)上下文切换机制(环境信息切换)

3、进程调度的方式

(1)非抢占方式(Non-preemptive Mode)

引发调度的事件:

① 正在执行的进程执行完毕;

② 发生某事件而不能再继续执行;

③ 执行中的进程因提出I/O请求而暂停执行;

④ 执行了某种原语操作。

特点:实现简单、系统开销小,适用于大多数的批 处理系统环境,难以满足紧急任务的要求。

(2) 抢占方式 (Preemptive Mode)

抢占的原则:

(1) 优先权原则

(2) 短作业(进程)优先原则

(3) 时间片原则

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

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

(1) 资源利用率

(2) 公平性

(3) 平衡性

(4) 策略强制执行

2、批处理系统的目标

(1)周转时间:从作业提 交给系统开始,到作业完成这 段时间间隔。

image-20211024123550488

3、分时系统的目标

1)响应时间快

2)均衡性

4、实时系统的目标

1)截止时间的保证

2)可预测性

3.2、调度算法

3.3.1、先来先服务和短作业(进程)优先调度算法

1、先来先服务调度算法(FCFS)

2、短作业(进程)优先调度算法(SJF / SPF)

SJF/SPF算法的缺点:

(1) 对长作业(进程)不利。调度程序总是优先调 度那些(即使是后进来的)短作业(进程),可能使 长作业(进程)长期不被调度。

(2) 未考虑作业(进程)的紧迫程度。不能保证紧 迫性作业(进程)被及时处理。

(3) 作业(进程)的长短没有客观标准。可能有失 公平,损害算法初衷。

3.2.3、优先级调度算法

1、优先权调度算法的类型

(1)非抢占式优先权算法

主要用于批处理系统中;

(2) 抢占式优先权调度算法

能更好地满足紧迫作业的要求,常用于要求比较严格的实时系统中, 以及对性能要求较高的批处理系统 和分时系统中。

2、优先权的类型

(1)静态优先权

优先权是在创建进程时确定,在进程的整个运行期间 保持不变。

优先权的确定依据:进程类型,进程对资源的需求, 用户要求。

(2) 动态优先权

动态优先权是指,在创建进程时所赋予的优先权,是 可以随进程的推进或随其等待时间的增加而改变的,以便 获得更好的调度性能。

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

image-20211024124628485

(2)高响应比优先调度算法优点:

*等待时间相同,要求服务的时间愈短,优先权愈高,算法有利于短作业。

*要求服务的时间相同,等待时间愈长,其优先权愈高,实现了先来先服务。

*长作业优先级随等待时间的增加而提高,最终也可获得处理机,确保了长作业的执行。

3.2.4、基于时间片的轮转调度算法

1、 时间片轮转法基本原理

(1)把CPU按时间片分配给进程,进程按时间片 大小轮流执行。

(2)保证就绪队列中的所有进程,在一给定的时 间内,均能获得一时间片的处理机执行时间。(响应 时间)

(3)时间片的大小从几ms到几百ms.

2、进程切换时机

(1)若一个时间片尚未用完,正在运行的进程已经完成,则调度激活程序,将已经完成的进程从就绪队列中删除,再调度就绪队列中队首进程运行,并启动一个新的时间片。

(2)当一个时间片用完,计时器中断处理程序被激活。此时,若进程尚未运行完成,调度程序把它送到就绪队列末尾。

3、 时间片大小确定

image-20211024124924422

3.2.5、多级队列调度算法

在进程容易分成不同组的情况下,可以有另一类调度算法。例如, 进程通常分为前台进程(或交互进程)和后台进程(或批处理进程)。 这两种类型的进程具有不同的响应时间要求,进而也有不同调度需要。 另外,与后台进程相比,前台进程可能要有更高的优先级(外部定 义)。多级队列调度算法将就绪队列分成多个单独队列根据进程属性, 如内存大小、进程优先级、进程类型等,一个进程永久分到一个队列, 每个队列有自己的调度算法。

3.2.6、多级反馈队列调度算法

image-20211024125214207

3.3.7、基于公平原则的调度算法

1、 保证调度算法

2、公平分享调度算法

3.3、实 时 调 度

不做要求

3.5、死锁概述

3.5.1、资源问题

  1. 可重用性资源和消耗性资源

1)可重用性资源

2)可消耗性资源

  1. 可抢占性资源和不可抢占性资源

1)可抢占性资源

2)不可抢占性资源

3.5.2、计算机系统中的死锁

死锁: 指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。

产生死锁的原因:

  1. 竞争资源
  2. 进程间推进顺序非法

1、竞争不可抢占性资源引起进程死锁

image-20211024125728280

2 、竞争可消耗性资源

image-20211024125809057

3、进程推进顺序不当引起的死锁

当进程P1、P2共享资源A、B时,若推进顺序合法则不会产生死锁, 否则会产生死锁。

合法的推进路线:①②③ 不合法的推进线路:④

image-20211024125917534

3.5.3、死锁的定义、必要条件和处理方法

1、死锁的定义

如果系统中的每一个进程都在等待仅由该组进 程中的其他进程才能引发的事件,那么该组进程就是死锁的。

2、 产生死锁的必要条件

(1) 互斥条件

(2) 请求和保持条件

(3) 不剥夺条件

(4) 环路等待条件

3、处理死锁的基本方法

(1) 预防死锁

(2) 避免死锁

(3) 检测死锁

(4) 解除死锁

3.5.4、资源分配图

image-20211024130138838

3.6、预防死锁的方法

3.6.1、破坏“请求和保持”条件

1、第一种协议

系统要求所有进程要一次性地申请在整个运行过程所需要的全部资源。

摒弃请求条件:进程在整个运行期间,不再提 出资源要求。

摒弃保持条件:等待期间进程不占有任何资源。

优点:简单、易于实现、且安全。

缺点: (1)资源严重浪费 (2)进程延迟运行

2、第二种协议

思想:允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己、且已用完的全部资源,然后再请求新的所需资源。

3.6.2、摒弃“不可抢占”条件

思想:允许进程还未执行完成时释放已经占有的资源。

方法:

  1. 如果得不到满足,则先释放所占有的所有资源。
  2. 高优先级的进程优先请求相同资源,并能剥夺低优先级进程的资源。

局限: 实现复杂,代价较大,为了恢复现场需要耗费很多时间和空间。只适合类似CPU、存储器这样的资源。

3.6.3、破坏“循环等待”条件

方法:

给资源编号,进程必须按序申请资源。

局限:

  1. 资源编号困难
  2. 申请资源的顺序很难和资源编号顺序相一致
  3. 限制了用户对资源调用的灵活性

3.7、死锁避免

3.7.1、系统安全状态

所谓安全状态,是指系统能按某种进程顺序(P1, P2, …, Pn)(称ǿP1, P2, …, PnȀ序列为安全序列),来为每个进程Pi 分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。

如果系统无法找到这样一个安全序列,则称系统处于不安全状态。

避免死锁的关键就是:让系统在动态分配资源的过程中,不要进入不安全状态。

2、安全状态之例

3、由安全状态向不安全状态的转换

如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态,进而可能造成死锁。

3.7.2、利用银行家算法避免死锁

1965年由Dijkstra为T.H.E系统设计

基本思想:借用了银行借贷系统的分配策略。

基本规则:

(1)第一次申请需要声明最大资金需求量

(2)满足最大需求后要及时归还资金

(3)客户申请的贷款数量不超过它自己拥有的最大值时,银行要尽量满足客户需求

客户---->资金

银行---->进程

资源---->操作系统

1、 银行家算法中的数据结构

(1) 可利用资源向量Available,表示系统中可利用的资 源的数目;如Available[j]=K,表示系统中Rj 类资源有K 个。

(2) 最大需求矩阵Max,表示n个进程中的各进程对m类 资源的最大需求,如Max[i, j]=K,表示进程i需要Rj 类资 源的最大数目为K个。

(3) 分配矩阵Allocation,表示各进程当前已分得各类资源 的数目;如Allocation[i, j]=K,表示进程i当前已分得K 个Rj 类资源。

(4) 需求矩阵Need,表示各进程尚需的各类资源的数目; 如Need[i, j]=K,表示进程i还需要K个Rj类资源,方能完成其任务。

Need[i,j]=Max[i,j]-Allocation[i,j]

2、银行家算法

(1) 如果Requesti [j]≤Need[i,j],便转向步骤2;否则 认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2) 如果Requesti [j]≤Available[j],便转向步骤3; 否则, 表示尚无足够资源,Pi 须等待。

(3) 系统试探着把资源分配给进程Pi ,并修改下面数据结 构中的数值: Available[j]: =Available[j]- Requesti [j]; Allocation[i,j]: =Allocation[i,j]+ Requesti [j]; Need[i,j]: =Need[i,j]- Requesti [j];

(4) 系统执行安全性算法,检查此次资源分配后,系统 是否处于安全状态。若安全,才正式将资源分配给进程Pi ; 否则,恢复原来的资源分配状态,让进程Pi 等待。

image-20211024130915848

3、 安全性算法

(1)设置两个向量:

① 工作向量Work: 表示系统可提供给进程继续运行 的各 类 资源 数 目 , 在 执行安全算法开始时 , Work=Available;

② Finish: 表示系统是否有足够的资源分配给进程, 开始时先做Finish[i]:=false; 当有足够资源分配给进程时, 再令Finish[i]=true.

(2)从进程集合中找到一个能满足下述条件的进程:

① Finish[i]=false 且

② Need[i,j]≤Work[j]; 若找到, 执行步骤(3), 否则,执行步骤(4)。

(3)进程Pi 获得资源后,能顺利完成,并释放全部资 源,则修改向量: Work[j]:= Work[i]+ Allocation[i,j]; Finish[i]:= true; go to step 2;

(4) 如果所有进程的Finish[i]=true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。

设置两个向量: work、 Finish

从进程集合中找到一个能满足下述条件的进程: Finish[i] = false & Needi <= work

执行:

Work := Work + Allocation;

Finish[i] := true;

循环,如果所有进程的Finish[i] = true则安全。

5、 银行家算法的优缺点

优点:

  1. 提高了资源利用程度
  2. 系统总是处于安全状态

缺点:

  1. 被分配的每类资源的数量是固定不变的;
  2. 用户数保持固定不变;
  3. 要求用户事先说明其最大资源要求。

3.8、死锁的检测与解除

3.8.1、死锁的检测

要求:

  1. 资源请求与分配信息
  2. 检测算法和解除算法

1、资源分配图(Resource Allocation Graph)

image-20211024194823860

资源分配图化简:

image-20211024194947921


image-20211024194921066


image-20211024195019147

2、死锁定理

当且仅当系统某状态S所对 应的资源分配图是不可完全化简的,则S是死锁状态,而相应进程被死锁。

如果资源分配图中没有环路,则系统中没有死锁,如果图中存在环路则系统中可能存在死锁

如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件。

有环有死锁

image-20211024195155287

有环无死锁

image-20211024195255855

3、 死锁检测中的数据结构

(1) 可利用资源向量Available,它表示了m类资源中每一 类资源的可用数目。

(2) 把不占用资源的进程(向量Allocation∶=0)记入L表中, 即Li ∪L。

(3) 从进程集合中找到一个Requesti ≤Work的进程,做如下处理:

① 将其资源分配图简化,释放出资源,增加工作向 量Work∶=Work+Allocationi 。

② 将它记入L表中。

(4) 若不能把所有进程都记入L表中, 便表明系统状态S 的资源分配图是不可完全简化的。 因此,该系统状态将发生死锁。

3.8.2、死锁的解除

重新启动:这是一种常用但比较粗暴的方法,虽然实现简单,但会使之前的工作全部白费,造成很大的损失和浪费。

撤消进程:死锁发生时,系统撤消造成死锁的进程, 解除死锁。 一次性撤消所有的死锁进程。损失较大。 逐个撤消,分别收回资源。

具体做法:系统 可以先撤消那些优先级低的、已占有资源少 或已运行时间短的、还需运行时间较长的进 程,尽量减少系统的损失。

剥夺资源:死锁时,系统保留死锁进程,只剥夺死 锁进程占有的资源,直到解除死锁。选择被剥夺资源进程的方法和选择被撤消进程相同。

进程回退:死锁时,系统可以根据保留的历史信息, 让死锁的进程从当前状态向后退回到某种状态,直到死锁解除。

实现方法:可以通过结合检查点或回退机制实现。

posted @ 2021-10-24 22:45  NotYourferry  阅读(934)  评论(0编辑  收藏  举报