死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验提供了一个系统动态分配资源的简单模拟程序,用于了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。

一、实验要求
设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。
系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;

二、银行家算法
Request i 是进程Pi 的请求向量。Request i(j)=k表示进程Pi请求分配Rj类资源k个。当Pi发出资源请求后,系统按下述步骤进行检查:
1.如果Request i≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。
2.如果Request i≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。
3.系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值:
Available = Available - Request i
Allocation i= Allocation i+ Request i
Need i= Need i - Request i
4.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

三、安全性算法
1.设置两个向量。
Work:它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work = Available。
Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish(i)=false;当有足够资源分配给进程Pi时,令Finish(i)=true;
2.从进程集合中找到一个能满足下述条件的进程。
Finish(i)= = false;
Need i ≤work;
如找到则执行步骤3;否则,执行步骤4;
3.当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行
Work = work + Allocation i
Finish(i)=true;转向步骤2;
4.若所有进程的Finish(i)都为true,则表示系统处于安全状态;否则,系统处于不安全状态。
假定系统有5个进程(p0,p1,p2,p3,p4)和三类资源(A,B,C),各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如下图:

问题:
1.T0时刻系统是否安全?如果安全,给出安全序列。
安全。安全序列为:

2.如果某时刻T1,P1请求资源:Request1(1,0,2),系统是否分配?为什么?
分配。因为Request1(1,0,2)≤Need1(1,2,2),而且Request1(1,0,2)≤Available(3,3,2)
安全序列为{P1,P3,P4,P2,P0}

3.P1请求处理完毕后,如果某时刻T2, P4请求资源: Request4(3,3,0),系统是否分配?为什么?
不分配。因为 Request4(3,3,0)≤Need4(4,3,1); Request4(3,3,0)>Available(2,3,0),让P4等待。

4.打开“Microsoft Visual C++ 6.0”,输入相关代码,同时在源程序同一目录下新建“input1.txt”文件,根据代码要求,正确输入T0时刻的系统状态,并对程序行进编译运行。根据提示将前述的三个问题的相关数据依次输入,然后运行:

input1.text的内容如下:

运行结果:



5.输出的结果与你所写的一致否?如果不一致,理解之后,修改你的结果,给出“input1.txt”的内容。 一致。



#include<stdio.h>
#include<conio.h>
#include<iostream>
using namespace std;
typedef struct Max{int m_a;int m_b;int m_c;
}Max;
typedef struct Allocation{int a_a;int a_b;int a_c;
}Allocation;
typedef struct Need{int n_a;int n_b;int n_c;
}Need;
struct Available{int av_a;int av_b;int av_c;
}q;
struct pr{char name;Max max;Allocation allocation;Need need;int finishflag;
}p[5];
char na[5];
void init(){  cout<<"各进程还需要的资源数NEED: "<<endl;FILE *fp;fp=fopen("input1.txt","r+");for(int i=0; i<5;i++){fscanf(fp,"%c %d %d %d %d %d %d\n",&p[i].name,&p[i].max.m_a,&p[i].max.m_b,&p[i].max.m_c,&p[i].allocation.a_a,&p[i].allocation.a_b,&p[i].allocation.a_c);p[i].need.n_a=p[i].max.m_a-p[i].allocation.a_a;   p[i].need.n_b=p[i].max.m_b-p[i].allocation.a_b;  p[i].need.n_c=p[i].max.m_c-p[i].allocation.a_c;cout<<p[i].name<<": "<<p[i].need.n_a<<" "<<p[i].need.n_b<<" "<<p[i].need.n_c<<endl;}fclose(fp);
}int fenpei(){cout<<"Available: ";cout<<q.av_a<<" "<<q.av_b<<" "<<q.av_c<<endl;int finishcnt=0, k=0,count=0;   for(int j=0; j<5;j++){p[j].finishflag=0;}   while(finishcnt<5){for(int i=0; i<5; i++){if(p[i].finishflag==0&&q.av_a>=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].need.n_c){q.av_a+=p[i].allocation.a_a;   q.av_b+=p[i].allocation.a_b;   q.av_c+=p[i].allocation.a_c;p[i].finishflag=1;finishcnt++;na[k++]=p[i].name;break;}}count++;   if(count>5){        return 0;}}return 1;
}int shq(){int m=0,i=0,j=0,k=0;  cout<<"请输入进程号和请求资源的数目!"<<endl;cout<<"如:进程号 资源A B C"<<endl;cout<<"  0  202"<<endl;cin>>m>>i>>j>>k;if(i<=p[m].need.n_a&&j<=p[m].need.n_b&&k<=p[m].need.n_c){if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c){p[m].allocation.a_a+=i;p[m].allocation.a_b+=j;p[m].allocation.a_c+=k;p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a;  p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b;  p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c;  cout<<"各进程还需要的资源数NEED:"<<'\n';   for(int w=0;w<5;w++){cout<<p[w].name<<": "<<p[w].need.n_a<<" "<<p[w].need.n_b<<" "<<p[w].need.n_c<<endl;}return 1;}else{cout<<"Request>Available让进程"<<m<<"等待......"<<endl;}}else{  cout<<"Request>Available让进程"<<m<<"等待......"<<endl;}return 0;
}void main(){int flag;char c;cout<<"               /********* 银 行 家 算 法 *********/ "<<endl;cout<<"确认已经在\"input1.txt\"文档中正确输入各进程的有关信息后按回车键"<<endl;getch();init();q.av_a=10;  q.av_b=5;q.av_c=7;while(flag){for(int i=0; i<5;i++){q.av_a-=p[i].allocation.a_a;q.av_b-=p[i].allocation.a_b;q.av_c-=p[i].allocation.a_c;}if(fenpei()){cout<<"这样配置资源是安全的!"<<endl;cout<<"其安全序列是:";for(int k=0;k<5;k++){cout<<"->"<<na[k];}cout<<endl;cout<<"有进程发出 Request请求向量吗?(Enter y or Y)"<<endl;cout<<endl;c=getch();if(c=='y'||c=='Y'){if(shq())continue;elsebreak;}elseflag=0;}else{flag=0;cout<<"不安全!!"<<endl;}}
}

思古之圣贤,与我同为丈夫,彼何以百世可师,我何以一身瓦裂。

银行家算法课程设计(附源代码)相关推荐

  1. 银行家算法课程设计java语言_Java语言的银行家算法

    <Java语言的银行家算法>由会员分享,可在线阅读,更多相关<Java语言的银行家算法(12页珍藏版)>请在人人文库网上搜索. 1.湖北中医学院信息技术系 操作系统课程设计操作 ...

  2. 数据结构与算法课程设计之五子棋(人机)

    数据结构与算法课程设计之五子棋(人机) 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏.通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜. 这是 ...

  3. 数据结构与算法课程设计大作业

    考   核   要  求 课程编号:400802010    课程名称:数据结构与算法课程设计考试形式:大作业 大作业1-9见我的下载 里面包含多个版本的设计 文件有cpp文件设计文档总结等 一.设计 ...

  4. 数据结构c语言程序设计报告,数据结构与算法课程设计报告模版.doc

    数据结构与算法课程设计报告模版.doc 数据结构与算法课程设计报告题 目本科生导师制问题与家族关系查询系统院 (系) 信息科学与工程 专业班级 计算机应用技术1301班 学生姓名 顾 泉 学 号 20 ...

  5. 数据结构计算机专业教学计划编制,数据结构与算法课程设计报告--教学计划编制...

    数据结构与算法课程设计报告--教学计划编制 数据结构与算法课程设计报告题目教学计划编制目录一.需求分析311系统概述3111研究背景3112研究意义及目的312具体分析4121功能需求分析4122运行 ...

  6. 数据结构与算法课程设计——C语言《职员薪资查询系统》

    数据结构与算法课程设计--C语言<职员薪资查询系统> 温馨提示:课设要自己去操作,自己写代码,可以借鉴他人代码,学习思路和一些操作,切不可完全抄袭!!! 总体说明:设计一个职员薪资查询系统 ...

  7. 基于SpringBoot的二手交易平台(自己的课程设计附项目下载)

    基于SpringBoot的二手交易平台(自己的课程设计附项目下载) 整体的目录如下: 整体首页是这样的: 左边是一个快捷的连接分类按钮,右边是分类对应的商品 那下面就详细介绍一下吧!!! 注意:下面的 ...

  8. java动态分区分配算法,操作系统_动态分区分配算法课程设计_java版

    <操作系统_动态分区分配算法课程设计_java版>由会员分享,可在线阅读,更多相关<操作系统_动态分区分配算法课程设计_java版(13页珍藏版)>请在人人文库网上搜索. 1. ...

  9. java动态分区分配_操作系统 动态分区分配算法课程设计 java版.pdf

    操作系统 动态分区分配算法课程设计 java版 湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班 ...

最新文章

  1. 商汤科技实习生招募专场 | 与大咖畅聊AI拿OFFER,赢商汤年会入场券
  2. 滴滴行程单用的什么字体_打车就送冰淇淋!滴滴出行放大招,限时19天
  3. java多线程正在旋转的_一个正在高速旋转的巨大黑洞:速度竟达到光速的一半!...
  4. Bert模型冻结指定参数
  5. 递归算法及经典递归例子代码实现
  6. Linux黑客基础01篇
  7. 图片裁剪源代码+php,php进行图片裁剪及生成缩略图程序源代码
  8. 3D相机技术 | 立体视觉传感器+TOF相机
  9. kali Linux sqli labs环境搭建,以及报503错误解决
  10. hibernate操作步骤(代码部分)
  11. 项目中涉及到金钱的计算时,数据库字段的使用
  12. 2020年6月电子学会Python等级考试试卷(三级)考题解析
  13. 如何查看一个vs工程使用的vs版本是哪一个?
  14. Windows10访问共享总是提示输入网络凭证不正确
  15. 【时空序列预测paper】ConvLSTM:A Machine Learning Approach for Precipitation Nowcasting
  16. 2271Eddy的难题
  17. 【Android】使用LiveData KTX Builder让代码更简洁
  18. tgp饥荒服务器mod文件在哪,饥荒TGP平台使用Steam平台MOD方法一览
  19. mp4转换成avi,mp4转avi的方法
  20. EXP-00091: Exporting questionable statistics.错误解决方案

热门文章

  1. python表示完数_python求完数
  2. 认识与使用计算机 答案,计算机学习感悟—对计算机的认知和理解
  3. MongoDB使用过程中的报错处理(持续更新)
  4. Java第六次作业--异常处理和Java类集
  5. 【原】基于matlab的蓝色车牌定位与识别---绪论
  6. 三、java语法基础
  7. .net web开发经典图书总结
  8. oracle 导入导出数据库、删除用户以及该用户所有的对象
  9. js弹出对话框(半透明背景,兼容各浏览器)
  10. wireshark最新版本for Ubuntu18.04(六)