第五章 死锁
死锁的产生
- 死锁:多道程序系统中,一组进程中的每一个进程均无限期的等待被该组另一个进程所占有且永远不会释放的资源
- 死锁产生原因:竞争资源、多道程序运行时,程序推进顺序不合理
- 资源:分为永久性资源和临时性资源
- 永久性资源(可重用资源);系统中可供进程重复使用、长期存在的资源
- 临时性资源(消耗性资源);由某个进程产生、只为另一个进程使用一次或经过短暂时间后便不再使用的资源,如I/O和时钟中断信号、同步信号、消息等
- 死锁的例子:申请不同类资源产生死锁、申请同类资源产生死锁、P、V操作不当产生死锁、对临时性资源使用不加限制而引起死锁
- 死锁产生的必要条件:
- 互斥资源——独占且排他使用
- 不可剥夺条件——不可抢占
- 请求和保持条件——部分分配或占有申请
- 循环等待——又称环路等待
- 解决死锁的方法:
- 预防死锁——破坏产生死锁的必要条件,可能会导致系统资源利用率过低
- 避免死锁——在动态分配中,采取方法防止进入不安全状态
- 检测与解除死锁——设置检测机构,定时检测是否发生死锁并采取措施解除死锁
- 忽略死锁———对发生几率极低、解决代价极大或暂时无法解决的死锁问题暂不理睬
死锁预防
-
死锁预防:系统设计时事先确定资源分配的算法,限制进程对资源的申请,从而保证不发生死锁。具体做法是破坏四个必要条件
-
资源的静态分配策略
-
破坏不可剥夺条件
- 若一个进程已经占用某些资源,又要申请一个新资源,再申请新资源时,不能立即满足,变为等待状态之前必须释放自己占有的资源
- 若一个进程申请某些资源,首先检查是否可用,可用就分配,不可用继续检查是否在等待进程手中,是则剥夺反之进入等待队列
-
破坏请求和保持条件
-
每个进程必须在开始执行前就申请它所需要的全部资源,仅当系统能够满足进程的资源申请要求且把资源一次性分配给进程后,进程才会执行
-
进程没有占用资源时才允许申请资源,反之则必须先归还所占资源再申请新资源(程序运行前不确定所需全部资源)
-
-
-
资源的有序分配法
- 将系统中所有资源按顺序编号,越紧缺、稀少的资源边好较大,进程申请资源时,必须按照编号顺序进行,否则系统不予分配,释放时按照编号递减次序进行(破坏了循环等待条件)
死锁避免
- 死锁避免的基本思想:系统对进程发出的每个一系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源;如果分配后可能发生死锁则不予分配
- 安全状态和安全序列
- 安全状态:如果存在一个由系统中所有进程构成的安全序列{P1、P2…,Pn},则系统处于安全状态
- 不安全状态不一定导致死锁,死锁一定是不安全
- 银行家算法——Dijikstra等人提出
- 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可以接纳该顾客
- 顾客可以分期贷款,贷款总数不能超过最大需求量
- 当银行就现有资源不能满足顾客尚需的贷款数额时,对顾客贷款可推迟支付,但总能使顾客在有限的时间里得到贷款
- 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有资金
死锁检测与解除
- 死锁检测的时机:资源分配后、每次调度后、定时器定时运行检测、某个进程长期处于阻塞或阻塞进程过多
- 死锁检测算法:
- 为每个进程和每个资源指定唯一编号
- 设置一张资源分配状态表,每条包含资源号和进程号,记录每个资源正在被那个进程所占用
- 设置一张进程等待分配表,包含进程号和资源号(该进程所等待)
- 死锁解除的方法:
- 剥夺资源:使用挂起/激活机制挂起一些进程,剥夺它们所占有的资源给死锁进程,以解除死锁,待到条件满足时,再激活被挂起的进程。还原算法与建立检查点是进程返回到分配资源前的某一点经常使用的方法
- 撤销进程:撤销死锁进程,将它们占有的资源分配给另一些死锁进程,直到死锁解除为止。
- 撤销进程中衡量撤销代价的标准:
- 进程优先数
- 进程类的外部代价——进程自己规定出各自的撤销代价
- 运行代价——重新启动进程并运行到当前撤销点所需要的代价
资源分配图
- 资源分配图:一张有向图,一个系统资源分配图SRAG可定义一个二元组即SRAG=(V,E),V是顶点的集合,E是有向边的集合;顶点分为进程集合(P=(P1,P2,。。。,Pn))和资源集合(R=(r1,r2,。。。,rn))
- <Pi,ri>属于E,则存在一条从Pi指向ri的有向边,表示Pi提出了一个要求分配ri类资源中的一个资源的请求并且当前正在等待分配,<Pi,ri>叫做请求边
- <ri,Pi>属于E,则存在一条从ri指向Pi的有向边,表示ri类资源中某个资源已经分配给了进程Pi,<ri,Pi>叫做分配边
- 圆圈表示进程,方框表示每类资源,用方框中圆点表示各个资源实例
- 死锁定理:基于资源分配图的定义,可给出判定死锁的法则,又称为死锁定理
- 系统分配图中没有环路,系统没有死锁
- 系统分配图中有环路,系统可能存在死锁
- 若每个环路中每个资源类中均只包含一个资源实例,则死锁必定存在
- 如果资源实例个数不全为1,则死锁不一定存在
- 资源分配图化简方法:
- 在资源分配图中,找到一个既非等待又非孤立的进程结点,该进程结点可获得它所需要的全部资源,且运行完后释放它所占有的全部资源,即去掉所有边
- 将进程结点释放的资源分配给申请它们的进程
- 将进程结点释放的资源分配给申请它们的进程
- 重复直到所有进程结点孤立
哲学家就餐问题
有5个哲学家以思考、用餐交替进行的方式生活,它们坐在一张圆桌边,桌子上有5个盘子和5只筷子,当一个哲学家思考,他与邻座的哲学家没有任何联系,当一个哲学家饿了,则试图拿走他左右两边的筷子用餐,如果邻座拿到了,则它可能一只甚至一只也拿不到,当一个哲学家拿到两只筷子,则它可以用餐