实现思想
当某进程请求分配资源时,系统假定先分配给他,之后若能找到一个进程完成序列,说明系统是安全的,可进行实际分配,否则让申请者等待
数据结构
安全性算法
work和finish向量:work表示系统的可用资源数,finish表示系统是否有足够的资源分配给进程。
初始值:work=available
need<=work
finish=false
Work = Work + Allocation;
实例
假定系统中有五个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况如下图所示。
(1)T0时刻系统是否安全?
执行安全性算法进行检查:
-
work向量初值:work=available=(3,3,2)
-
在进程中找到满足need<=work:need(1,2,2)<=work
-
假设P1顺利执行完成:
work1=work+allocation=(3,3,2)+(2,0,0)=(5,3,2)
-
此时work=(5,3,2),再重复上述步骤。
- 所以系统存在安全序列{P1,P3,P0,P2,P4},所以T0时刻系统出于安全状态
安全序列可以不唯一
(2)P1发出请求Request(1,0,2),系统能分配资源吗?
执行银行家算法:
Request<=Need
Request<=Available
答:因为P1的Request(1,0,2)<=Need(1,2,2);
Request(1,0,2)<=Available(3,3,2)
所以系统为P1进行预分配,并修改Available,Allocation,Need的值
Available1 = Available-Request
=(3,3,2)-(1,0,2)
=(2,3,0)
Allocation1 = Allocation+Request
=(2,0,0)+ (1,0,2)
=(3,0,2)
Need1=Need - Request
=(1,2,2)-(1,0,2)
=(0,2,0)
然后执行安全性算法:
- Work = Available =(2,3,0);
- 在进程中找到Need<=Work,即Need(0,2,0)
- 假设P1可以顺利执行完成,则Work = Work+Allocation
- Finish=true
- 以此类推,用Need<=Work寻找下一个进程
- 执行安全性算法,得到安全序列{P1,P3,P0,P2,P4},所以请求向量Request(1,0,2)发出时系统安全
(3)P4发出请求Request(3,2,1),系统能分配资源吗
执行银行家算法进行检查:
Request(3,2,1)<=Need(4,3,1)
但Request(3,2,1)不小于等于Available(2,3,0),注意此时的Available不是原来的(3,3,2),而是分配给P1进程后的Available。所以P4请求失败,让其等待。
(4)P0发出请求(0,2,0),系统能分配资源吗?
答:Request<=Need(7,4,3);
Request<=Available(2,3,0)
系统为P0做预分配,并修改有关数据:
Available = Available(原来)-Request;
Allocation = Request+Allocation(原来);
Need=Need(原来) - Request