操作系统银行家算法 —— C++实现

运行结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

算法描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码实现

#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;
} 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枯木何日可逢春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值