1 设计内容
完成银行家算法的模拟实现:设计有m个进程共享n个系统资源的系统,进程可动态的申请和释放资源。系统按各进程的申请动态的分配资源时,采用银行家算法有效地避免死锁的发生。
2 算法原理
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。每分配一次资源就测试一次是否安全,不是资源全部就位后才测试,注意理解checkError函数的循环顺序。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
1、当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客(试探性分配) 顾客可以分期贷款,但贷款的总数不能超过最大需求量(可能一次并不能满足所需要的全部资源) 。
2、当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款(不存在死锁) 。
3、当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金(运行后释放) 。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能存在安全状态,则按当前的申请量分配资源,否则也要推迟分配。
3 关键代码
void Bank()
{
char t;
cout<<"是否请求资源?请输入你的选择:Y 或 N:";
cin>>t;
if(t=='N')
{
cout<<"------------------END!!!!!--------------------"<<endl;
}
if(t=='Y')
{
cout<<"请输入需要请求资源的进程:";
cin>>process_num;
cout<<"请输入进程"<<process_num<<"的资源请求量:";
for(int j=0;j<n;j++)
{
cin>>request[j];
}
process_num=process_num-1;//因为数组序号从0开始
int compare1=1;//-------------------------1
for(int k=0;k<n;k++)
{
if(request[k]>need[process_num][k])
compare1=0;
}
if(compare1)
{
int compare2=1;//---------------------2
for(int kk=0;kk<n;kk++)
{
if(request[kk]>available[kk])
compare2=0;
}
if(compare2)
{
for(int o=0;o<n;o++)
{
available[o]=available[o]-request[o];
}
for(int p=0;p<n;p++)
{
allocation[process_num][p]=allocation[process_num][p]+request[p];
}
for(int q=0;q<n;q++)
{
need[process_num][q]=need[process_num][q]-request[q];
}
count++;//记录第几次申请资源
security();
}
/*----------------compare2=0------------------*/
else
{
cout<<"请求资源不当!";
Bank();
}
}
/*----------------compare1=0------------------*/
else
{
cout<<"请求资源不当!";
Bank();
}
}
}
/*---------------------------------------------------------------------------------*/
void security()
{
int sum[20];
int x=0;
for(int ii=0;ii<n;ii++)
work[ii]=available[ii];
for(int jj=0;jj<m;jj++)
finish[jj]=0;
for(int a=0;a<m;a++)
for(int j=0;j<m;j++)
{
int flag=1;
for(int b=0;b<n;b++)
{
if(work[b]<need[j][b])
flag=0;
}
if(flag)
{
sum[x++]=j;
for(int c=0;c<n;c++)
{
work[c]=work[c]+allocation[j][c];
finish[j]=1;
}
}
}
int safe=1;
for(int d=0;d<m;d++)
{
if(finish[d]==0)
{
cout<<"无安全序列!系统处于不安全状态!"<<endl;
safe=0;
break;
}
}
if(safe)
{
cout<<"系统处于安全状态!"<<endl;
cout<<"找到一个安全序列:";
for(int e=0;e<m-1;e++)
{
cout<<sum[e]+1<<"->";
}
cout<<sum[m-1]+1<<endl;
Bank();
}
if((safe==0)&&(count==0))
{
cout<<"------请重新输入!-------"<<endl;
input();
}
else if((safe==0)&&(count>=1))
{
cout<<"撤销资源申请!"<<endl;
/***************撤销资源申请***************/
for(int o=0;o<n;o++)
{
available[o]=available[o]+request[o];
}
for(int p=0;p<n;p++)
{
allocation[process_num][p]=allocation[process_num][p]-request[p];
}
for(int q=0;q<n;q++)
{
need[process_num][q]=need[process_num][q]+request[q];
}
Bank();
}
}
void input()
{
cout<<"请输入进程数目m:";
cin>>m;
cout<<"请输入资源种类数n:";
cin>>n;
cout<<"请输入系统可用资源数:";/*************************/
for(int k=0;k<n;k++)
{
cin>>available[k];
}
cout<<"请输入最大需求量矩阵:"<<endl;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
cin>>Max[i][j];
}
cout<<"请输入已分配资源数量矩阵:"<<endl;
for(int c=0;c<m;c++)
for(int j=0;j<n;j++)
cin>>allocation[c][j];
for(int a=0;a<m;a++)
for(int j=0;j<n;j++)
{
need[a][j]=Max[a][j]-allocation[a][j];
}
}