-
避免死锁的算法是__存在的__, 但是__前提__是事先已经获得了进程要获取资源的全部信息
-
(1) 安全状态
当死锁没有发生时, 即使所有进程突然请求对资源的最大需求, 也仍然存在某种调度次序, 使得每一个进程都可以运行完毕
(2) 不安全状态
当死锁没有发生时, 不存在某种调度次序, 使得每一个进程都可以运行完毕
-
单个资源的银行家算法
(1) 基本思想
对每一个资源请求进行__检查__,检查如果答应了请求后是否会进入__不安全状态__,如果会进入不安全状态则__直接拒绝请求__
(2) 示例
总资源 E = (10); 初始时进程拥有的资源个数 C = (1,1,0,4)'; 每个进程对资源的未满足最大需求 R = (5,4,4,3)'; 剩余资源 A= (4);
此时画出资源分配图可知,死锁不会发生
第一个请求: 进程3请求2个资源
如果同意请求,则
C1 = (1,1,2,4)'; R1 = (5,4,2,3)'; A1 = (2)
此时,即便所有进程突然都请求对资源的最大需求,也可以存在一种调度次序 C->B->D->A,使得进程都可以正常运行,所以是安全状态,同意请求
第二个请求: 进程2请求1个资源
如果同意请求,则
C2 = (1,2,2,4)'; R1 = (5,3,2,3)'; A1 = (1)
此时如果进程突然都请求对资源的最大需求,那么所有进程都会阻塞,所以是不安全状态,拒绝请求
-
多个资源的银行家算法
(1) 从"多个资源的银行家算法"推广而来,思想是一样的
(2) 检查一个状态是否安全的算法
A(1*m) = (A1,A2,..., Am)代表每种资源可分配部分的个数 C(n*m), Cij代表进程i拥有的j资源的个数 R(n*m), Rij代表进程i还需要的j资源的个数
1° 查找矩阵R中是否有一行Ri, 满足 Ri≤A, 如果不存在,说明状态不安全
2° 如果能找到,则将Ci叠加到A,跳转到1°,直到每个进程都查找过一次了
-
银行家算法虽然正确,但是缺乏实用价值
1° 很少有进程运行前就得知所需资源的最大值
2° 进程数量不固定
3° 可用资源的数目不固定(例如打印机突然坏了)
chapter06_死锁_5_处理死锁的策略(三)死锁避免
最新推荐文章于 2019-06-09 17:14:26 发布