文章目录
第三章 处理机调度与死锁
3.1 处理机调度的层次和调度算法的目标
- 调度的实质
- 处理机调度
- 处理机调度
- 算法多级调度
3.1.1 处理机调度层次
- 高级调度(作业调度)的主要任务是根据某种算法,把外存上处于后备队列中的那些作业调入内存。
- 低级调度(进程调度)是保存处理机的现场信息,按某种算法先取进程,再把处理器分配给进程。
- 引入中级调度(内存调度)的主要目的是为了提高内存利用率和系统吞吐量。使那些暂时不能运行的进程不再占用内存资源,将它们调至外存等待,把进程状态改为就绪驻外存状态或挂起状态。
3.1.2 处理机调度算法目标
- 处理机调度算法共同目标
- 资源利用率
- 公平性:每个进程获得合理的时间分配
- 平衡性:使CPU和各种外部设备都处于忙碌状态,调度算法保证系统资源的使用平衡性
- 策略强制执行:对所制定的策略,只要需要就予以执行,即使会造成某些工作的延迟也要执行
- 批处理系统的目标
(1)平均周转时间短
作业周转周期:是指从作业被提交给系统开始,到作业完成为止这段时间。
包括四部分:作业在外存后背队列上的等待调度的时间 、进程在就绪队列上等待进程调度时间、进程在CPU上执行时间、进程等待I/O操作完成时间
对每个用户而言,都希望自己作业的周转时间最短。但作为计算机系统的管理者,则总是希望能使平均周转时间最短,这不仅会有效地提高系统资源的利用率,而且还可使大多数用户都感到满意。
可把平均周转时间描述为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(N条作业提交到结束的时间之和除N)
为了进一步反映调度的性能,更清晰地描述各进程在其周转时间中,等待和执行时间的具体分配状况,往往使用带权周转时间,即作业的周转时间T与系统为它提供服务的时间T,之比,即W= T/T,o而平均带权周转时间则可表示为:
(N条作业提交到结束的时间与其对应每条作业运行时间的比除N)
(2)系统吞吐量高。
吞吐量是指在单位时间内系统所完成的作业数,它与批处理作业的平均长度有关。事实上,如果单纯是为了获得高的系统吞吐量,就应尽量多地选择短作业运行。
(3)处理机利用率高。
调度方式和算法又对处理机的利用率起着十分重要的作用。如果单纯是为使处理机利用率高,应尽量多地选择计算量大的作业运行。
3.分时系统的目标
(1)响应时间快
响应时间:是从用户通过键盘提交一个请求开始,直到屏幕上显示出处理结果为止 的一段时间间隔。
(2)均衡性
均衡性:是指系统响应时间的快慢应与用户请求服务的复杂性相适应。
- 实时系统目标
(1)截止时间保证
截止时间是指某任务必须开始执行的最迟时间,或必须完成的最迟时间。
HRT和SRT任务的调度方式、调度算法对其要求不一样。
(2)可预测性
3.2作业与作业调度
在多道批处理系统中,作业是用户提交给系统的一项相对独立的工作。操作员把用户提交的作业通过相应的输入设备输入到磁盘存储器,并保存在一个后备作业队列中,再由作业调度程序将其从外存调入内存。
3.2.1批处理系统中的作业
- 作业和作业步
(1)作业(Job) PS:不仅包含程序和数据还包含说明书
(2)作业步(Job Step) 对作业进行处理的相对独立的一个步骤,一个作业由多个作业步组成。如编译、链接、运行、打印结果。
-
作业控制块(Job Control Block,JCB)
为了管理和调度作业,在多道批处理系统中,为每个作业设置了一个作业控制块JCB,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。- JCB中的内容
- 作业标识
- 用户名称
- 用户账号
- 作业类型
- 作业状态
- 调度信息(优先级、作业运行时间)
- 资源需求(预计运行时间、要求内存大小等)
- 资源使用情况
- JCB中的内容
-
作业运行的三个阶段和三种状态
作业从进入系统到运行结束,通常需要经历收容、运行和完成三个阶段。相应的,作业也就有“后备状态”、“运行状态”和“完成状态”。
(1)收容阶段
(2)运行阶段
(3)完成阶段
3.3.2 作业调度的主要任务
根据JCB中的信息,检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程排在就绪队列上等待调度。因此,也把作业调度称为接纳调度。
在每次执行作业调度时,都需做出以下两个决定。
-
接纳多少个作业(取决于多道程序度)
-
接纳哪些作业(取决于所采用的调度算法)
- 注意:分时和实时系统不需要作业调度,但需具有接纳控制措施。
3.2.3先来先服务(FCFS)和短作业优先(SJF)调度算法
-
先来先服务(first-come first-served,FCFS)调度算法
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
当在进程调度中采用FCFS算法时,每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后,才放弃处理机。
-
特点:属于非抢占调度方式,简单、易于实现,
但不利于短作业和I/O型作业的运行。
-
应用场合:FCFS很少作为进程调度的主算法,常作为辅助调度算法。
-
短作业优先(short job first,SJF)的调度算法
由于在实际情况中,短作业(进程)占有很大比例,为了能使它们能比长作业优先执行,而产生了短作业优先调度算法。
(1) 短作业优先算法
SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度。
在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。
(2) 短作业优先算法的缺点
- 必须预知作业的运行时间。
- 对长作业非常不利。
- 人机无法实现交互。
- 不能保证紧迫性作业能得到及时处理。
3.2.4优先级调度算法(PSA)和高响应比优先调度算法(HRRN)
-
优先级调度算法(priority-scheduling algorithm,PSA)
可以这样来看待作业的优x先级,对于FCFS调度算法,作业的等待时间就是作业的优先级,等待时间越长,其优先级越高。
对于SJF调度算法,作业的长短就是作业的优先级,作业所需运行的时间越短,其优先级越高。但上述两种优先级都不能反映作业的紧迫程度。
-
高响应比优先调度算法(Highest Response RatioNext, HRRN)
在批处理系统中,FCFS算法所考虑的只是作业的等待时间,而忽视了作业的运行时间。而SJF算法正好与之相反,只考虑作业的运行时间,而忽视了作业的等待时间。
高响应比优先调度算法则是既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。
若能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先级又相当于响应比RP.
3.3进程调度
3.3.1进程调度任务、机制和方式
- 进程调度任务
- 保存当前进程现场信息
- 按某种算法选取新进程
- 把处理器分配给新进程
- 进程调度机制
调度机制由三组成部分
- 排队器:就绪进程构成一个或多个队列
- 分派器
- 上下文切换器:两次切换
- OS保存当前进程上下文(即把当前进程的处理机寄存器内容保存到该进程的进程控制块内),再装入新进程的上下文
- 移除分派程序上下文,将新选进程的CPU现场信息装入到处理机的各个相应寄存器中,以便新选进程运行
进程切换开销大
- 硬件实现切换,两组R(系统态、用户态)
在上下文切换时,需要执行大量load和store 等操作指令,以保存寄存器内容。即使是现代计算机,每次上下文切换所花费时间大约可执行上千条指令。为了解决这个问题,一般用空间换时间的方法优化,采用多组寄存器,一组寄存器供处理机系统态使用,一组供应用程序使用,这样上下文切换只需改变指针即可。
3.进程调度方式
-
非抢占式调度
- 不会被时钟中断或其它任何原因抢占,早期OS采用
- 有局限性,无法满足交互式及实时性需求
-
引起调度因素
-
(1)运行完毕,或出现错误
-
(2)因Io请求暂停
-
(3)进行通信或同步时执行某些原语,如block
-
特点:简单、开销小,适合批处理os,不能用于实时和分时系统
-
抢占式调度
-
允许调度程序根据某种原则调度新进程执行
-
现代OS广泛采用:
- 1)批处理:防止长期占用CPU
- 2)分时:实现人机交互
- 3)实时:满足实时任务需求
复杂,开销大
-
抢占原则
不是任意抢占,要遵循一定原则:
- 优先权原则:高抢占低
- 短进程优先:短抢占长
- 时间片原则:时间片完抢占
3.3.2轮转调度算法(RR)
分时系统常采用轮转调度算法,非常公平,毫秒级时间片
-
轮转算法基本原理
系统根据按FCFS策略,将所有的就绪进程排成一个就绪队列,并可设置每隔一定时间间隔(如30ms)即产生一次中断,激活系统中的进程调度程序进行调度,完成一次调度,将CPU分配给队首进程,令其执行。
当该进程的时间片耗尽或运行完毕时,系统再次将CPU 分配给新的队首进程(或新到达的紧迫进程)。由此可保证就绪队列中的所有进程在一个确定的时间段内,都能够获得一次CPU执行。
-
进程切换时机
- 若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。
- 在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。
- 进程I/O进程执行过程时间片未用完,但是发送I/O进程进入阻塞
- 时间片大小的确定
- 时间片大小极大影响系统性能
- 小时间片有利于短作业;太小则调度频繁,开销大
- 时间片长无法满足短作业和交互式需求太长退化为FCFS
- 以略大于一次典型交互时间为准,大多数进程在一个时间片完成
3.3.3优先级调度算法
- 优先级调度算法的类型
优先级调度算法把处理机分配给就绪队列中优先级最高的进程
-
分成如下两种
- (1)非抢占式优先级调度算法
- (2)抢占式优先级调度算法
-
抢占式优先级调度常用于实时性较高系统,当有新就绪进程时要重新评估
- 优先级的类型
- 静态优先级
静态优先级是指在创建进程时确定且在进程的整个运行期间保持不变的优先级。
-
进程创建时确定,三个依据:
-
(1)进程类型 系统进程>用户进程
- (2)进程对资源需求 需求少优先级高
-
(3)用户要求 根据紧迫程序及付费确定
-
动态优先级
动态优先级是指在创建进程时赋予的优先权,可以随进程推进或随其等待时间增加而改变的优先级,可以获得更好的调度性能。
特点:随进程推进或等待时间的增加而改变,调度性能好
3.3.4多级队列调度算法
- 采用一个进程就绪队列,低级调度算法固定、单一,无法满足不同用户对进程调度策略的不同要求
- 多个进程就绪队列,不同队列有不同调度算法,不同优先级
- 针对不同用户进程提供多种调度策略
- 针对多CPU,一个CPu进程可放于单个就绪队列
- 相互合作的进行分配到不同队列以提高并行性
3.3.5多级反馈队列调度算法
- 前面的算法有局限。不知进程长度时SPF和基于进程长度抢先式调度无法使用
- 不必事先知道进程长度,较好满足各种类型进程需要
- 目前公认较好的算法
- 多级:多个队列,每个队列优先级从高到低,优先级高的时间片短。
- 反馈:表示如果有新的进程加入优先级高的队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列。
-
调度机制
-
设置多个就绪队列, 设置多个就绪队列(多队列调度算法),第一个队列优先级最高,逐个降低;优先级越高,时间片越 小
-
时间片不同每个队列都采用FCFS算法,最后队列采取按RR
-
按队列优先级调度,属于抢先式调度
-
调度算法性能
第一个队列时间片略大于多数人机交互所需之处理时间时,能满足各种类型用户的需要。
- 终端型用户:由于终端型用户提交的作业多属于交互型作业,通常较小,系统只要能使这些作业在第一队列规定的时间片内完成,便可使终端型用户感到满意。
- 短批处理作业用户 :对于这类作业,如果可在第一队列中执行完成,便获得与终端型作业一样的响应时间。对于稍长的短作业,也只需在第二和第三队列各执行一时间片完成,其周转时间仍然较短。
- 长批处理作业用户 :对于长作业,它将依次在第1,2,……n个队列中运行,然后再按轮转方式运行,用户不必担心其作业长期得不到处理。
3.3.6 基于公平性原则的调度算法
-
保证调度算法
性能保证
n个相同类型的进程同时运行,须保证每个进程都获得相同的处理机时间1/n。
保证调度算法是另外一种类型的调度算法,它向用户所做出的保证并不是优先运行,而是明确的性能保证,该算法可以做到调度的公平性。一种比较容易实现的性能保证是处理机分配的公平性。
- 公平分享调度算法
在公平分享调度算法中,调度的公平性主要是针对用户而言,使所有用户能获得相同的处理机时间,或所要求的时间比例。
3.4实时调度
3.4.1 实现实时调度基本条件
- 提供必要信息
- 就绪时间 某任务成为就绪状态的起始时间,在周期任务的情况下,它是事先预知的一串时间序列
- 开始时间和截止时间 对于典型的实时应用,只须知道开始截止时间,或者完成截止时间。
- 处理时间 一个任务从开始执行,直至完成时所需的时间。
- 资源要求 任务执行时所需的一组资源。
- 优先级 如果某任务的开始截止时间错过,势必引起故障,则应为该任务赋予“绝对”优先级;如果其开始截止时间的错过,对任务的继续运行无重大影响,则可为其赋予“相对”优先级,供调度程序参考。
- 系统处理能力强
假定系统中有m个周期性的硬实时任务HRT,它们的处理时间可表示为C,周期时间表示为P,则在单处理机情况下,必须满足下面的限制条件时系统才是可调度的:
- 提高系统处理能力的途径有:
①采用单处理机系统,但须增强其处理能力,以显著地减少对每一个任务的处理时间;
②采用多处理机系统。假定系统中的处理机数为N,则应将上述的限制条件改为
-
采用抢占式调度机制
在含有HRT任务的实时系统中,广泛采用抢占机制。这样便可满足HRT任务对截止时间的要求。但这种调度机制比较复杂。
-
具有快速切换机制
为保证硬实时任务能及时运行,在系统中还应具有快速切换机制,使之能进行任务的快速切换。该机制应具有如下两方面的能力:
- (1)对中断的快速响应能力
- (2)快速的任务分派能力
3.4.2 实时调度算法分类
- 可以按不同方式对实时调度算法加以分类:
- 根据实时任务性质:硬实时调度、软实时调度
- 按调度方式:非抢占调度、抢占调度。
- 非抢占式调度:非抢占式轮转、非抢占式优先权
- 抢占式调度:基于时钟中断的抢占式优先级调度、立即抢占的优先级调度
3.4.3 最早截至时间优先(EDF)算法
任务的截至时间越早,其优先级越高
- 非抢占式调度方式用于非周期实时任务
-
假设任务3,4的开始截止时间早于任务2
- 抢占式用于周期实时任务
-
任务A和任务B的周期时间分别为20ms和50ms
每个周期的处理时间分别为10ms和25ms。
3.4.4 最低松弛度优先(LLF)算法
该算法在确定任务的优先级时,根据的是任务的紧急(或松弛)程度。任务紧急程度愈高,赋予该任务的优先级就愈高,以使之优先执行。
-
任务的松弛度=必须完成的时间-其本身的运行时间-当前时间
其中其本身运行的时间指任务运行结束还需多少时间。eg:一个任务在200ms时必须完成,而它本身所需的运行时间是100ms,因此调度程序必须在100ms之前调度执行,则该任务的紧急程度(松弛程度)为100ms。
-
LLF算法实现方法
在实现该算法在时要求系统中有一个按松弛度排序的实时任务就绪队列,松弛度最低的任务排在最前面,调度程序选择队列中的队首任务执行。
该算法主要用于可抢占调度方式中。
假如在一个实时系统中有两个周期性实时任务A和B,
任务A要求每20ms执行一次,执行时间为10ms,
任务B要求每50ms执行一次,执行时间为25ms.
由此可知,任务A和B每次必须完成的时间分别为:A1、A2、A3、…和B1、B2、B3、…,见下图。
- 下图示出了具有两个周期性实时任务的调度情况
t1= 0ms: A1松弛度为10ms,B1松弛度为25ms
t2=10ms:A2松弛度为20ms,B1松弛度为15ms
t3=30ms:A2松弛度为 0ms,B1松弛度为15ms
t4=40ms:A3松弛度为10ms,B1松弛度为 5ms
t5=45ms:A3松弛度为 5ms,B2松弛度为30ms
t6=55ms:任务A尚未进入第4周期,调度B2执行
t7=70ms: A4松弛度为0ms,B2松弛度为20ms
3.5死锁概述
所谓死锁是指多个进程因为竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
3.5.1 资源问题
在系统中有许多不同类型的资源,其中可以引起死锁的主要是,需要采用互斥访问方法的、不可以被抢占的资源(临界资源)。
系统中这类资源有很多,如打印机、数据文件、队列、信号量等。
-
可重用性资源和消耗性资源
① 可重用性资源
-
定义:是一种可供用户重复使用多次的资源
-
代表:计算机中的大多数资源
-
资源的请求和释放:通过系统调用实现
-
特点:
(1)每一个可重用性资源中的单元只能分配给一个进程使用,不允许多个进程共享。
(2)进程在使用可重用性资源时须按照一定的顺序。
(3)系统中每一类可重用性资源中的单元数目是相对固定的,进程在运行期间既不能创建也不能删除它。
② 消耗性资源
临时性资源
-
定义:是在进程运行期间由进程动态地创建和消耗的资源。
-
代表:进程间通信的消息。
-
特点:
(1)每一类可消耗性资源的单元数目在进程运行期间是可以不断变化的。
(2)进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增加该资源类的单元数目。
(3)进程在运行过程中,可请求若干个可消耗性资源单元用于进程自己的消耗,不再将它们返回给该资源类中。
-
-
可抢占资源和不可抢占资源
①可抢占资源
某进程获取该资源后可以被其他进程或系统抢占
②不可抢占资源
一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
3.5.2 计算机系统的死锁
-
竞争不可抢占性资源的死锁
通常系统中所拥有的不可抢占性资源其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。
-
资源分配图
方块代表资源,圆圈代表进程
从进程指向资源的箭头表示请求资源
从资源指向进程的箭头表示已分配资源
图7.共享文件死锁情况 -
-
竞争可消耗资源引起死锁
图8.进程之间通信时死锁 如果三个进程间的消息通信。则按照下述顺序进行:P1: …send(p2, m1);receive(p3, m3); …
P2: …send(p3, m2);receive(p1, m1); …
P3: …send(p1, m3);receive(p2, m2); …
- 结果:三个进程可以顺利的运行,不会发生死锁。
但若改成三个进程都先执行receive操作,后执行send操作。按照下述运行顺序:
P1: …receive(p3 m2); send(p2,m1); …
P2: …receive(p1, m1);send(p3,m2); …
P3: …receive(p2, m2);send(p1, m3);…
- 结果:则三个进程就会永远阻塞在它们的receive操作上,于是发生了死锁。
-
进程推进顺序不当引起死锁
除了系统中多个进程对资源的竞争会引发死锁外,进程在运行过程中,对资源进行申请和释放的顺序是否合法,也是在系统中是否会产生死锁的一个重要因素。
- 例如:
系统中只有一台打印机R1和一台磁带机R2,可供进程Р1和P2,共享。由于进程在运行中具有异步的特征,这就可能使P1和P2按照下述两种顺序向前推进。
- 进程推进顺序非法
若并发进程P1,和P2,按图3中曲线④所示的顺序推进,它们将进入不安全区D内。- 此时P1保持了资源R1,P2保持了资源R2,系统处于不安全状态。此刻如果两个进程继续向前推进,就可能发生死锁。
- 例如,当P1,运行到P1: Request(R2)时,将因R2,已被P2占用而阻塞;当P2运行到P2: Request(R1)时,也将因R1已被P1占用而阻塞,于是发生了进程死锁,这样的进程推进顺序就是非法的。
3.5.3 死锁的定义、必要条件和处理方法
-
死锁的定义
死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处丁死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
规范定义
如果一组进程中每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的(Deadlock)。
-
产生死锁的必要条件
(1)互斥条件
(2)请求和保持条件
(3)不可抢占条件
(4)循环等待条件 -
处理死锁的方法
⑴预防死锁
(2)避免死锁
(3)检测死锁
(4)解除死锁
说明:这4种方法按次序对死锁的防范程度逐渐削弱,但对应的是资源利用率的提高,以及进程因资源因素而阻塞的频度下降(即并发程度提高)。
3.6预防死锁
通过破坏产生死锁的四个必要条件中的一个或几个,以避免发生死锁。
由于互斥条件是非共享设备所必须的,不仅不能改变,还应加以保证,因此主要是破坏产生> 死锁的后三个条件。
3.6.1 破坏"请求和保持"条件
为了能破坏“请求和保持”条件,系统必须保证做到:当一个进程在请求资源时,它不能持有不可抢占资源。
-
第一种协议
该协议规定:所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。
分配所有所需资源,进程在整个运行期间便不会再提出资源要求,从而破坏了“请求”条件。
系统在分配资源时,只要有一种资源不满足进程的要求,即使其他资源都空闲也不分配给该进程,而让进程等待。由于该进程在等待期间未占用任何资源,于是,破坏了“保持”条件,从而预防了死锁的产生。特点
-
优点:简单、易行和安全。
-
缺点:
- 资源被严重浪费,严重恶化了资源的利用率。
- 使进程经常发生饥饿现象。
-
-
第二种协议
该协议是对第一种协议的改进,它允许一个进程只获得运行初期所需的资源后,便开始运行。运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。
特点 提高资源利用率和减少饥饿几率
3.6.2 破坏“不可抢占”条件
-
为了能破坏“不可抢占”条件,协议中规定:进程提出新资源请求而不能满足时,必须释放已经保持的所有资源,待以后需要时再重新申请。
-
进程已占有的资源会被暂时地释放,或者说是被抢占
特点
该实现起来比较复杂,且需付出很大的代价。
反复申请释放,延长进程周转时间、增加系统开销、降低系统吞吐量
3.6.3 破坏“循环等待”条件
一个能保证“循环等待”条件不成立的方法是,对系统所有资源类型进行线性排序,并赋予不同的序号。
设R={R1,R2, R3.…Rm}为资源类型的集合,为每个资源类型赋予唯一的序号。若系统中有磁带驱动器、磁盘驱动器、打印机,则函数F可按如下形式来定义:
F(tape drive) =1;
F(disk drive) =5;
F(printer)=12;
- 规定:每个进程必须按照序号递增的顺序请求资源。
如果一个进程已请求到一些序号较高的资源,后来又想请求序号低的资源时,必须先释放所有具有相同和更高序号的资源后,才能申请序号低的资源。
特点
-
优点:资源利用率和系统吞吐量都明显改善。
-
缺点:
- 系统中各类资源所规定的序号必须稳定,这就限制了新类型设备的增加。
- 可能会发生作业使用各类资源的顺序与系统规定的顺序不同,造成资源的浪费。
- 这种按照规定次序申请资源的方法会限制用户自主的编程。
3.7避免死锁
- 避免死锁思想:
避免死锁属于事先预防策略
在资源动态分配过程中防止进入不安全状态,以避免死锁
施加的限制条件较弱,系统性能较好
目前常用此方法来避免死锁
3.7.1 系统安全状态
死锁的避免把死锁分为安全状态和不安全状态
-
系统处于安全状态可避免死锁
-
系统处于不安全状态可能发生死锁
-
避免死锁的实质:资源分配时不进入不安全状态
-
安全状态
-
安全状态:指系统能找到某种进程推进顺序(P1,P2,…pn)为每个进程分配所需最大资源,使每个进程都可顺序完成
-
安全序列:找到推进顺序(p1,p2,p3,…pn)
-
安全状态举例:三个进程p1,p2,p3,共12台磁带机,资源使用情况如下表
进程 最大需求 已分配 还需要 可用 p1 10 5 5 3 p2 4 2 2 p3 9 2 7 由表:
可找到安全序列(p2,p1,p3),系统安全。
-
安全状态变为不安全状态举例:若p3再多分配一个磁带机,分配后为不安全状态
进程 最大需求 已分配 还需要 可用 p1 10 5 5 2 p2 4 2 2 p3 9 3 6
-
3.7.2 利用银行家算法避免死锁
本为银行系统设计,确保放贷安全
现在OS也可使用来避免死锁
-
算法思想
- 新进程进入系统必须声明对每种资源的最大需求量
- 进程申请资源确定是否有足够资源
- 若足够再判断分配后是否进入安全状态
- 若安全则分,否则进程等待
-
银行家算法数据结构:
ps: i:表示进程 ,j表示资源
-
可利用资源向量Available
表示可利用资源的数量,初值为系统每类资源总数量 Available[j]=k;
-
最大需求矩阵 Max
每个进程对每类资源的最大需求量 Max[i,j]=k
-
分配矩阵Allocation
每个进程已分配每类资源数量。 Allocation[i,j]=k
-
需求矩阵 Need
每个进程还需要多少资源 Need[i,j]=Max[i,j]-Allocation[i,j]
-
-
银行家算法流程
Requesti[j] 是进程pi对资源j的请求向量,Requesti[j]=k含义:
-
若Requesti[j]≤Need[i,j],则转向2;否则出错
判断请求资源数量是否小于等于进程还所需资源
-
若Requesti[j]≤Available[j]则转向3;否则pi等待
判断请求资源数量是否小于等于进程可利用资源
-
试探着把资源分配给进程pi,并修改数据结构值:
Avaliable[j]=Avaliable[j]-Requesti[j];
Allocation[i,j]=Allocation[i,j]+Requesti[j];
Need[i,j]=Need[i,j]-Requesti[j]
-
系统执行安全性算法。若安全才正式分配给Pi;否则恢复原来资源分配状态,让进程Pi,等待;
-
-
安全性算法
-
设置两个向量:
①工作向量Work,表示系统可提供给该进程所需的各类资源数量,在执行安全算法时,Work[j]:=Avaliable[j];
②完成标志向量Finish:表示系统是否有足够资源分配给进程,使之运行完成。开始时Finish[i]=false;当有足够资源分配给进程时令Finish[I]=true;
-
从进程集合中找到能满足下述条件的进程:
①Finish=false;
②Need[i,j]≤Work[j];
若找到则执3否则执行4
-
Pi获得资源执行完成并释放分配给它的所有资源,故应执行
Work[j]=Work[j]+Allocation[i,j];
Finsh[i]=true;
go to step 2;
-
若所有进程的Finish[i]=true,则系统处于安全状态;反之不安全;
-
-
银行家算法举例
有五个进程{p0,p1,p2,p3,p4}和三类资源{A,B,C},各种资源数量分别为10,5,7在T0时刻资源分配情况如下:
- T0时刻存在安全序列{p1,p3,p4,p2,p0},系统是安全的
-
若p1发出资源请求向量Request1(1,0,2),先按银行家算法检查
①Request1(1,0,2)≤Need1(1,2,2);
②Request1(1,0,2)≤Avaiable1(3,3,2);
③先假定为P1,分配资源,并修改Available1,Allocation1,和Need1,向量
④再利用安全性算法检查,存在安全序列<P1,P3,P4,P0,P2>
安全性算法检查
-
若P4发出资源请求向量Reque4(3,3,0),按银行家算法检查:
①Request4(3,3,0)≤Need4;
②Request4(3,3,0)≤Available(2,3,0 ),p4等待
-
若P0发出资源请求向量Request0(0,2,0),按银行家算法检查:
①Request0(0,2,0)≤Need0;
②Request0(0,2,0)≤Available(2,3,0 );
③先假定可为p0分配资源,并修改有关数据
-
再进行安全性检查:可用资源Available(2,1,0)不能满足任何进程的需要,故系统进入不安全状态,拒绝分配资源
3.8死锁的检测与解除
系统不采取预防死锁措施,有没有避免死锁算法
系统提供两个算法:
- 死锁检测算法。判断系统是否发生死锁
- 死锁解除算法。发生死锁时,利用该算法使系统脱离死锁状态
3.8.1 死锁的检测
-
资源分配图
资源分配图由结点集合N和边集合E所组成
(1)结点集合N分为两个互斥子集
即进程结点P={P1,P2,… ,Pn}和资源结点R={R1,R2,…R3},N=PUR(2)边集合E每条边都连接着P中的一个结点和R中的一个结点,
边Pi—>Rj是资源请求边;Rj—>Pj是资源分配边
图11.资源分配图 -
死锁定理
利用资源分配图化简来检测死锁
①在图找出一个既不阻塞又非独立的进程结点P,消去P;的请求边和分配边使之成为孤立
②化简后若能化简成功则没死锁反之则发生了死锁
图12.资源分配图化简 -
死锁检测步骤
①可利用资源向量Available,表示m类资源中每一类资源的可用数目
②把不占用资源的进程(向量Allocation=0)记入L表中,即LiUL;
③从进程集合中找到一个Request≤Work的进程做如下处理
- 释放该进程资源work =Work + Allocation i
- 将它记入L表中
④循环执行③若不能将所有进程都加入L表,资源分配图不可化简,发生死锁
3.8.2 死锁的解除
- 人工方式解除死锁
- 利用死锁解除算法解除死锁
- 抢占资源
- 终止进程:终止所有进程或者逐个终止,代价大
- 终止进程考虑的因素:进程优先级,已执行时间,已使用资源数量,交互式作业还是匹处理作业
-------------------------------------------分隔符-----------------------------------------
ps: 对于k个进程,每个进程需要m个资源,需要满足k*(m-1)+1≤资源总数,才不会发生死锁
- 参考:计算机操作系统(第四版)(汤小丹版)