银行家算法 c++ 简要 演示
来源:互联网 发布:淘宝app 编辑:程序博客网 时间:2024/06/06 12:58
先推荐一个题目,对于新手可以帮助很快理解银行家算法,本次程序也是以该题数据为基础初始化的。
http://wenku.baidu.com/view/f9d05f5fbe23482fb4da4c08.html
(百度文库上的,下载积分为0)
T0时刻系统状态表:
最大资源需求量
已分配资源数量
A B C
A B C
P1
5 5 9
2 1 2
P2
5 3 6
4 0 2
P3
4 0 11
4 0 5
P4
4 2 5
2 0 4
P5
4 2 4
3 1 4
资源总量:A 17 B 5 C 20
安全性检测的原则是:
1 进程申请资源可分布申请,但总量不应超过其最大需求量
2 每次申请的资源量必须小于系统可供使用的资源量
3 分配完成后,系统是安全的,即仍存在一个序列,可以运行完当前所有进程,这是关键
笔者写了一个程序可以完整演示整个测试流程,看一下运行结果即可理解银行家算法,代码在vc6下测试完美通过。
附上完整代码与注释:
#include<iostream>using namespace std;#define M 5//进程数#define N 3//资源数int R[N]={17,5,20};//资源总数int Maxall[N]={0};//被占用的资源数int V[N]={0};//可用资源总数int Max[M][N]={{5,5,9},{5,3,6},{4,0,11},{4,2,5},{4,2,4}};//各进程最大需求量int Alloc[M][N]={{2,1,2},{4,0,2},{4,0,5},{2,0,4},{3,1,4}};//各进程已经分配的资源量int Need[M][N]={0};//各进程还需要的资源量int Appli[M][N]={0};//一次为某个进程申请的资源量int i,j,n;//程序中用int main(){void init();void show();int applicate(int,int,int,int);void update(int,int,int,int);void release(int,int,int,int);int safecheck();init();show();safecheck();//这里安排显示了按安全序列执行完毕前后的系统状态show();return 0;}void init()//初始化状态{/*cout<<"请依次输入各进程对资源最大需求量:"<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++){cout<<i<<"进程"<<j<<"资源:"<<endl;cin>>Max[i][j];}cout<<"请依次输入各进程已分配资源:"<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++){cout<<i<<"进程"<<j<<"资源:"<<endl;cin>>Alloc[i][j];}cout<<"请依次输入各资源总数:"<<endl;for(j=0;j<N;j++){cout<<j<<"资源:"<<endl;cin>>R[j];}*///本可以自行输入的,此处为避免大量输入,在程序中初始化for(i=0;i<M;i++)for(j=0;j<N;j++)Need[i][j]=Max[i][j]-Alloc[i][j];for(j=0;j<N;j++)for(i=0;i<M;i++)Maxall[j]+=Alloc[i][j];for(j=0;j<N;j++)V[j]=R[j]-Maxall[j];}void show()//显示系统状态{cout<<"Max:"<<endl;for(i=0;i<M;i++){for(j=0;j<N;j++)cout<<Max[i][j]<<" ";cout<<endl;}cout<<endl;cout<<"Alloc:"<<endl;for(i=0;i<M;i++){for(j=0;j<N;j++)cout<<Alloc[i][j]<<" ";cout<<endl;}cout<<endl;cout<<"Need:"<<endl;for(i=0;i<M;i++){for(j=0;j<N;j++)cout<<Need[i][j]<<" ";cout<<endl;}cout<<endl;cout<<"系统总资源:"<<endl;for(n=0;n<N;n++)cout<<R[n]<<" ";cout<<endl;cout<<"系统剩下的资源"<<endl;for(j=0;j<N;j++){cout<<V[j]<<" ";}cout<<endl;}int applicate(int i,int r1,int r2,int r3)//资源申请{Appli[i][0]=r1;Appli[i][1]=r2;Appli[i][2]=r3;if((Appli[i][0]<=Need[i][0] && Appli[i][1]<=Need[i][1] && Appli[i][2]<=Need[i][2]) && (Appli[i][0]<=V[0] && Appli[i][1]<=V[1] && Appli[i][2]<=V[2])){//cout<<"申请成功,但还未进行安全性检测..."<<endl;return 1;}else{//cout<<"申请失败..."<<endl;return 0;}}void update(int i,int r1,int r2,int r3)//分配资源,注意保证数据的一致性{Alloc[i][0]+=r1; Alloc[i][1]+=r2; Alloc[i][2]+=r3;Need[i][0]-=r1; Need[i][1]-=r2; Need[i][2]-=r3;V[0]-=r1; V[1]-=r2; V[2]-=r3;}void release(int i,int r1,int r2,int r3)//释放资源,注意保证数据的一致性{Alloc[i][0]-=r1; Alloc[i][1]-=r2; Alloc[i][2]-=r3;Need[i][0]+=r1; Need[i][1]+=r2; Need[i][2]+=r3;V[0]+=r1; V[1]+=r2; V[2]+=r3;}int safecheck()//检测安全性,反复M次寻找一个可执行的进程,执行完后释放资源,再往复下一步{int count=0;cout<<endl<<endl;cout<<"开始安全性测试:(此测试将改动数据,即执行完整个进程,正式的检测应有备份数据,此处只演示检测过程,为节省篇幅省略)"<<endl;while(count<5){for(int m=0;m<M;m++){if(applicate(m,Need[m][0],Need[m][1],Need[m][2]) ){if(((Alloc[m][0]==0)&&(Alloc[m][1]==0)&&(Alloc[m][2]==0)))continue;update(m,Need[m][0],Need[m][1],Need[m][2]);release(m,Alloc[m][0],Alloc[m][1],Alloc[m][2]);cout<<"进程"<<m<<"顺利结束"<<endl;count++;show();//这样你可以观察到每一个细致的变化break;}}}cout<<"至此队列执行结束!"<<endl<<endl<<endl;return 1;}
- 银行家算法 c++ 简要 演示
- 银行家算法演示【原创】
- 银行家算法c模拟
- c 银行家算法
- c语言银行家算法
- C ++ 银行家算法
- 银行家算法 C语言
- 银行家算法(C++)
- C语言实现银行家算法
- 银行家算法的C实现
- C语言实现银行家算法
- 操作系统c实现银行家算法
- 【c语言/vs2010】银行家算法
- [C#]银行家算法的实现
- 银行家算法C,Java实现
- 银行家算法C语言模拟程序
- C语言实现操作系统银行家算法
- C语言实现 操作系统 银行家算法
- 基于libcap的网络包分析问题集锦(http post方式上传文件)
- FreeBSD安装Ports
- 随机排列生成算法的一些随想
- JS数组
- Android开发配置SVN的问题
- 银行家算法 c++ 简要 演示
- uva 10282 - Babelfish
- freebsd中无法切换root用户
- qmail的发信三个问题
- DES 算法的 C++ 与 JAVA 互相加解密
- typedef用法
- Object-C学习笔记-Category(分类)
- poj 试题分类
- python那点事(3)