目录
前言
本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是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;
}