运行结果
算法描述
代码实现
#include<bits/stdc++.h>
using namespace std;
const int M=5; // 进程数
const int N=3; // 资源数
// 最大需求矩阵 m*n矩阵定义m个进程对n类资源的最大需求量
int Max[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
// 可用资源向量 长度为n的数组表示系统中n类资源的当前可用数目
int Available[N]={3,3,2};
// 已分配资源矩阵 m*n矩阵定义了每个进程现在已分配到的各类资源的实际数目
int Allocation[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
// 需求矩阵 m*n矩阵表示每个进程还需要的各类资源的数目
int Need[M][N]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int Request[N]={0,0,0};
// 当前资源分配情况
void show(){
int i,j;
cout<<"系统可用的资源数为:"<<endl;
for(j=0;j<N;j++){
cout<<"资源"<<j<<": "<<Available[j]<<" \n";
}
cout<<endl;
cout<<"各进程还需要的资源量:"<<endl;
for (i=0;i<M;i++){
cout<<"进程"<<i<<": ";
for (j=0;j<N;j++){
cout<<"资源"<<j<<": "<<Need[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<"各进程已经得到的资源量:"<<endl;
for (i=0;i<M;i++){
cout<<"进程"<<i<<": ";
for(j=0;j<N;j++){
cout<<"资源"<<j<<": "<<Allocation[i][j]<<" ";
}
cout<<endl;
}
}
int find(int Work[],bool Finish[]){
for(int i=0;i<M;++i){
bool flag=true;
if(Finish[i]==false){
for(int j=0;j<N;++j){
if(Need[i][j]>Work[j]){
flag=false;
}
}
}else{
continue;
}
if(flag){
return i;
}
}
return -1;
}
bool check(){
int Work[N]={Available[0],Available[1],Available[2]};
bool Finish[M]={false};
while(1){
int i=find(Work,Finish);
if(i==-1){
break;
}
// 进程Pi释放所占的全部资源
for(int j=0;j<N;++j){
Work[j]+=Allocation[i][j];
}
Finish[i]=true;
}
for(int i=0;i<M;++i){
if(Finish[i]!=true){
return false;
}
}
return true;
}
void requestAndAlloc(){
int k;
cout<<"\n请输入请求进程: ";
cin>>k;
if(k==-1){
exit(0);
}
memset(Request,0,sizeof(Request));
cout<<"请输入N中资源的请求数量: ";
for(int j=0;j<N;++j){
cin>>Request[j];
}
for(int j=0;j<N;++j){
if(Request[j]>Need[k][j]){
cout<<"进程Pi对资源的请求量已超过其说明的最大数量";
return;
}
if(Request[j]>Available[j]){
cout<<"系统现在没有可用的资源,进程k必须等待\n";
return;
}
}
// 系统给进程k分配所请求的资源
for(int j=0;j<N;++j){
Available[j]-=Request[j];
Allocation[k][j]+=Request[j];
Need[k][j]-=Request[j];
}
if(!check()){
cout<<"无法完成请求"<<endl;
for(int j=0;j<N;++j){
Available[j]+=Request[j];
Allocation[k][j]-=Request[j];
Need[k][j]+=Request[j];
}
}else{
cout<<"请求完成\n\n\n";
show();
}
}
int main(){
cout<<"如果输入请求进程进程编号为-1,则退出本程序\n";
cout<<"如果输入请求进程进程编号为-1,则退出本程序\n";
cout<<"如果输入请求进程进程编号为-1,则退出本程序\n\n";
show();
while(1){
requestAndAlloc();
}
return 0;
}