搞了几天银行家算法,终于搞定了。知识还是得从基础抓起啊。
所谓银行家算法,主要是解决操作系统的进程调度的,解决并发进程的死锁问题。目前,大部分操作系统已经不采用此算法,但此算法去还是很经典的。算法思想非常简单,便于理解。但是,在实现时,发现出现了各种各样的问题。
银行家算法,主要有两部分组成。一是安全检测,其次,就是进程的调度。
银行家算法是死锁避免的经典算法
,其核心思想是:进程动态地申请资源,每次申请资源时系统都执行安全状态检查算法判断本次申请是否会造成系统处于不安全状态,如果不安全则阻塞进程;如果安全状态,则完成资源分配。
安全状态检查算法
的思想是找到一个安全序列,使所有进程都能执行完毕。如果找到,则处于安全状态,否则为不安全状态。
书中的伪代码,我根据他用c++实现了一下。本人水平较低,出现错误,望各位见谅。并能更正提出。
#include<iostream>
#include<string>
using namespace std;
#define m 3 //资源种类数
#define n 4 //进程数
struct state{
int resource[m]; //资源总数
int available[m]; // 目前可用资源数
int claim[n][m]; //各进程所需资源数
int alloc[n][m]; // 进程已申请资源数
};
int p[n]; //进程执行队列
int request[m];//请求资源数
bool safe(state S)
{
int currentavail[m]; //测试可用资源
bool rest[n]={false}; //进程状态数组,记录进程是否阻塞
int i,j,k,l=0;
for(i=0;i<m;i++)
currentavail[i]=S.available[i];
//rest={};
bool possible=true;
while(possible)
{
k=0;
for(i=0;i<n;i++) //从第一个进程开始判断
{
// cout<<rest[i]<<"\n";
if(rest[i]==true)
{
k++;
continue;
}
else
{
for(j=0;j<m;++j)
{
if(S.claim[i][j]-S.alloc[i][j]<currentavail[j]) //判定进程需要的最大资源是否满足
continue;
else
break;
}
if(j==m) //该进程各个资源都未阻塞
{
for(j=0;j<m;j++)
currentavail[j]+=S.alloc[i][j];
rest[i]=true;
p[l++]=i;
}
else
{
k++;
continue;
}
}
}
if(k==n) //在一次循环中,如果没有进程资源被分配,则进程不安全。
{
possible=false;
}
if(l==n)
{
cout<<"系统是安全的\n";
cout<<"执行序列为:";
for(i=0;i<n;i++)
{
cout<<p[i]<<"\n";
}
return true;
}
}
/*for(i=0;i<n;i++) //从第一个进程开始判断
{
// cout<<rest[i]<<"\n";
if(rest[i]==true)
continue;
else
{
for(j=0;j<m;++j)
{
if(S.claim[i][j]-S.alloc[i][j]<currentavail[j]) //判定进程需要的最大资源是否满足
continue;
else
break;
}
if(j==m) //该进程各个资源都未阻塞
{
for(j=0;j<m;j++)
currentavail[j]+=S.alloc[i][j];
rest[i]=true;
p[l++]=i;
}
else
{
continue;
}
}
if(l==n)
{
cout<<"系统是安全的\n";
cout<<"执行序列为:";
for(i=0;i<n;i++)
{
cout<<p[i]<<"\n";
}
return true;
}
}*/
cout<<"系统不安全\n";
return false;
}
bool banker(state s) //银行家算法
{
int i,j,k;
cout<<"请输入要求分配的进程id(进程id从0开始)\n";
cin>>i;
for(j=0;j<m;j++)\
{
cout<<j<<":";
cin>>request[j];
}
for(j=0;j<m;j++)
{
if(s.alloc[i][j]+request[j]>s.claim[i][j])
{
cout<<"申请资源大于他所需要的资源\n";
cout<<"分配不合理,不分配\n";
return false;
}
else
{
if (s.alloc[i][j]+request[j]>s.claim[i][j])
{
cout<<"申请资源数大于系统现在可以利用资源数\n";
cout<<"分配出错,不给予分配\n";
return false;
}
}
}
for(j=0;j<m;j++)
{
s.alloc[i][j]+=request[j];
s.available[j]=s.available[j]-request[j];
}
if(safe(s))
{
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
{
cout<<s.alloc[j][k]<<" ";
}
cout<<endl;
}
}
else
{
for(j=0;j<m;j++)
{
s.alloc[i][j]=s.alloc[i][j]-request[j];
s.available[j]=s.available[j]+request[j];
}
}
return 0;
}
int main()
{
state S;
cout<<"请输入各种资源的总数\n";
int i,j;
for(i=0;i<m;i++)
cin>>S.resource[i];
cout<<"目前可用的资源数\n";
for(i=0;i<m;i++)
cin>>S.available[i];
cout<<"各进程已占资源数\n";
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>S.alloc[i][j];
cout<<"各进程所需最大资源数\n";
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>S.claim[i][j];
banker(S);
}