死锁
3.4死锁概念 1.问题引出 日常生活中 计算机系统中 2.定义: 多个进程循环等待它方 占有的资源而无限期地僵持下去 的局面。
3.产生死锁的根本原因 竞争资源 进程间推进顺序非法
3.5 死锁的产生 产生死锁的必要条件: 互斥条件 请求和保持条件 不剥夺条件 环路等待条件
①互斥条件 资源独占 ②不剥夺条件 不能强行抢夺对方资源 ③请求和保持条件 资源分配并非一次到位 ④环路等待条件 构成环路
(4) 如果所有进程的Finish[i]=true 都满足, 则表示系统处于安全状态; 否则,系统处于不安全状态。
举例
T0时刻的资源分配情况
假定系统中有四个进程P1, P2, P3, P4和三类资源R1, R2, R3,各种资 源的数量分别为9、3、6
资源 情况 进程
Max R1 R2 R3 3 6 3 4 2 1 1 2 2 2 3 4
(4) 系统执行安全性算法,检查此次资源分配 后,系统是否处于安全状态。若安全,才正式 将资源分配给进程Pi,完成本次分配;否则, 试探分配失败,让进程Pi阻塞等待。
3)安全性算法 (1)设置两个工作向量 ①设置一个数组Finish[n]。 当Finish[i]∶=true (0≤i≤n,n为系统中的进程数)时,表示进程 Pi可获得其所需的全部资源,而顺利执行完成。 ②设置一个临时向量Work,表示系统可提供给进程 继续运行的资源的集合。安全性算法刚开始执行 时 Work∶=Available
(3) 系统试探着把资源分配给进程Pi,并修改下 面数据结构中的数值:
Available[j]∶=Available[j]-Requesti[j]; Allocation[i,j]∶=Allocation[i,j]+Requesti[j]; Need[i,j]∶=Need[i,j]-Requesti[j];
Finish
True True True True
2. 假设T0时刻,P1请求资源:P1发出请求向量 Request1(0,0,1),系统按银行家算法进行检 查: 2) ① Request1(0, 0,1)≤Need1(2, 2, 2) ② Request1(0, 0, 1)≤Available(0, 1, 1) 故,系统试探性地为P1分配资源,并修 改Available,Allocation1,Need1向量 如图示:
3. 假设T0时刻,P4请求资源:P4发出请求向量 Request4(1,2,0),系统按银行家算法进行检 查: ① Request4(1, 2,0)≤Need4(4, 2, 0) ② Request4(1, 2, 0) ≥Available (0, 1, 1) P4的请求向量超过系统的可用资源向量,故 P4的请求不能满足,进程P4阻塞等待。 考虑:如果T0时刻,进程P4申请资源,其 请求向量为Request4(0, 1,0),系统能否将 资源分配给它?
(2) 从进程集合中找到一个能满足下述条件的 进程: ① Finish[i]=false; 并且② Need[i,j]≤Work[j]; 若找到, 执行步骤(3), 否则,执行步骤(4)。 (3) 当进程Pi获得资源后,可顺利执行,直至 完成,并释放出分配给它的资源,故应执行: Work[j]∶=Work[i]+Allocation[i,j] Finis h[i]∶=true; go to step 2; 转向步骤(2)
3.死锁的检测与恢复
可以满足的话, 可以满足的话,执行完就会释 放它的资源,成为独立的点。 放它的资源,成为独立的点。
化简资源分配图,说明有无进程处于死锁状态? 化简资源分配图,说明有无进程处于死锁状态?
R0
P1 P0
R1 R2 R3 R4
P2
P3 P4
P0
P1
P2
P3
P4
系统处于死锁状态的充分条件是:当且仅当其进程资源图是 不可完全化简的。
(3) 分配矩阵Allocation。这也是一个n×m的 矩阵,它定义了系统中每一类资源当前已分配 给每一进程的资源数。如果Allocation[i,j] =K,则表示进程i当前已分得Rj类资源的数目为 K。 (4) 需求矩阵Need。这也是一个n×m的矩阵, 用以表示每一个进程尚需的各类资源数。如果 Need[i,j]=K,则表示进程i还需要Rj类资源K 个,方能完成其任务。 上述三类矩阵存在下述关系: Need[i,j]=Max[i,j]-Allocation[i,j]
进 程 P1 P2 P3 P4 1 6 2 0
Allocation R1 R2 R3 0 1 1 0 2 1 2 1
Need R1 R2 R3 2 0 1 4 2 0 0 2 0 1 3 1
Available R1 R2 R3 0 1 0
进行安全性检查: 可用资源Available(0,1,0)已不能满足任何 进程的需要,系统进入不安全状态。 P1请求的资源不能分配。
说明
四个条件必须同时具备,才会 发生死锁
3.6 处理死锁的对策 预防 避免 检测与解除
1.死锁的预防 预防死锁的基本思想: 打破产生死锁的四个必 要条件中的一个或几个。 这是排除死锁的静态策略
1.死锁的预防 预防死锁的可行策略 ①打破“请求和保持”条 件 运行前一次分配资源 ②打破“循环等待”条件 资源事先分类编号,按顺序(如递增) 分配 资源:R1 序号:1 R2 2 … Rn n
进程 P1 P2 P3
最大需求 12 4 9
已分配 5 2 4
还需要 7 2 5 3
可用
T0时刻是安全的, 存在一个安全序列< P2,P3,P1>
若系统处于安全状态,则还会进入 死锁状态。 若产生死锁,则系统一定处于不安 全状态。 但是,系统进入不安全状态,也未 必会产生死锁。
③著名的避免死锁的算法:银行家算法 基本思想:为每个进程分配资源之前, 先判断系统是否是安全的,若是,才分 配。
1)数据结构 (1) 可利用资源向量Available。这是一个含有m 个元素的数组,其中的每一个元素代表一类可利 用的资源数目,其初始值是系统中所配置的该类 全部可用资源的数目,其数值随该类资源的分配 和回收而动态地改变。如果Available[j]=K, 则表示系统中现有Rj类资源K个。 (2) 最大需求矩阵Max。这是一个n×m的矩阵, 它定义了系统中n个进程中的每一个进程对m类 资源的最大需求。如果Max[i,j]=K,则表示 进程i需要Rj类资源的最大数目为K。
③打破不剥夺条件
例子
小河中铺了一垫脚石用于过河。 试说明什么是过河问题中的死锁? 并给出破坏死锁4个必要条件均可 用于过河问题的解法。 当垫脚石每次只允许一个人通过, 并且两人在河中相遇并且都不退让 时则出现了死锁。
破坏互斥条件:加宽垫脚石, 破坏互斥条件:加宽垫脚石,允许两人共享同一 块垫脚石。 破坏部分分配条件:在过河前,每个人必须申 破坏部分分配条件:在过河前,每个人必须申 请使用河中的所有垫脚石。 破坏不剥夺条件:当两人在河中相遇时强行要 破坏不剥夺条件:当两人在河中相遇时强行要 求过河的另一方撤回。 破坏环路等待条件:为避免河中两人都要求对 破坏环路等待条件:为避免河中两人都要求对 方的垫脚石而铺设两串垫脚石。
2.死锁的避免 这是排除死锁的动态策略 在资源分配过程中,若预测有发 生死锁的可能性,则加以避免。
①安全序列 系统是安全的,是指系统中的所用进 程能够按照某一种次序分配资源,并 且依次的运行完毕,这种进程序列 (P1,P2,…Pn)就是安全序列。
假定
系统中有三个进程P1、 P2和P3,共有14台 磁带机。 进程P1总共要求12台磁带机,P2和P3分别 要求4台和9台。 假设在T0时刻,进程P1、P2和P3已分别获 得5台、2台和4台磁带机,尚有3台空闲未分 配,如下表所示:
Allocation R1 R2 R3 1 6 2 0 0 1 1 0 2 0 2 1
Need R1 R2 R3 2 0 1 4 2 0 0 2 0 1 3 2
Available R1 R2 R3 0 1 1
P1 P2 P3 P4
1.T0时刻的安全性 T0时刻存在着一个安全序列< P2, P1, P4, i是进程Pi的请求向量,如果 Requesti[j]=K,表示进程Pi需要K个Rj类型 的资源。当Pi发出资源请求后,系统按下述步 骤进行检查: (1) 如果Requesti[j]≤Need[i,j],便转 向步骤2;否则认为出错,因为它所需要的资 源数已超过它所宣布的最大值。 (2) 如果Requesti[j]≤Available[j], 便转向步骤(3);否则, 表示尚无足够资源, Pi须等待。
一时刻系统是安全的
进 程
P2 P1 P4 P3 Work R1 R2 R3 0 6 7 7 1 1 2 3 2 3 2 5 Need R1 R2 R3 0 2 4 1 0 2 2 0 3 1 2 0 Allocation R1 R2 R3 6 1 0 2 1 0 0 1 2 0 2 1 Work+Allocation R1 R2 R3 6 7 7 9 2 2 2 3 5 6 3 3