实验三 银行家算法
一、 实验内容简要描述 1. 实验目标:
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。
2. 实验要求:
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。
二、 报告主要内容 1. 设计思路
A、 设计进程对各在资源最大申请表示及初值确定。 B、 设定系统提供资源初始状态。
C、 设定每次某个进程对各类资源的申请表示。
D、 编制程序,依据银行家算法,决定其申请是否得到满足。
2. 主要数据结构
假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数
ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量
银行家算法:
设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
安全性检查:
(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
3.主要代码
源程序:
#include #define MAXPROCESS 50 /*最大进程数*/ #define MAXRESOURCE 100 /*最大资源数*/ int AVAILABLE[MAXRESOURCE]; /*可用资源数组*/ int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/ int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/ int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/ int REQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/ bool FINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/ int p[MAXPROCESS]; /*记录序列*/ int m,n; /*m个进程,n个资源*/ void Init(); bool Safe(); void Bank(); int main() { Init(); Safe(); Bank(); } void Init() /*初始化算法*/ { int i,j; cout<<\"请输入进程的数目:\"; cin>>m; cout<<\"请输入资源的种类:\"; cin>>n; cout<<\"请输入每个进程最多所需的各资源数,按照\"< cout<<\"请输入每个进程已分配的各资源数,也按照\"< NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; if(NEED[i][j]<0) { cout<<\"您输入的第\"<j--; continue; } } } cout<<\"请输入各个资源现有的数目:\"< void Bank() /*银行家算法*/ { int i,cusneed; char again; while(1) { cout<<\"请输入要申请资源的进程号(注:第个进程号为,依次类推)\"< cout<<\"请输入进程所请求的各资源的数量\"< } for(i=0;i cout<<\"您输入的请求数超过进程的需求量!请重新输入!\"< cout<<\"您输入的请求数超过系统有的资源数!请重新输入!\"< ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; } if(Safe()) { cout<<\"同意分配请求!\"< ALLOCATION[cusneed][i]-=REQUEST[cusneed][i]; NEED[cusneed][i]+=REQUEST[cusneed][i]; } } for(i=0;i cout<<\"您还想再次请求分配吗是请按y/Y,否请按其它键\"< if(again=='y'||again=='Y') { continue; } break; } } bool Safe() /*安全性算法*/ { int i,j,k,l=0; int Work[MAXRESOURCE]; /*工作数组*/ for(i=0;i for(i=0;i continue; else { for(j=0;j break; } if(j==n) { FINISH[i]=true; for(k=0;k p[l++]=i; i=-1; } else { continue; } } if(l==m) { cout<<\"系统是安全的\"< cout<<\"-->\"; } cout<<\"\"< 实验结果 三、实验心得(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验的体会及收获、对做好今后实验提出建设性建议等。) 在多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。银行家算法是避 免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。本实验中我对数据结构的设计算法存在问题,在同学的帮助下,还是理解了,并且参考网上存在的银行家算法完成了本试验。对于银行家算法的了解更加深入,还体会了死锁和避免死锁的具体实施方法。 精心搜集整理,只为你的需要 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务