操作系统实验四 银行家算法
2015-11-30 17:00
302 查看
操作系统实验四 银行家算法
一、实验目的
1、 理解银行家算法。2、 掌握进程安全性检查的方法与资源分配的方法。
二、实验内容与基本要求
编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。进程 | 已占资源 | 最大需求数 |
---|---|---|
资源种类 | A B C D | A B C D |
P0 | 0 0 1 2 | 0 0 1 2 |
P1 | 1 0 0 0 | 1 7 5 0 |
P2 | 1 3 5 4 | 2 3 5 6 |
P3 | 0 6 3 2 | 0 6 5 2 |
P4 | 0 0 1 4 | 0 6 5 6 |
1、 现在系统是否处于安全状态?
2、 如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?
三、实验报告内容
1、 银行家算法和安全性检查算法原理
银行家算法:
银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。在OS设计中,也可以用它来避免死锁。为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。若两项均满足,则系统试分配资源并执行安全性检查算法。
安全性检查算法 :
安全性检查算法用于检查系统进行资源分配后是否安全,若安全系统才可以执行此次分配;若不安全,则系统不执行此次分配。安全性检查算法原理为:在系统试分配资源后,算法从现有进程列表寻找出一个可执行的进程进行执行,执行完成后回收进程占用资源;进而寻找下一个可执行进程。当进程需求量大于系统可分配量时,进程无法执行。当所有进程均可执行,则产生一个安全执行序列,系统资源分配成功。若进程无法全部执行,即无法找到一条安全序列,则说明系统在分配资源后会不安全,所以此次分配失败。
2、 程序流程图
3、 程序及注释
#include <iostream.h> ////////////////////////////////////////////////////////////////////////// //全局变量定义 int Available[100]; //可利用资源数组 int Max[50][100]; //最大需求矩阵 int Allocation[50][100]; //分配矩阵 int Need[50][100]; //需求矩阵 int Request[50][100]; //M个进程还需要N类资源的资源量 int Finish[50]; int p[50]; int m,n; //M个进程,N类资源 ///////////////////////////////////////////////////////////////////////// //安全性算法 int Safe() { int i,j,l=0; int Work[100]; //可利用资源数组 for (i=0;i<n;i++) Work[i]=Available[i]; for (i=0;i<m;i++) Finish[i]=0; for (i=0;i<m;i++) { if (Finish[i]==1) continue; else { for (j=0;j<n;j++) { if (Need[i][j]>Work[j]) break; } if (j==n) { Finish[i]=1; for(int k=0;k<n;k++) Work[k]+=Allocation[i][k]; p[l++]=i; i=-1; } else continue; } if (l==m) { cout<<"系统是安全的"<<'\n'; cout<<"系统安全序列是:\n"; for (i=0;i<l;i++) { cout<<p[i]; if (i!=l-1) cout<<"-->"; } cout<<'\n'; return 1; } } } ///////////////////////////////////////////////////////////////////////////////// //银行家算法 int main() { int i,j,mi; cout<<"输入进程的数目:\n"; cin>>m; cout<<"输入资源的种类:\n"; cin>>n; cout<<"输入每个进程最多所需的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n"; for (i=0;i<m;i++) for(j=0;j<n;j++) cin>>Max[i][j]; cout<<"输入每个进程已经分配的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n"; for (i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>Allocation[i][j]; Need[i][j]=Max[i][j]-Allocation[i][j]; if (Need[i][j]<0) { cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源错误,请重新输入:\n"; j--; continue; } } } cout<<"请输入各个资源现有的数目:\n"; for (i=0;i<n;i++) cin>>Available[i]; Safe(); while (1) { cout<<"输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n"; cin>>mi; cout<<"输入进程所请求的各个资源的数量\n"; for (i=0;i<n;i++) cin>>Request[mi][i]; for (i=0;i<n;i++) { if (Request[mi][i]>Need[mi][i]) { cout<<"所请求资源数超过进程的需求量!\n"; return 0; } if (Request[mi][i]>Available[i]) { cout<<"所请求资源数超过系统所有的资源数!\n"; return 0; } } for (i=0;i<n;i++) { Available[i]-=Request[mi][i]; Allocation[mi][i]+=Request[mi][i]; Need[mi][i]-=Request[mi][i]; } if (Safe()) cout<<"同意分配请求\n"; else { cout<<"SORRY╮(╯▽╰)╭……你的请求被拒绝…\n"; for (i=0;i<n;i++) { Available[i]+=Request[mi][i]; Allocation[mi][i]-=Request[mi][i]; Need[mi][i]+=Request[mi][i]; } } for (i=0;i<m;i++) Finish[i]=0; char Flag; //标志位 cout<<"是否再次请求分配?是请按Y/y,否请按N/n"; while (1) { cin>>Flag; if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n') break; else { cout<<"请按要求重新输入:\n"; continue; } } if (Flag=='Y'||Flag=='y') continue; else break; } }
4、 运行结果以及结论
图示为题目所给定的条件下的程序运行结果。可看出在现有分配情况下,该系统安全。下图为,P1提出请求后,程序的运行结果,可知,系统仍然安全,所以系统可以满足请求。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 应用领航:盘点那些年我们一起追过的OS
- 如何写好 C main 函数
- 无奇不有!盘点各国自己开发的操作系统
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现判断操作系统是否为Win8以上版本
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解