实验目的
根据银行家算法的思想,编写程序,解决并发进程的死锁问题。
实验内容
进程的死锁避免算法。编写一段程序,模拟银行家算法,解决进程的死锁问题。 利用VC++6.0实现上述程序设计和调试操作,根据提示输入相应的资源请求,对于算法操作的成功与否提供一定的提示框。
实验心得
虽然基础一般,但是我仍然坚持把程序拿下,这是让自己很欣慰的事,本次实验不仅让我对银行家算法有了更深入的理解,并且还让我的编程能力得到了较大提高,希望能有更多这样的机会,借此较好的锻炼自己,从而更好的掌握和运用自己的专业知识,提高能力水平。
第二篇:银行家算法
计算机操作系统实验报告
银行家算法
班 别:
姓 名:
学 号:
指导老师:
一、实验名称:银行家算法
二、实验内容:银行家算法是避免死锁的一种重要方法,通过编写 一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法,将系统的资源合理运用。
三、实验设计:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
四、实验代码:
#include <iostream.h>
#include <stdio.h>
#include <windows.h>
#define MAX_PROCESS 32 //最大进程数
#define MAX_RESOURCE 64 //最大资源类别
int PROCESS_NUM; //实际总进程数
int RESOURCE_NUM; //实际资源类别数
int Available[MAX_RESOURCE]; //可利用资源向量
int Max[MAX_PROCESS][MAX_RESOURCE]; //最大需求矩阵
int Allocation[MAX_PROCESS][MAX_RESOURCE]; //分配矩阵
int Need[MAX_PROCESS][MAX_RESOURCE]; //需求矩阵
int Request_PROCESS; //发出请求的进程
int Request_RESOURCE_NEMBER[MAX_RESOURCE]; //请求资源数
void Read_Available_list(); //读入可用资源Available
void Read_Max_list(); //读入最大需求矩阵Max
void Read_Allocation_list(); //读入已分配矩阵Allocation
void PrintInfo(); //打印各数据结构信息
void Read_Request(); //输入请求向量
void Allocate_Source(); //开始正式分配资源(修改Allocation_list.txt)
void Recover_TryAllocate(); //恢复试分配前状态
int Test_Safty(); //安全性检测
void RunBanker(); //执行银行家算法
//读入可用资源Available
void Read_Available_list()
{
FILE *fp;
if((fp=fopen("Available_list.txt","r"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名"<<endl;
exit(0);
}
fscanf(fp,"%d",&RESOURCE_NUM);
int i=0;
while(!feof(fp))
{
fscanf(fp,"%d",&Available[i]);
i++;
}
fclose(fp);
}
//读入最大需求矩阵Max
void Read_Max_list()
{
FILE *fp;
if((fp=fopen("Max_list.txt","r"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名"<<endl;
exit(0);
}
fscanf(fp,"%d",&PROCESS_NUM);
for(int i=0;i<PROCESS_NUM;i++)
for(int j=0;j<RESOURCE_NUM;j++)
fscanf(fp,"%d",&Max[i][j]);
fclose(fp);
}
//读入已分配矩阵Allocation
void Read_Allocation_list()
{
FILE *fp;
if((fp=fopen("Allocation_list.txt","r"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名"<<endl;
exit(0);
}
for(int i=0;i<PROCESS_NUM;i++)
for(int j=0;j<RESOURCE_NUM;j++)
fscanf(fp,"%d",&Allocation[i][j]);
fclose(fp);
}
//设置需求矩阵Need
void Set_Need_Available()
{
for(int i=0;i<PROCESS_NUM;i++)
for(int j=0;j<RESOURCE_NUM;j++)
{
Need[i][j]=Max[i][j]-Allocation[i][j];
Available[j]=Available[j]-Allocation[i][j];
}
}
//打印各数据结构信息
void PrintInfo()
{
cout<<"进程个数: "<<PROCESS_NUM<<"\t"<<"资源个数: "<<RESOURCE_NUM<<endl;
cout<<"可用资源向量Available:"<<endl;
int i,j;
for(i=0;i<RESOURCE_NUM;i++)
cout<<Available[i]<<"\t";
cout<<endl;
cout<<"最大需求矩阵Max:"<<endl;
for(i=0;i<PROCESS_NUM;i++)
{
for(j=0;j<RESOURCE_NUM;j++)
cout<<Max[i][j]<<"\t";
cout<<endl;
}
cout<<"已分配矩阵Allocation:"<<endl;
for(i=0;i<PROCESS_NUM;i++)
{
for(j=0;j<RESOURCE_NUM;j++)
cout<<Allocation[i][j]<<"\t";
cout<<endl;
}
cout<<"需求矩阵Need:"<<endl;
for(i=0;i<PROCESS_NUM;i++)
{
for(j=0;j<RESOURCE_NUM;j++)
cout<<Need[i][j]<<"\t";
cout<<endl;
}
}
//输入请求向量
void Read_Request()
{
cout<<"输入发起请求的进程(0-"<<PROCESS_NUM-1<<"):";
cin>>Request_PROCESS;
cout<<"输入请求资源的数目:按照这样的格式输入 x x x:";
for(int i=0; i<RESOURCE_NUM; i++)
cin>>Request_RESOURCE_NEMBER[i];
}
//开始正式分配资源(修改Allocation_list.txt)
void Allocate_Source()
{
cout<<'\n'<<"开始给第"<<Request_PROCESS<<"个进程分配资源..."<<endl;
FILE *fp;
if((fp=fopen("Allocation_list.txt","w"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名"<<endl;
exit(0);
}
for(int i=0;i<PROCESS_NUM;i++)
{
for(int j=0;j<RESOURCE_NUM;j++)
fprintf(fp,"%d ",Allocation[i][j]);
fprintf(fp,"\n");
}
cout<<"分配完成,已更新Allocation_list.txt"<<endl;
fclose(fp);
}
//恢复试分配前状态
void Recover_TryAllocate()
{
for(int i=0;i<RESOURCE_NUM;i++)
{
Available[i]=Available[i]+Request_RESOURCE_NEMBER[i];
Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]-Request_RESOURCE_NEMBER[i];
Need[Request_PROCESS][i]=Need[Request_PROCESS][i]+Request_RESOURCE_NEMBER[i];
}
}
//安全性检测
//返回值:0:未通过安全性测试; 1:通过安全性测试
int Test_Safty()
{
cout<<'\n'<<"进入安全性检测!"<<endl;
int i,j;
int Work[MAX_RESOURCE]; //定义工作向量
for(i=0;i<RESOURCE_NUM;i++){
Work[i]=Available[i];
}
bool Finish[MAX_PROCESS]; //定义布尔向量
for(i=0;i<PROCESS_NUM;i++)
Finish[i]=false;
int safe[MAX_RESOURCE]; //用于保存安全序列
bool found=false; //判断在一轮查找中是否找到符合条件的进程
int FinishCount=0; //找到满足条件的进程i的数目
while(FinishCount<5)
{
for(i=0;i<PROCESS_NUM;i++)
{
if(Finish[i]==true) //检查是否满足条件Finish[i]==false
continue;
bool HasResource=true;
for(j=0;j<RESOURCE_NUM;j++) //检查是否满足条件Need[i]<=Work
if(Need[i][j]>Work[j])
HasResource=false;
if(HasResource)
{
for(j=0;j<RESOURCE_NUM;j++)
Work[j]=Work[j]+Allocation[i][j];
Finish[i]=true;
safe[FinishCount]=i;
FinishCount++;
found=true;
}
}
if(found)
{
found=false;
}else
break;
}
for(i=0;i<PROCESS_NUM;i++) //判断是否所有进程满足Finish[i]==true
{
if(Finish[i]==true)
continue;
else
{
cout<<"未通过安全性测试,不分配"<<endl;
return 0;
}
}
cout<<'\n'<<"找到一个安全序列:";
for(i=0;i<PROCESS_NUM;i++) //打印安全序列
{
cout<<"P"<<safe[i];
if(i!=PROCESS_NUM-1)
cout<<"--->";
}
cout<<'\n'<<"已通过安全性测试!"<<endl;
return 1;
}
void RunBanker(){ //执行银行家算法
cout<<endl;
cout<<"开始执行银行家算法..."<<endl;
for(int i=0;i<RESOURCE_NUM;i++) //检查是否满足条件Request<=Need
if(Request_RESOURCE_NEMBER[i]>Need[Request_PROCESS][i])
{
cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;
cout<<"原因:超出该进程尚需的资源的最大数量!"<<endl;
return;
}
for(i=0;i<RESOURCE_NUM;i++) //检查是否满足条件Request<=Available
if(Request_RESOURCE_NEMBER[i]>Available[i])
{
cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;
cout<<"原因:系统中无足够的资源!"<<endl;
return;
}
else{
//试分配,更新各相关数据结构
Available[i]=Available[i]-Request_RESOURCE_NEMBER[i];
Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]+Request_RESOURCE_NEMBER[i];
Need[Request_PROCESS][i]=Need[Request_PROCESS][i]-Request_RESOURCE_NEMBER[i];
}
cout<<endl<<"试分配完成..."<<endl;
if(Test_Safty()) //使用安全性算法检查,若满足,则正式分配
Allocate_Source();
else //否则恢复试分配前状态
Recover_TryAllocate();
}
void main()
{
char c;
Read_Available_list();
Read_Max_list();
Read_Allocation_list();
Set_Need_Available();
PrintInfo();
while(1)
{
Read_Request();
RunBanker();
cout<<"\n\n需要继续吗?(y-继续;n-终止)";
cin>>c;
if(c=='n')
break;
cout<<endl<<endl;
PrintInfo();
}
}
五、 实验结果运行图
六、 实验总结
系统运行过程中,如果有多个进程同时运行就会容易造成死锁,银行家的运用会使系统资源得到合理运用,避免了死锁,使系统时时处于按全状态。