在此之间你需要创建三个文件Available_list.txt,Max_list.txt,Allocation_list.txt,把三个文件和程序放在同一个文件夹里,三个文件编写格式如下
available.txt
3(代表资源种类,括号里面的文字不用写,只是解释)
3 9 7(各种资源数量)
Max_list.txt
4(进程数量)
2 3 1
1 1 1
1 3 4
1 2 1
Allocation._list.txt
0 0 0
0 0 1
1 0 1
1 0 1
像这样
#include <iostream>
#include <stdio.h>
#include <windows.h>//Windows内核API,图形界面接口,图形设备函数等重要的功能
#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_NUMBER[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(); //执行银行家算法
using namespace std;
//读入可用资源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()
{
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<<"输入发起请求的进程(1-"<<PROCESS_NUM<<"):";
cin>>Request_PROCESS;
cout<<"输入请求资源的数目:按照这样的格式输入 x x x:";
for(int i=0; i<RESOURCE_NUM; i++)
cin>>Request_RESOURCE_NUMBER[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;// finish表示进程是否由足够的资源分配给进程
int safe[MAX_RESOURCE]; // 用于保存安全序列
bool found=false; //判断在一轮查找中是否找到符合条件的进程
int FinishCount=0; //找到满足条件的进程i 的数目
while(FinishCount<4)
{
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_NUMBER[i]>Need[Request_PROCESS][i])
{
cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;
cout<<"原因:超出该进程尚需的资源的最大数量!"<<endl;
return;
}
for(int i=0;i<RESOURCE_NUM;i++) //检查是否满足条件Request<=Available
if(Request_RESOURCE_NUMBER[i]>Available[i])
{
cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;
cout<<"原因:系统中无足够的资源!"<<endl;
return;
}
else{
//试分配,更新各相关数据结构
Available[i]=Available[i]-Request_RESOURCE_NUMBER[i];
Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]+Request_RESOURCE_NUMBER[i];
Need[Request_PROCESS][i]=Need[Request_PROCESS][i]-Request_RESOURCE_NUMBER[i];
}
cout<<endl<<"试分配完成..."<<endl;
if(Test_Safty()) //使用安全性算法检查,若满足,则正式分配
Allocate_Source();
else //否则恢复试分配前状态
Recover_TryAllocate();
}
//恢复试分配前状态
void Recover_TryAllocate()
{
for(int i=0;i<RESOURCE_NUM;i++)
{
Available[i]=Available[i]+Request_RESOURCE_NUMBER[i];
Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]-Request_RESOURCE_NUMBER[i];
Need[Request_PROCESS][i]=Need[Request_PROCESS][i]+Request_RESOURCE_NUMBER[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);
}
//::main' must return 'int,C语言标准允许main函数为void类型。按照C++的标准中main必须是int类型
int main()
{
char c;
Read_Available_list();//读不可抢占资源表 ,资源种类和各资源数量
Read_Max_list();//读进程(进程数,各进程所需的最大资源数)
Read_Allocation_list();//读分配表,现在已经分配的 ,初始化为0
Set_Need();
PrintInfo();
while(1)
{
Read_Request();//用户需求
RunBanker();//银行家算法
cout<<"\n\n需要继续吗?(y-继续;n-终止)";
cin>>c;
if(c=='n')
break;
cout<<endl<<endl;
PrintInfo();
}
}
一年一度的课程设计,却不知道根本原理,友情提醒各位用户,当我们输入数值时,如果我们没有出现安全序列,说明发生了死锁。
如果有问题,欢迎指正,有问题请教也可以,还有本代码只是借鉴别人的,并非本人一瘦创作,只是在原有的基础上进行了改编。