举例说明:“若系统状态目前是安全的,若对某个申请评估时 在假定分配状态中,只要找到一个可满足线程就可断定系统是安全的”结论是错的。请构造一个例子进行证明。
例:在银行家算法中,若出现下述分配情况,试问:
若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?
答:不能,按照银行家算法,首先检查Requesti [j] 是否小于等于 Need[i,j],在这里(1,2,2,2) < (2,3,5,6)满足条件,则再判断Requesti [j] 是否小于等于 Available[j],这里(1,2,2,2) <(1,6,2,2)满足!此时找到了一个可满足进程。
然后便试探性的将资源分配给P2,此时P2的Allocation项变为(2,5,7,6),Need项变为(1,1,3,4),Available项变为(0,4,0,0)必须执行安全性算法,第一步就发现找不到一个进程使得Need[i,j] <= Work[j];所以安全性检查失败,这个Request请求会造成死锁,系统将处于不安全状态,故本次试探分配作废,恢复原来的资源分配状态,让进程P2等待。故“只要找到一个可满足线程就可断定系统是安全的”是错误的。
笔记:
1.多个进程: { P0,P1,P2,P4 } 代表1,2,3,4四个需要临界资源的进程
2.几种资源:{ A, B ,C } 代表A,B,C三种临界资源
3.Claim:最大需求矩阵(进程完成执行需要的各资源总量)
Allocation:分配矩阵(某个进程现在已经拥有的各资源量)
Need:需求矩阵(某个进程仍需要的各资源量)
Available:可利用资源向量 (系统保有的供分配的资源量)
其中:Need = Max - Allocation ,仍然需要的量等于总需求量减去拥有的量
当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求;如果不是,阻塞该进程知道同意该请求后系统状态仍然是安全的。