参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //bool类型数据头函数
#include <iostream>
using namespace std;
#define processNum 5 //五个进程
#define resourceNum 3 //三类资源
//初始状态
int p;
//work表示系统中的可用资源
int work[resourceNum];
//请求的各类资源
int Request[resourceNum];
//判断各类资源是否用完
bool Finish[processNum];
int Available[resourceNum]={3,3,2};//可利用资源
//最大的需求量
int Max[processNum][resourceNum]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};
//还需要多少对各类资源的需求
int Need[processNum][resourceNum]={7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};
//分配矩阵
int Allocation[processNum][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};
//输出初始化的信息表
void print1()
{int i,j;printf("系统剩余资源数:");for(j = 0;j < resourceNum;j++)printf("%d ",Available[j]);printf("\n");printf("============当前资源分配状态=========\n");printf("process=== Max =====Allocation=====  Need\n");for(i = 0;i < processNum;i++){printf("p%d        ",i);for(j = 0;j < resourceNum;j++)printf("%d ",Max[i][j]);//输出进程需要的最大需求量 printf("       ");for(j = 0;j < resourceNum;j++)printf("%d ",Allocation[i][j]);//输出进程的各类资源的分配 printf("       ");for(j = 0;j < resourceNum;j++)printf("%d ",Need[i][j]);//输出各类资源仍需要的资源数目 printf("       \n");}
}
void print2(int i)
{int j;if(Need[i][0]==0&&Need[i][1]==0&&Need[i][2]==0){for(int te=0;te<resourceNum;te++){work[te]+=Allocation[i][te];Available[te]+=Allocation[i][te];}}printf("p%d        ",i);for(j = 0;j < resourceNum;j++)printf("%d ",work[j]);printf("       ");for(j = 0;j < resourceNum;j++)printf("%d ",Need[i][j]);printf("       ");for(j = 0;j < resourceNum;j++)printf("%d ",Allocation[i][j]);printf("       ");for(j = 0;j < resourceNum;j++)printf("%d ",work[j]);printf("       ");for(j = 0;j < resourceNum;j++)if(!Finish[i])break;if(j == resourceNum)printf("true");elseprintf("false");printf("       \n");
}
//进程不安全,回收预分配的资源
void recycle()
{int j;for(j = 0;j < resourceNum;j++){Need[p][j] += Request[j];Available[j] += Request[j];Allocation[p][j] -= Request[j];}printf("系统进程资源状态不改变!\n");
}
//检测分配是否安全。
void Test_safety()
{int i,j,te;int finish = 0,Done = 0; //Done一轮遍历下完成的,finish总共完成的int safeseries[processNum] = {-1,-1,-1,-1,-1};//初始化for(i = 0;i < processNum;i++)Finish[i] = false;for(j = 0;j < resourceNum;j++)work[j] = Available[j]; //初始值等于Available;// 查找未完成进程,且当前进程尚需资源不大于系统剩余资源;i = 0;while(finish != processNum){j = 0;if(Finish[i] == false)//如果这个进程的还需要的各类资源还大于系统当前的资源的,break; {for(j = 0;j < resourceNum;j++)if(Need[i][j] > work[j]) break;}if(j == resourceNum){//此时代表当前的系统资源可以满足这个进程//那么可以对这个进程的资源进程回收。 Finish[i] = true;//代表该进程已经被完成。 print2(i);safeseries[finish++] = i; //记录下安全序列for(j = 0;j < resourceNum;j++)//开始资源的回收 work[j] += Allocation[i][j];}i++; //下一个进程//一轮遍历后,判断是否还有可分配进程if(i >= processNum){i = i % processNum;if(Done == finish) //判断本轮完成进程是否等于上一轮,是则代表没有可执行进程break;else Done = finish; //否则将本轮完成进程数赋值给Done}}if(finish == processNum){printf("进程P%d请求通过,此时安全序列为:",p);for(i = 0;i < processNum;i++)printf("p%d ",safeseries[i]);printf("\n");print1(); //打印出此刻系统资源分配状态}else{recycle();printf("进程死锁,进程P%d请求无法通过!\n",p);print1();}
}
void judge_assign()
{int j;for(j = 0;j < resourceNum;j++){//当前请求资源加上已分配资源不能大于最大需求资源;if(Request[j] + Allocation[p][j] > Max[p][j]){printf("当前请求资源+已分配资源>最大需求资源:无法满足!错误!\n");break;}//当前请求资源不能大于系统现有资源;if(Request[j] > Available[j]){printf("当前请求资源>系统现有资源:无法满足!错误!\n");break;}}if(j == resourceNum){//尝试分配资源for(j = 0;j < resourceNum;j++){Need[p][j] -= Request[j];Available[j] -= Request[j];Allocation[p][j] += Request[j];}//检查此时系统的安全性printf("===========安全序列===========\n");printf("process=== Work===== Need =====Allocation=====work+allocation==finish\n");Test_safety();}
}
int main()
{int i;print1();printf("===========此时安全序列===========\n");printf("process=== Work===== Need =====Allocation=====work+allocation==finish\n");Test_safety();while(1){printf("存在进程0,1,2,3,4,资源类别0,1,2\n请依次输入请求资源的进程和进程请求的A,B,C类资源数\n例如:1 0 0 1 \n");scanf("%d",&p);for(i = 0;i < resourceNum;i++)scanf("%d",&Request[i]);//尝试分配资源给进程judge_assign();}return 0;
}

  

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

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

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

  2. 计算机操作系统实验:银行家算法模拟

    目录 前言 实验目的 实验内容 实验原理 实验过程 代码如下 代码详解 算法过程 运行结果 总结 前言 本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现.银行家算法是一种用于解决多个 ...

  3. 【南邮操作系统实验】银行家算法Java版

    这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法. 我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出. import java.util.*; /* ...

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

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

  5. 计算机操作系统实验银行家算法,实验六 银行家算法(下)

    实验六 银行家算法(下) 一.实验说明 实验说明:本次实验主要是对银行家算法进行进一步的实践学习,掌握银行家算法的整体流程,理解程序测试时每一步的当前状态,能对当前的资源分配进行预判断. 二.实验要求 ...

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

    实验六 银行家算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 进一步理解进程的并发执行. (2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念. ...

  7. 操作系统:实验二 银行家算法

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

  8. 操作系统实验七 地址映射与共享(哈工大李治军)

    实验七 地址映射与共享 实验目的 深入理解操作系统的段.页式内存管理,深入理解段表.页表.逻辑地址.线性地址.物理地址等概念: 实践段.页式内存管理的地址映射过程: 编程实现段.页式内存管理上的内存共 ...

  9. 操作系统实验四-LRU算法的模拟

    操作系统实验四:页式虚拟存储管理的模拟 一.实验目的: 掌握存储管理的基本原理.地址变换过程:用软件实现地址转换过程:用一种常用的页面置换算法来处理缺页中断并研究其命中率. 二.实验题目: 1.模拟请 ...

  10. 【梳理】简明操作系统原理:银行家算法(内附文档高清截图)

    银行家算法 W. Dijkstra的银行家算法是一种避免死锁的算法.命名原因是该算法原本为银行设计,确保银行发放贷款时,不会发生不能满足全部客户的需求的情况. 1.银行家算法需要的数据结构 设1个CP ...

最新文章

  1. 通信网络设计(最小生成树+图的联通)
  2. viewholder
  3. 更新view是可以update到表的
  4. LLBLGen update table with join
  5. Fast R-CNN论文详解
  6. Java Package getPackage()方法与示例
  7. 【报告分享】2021中国零售消费品行业供应链专项研究报告.pdf(附下载链接)...
  8. 翻译:您在Swift 5中的第一个UITest
  9. SpringCloud + RocketMQ实现可靠消息最终一致性事务
  10. python程序设计报告-Python程序设计实验报告一
  11. 正则表达式-国际手机号或座机号校验
  12. 盘点!AGV的12种导引导航方式
  13. ubuntu 18.04 安装 wine5.0
  14. FreeIPA 4.7.0 服务端 部署
  15. Element properties is not closed
  16. Eclipse版本代号
  17. php 屏蔽deprecated,解决php deprecated 的问题
  18. 计算机毕业设计Java校园约拍系统(源码+系统+mysql数据库+Lw文档)
  19. Win7蓝屏代码0X0000007B可能是SATA mode问题
  20. 华为云设计语言_多云架构落地设计和实施方案【华为云分享】

热门文章

  1. Redis中SDS简单动态字符串
  2. 【机器学习面经】AI算法岗位简历必备
  3. 解决Eclipse保存web.xml卡的问题
  4. 人类的历史就是一部创业史
  5. 淋雨量matlab,最小淋雨量问题
  6. 搜狗浏览器怎么翻译英文网页
  7. DellR720安装系统不能正常进入系统
  8. Python 安装pyinstaller失败的解决方法
  9. code405是什么意思_HTTP协议状态码详解(HTTP Status Code)
  10. GPS时间转北京时间