计算机操作系统 银行家算法
- 格式:doc
- 大小:51.00 KB
- 文档页数:10
银行家算法//breaker.h文件代码#include <iostream>using namespace std;int Test_Request(int *,int *); //测试函数void Assign(); //分配函数int Check_Safe(); //安全检测函数void Recover(); //回收函数int Check_Finish(); //检测finish函数int Finish[9]={0,0,0,0,0,0,0,0,0}; //已完成的进程序列int Work[9]; //进程工作序列int Max[9][9],MaxHF[9][9],MaxHFF[9][9];//[5][3]={{5,5,9},{5,3,6},{4,0,11},{4,2,5},{4,2,4}};// //进程最大需求int Allocation[9][9],AllocationHF[9][9],AllocationHFF[9][9];//[5][3]={{2,1,2},{4,0,2},{4,0,5},{2,0,4},{3,1,4}};// //进程已得到的int Need[9][9],NeedHF[9][9];//[5][3]={{3,4,7},{1,3,4},{0,0,6},{2,2,1},{1,1,0}}; //进程还需分配的int A vailable[9],A vailableHF[9],A vailableHFF[9];//[3]={2,3,3}; //系统拥有的资源int n; //告诉系统第几个进程需要申请int Request[9];//[3]; //告诉系统申请每类资源的数量int i,j,w=0;//输出函数void PutMax(int a,int m){for(i=0;i<a;i++){cout<<" | ";for(j=0;j<m;j++)cout<<Max[i][j]<<" ";}cout<<endl;}void PutAllocation(int a,int m){for(i=0;i<a;i++){cout<<" | ";for(j=0;j<m;j++)cout<<Allocation[i][j]<<" ";}cout<<endl;}void PutNeed(int a,int m){for(i=0;i<a;i++){for(j=0;j<m;j++)cout<<Need[i][j]<<" ";}cout<<endl;}void PutA vailable(int m){cout<<"A"<<"B "<<"C "<<"^^^"<<endl;for(i=0;i<m;i++){cout<<A vailable[i]<<" ";}cout<<endl;}//显示函数void Display(int a,int m){cout<<endl<<"-- Max --"<<endl;PutMax(a,m);cout<<endl<<"--Allocation--"<<endl;PutAllocation(a,m);cout<<endl<<"-- Need --"<<endl;PutNeed(a,m);cout<<endl<<"-- A vailable--"<<endl;PutA vailable(m);}//选择函数int Choice(char k){while(k!='Y'&& k!='N'&& k!='y'&& k!='n'){cout<<"请输入正确的字母!!!";cin>>k;}return(k);}int Choice1(char k){while(k!='A'&& k!='B'&& k!='a'&& k!='b'&&k!='C'&& k!='c'&& k!='E'&& k!='e'){ cout<<"请输入正确的字母!!!";cin>>k;}return(k);}//标记分配后的数据void Flag(int a,int m){for(i=0;i<a;i++){for(j=0;j<m;j++){MaxHF[i][j]=Max[i][j];AllocationHF[i][j]=Allocation[i][j];}for(j=0;j<m;j++)A vailableHF[j]=A vailable[j];}//标记分配后的数据void FlagF(int a,int m){for(i=0;i<a;i++){for(j=0;j<m;j++){MaxHFF[i][j]=Max[i][j];AllocationHFF[i][j]=Allocation[i][j];}}for(j=0;j<m;j++)A vailableHFF[j]=A vailable[j];}//恢复分配前的数据void Huifu(int a,int m){for(i=0;i<a;i++){for(j=0;j<m;j++){Max[i][j]=MaxHF[i][j];Allocation[i][j]=AllocationHF[i][j];Need[i][j]=Max[i][j]-Allocation[i][j];}Finish[i]=0;}for(j=0;j<m;j++)A vailable[j]=A vailableHF[j];}//恢复正常分配后的数据void HuifuF(int n,int a,int m){for(i=0;i<a;i++){for(j=0;j<m;j++){Max[i][j]=MaxHFF[i][j];Allocation[i][j]=AllocationHFF[i][j];Need[i][j]=Max[i][j]-Allocation[i][j];if(Need[i][j]<=0)Need[i][j]=0;}Finish[i]=0;}for(j=0;j<m;j++){if(Need[n][j]<=0){Need[n][j]=0;A vailable[j]=Allocation[n][j]+A vailableHFF[j];}elseA vailable[j]=A vailableHFF[j];}//测试请求合法性int Test_Request(int *p,int *q,int m){for(int i=0;i<m;i++){if (*(p+i)>*(q+i))return 0;if(*(p+i)<=*(q+i)&&i<=(m-1))return 1;}}//分配资源void Assign(int n,int m){for(int i=0;i<m;i++){Need[n][i]-=Request[i];if(Need[n][i]<0)Need[n][i]=0;A vailable[i]-=Request[i];Allocation[n][i]+=Request[i];}}//安全性检查int Check_Safe(int a,int m){while(1){for(i=0;i<a;i++)if(Test_Request(Need[i],A vailable,m)&&Finish[i]==0) break;if(i<a){for(int j=0;j<m;j++){A vailable[j]+=Allocation[i][j];}Finish[i]=1;Work[w]=i+1;w++;}if(i>=a){for(int i=0;i<a;i++){if(Finish[i]==0)elseif(Finish[i]!=0&&i<=(a-1))j=1;}if(j) return 1;else{//恢复原状态Huifu(a,m);return 0;}}}}//添加进程与资源void ADD(int *a,int *m){char k;cout<<endl<<"***********************************************"<<endl;cout<<"添加 a 个进程:a=";cin>>*a;cout<<"添加m 类资源:m=";cin>>*m;cout<<"***********************************************"<<endl;cout<<" "<<*m<<"类资源的总量"<<endl;cout<<" ----------------------- "<<endl;for(i=0;i<*m;i++){cout<<"第"<<(char)(i+65)<<"类资源的总量:";cin>>A vailable[i];}cout<<"***********************************************"<<endl;cout<<"----------------- Max ----------------"<<endl;// PutMax(a,m);cout<<" 各进程所需的各类资源的数量(Max) "<<endl;cout<<" ------------------------------- "<<endl;for(i=0;i<*a;i++){cout<<"第"<<i+1<<"个进程所需要的"<<*m<<"类资源的数量:";for(j=0;j<*m;j++)cin>>Max[i][j];//max[i][j]表示第i个进程所需要的j类资源的数量}cout<<endl;cout<<"***********************************************"<<endl;cout<<"是否给各进程初始化分配资源? (Y/N)";cin>>k;k=Choice(k);if(k=='Y'||k=='y'){for(i=0;i<*a;i++)//a为进程数{cout<<"第"<<i+1<<"个进程已分配各类资源的数量:";for(j=0;j<*m;j++)cin>>Allocation[i][j];}for(j=0;j<*m;j++){for(i=0;i<*a;i++)A vailable[j]=A vailable[j]-Allocation[i][j];}//Need[i][j]表示进程i对第j类资源的还需要数量for(i=0;i<*a;i++){for(j=0;j<*m;j++){Need[i][j]=Max[i][j]- Allocation[i][j];if(Need[i][j]<=0){Need[i][j]=0;A vailable[j]+=Allocation[i][j];}}}cout<<endl;}else{for(i=0;i<*a;i++)//a为进程数{for(j=0;j<*m;j++)Allocation[i][j]=0;}//Need[i][j]表示进程i对第j类资源的还需要数量for(i=0;i<*a;i++){for(j=0;j<*m;j++)Need[i][j]=Max[i][j];}}}//银行家算法void Banker(int a,int m){cout<<"***********************************************"<<endl;cout<<"** 银行家算法**"<<endl;cout<<"***********************************************"<<endl;//标记分配前的数据Flag(a,m);cout<<endl<<"请输入要申请资源的进程(1-"<<a<<"): ";cin>>n;//判断是否输入正确的进程序号w=0;while(!w){while(n<1||n>a) //输入正确的进程序号{cin>>n;}j=0;n=n-1;if(Need[n][j]==0 && Need[n][j+1]==0){cout<<"进程已运行完毕!!! 请重新输入未完成进程序号:";cin>>n;}else{ w=1;}}w=0;cout<<"输入该进程所要申请的各资源数(A B C ^^^): "<<endl;for(j=0;j<m;j++) //输入申请资源的数量cin>>Request[j];if(Test_Request(Request,A vailable,m)){Assign(n,m);//标记分配后的数据FlagF(a,m);if(Check_Safe(a,m)){cout<<endl<<"不会产生死锁,安全进程队列为:"<<endl;for(int i=0;i<a;i++)cout<<"P"<<Work[i]<<'\t';//恢复正常分配后的数据HuifuF(n,a,m);}else {cout<<endl<<'\a'<<"产生死锁!!!";}}elsecout<<endl<<"系统资源不足!!!";system("pause");cout<<"***********************************************"<<endl;}//求安全序列void Run(int a,int m){char k,g;cout<<"***********************************************"<<endl;cout<<"各进程是否已初始化分配资源? (Y/N):";cin>>k;if(k=='N'||k=='n'){cout<<endl<<"----------------------------------------------"<<endl;cout<<"是否初始化分配资源? (Y/N):";cin>>g;g=Choice(g);if(g=='Y'||g=='y'){cout<<endl<<"-------------输入初始化分配的资源-------------"<<endl<<endl;//cout<<"输入初始化分配资源\n";for(i=0;i<a;i++)//a为进程数{cout<<"第"<<i+1<<"个进程已分配各类资源的数量:";for(j=0;j<m;j++)cin>>Allocation[i][j];}}for(j=0;j<m;j++){for(i=0;i<a;i++)A vailable[j]=A vailable[j]-Allocation[i][j];}//Need[i][j]表示进程i对第j类资源的还需要数量for(i=0;i<a;i++){for(j=0;j<m;j++){Need[i][j]=Max[i][j]- Allocation[i][j];if(Need[i][j]<=0){Need[i][j]=0;A vailable[j]+=Allocation[i][j];}}}}cout<<endl<<"***********************************************"<<endl;Display(a,m);//银行家算法Banker(a,m);}//breaker.cpp文件代码#include <iostream>#include <windows.h>#include <stdio.h>#include "banker.h"void main(){int m,a;char choice;cout<<" "<<endl;cout<<" ****************"<<endl;cout<<" ** 银行家算法**"<<endl;cout<<" ************************************************************************"<<endl;cout<<" ** 09计算机本2 田龙50902012021 **"<<endl;cout<<" ************************************************************************"<<endl;cout<<" ** **"<<endl;cout<<" ** 算法简介:**"<<endl;cout<<" ** 在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意**"<<endl;cout<<" ** 的系统性能。