死锁的预防(静态策略) | 死锁的避免(动态策略) |
---|
对进程有关的资源活动加以限制,所有进程遵循这种限制,即可保证没有死锁 | 进程在运行过程中向系统请求资源,系统判定满足或不满足 |
优点:对系统没有要求 | 满足条件:不超过最大限制;系统剩余资源足够多 |
缺点:违反约束,仍可能产生死锁 | 若满足进行安全检测,安全–>分配,不安全–>不分配 |
方法:预先分配法,有序分配法 | 死锁是不安全状态的真子集 |
预先分配法 | 有序分配法 |
---|
进程:运行前申请全部所需资源 | 资源集R={r1,r2,…,r n},r1~r n,n个资源类,每个类里有多个资源;函数F:R–>N,定义R到自然数N的映射,每个类对应一个自然数,相当于将每个资源类编号 |
系统:若满足,全部分配;否则,一个也不分配 | 进程pi可以申请资源rj中的实例,当且仅当,对于所有pi当前占有的资源rl,F(rj)>F(rl) |
破坏“保持并占有”条件 | 破坏“循环等待”条件 |
缺点:资源利用率低;一个程序运行可能有多个分支,多个分支有不同资源,一次提出申请困难 | 优点:与预先分配法相比,资源利用率提高;缺点:资源编号困难(并不清楚设备特性,哪个设备先进行哪个设备后进行);为保持按序申请,有些暂时用不到的资源也要提前申请,牺牲资源利用率 |
采用有序分配法,证明无死锁:
(1)在所有被占有资源类中,选取编号最大者rk1;
(2)设p1占有该类资源,(若p1继续申请,因为是有序分配,p1申请肯定往下申请,还是能找到资源类最大编号,假设当前编号最大的是rk1),则p1能运行完,去除p1相关的所有分配边;
(3)在剩下所有被占有资源类中,选取编号最大者rk2;
(4)设p2占有该类资源,则p2能运行完,去除所有相关p2的分配边;
(5)依次下去,所有的节点都将称为孤立点。
若算法结束时,所有节点均为孤立节点,则称资源分配图是可完全约简的,否则是不可完全约简的。
死锁定理: 系统状态S为死锁状态的充分必要条件是S的资源分配图是不可完全约简的。