📄 2.cpp
字号:
#include "iostream"
using namespace std;
#define false 0
#define true 1
#define w 10 //最大进程数
#define r 20 //最大资源数
int m ; //总进程数
int n ; //资源种类
int all_resource[r]={10,5,7};//系统中各种资源的数目总和
int max[w][r]=
{
{7,5,3},
{3,2,2},
{9,0,2},
{2,2,2},
{4,3,3}
}; //m个进程对n类资源最大资源需求量
int available[r]; //系统可用资源数
int allocation[w][r]=
{
{0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}
}; //m个进程已经得到n类资源的资源量
int need[w][r]; //m个进程还需要n类资源的资源量
int request[r]; //请求资源个数
int num;//申请资源的进程号
int sort[w];//记录安全序列数组
//函数print,输出资源分配情况
void print()
{
int i,j;
cout<<"各种资源的总数量(all):";
for(j=0;j<n;j++)cout<<j<<"类资源--"<<all_resource[j]<<" ";
cout<<endl;
cout<<"系统目前各种资源可用的数为(available):";
cout<<" ";
for(j=0;j<n;j++)cout<<j<<"类资源--"<<available[j]<<" ";
cout<<endl<<endl;
cout<<"当前的资源分配表如下:"<<endl;
cout<<" Max Allocaition Need"<<endl;
for(i=0;i<m;i++)
{
cout<<"P"<<i;
cout<<" ";
//输出进程i对各类资源的最大需求量
for(j=0;j<n;j++)
cout<<max[i][j]<<" ";
cout<<" ";
//输出进程i已占有的各类资源的数目
for(j=0;j<n;j++)
cout<<allocation[i][j]<<" ";
cout<<" ";
//输出进程i还需的各类进程的数目
for(j=0;j<n;j++)
cout<<need[i][j]<<" ";
cout<<endl;
}
}
//函数changdata,改变进程k可用资源和已经拿到资源和还需要的资源的值
void changdata(int k)
{
int j;
for(j=0;j<n;j++)
{
available[j]=available[j]-request[j];//修改可用资源数
allocation[k][j]=allocation[k][j]+request[j];//修改已占资源数
need[k][j]=need[k][j]-request[j];//修改还需要资源数
}
}
//函数rstordata,恢复进程k可用资源和已经拿到资源和还需要的资源的值
void rstordata(int k)
{
int j;
for(j=0;j<n;j++)
{
available[j]=available[j]+request[j];
allocation[k][j]=allocation[k][j]-request[j];
need[k][j]=need[k][j]+request[j];
}
}
//函数test,试探是否存在安全序列
bool test()
{
cout<<"测试安全序列:\n";
int finish[w];//标记向量,
int work[r];//系统可提供进程继续运行所需要的各类资源数目
int i,j;
int s;//记录可完成的进程数
for(i=0;i<m;i++)
finish[i]=false;//检查前,对所有的进全标记为false
for(i=0;i<n;i++)
work[i]=available[i];//给work向量初始化
i=0;//从P0开始检查
s=0;
while(i<m) //测试安全序列
{
if(finish[i]==false)
{
//i进程需要的j类资源数目应小于当前j类资源可以分配出的资源数目work[j]
for(j=0;(j<n)&&(need[i][j]<=work[j]);j++)
if(j==(n-1)) //j==(n-1)表示所有可分配的资源都符合进程i的需求
{
finish[i]=true; //表明i进程执行完
cout<<"process P"<<i<<" can be completed"<<endl;
for(j=0;j<n;j++) //i进程释放资源
work[j]+=allocation[i][j];
sort[s]=i; //记录i进程
s++;
i=-1; //再从头检查哪一个进程可完成
}
}
i++;
}
if(s!=m) return false;//(s!=m)表示有进程不能执行完成,找不到一个安全序列,返回false
cout<<"存在安全序列:"<<endl;
for(i=0;i<m;i++)//打印该安全序列
cout<<"P"<<sort[i]<<" ";
return true;//找到一个安全序列返回true
}
//函数exam,检查是否可以将进程num所申请的资源分配给它
void exam()
{
cout<<"\nExamming Process:"<<num<<endl;
int i;
for(i=0;i<n;i++)//对j类资源的请求数目应不大于系统可分配出来的数目
if(request[i]>available[i])
{
cout<<"Resouces are not enough!"<<endl;
return;
}
//request满足条件,试探性的把资源分配给进程num,修改相应数据的值
changdata(num);
print(); //打印此时的资源分配表
if(test())//若test()的值为true,就正式把进程num申请的资源分配给它
cout<<"\nThe request resource is allocated to P"<<num<<endl;
//若test()的值为false,就不能将资源分配给进程num,并恢复相应数据的值,让等待其
else
{
rstordata(num);
cout<<"不存在安全序列. P"<<num<<" must wait!"<<endl<<endl;
print();
}
}
//申请资源
void newrequest()
{
int j;
do
{
cout<<",请输入需申请资源的进程号(从P0到P"<<m-1<<",否则重输入!):";
cout<<"P";
cin>>num;
if(num<0||num>=m)cout<<"输入的进程号不存在,重新输入!"<<endl;
}while(num<0||num>=m);//输入提出资源申请的进程号
cout<<"请输入进程P"<<num<<"申请的资源数:"<<endl;
for(j=0;j<n;j++) //输入进程num所请求的各类资源的数目
{
cout<<j<<"类资源--";
cin>>request[j];
if(request[j]>need[num][j])//若输入的请求量大于该进程的需求量,重新输入
{
cout<<"申请的"<<j<<"类资源数目大于该进程的需求数目,请重新输入!"<<endl;
j--;
}
}
}
//银行家算法
void bank()
{
newrequest();
exam();
}
//初始化资源分配情况
void input()
{
int i=0,j=0,p;
cout<<"输入总进程数--";
cin>>m;
cout<<"输入总资源种类--";
cin>>n;
//为在运行时减少数据的输入量,已经用实验的测试数据对all_resource、max、
//allocation进行了初始化,因此将194行至231行代码注释掉了;
//若要测试其他数据,只需去掉注释符,再编译连接运行
/*cout<<"请输入总资源数(all_resource):"<<endl;
for(i=0;i<n;i++)
{
cout<<i<<"类资源--";
cin>>all_resource[i];
}
cout<<endl;
cout<<"依次输入各进程所需要的最大资源数量(max):"<<endl;
for(i=0;i<m;i++)
{
cout<<"P"<<i<<"需要的最大资源数量:"<<endl;
for(j=0;j<n;j++)
{
cout<<j<<"类资源--";
do
{
cin>>max[i][j];
if(max[i][j]>all_resource[j])
cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
}while(max[i][j]>all_resource[j]);
}
}
cout<<"\n依次输入各进程已经占有的资源数量(allocation):"<<endl;
for(i=0;i<m;i++)
{
cout<<"P"<<i<<"已占有的资源数量:"<<endl;
for(j=0;j<n;j++)
{
cout<<j<<"类资源--";
do
{
cin>>allocation[i][j];
if(allocation[i][j]>max[i][j])
cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
}while (allocation[i][j]>max[i][j]);
}
}*/
//初始化系统可用资源数量
for(i=0;i<n;i++)
{
p=all_resource[i];
for(j=0;j<m;j++)
{
p-=allocation[j][i];//减去已经被占据的资源
available[i]=p;
if(available[i]<0)
available[i]=0;
}
}
//初始化各进程还需各类资源数量
for(i=0;i<m;i++)
for(j=0;j<n;j++)
need[i][j]=max[i][j]-allocation[i][j];
}
//主函数
void main()
{
char j='0';
input();
print();
do
{
cout<<endl<<"开始演示银行家算法";
bank();
cout<<"\n☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n";
cout<<endl<<"0--继续演示 其他退出------- ";
cin>>j;
}while(j=='0');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -