银行算法的原理是先假定某一次分配成立,然后检查由于这次分配是否会引起死锁,即剩下的资源是不是能满足任一进程完成的需要。如这次分配是安全的(不会引起死锁),就实施本次分配,再作另一种分配试探,一直探索到各进程均满足各自的资源请求,防止了死锁的发生。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。银行算法的原理是先假定某一次分配成立,然后检查由于这次分配是否会引起死锁,即剩下的资源是不是能满足任一进程完成的需要。如这次分配是安全的(不会引起死锁),就实施本次分配,再作另一种分配试探,一直探索到各进程均满足各自的资源请求,防止了死锁的发生。
关键代码:
int n,m,i,j,k;
cout<<"请输入进程数 : ";
cin>>n;
cout<<"请输入资源数 : ";
cin>>m;
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
{
cout<<"请输入进程p"<<j<<"的"<<k+1<<"项资源: ";
cin>>Allocation[j][k];
}
}
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
{
cout<<"请输入进程p"<<j<<"的"<<k+1<<"项资源: ";
cin>>Need[j][k];
}
}
for(j=0;j<m;j++)
{
cout<<"please input Available["<<j+1<<"]: ";
cin>>Available[j];
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
Max[i][j]=Allocation[i][j]+Need[i][j];
}
}
print(n,m);
for(i=0;i<m;i++)
SAvailable[i]=Available[i];
if(bank(SAvailable,n,m))
{
int number;
while(true)
{
cout<<"请输入申请资源的进程号:";
cin>>number;
if(number<0)
break;
cout<<"请输入请求的各资源数::";
for(int j=0;j<m;j++)
{
cin>>Request[j];
Available[j]-=Request[j];
Need[number][j]-=Request[j];
Allocation[number][j]+=Request[j];
}
for(i=0;i<m;i++)
SAvailable[i]=Available[i];
cout<<"After the request,the program is:"<<endl;
bank(SAvailable,n,m);
if(jd==0)
{
for(int j=0;j<m;j++)
{
Available[j]+=Request[j];
Need[number][j]+=Request[j];
Allocation[number][j]+=Request[j];
}
}
}
}
}
bool bank(int* availabled,int n,int m)
{
int L=0,i;
for(i=0;i<n;i++)
Finished[i]=false;
for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if(Finished[j]==false && compare(availabled,Need[j],m))
{
for(int k=0;k<m;k++)
availabled[k] += Allocation[j][k];
Finished[j]=true;
SafeOrder[L]=j;
L++;
break;
}
}