安全状态与不安全状态
安全状态:系统能按某种进程推进顺序,如<P,P…P。>为每个进程分配所需资源,直到最大需求,使每个进程都可顺利完成。这样的序列<P, P… P.>称为安全序列。
不安全状态:不存在安全序列。
安全性算法
(1) Work[…m]=Available0…m];
Finish[…n]=false;
(2)从进程集合中寻找满足下列条件的进程Pi:
①Finish[i]=false;
②Need[ij]SWork[j];
若找到,转(3) ;否则,转(4)
(3)进程Pi可获取资源,然后执行完毕,并释放资源:
Work[j]=Work[j]+ Allocation[ij];
Finish[i] =true.
转(2)
(4)判断:若对所有Pi, Finish[i]=true
则系统处于安全状态,否则处于不安全状态。
利用银行家算法避免死锁
避免死锁的方法:允许进程动态地提出资源请求,在系统进行资源分配之前,先判断此次资源分配的安全性。
①若资源分配后,系统处于安全状态,则表明此次资源分配可行,实施资源分配;
②若资源分配后,系统处于不安全状态,则表明此次资源分配不可行,进程需等待
1.银行家算法中的数据结构
■Available向量:系统中可利用的资源数目
●Available[j]=K: 表示系统中可用的R:类资源有K个
■Max矩阵:各个进程对每种资源的最大需求
●Max[i,j]=K:进程i对R;类资源的最大需求量为K
■Allocation矩阵:每个进程已分配的各类资源的数目;
●Allocation[i, j]=K:进程i记获得K个R;类资源
■Need矩阵:每个进程尚需的各类资源数
●Need[i, j]=K:进程i尚需R:类资源K个
■Need[i, i] =Max[i, j]-Allocation[i,j]
2.银行家算法
■当进程P;做出资源请求时,如Request,[i]= k表示进程P;所需要的资源类型R,的请求数量为。系统按下述步骤进行检查:
■(1) 如果Request; [j]≤Need[ij]转到(2);否则,认为出错,因为它所请求的资源数量已超过它所宣布的最大值。
■(2)如果Request; [j]≤Available[j],则转到(3); 否则,表示尚无足够资源,进程须等待。
■(3)系统试探着把资源分配给进程P;,并按下面公式修改数据结构中的值:
●Available[j] = Available[j] - Request;[j] ;
●Allocation[i,j] = Allocation[i,j] + Request;[j];
●Need[i;j] = Need[i;j] - Request;[j];
■(4)系统执行安全性算法。检查此次分配后系统是否处于安全状态。
●若安全,正式将资源分配给进程P;
●若不安全,将本次试探分配作废,恢复到原先资源分配状态,让进程P等待。
(1) 若此时P1请求资源,发出请求向量Request,(1,0,2), 系统能否把资源分配给P1 ?
●系统按银行家算法进行检查:
■Request(1,0,2)<=Need(1,2,2)
■Request(1,0,2)<=Available(3,3,2)
■试探着分配,修改表中数值。
■再利用安全性算法判断此时系统是否安全。
(2)若此时P4发出请求向量Request,(3,3,0),能否把资源分配给P4?
●系统按银行家算法进行检查:
■Request,(3,3,0)<=Need4(4,3,1)
■Request,(3,3,0)> Available(2,3,0)
■因此,让P4等待。
(3)若此时P0请求资源,发出请求向量Request(0,2,0),系统能否分配资源给PO?
●系统按银行家算法进行检查:
■Request(0,2,0)<=Need6(7,4,3)
■Request(0,2,0)<=Available(2,3,0)
■试探着分配,修改有关数据。
■进行安全性检查,Available(2,1,0)已不 能满足任何进程的需要,故系统进入不安全状态,将本次试探作废,恢复到原来的资源分配状态,让P0等待。
相关文章
- 02-28channel 是怎么走上死锁这条路的
- 02-28go死锁与goroutine泄露
- 02-28Golang 需要避免踩的 50 个坑1
- 02-28使用expect scp避免直接输密码
- 02-28DllMain加载其他DLL造成的死锁问题及其解决办法
- 02-28win10控制台程序printf死锁问题
- 02-28python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)
- 02-288.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q
- 02-28[网摘]如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践
- 02-28python如何避免由路径中的转义字符造成输出结果紊乱