死锁与银行家算法
1. 死锁定义
指多个进程在运行过程中,因争夺资源而造成的一种僵局。当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。
2. 死锁与饥饿
-
死锁(Deadlock): 指进程之间无休止地互相等待!
-
饥饿(Starvation):指一个进程无休止地等待!
3. 产生死锁的原因
- 竞争资源
- 进程间推进顺序非法
3. 产生死锁的必要条件 (四个条件都具备就会死锁,缺一就不会死锁)
- 互斥条件
- 请求和保持条件
- 不剥夺条件
- 环路等待条件
4. 处理死锁的基本方法:
1)事先预防:预防死锁、避免死锁
2)事后处理: 检测死锁、解除死锁
5. 预防死锁的方法:
- 摒弃“请求和保持”条件
- 摒弃“不剥夺”条件: 允许进程先运行,但当提出的新要求不被满足时必须释放它已保持的所有资源,待以后需要时再重新申请。
- 摒弃“环路等待”条件
6. 避免死锁:
只要使系统始终处于安全状态,便可避免发生死锁。
-
安全状态:系统能按某种进程顺序为每个进程分配所需资源,直至满足每个进程对资源的最大需求,并能顺利完成。
-
不安全状态:系统无法找到一种使多个进程能够顺利分配资源执行完的安全序列。
不是所有的不安全状态都是死锁状态。
7. 死锁的检测
检测时机:
- 当进程等待时检测死锁
- 定时检测
- 系统资源利用率下降时检测死锁
死锁定理:
- 利用资源分配图简化法来检测死锁。
简化方法如下:
1.在资源分配图中找出一个既不阻塞又非独立的进程结点Pi,在顺利的情况下运行完毕,释放其占有的全部资源。
2.由于释放了资源,这样能使其它被阻塞的进程获得资源继续运行。消去了Pi的边。
3.经过一系列简化后,若能消去图中所有边,使结点都孤立,称该图是可完全简化的。 - S状态为死锁状态的充分条件是当且仅当S状态的资源分配图是不可完全简化的。<死锁定理>
死锁检测算法:
- 每个进程和资源指定唯一编号
- 设置一张资源分配表
记录各进程与其占用资源之间的关系 - 设置一张进程等待表
记录各进程与要申请资源之间的关系
8. 死锁的解除
- 剥夺资源。从其他进程剥夺足够数量的资源给死锁进程以解除死锁状态。
- 撤销进程。最简单的是让全部进程都死掉;温和一点的是按照某种顺序逐个撤销进程,直至有足够的资源可用,使死锁状态消除为止。
9. 死锁处理方法比较
10. 银行家算法
最有代表性的避免死锁的算法,是Dijkstra的银行家算法。由于该算法能用于银行系统现金贷款的发放而得名。
【思路描述】 随时对系统中的所有资源信息进行统计,包括每种资源的数量、已分配给各进程的数量;每当进程提出某种资源请求时判断该请求分配后是否安全,如果安全才分配。对每个资源请求的处理都要保证系统始终从一个安全状态到另一个安全状态。
银行家算法中的数据结构
- 各类可利用资源的数量
向量Available
最大需求矩阵Max - 每个进程对每类资源的需求
最大需求矩阵Max
已分配矩阵Allocation
还需求的矩阵Need
避免死锁的算法过程(银行家算法)
- 构建资源分配表
- 判断向下运行过程中,各进程对资源的需求是否安全
- 系统试探着把资源分配给进程Pi ,并修改相应数据结构的值(假设性操作)
- 系统执行安全性算法,判断新的资源分配状态是否是安全的
安全性算法
- 需要一些记录信息的数据结构,设置两个向量:
工作向量work
算法开始时work=Available;
系统找安全序列的过程需要不断判断和修改当前资源数量,不能直接修改原始数据记录Aailable。
标志向量Finish
表示每个进程是否有足够的资源使之运行完成。开始时所以进程都设置初值Finish[i]:=false;
找安全序列的过程相当于使所有Finish[i]:=true。 - 找安全序列的过程
从 Finish[i] = false 的进程集合中找一个进程
IF Need[i,j] <= work[j]
THEN 执行步骤 a;
ELSE 执行步骤 b;
a) 假设Pi获得资源顺利执行完,释放出分配给它的资源,修改相应的值:
work【j】 = work【i】+ Allocation【i,j】;
Finish【i】= true;
goto step (2); //返回去继续找下一个进程。
b)当算法不再在 2 . 、a)步间循环找进程,到达本步时,若所有Finish[i]=true都满足,则表示所有进程都按某个顺序执行完了,系统处于安全状态;否则,系统当前所处的资源分配状态是不安全状态。
百度百科-银行家算法 https://baike.baidu.com/item/银行家算法/1679781?fr=aladdin