#include <string.h>
#include<iostream.h>
#define FALSE 0
#define TRUE 1
#define W 10
#define R 20int M;
int N;
int ALL_RESOURCE[W];
int AVAILABLE[R];
int MAX[W][R];
int ALLOCATION[W][R];  //分配矩阵
int NEED[W][R];        //需求矩阵
int Request[R];
void inputdata();
void showdata();
void changedata(int k);
void restoredata(int k);
int checksec(int s);
int checkmax(int s);
void bank();void main()
{int j,i;inputdata();for(i=0;i<M;i++){j=checksec(i);if(j==0)break;}if(i>=M)cout<<"错误提示,系统的初始状态不安全"<<endl;else{cout<<"提示:系统的初始状态安全"<<endl;bank();}
}
void inputdata()
{int i=0,j=0,p;cout<<"请输入总进程数"<<endl;do{cin>>M;if(M>W)cout<<"总进程数超过了程序允许的最大进程数,请重新输入: "<<endl;}while(M>W);cout<<endl;cout<<"请输入资源的种类数:"<<endl;do{cin>>N;if(N>R)cout<<"资源的种类数超过了程序允许的最大资源种类数,请重新输入: "<<endl;}while(N>R);cout<<"请输入各类资源的总数量"<<endl;for(i=0;i<N;i++)cin>>ALL_RESOURCE[i];cout<<endl;cout<<"请输入各进程所需要的最大资源数量,max矩阵"<<endl;for(i=0;i<M;i++){for(j=0;j<N;j++){do{cin>>MAX[i][j];if(MAX[i][j]>ALL_RESOURCE[j])cout<<"该最大资源数量超过其声明的该资源总数,请重新输入: "<<endl;} while(MAX[i][j]>ALL_RESOURCE[j]);}}cout<<endl<<"输入该时刻各进程已经占据的各类资源数量"<<endl;for(i=0;i<M;i++){for(j=0;j<N;j++){do{cin>>ALLOCATION[i][j];if(ALLOCATION[i][j]>MAX[i][j])cout<<"已占有的资源数量超过了声明的最大资源数,请重新输入: "<<endl;} while(ALLOCATION[i][j]>MAX[i][j]);}}cout<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++)NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];//need矩阵计算for(j=0;j<N;j++){     p=ALL_RESOURCE[j];for(i=0;i<M;i++){  p=p-ALLOCATION[i][j];//剩余资源计算AVAILABLE[j]=p;if(AVAILABLE[j]<0)AVAILABLE[j]=0;}}}
void showdata()
{int i,j;cout<<"各种资源的总数量为: "<<endl;for(j=0;j<N;j++)cout <<"资源"<<j<<" : "<<ALL_RESOURCE[j]<<" ";cout<<endl;cout<<"当前各类资源可用量:"<<endl;for(j=0;j<N;j++)cout <<"资源"<<j<<" : "<<AVAILABLE[j]<<" ";cout<<endl;cout<<"各进程还需矩阵矩阵为: "<<endl;for(i=0;i<M;i++){cout<<"进程P"<<i<<": ";for(j=0;j<N;j++)cout<<NEED[i][j]<<"   ";cout<<endl;}cout<<endl;cout<<"各进程已经得到的资源矩阵为: "<<endl;for(i=0;i<M;i++){cout<<"进程P"<<i<<": ";for(j=0;j<N;j++)cout<<ALLOCATION[i][j]<<"   ";cout<<endl;}cout<<endl;}
void show(){int i,j;cout<<"当前各类资源可用量:"<<endl;for(j=0;j<N;j++)cout <<"资源"<<j<<" : "<<AVAILABLE[j]<<" ";cout<<endl;cout<<"各进程还需矩阵矩阵为: "<<endl;for(i=0;i<M;i++){cout<<"进程P"<<i<<": ";for(j=0;j<N;j++)cout<<NEED[i][j]<<"   ";cout<<endl;}cout<<endl;}void changedata(int k)
{int j;for(j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]-Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];NEED[k][j]=NEED[k][j]-Request[j];}
}void restoredata(int k)
{int j;for(j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]+Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];NEED[k][j]=NEED[k][j]+Request[j];}
}int checksec(int s)
{  int FINISH[W];int i,j;int replace[R];for(j=0;j<N;j++)replace[j]=AVAILABLE[j];for(i=0;i<M;i++)FINISH[i]=FALSE;int k=M;while(k--){for(i=0;i<M;i++){if(FINISH[i]==FALSE){int x=1;for(j=0;j<N;j++){if(NEED[i][j]>replace[j]){ x=0;break;}}if(x==1){FINISH[i]=TRUE;for(j=0;j<N;j++){replace[j]+=ALLOCATION[i][j];}cout<<"P"<<i<<"  ";  }}}
}int judge=1;for(i=0;i<M;i++)if(FINISH[i]==FALSE){ judge=0;cout<<"该状态不安全"<<endl;return 1;}if(judge==1)cout<<"该状态安全"<<endl;show();return 0;}
/*   for(i=0;i<M;i++){if()for(j=0;j<N;j++){WORK=AVAILABLE[j];if (NEED[i][j]>=WORK)}}for(j=0;j<N;j++){WORK=AVAILABLE[j];i=s;do{  if(FINISH[i]==FALSE&&NEED[i][j]<=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;i=0;}else{ i++;}}while(i<M);for(i=0;i<M;i++)if(FINISH[i]=FALSE){ return 1;}  }
*/int checkmax(int s)
{ int j,flag=1;for(j=0;j<N;j++){if(MAX[s][j]>ALLOCATION[s][j]){ flag=0;//AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];//    MAX[s][j]=0;}   } if (flag==1){for(j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];MAX[s][j]=0;}}return flag;
}void bank()
{int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){i=-1;while(i<0||i>=M){cout<<"请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重新输入:";cout<<"p";cin>>i;if(i<0||i>=M)cout<<"输入的进程号不存在,请重新输入"<<endl;}cout<<"请输入进程P"<<i<<"申请的资源数:"<<endl;for(j=0;j<N;j++){cout<<"资源"<<j<<":";cin>>Request[j];if(Request[j]>NEED[i][j]){cout<<"进程 P"<<i<<" 申请的资源数大于系统可用"<<i<<"还需要"<<j<<"类资源的资源量";cout<<"申请不合理出错请重新选择"<<endl<<endl;flag='N';break;}else{if(Request[j]>AVAILABLE[j]){cout<<"进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量";cout<<"申请不合理,出错!请重新选择"<<endl;flag='N';break;}}}if(flag=='Y'||flag=='y'){   changedata(i);if (checksec(i)){cout<<endl;cout<<"该分配导致系统不安全,本次申请不成功,不予分配"<<endl;cout<<endl;restoredata(i);}else{cout<<endl;//  cout<<"经安全检查,系统安全,分配成功,资源分配如下";showdata();if(checkmax(i)){cout<<" 资源分配成功后,该进程最大需求量满足  "<<endl;cout<<" 该进程结束后 回收资源"<<endl;cout<<" 资源回收后,各进程的资源需求和分配情况如下所示"<<endl;showdata();}}}cout<<endl;cout<<"是否继续银行家算法演示,按Y或y键继续,按N键退出";cin>>flag;}}

1.银行家算法中的数据结构

为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述系统中可利用的资源、所有进程对资源的最大需求、系统中的资源分配,以及所有进程还需要多少资源的情况。

(1)可利用资源向量Available。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有R,类资源K个。

(2)最大需求矩阵 Max。这是一个nx m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要R类资源的最大数目为K。

(3)分配矩阵 Allocation。这也是一个nxm的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果 Allocation[i,j]=K,则表示进程i当前已分得R;类资源的数目为K。

(4)需求矩阵 Need。这也是一个nxm的矩阵,用以表示每一个进程尚需的各类资源数。如果 Need[i,j]=K,则表示进程i还需要Rj类资源K个方能完成其任务。

上述三个矩阵间存在下述关系:

Need[i,jil]= Max[i, j]- Allocation[i,j]

2.银行家算法

设Request ;是进程P的请求向量,如果 Request:[i]=K,表示进程P,需要K个R类型的资源。当P发出资源请求后,系统按下述步骤进行检查:

(1)如果 Request;j]≤Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果 Request;ji]≤Available[i],便转向步骤(3):否则,表示尚无足够资源,Р ﹔须等待。

(3)系统试探着把资源分配给进程P,并修改下面数据结构中的数值:

Available[j] =Available[j]- Request [jl;

Allocation[i, j] = Allocation[i,j] + Request;l;Need[i, j] = Need[i,j]- Request l];

(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程P,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程P等待。

3.安全性算法

系统所执行的安全性算法可描述如下:

(1)设置两个向量:

工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work := Available; Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i] := false;当有足够资源分配给进程时,再令Finish[i]:= true.

(2)从进程集合中找到一个能满足下述条件的进程:Finish[i]=false;

Need[i,j]≤Work[j];

若找到,执行步骤(3),否则,执行步骤(4)。

(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Workj] = Work[j]+Allocation[i,j];Finish[i]=true;

go to step 2;

(4)如果所有进程的 Finish[i]=true 都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

将测试数据输入

银行家算法实现(操作系统实验)相关推荐

  1. 实验三银行家算法linux,操作系统原理与linux_银行家算法实验报告.doc

    . . . PAGE 成 绩 评 阅 人 评阅日期 计算机科学与技术系 实 验 报 告 课程名称: 操作系统原理与linux 实验名称: 银行家算法 2011年 04 月 实验三 银行家算法 一.实验 ...

  2. 银行家算法(操作系统 Java版)

    文章目录 前言 数据结构 实现 效果 前言 这个就没啥了,俺是来水博文的~ 数据结构 这个银行家算法的原理很简单,我这里就不说了,代码有注释的. 主要是我这里的几个数据结构 就这几个,含义的话和操作系 ...

  3. 银行家算法 计算机操作系统,计算机操作系统 银行家算法.doc

    银行家算法 //breaker.h文件代码 #include using namespace std; int Test_Request(int *,int *); //测试函数 void Assig ...

  4. 银行家算法(操作系统)

    前言:银行家算法就真的是银行家算法.可以用银行贷款的实例来类比银行家算法. 一.银行贷款问题 假设有一家银行有一笔m亿的资金,n个客户需要贷款,他们都和银行签订了贷款协议,每个客户所需要贷款的资金不同 ...

  5. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

  6. 操作系统实验报告(二)银行家算法

    一. 实验目的 1.了解什么是操作系统安全状态和不安全状态: 2.了解如何避免系统死锁: 3.理解银行家算法是一种最有代表性的避免死锁的算法,掌握其实现原理及实现过程. 二. 实验环境 Windows ...

  7. 广州大学 操作系统实验之银行家算法

    实验二 银行家算法 一.实验目的 1.了解什么是操作系统安全状态和不安全状态: 2.了解如何避免系统死锁: 3.理解银行家算法是一种最有代表性的避免死锁的算法,掌握其实现原理及实现过程 二.实验环境 ...

  8. 计算机操作系统:实验2 【银行家算法】

    计算机操作系统:实验2 [银行家算法] 文章目录 计算机操作系统:实验2 [银行家算法] 一.前言 二.实验目的 三.实验环境 四.实验内容 五.实验说明 六.实验步骤 1. 认真理解好课本中银行家算 ...

  9. 操作系统实验二(银行家算法)

    实验二 银行家算法 一.实验目的 用高级语言编写和调试一个银行家算法程序,并可以利用银行家算法模拟分配资源以及进行安全性检查.加深对银行家算法的理解. 二.实验指导 银行家算法中的数据结构 (1) 可 ...

  10. 操作系统-资源分配银行家算法

    资源分配----银行家算法 一. 实验目的 模拟实现银行家算法,用银行家算法实现资源分配和安全性检查.通过本次实验,使学生加深对死锁概念的理解和掌握,并培养学生对操作系统课程的兴趣与高级语言设计的能力 ...

最新文章

  1. ffmpeg 视频转ts切片 生成m3u8视频播放列表
  2. 前端学习(1956)vue之电商管理系统电商系统之添加代码到仓库中
  3. c#中高效的excel导入oracle的方法(转)
  4. shell 实现txt转换成html
  5. keras的训练引擎:train_array.py和train_generator.py
  6. php是哪种化学药剂,常用化学试剂 英文缩写一览表
  7. idhttp返回乱码_node.js http.get请求返回的中文乱码, iconv zlib模块都不好使,求解决!!!...
  8. 关于SharePoint 2010里Servers in farm页面里status意义的澄清
  9. 新手必须要注意的编程范式
  10. UE4--地形篇——风吹草动的草
  11. html半透明遮罩,如何制作网页半透明遮罩效果
  12. QQ空间说说自动删除代码-真的自动
  13. Linux ftrace 2.3、kprobe event的使用
  14. 【故障分析】基于matlab GUI蚁群算法故障诊断【含Matlab源码 931期】
  15. 什么时候做都不晚——十大大器晚成的人物
  16. 测试打印 lua 的 _G 所有显示的字段内容
  17. 在Shopee做高客单价产品 需要具备哪些思路?
  18. Python:实现sha1算法(附完整源码)
  19. android 触摸时震动,android触屏震动以及震动强度批改
  20. 四、VUE基础——记事本案例(小黑记事本)

热门文章

  1. Vfed大橙子模板 苹果cms自动采集 的方法
  2. 字节和兆字节的换算_什么是兆字节(MB)?
  3. listmanager htdocs
  4. Cloudera Manager 5升级(官方翻译整理,企业级实战验证)
  5. 联想用u盘重装系统步骤_如何制作U盘系统盘以及U盘安装操作系统的方法
  6. 阿里2018届实习生内推经历
  7. 如何提高计算机打字,如何练电脑打字速度,教你如何科学提高打字速度
  8. 惠普服务器sd卡作用,HP服务器如何操作设置
  9. git 解决push报错:[rejected] master -> master (fetch first) error: failed to push some refs to ‘ ‘
  10. linux 输入密码后无法进入系统,【Linux学习笔记十六】用户密码修复和GRUB引导错误无法进入系统解决办法...