操作系统课程设计-银行家算法的模拟与实现

目录

 

前言

1 实验题目

2 实验目的

3 实验内容

3.1 步骤

3.2 关键代码

3.2.1 预分配preAlloc函数

3.2.2 恢复资源recoverAlloc函数

3.2.3 分配资源Alloc函数

3.2.4 分配资源Alloc函数

4 实验结果与分析

5 代码


前言

         本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是dev c++5.11

1 实验题目

        实验六 银行家算法的模拟与实现

2 实验目的

        (1) 进一步了解进程的并发执行。

        (2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念。

        (3) 掌握使用银行家算法避免死锁问题。

3 实验内容

3.1 步骤

        (1)初始化资源,给系统分配固定的资源。

        (2)通过键盘输入动态申请资源。

        (3)实现展示数据模块showData函数。

        (4)实现预分配模块preAlloc函数。

        (5)实现检测安全性模块check函数。

        (6)实现分配资源模块Alloc函数。

        (7)实现恢复资源模块recoverAlloc函数。

3.2 关键代码

3.2.1 预分配preAlloc函数

void preAlloc(int i){
	for(int j=0;j<N;j++){
		Allocation[i][j]=Allocation[i][j]+Request[j];
		Available[j]=Available[j]-Request[j];
		Need[i][j]=Need[i][j]-Request[j];
	}
}

3.2.2 恢复资源recoverAlloc函数

void recoverAlloc(int i){
	for(int j=0;j<N;j++){
		Allocation[i][j]=Allocation[i][j]-Request[j];
		Available[j]=Available[j]+Request[j];
		Need[i][j]=Need[i][j]+Request[j];
	}
}

3.2.3 分配资源Alloc函数

void Alloc(int i){
	for(int j=0;j<N;j++){
		Available[j]=Available[j]+Allocation[i][j];
		Allocation[i][j]=0;
		Need[i][j]=0;
	}
}

3.2.4 分配资源Alloc函数

int check(int k){
	int tempAvail[N]={0};
	int safe[M];
	int zero=0,index=0;
	int i,j,Nflag=0,Mflag=0,flag=1;
	memcpy(tempAvail,Available,sizeof(Available));
	for(j=0;j<N;j++){
		if(!Need[k][j])zero++;
	}
	if(zero==N){
		safe[index++]=k;
		Alloc(k);
		Mflag++;
		memcpy(tempAvail,Available,sizeof(Available));
	}
	for(i=0;i<M;i++){
		Nflag=0;
		zero=0;
		for(j=0;j<N;j++){
			if(Need[i][j]<=tempAvail[j])Nflag++;
			if(!Need[i][j])zero++;
		}
		if(Nflag==N&&zero!=N){
			safe[index++]=i;
			//cout<<i<<" ";
			Alloc(i);
			Mflag++;
			i=0;
			i--;
			memcpy(tempAvail,Available,sizeof(Available));
			//showData();
		}
	}
	if(Mflag==M){
		cout<<"资源申请成功!"<<endl;
		cout<<"存在安全序列:"; 
		for(i=0;i<M;i++){
			cout<<"p"<<safe[i]<<" ";
		}
		return 1;
	}
	else return 0;
}

4 实验结果与分析

(1)申请的资源能够找到安全序列,当p1进程申请R0、R1和R2的数量分别为0、0、1时,结合需求矩阵和已分配矩阵,可以知道存在安全序列p1、p0、p2、p3,程序运行结果如下图所示:

图1.1 申请资源后存在安全序列

(2)当p0进程申请的R0资源数为3大于需求矩阵中其需求的R0资源数时,会提示申请不合理,需要重新选择,如下图所示:

图1.2 合理性检测

(3)当p0进程申请的R0资源数为1大于当前系统中剩余的R0资源数时,会提示申请不可能,需要重新选择,如下图所示:

图1.3 可能性检测

(4)申请的资源不能够找到安全序列,当p0进程申请R0、R1和R2的数量分别为0、0、1时,结合需求矩阵和已分配矩阵,可以知道如果分配资源,则不存在安全序列,程序运行结果如下图所示:

图1.4 申请资源后不存在安全序列

5 代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

#define M 4 //进程数 
#define N 3 //资源种类 

int Claim[M][N]={{3,2,2},{6,1,3},{3,1,4},{4,2,2}}; //进程最大需求资源声明矩阵 
int Allocation[M][N]={{1,0,0},{6,1,2},{2,1,1},{0,0,2}}; //进程已分配资源矩阵 
int Need[M][N]; //需求矩阵 
int Resource[N]={9,3,6}; //系统资源总数 
int Available[N]; //系统剩余资源 
int Request[N]; //请求的资源 

void showData(){
	cout<<"最大申明矩阵(Claim):"<<endl; 
	cout<<"    R0 R1 R2"<<endl;
	for(int i=0;i<M;i++){
		cout<<"p"<<i<<":"; 
		for(int j=0;j<N;j++){
			cout<<Claim[i][j]<<"  ";
		}
		cout<<endl;
	}
	cout<<"已分配矩阵(Allocation):"<<endl; 
	cout<<"    R0 R1 R2"<<endl;
	for(int i=0;i<M;i++){
		cout<<"p"<<i<<":"; 
		for(int j=0;j<N;j++){
			cout<<Allocation[i][j]<<"  ";
		}
		cout<<endl;
	}
	cout<<"需求矩阵(Need):"<<endl; 
	cout<<"    R0 R1 R2"<<endl;
	for(int i=0;i<M;i++){
		cout<<"p"<<i<<":"; 
		for(int j=0;j<N;j++){
			cout<<Need[i][j]<<"  ";
		}
		cout<<endl;
	}
	cout<<"系统资源总数(Resource):"<<endl; 
	cout<<"R0   R1   R2"<<endl;
	for(int i=0;i<N;i++){
		cout<<Resource[i]<<"    ";
	}
	cout<<endl<<"系统剩余资源(Available):"<<endl; 
	cout<<"R0   R1   R2"<<endl;
		for(int i=0;i<N;i++){
		cout<<Available[i]<<"    ";
	}
	cout<<endl;
}

void preAlloc(int i){
	for(int j=0;j<N;j++){
		Allocation[i][j]=Allocation[i][j]+Request[j];
		Available[j]=Available[j]-Request[j];
		Need[i][j]=Need[i][j]-Request[j];
	}
}

void recoverAlloc(int i){
	for(int j=0;j<N;j++){
		Allocation[i][j]=Allocation[i][j]-Request[j];
		Available[j]=Available[j]+Request[j];
		Need[i][j]=Need[i][j]+Request[j];
	}
}

void Alloc(int i){
	for(int j=0;j<N;j++){
		Available[j]=Available[j]+Allocation[i][j];
		Allocation[i][j]=0;
		Need[i][j]=0;
	}
}

int check(int k){
	int tempAvail[N]={0};
	int safe[M];
	int zero=0,index=0;
	int i,j,Nflag=0,Mflag=0,flag=1;
	memcpy(tempAvail,Available,sizeof(Available));
	for(j=0;j<N;j++){
		if(!Need[k][j])zero++;
	}
	if(zero==N){
		safe[index++]=k;
		Alloc(k);
		Mflag++;
		memcpy(tempAvail,Available,sizeof(Available));
	}
	for(i=0;i<M;i++){
		Nflag=0;
		zero=0;
		for(j=0;j<N;j++){
			if(Need[i][j]<=tempAvail[j])Nflag++;
			if(!Need[i][j])zero++;
		}
		if(Nflag==N&&zero!=N){
			safe[index++]=i;
			//cout<<i<<" ";
			Alloc(i);
			Mflag++;
			i=0;
			i--;
			memcpy(tempAvail,Available,sizeof(Available));
			//showData();
		}
	}
	if(Mflag==M){
		cout<<"资源申请成功!"<<endl;
		cout<<"存在安全序列:"; 
		for(i=0;i<M;i++){
			cout<<"p"<<safe[i]<<" ";
		}
		return 1;
	}
	else return 0;
}

void bank(){
	char flag;
	int Rflag=0;
	int i=0,j=0;
	cout<<"是否进行资源申请,输入'y'继续,输入'n'退出:"; 
	cin>>flag; 
	while(flag!='y'&&flag!='n'){
		cout<<"输入错误,请从新输入:";
		cin>>flag;
	} 
	while(flag=='y'){
		i=-1;
		cout<<"请输入申请资源的进程号p(0-"<<M-1<<"):p";
		cin>> i;
		while(i<0||i>M-1){
			cout<<"进程号错误请重新输入:p";
			cin>> i;
		}
		for(j=0;j<N;j++){
			cout<<"申请R"<<j<<"资源的个数:";
			cin>>Request[j];
			if(Request[j]>Need[i][j]){
				cout<<"申请不合理,进程p"<<i<<"申请的该资源与所分配的该资源数总和大于该资源的最大申明数,请重新选择!!!";
				Rflag=1;
				break;
			}else{
				if(Request[j]>Available[j]){
					cout<<"申请不可能,进程p"<<i<<"申请的该资源与大于系统该资源的剩余数,请重新选择!!!";
					Rflag=1;
					break;
				}else{
					Rflag=0;
				}
			}
		}
		if(!Rflag){
			preAlloc(i);
			if(check(i)){
				//Alloc();
				flag='n'; 
			}else{
				recoverAlloc(i);
				cout<<"资源分配后,不存在安全序列,出错,请重新选择!!!"<<endl;
				//cin>>flag; 
				cout<<"是否进行资源申请,输入'y'继续,输入'n'退出:"; 
				cin>>flag; 
				while(flag!='y'&&flag!='n'){
					cout<<"输入错误,请从新输入:";
					cin>>flag; 
				} 
			}
		}else{
			cout<<endl<<"是否进行资源申请,输入'y'继续,输入'n'退出:"; 
			while(flag!='y'&&flag!='n'){
				cout<<"输入错误,请从新输入:";
				cin>>flag; 
			} 
		} 
	}
}
int main(){
	memcpy(Available,Resource,sizeof(Resource));
	for(int i=0;i<M;i++) {
		for(int j=0;j<N;j++){
			Need[i][j]=Claim[i][j]-Allocation[i][j];
			Available[j]=Available[j]-Allocation[i][j];
		}
	}
	cout<<"----------银行家算法模拟---------"<<endl;
	showData();
	bank();
	return 0;
}

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值