思想
允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。
数据结构
//银行家算法
int n,m; //系统中进程总数n和资源种类总数m
int Available[m]; //资源当前可用总量
int Allocation[n*m]; //当前给分配给每个进程的各种资源数量
int Need[n*m];//当前每个进程还需分配的各种资源数量
//安全性模块
int Work[m]; //当前可分配的资源
bool Finish[n]; //进程是否结束
安全判断模块
伪码
Boolen found=false;
work=Available;
finish[n]=false;//初始化
while(true){
found=false;
for(int i=0;i<n;i++){//循环一次
if(finish[i]==false && Need[i]<=Work){//进入循环表示可分配,并且回收资源
Work+=Allocation[i];
found=true;
finish[i]=true;
}
}
if(found=false){//不存在资源分配的情况就跳出
break;
}
}
for(int i=0;i<n;i++){
if(Finish[i]==false){//如果有没分配的说明会死锁
return "deadlock";
}
}
资源请求模块
我们将第i个进程请求的资源数记为Requests[i]
算法流程:
1.如果Requests[i]<=Need[i],则转到2。否则,返回异常。这一步是控制进程申请的资源不得大于需要的资源
2.如果Requests[i]<=Available,则转到3,否则Pi等待资源。
3.如果满足前两步,那么做如下操作:
Available = Available -Requests[i]
Allocation = Allocation[i]+Requests[i]
Need[i]=Need[i]-Requests[i]
调用安全判定算法,检查是否安全
if(安全)
{
资源分配
}
else
{
资源撤回。第三步前几个操作进行逆操作
}