资源描述
实验三 银行家算法
一、 实验内容简要描述
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 〈iostream>
using namespace std;
#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<〈"请输入每个进程最多所需得各资源数,按照”〈〈m<<"x"<〈n〈<”矩阵输入"<〈endl;
for(i=0;i<m;i++)
for(j=0;j〈n;j++)
cin>>MAX[i][j];
cout〈<"请输入每个进程已分配得各资源数,也按照”〈〈m〈<"x”<<n<〈"矩阵输入”<〈endl;
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<〈"个资源数错误,请重新输入:"<〈endl;
j-—;
continue;
}
}
}
cout〈<”请输入各个资源现有得数目:"<〈endl;
for(i=0;i〈n;i++)
{
cin>〉AVAILABLE[i];
}
}
void Bank() /*银行家算法*/
{
int i,cusneed;
char again;
while(1)
{
cout<<"请输入要申请资源得进程号(注:第个进程号为,依次类推)"〈〈endl;
cin〉>cusneed;
cout<〈"请输入进程所请求得各资源得数量"〈<endl;
for(i=0;i〈n;i++)
{
cin〉〉REQUEST[cusneed][i];
}
for(i=0;i<n;i++)
{
if(REQUEST[cusneed][i]>NEED[cusneed][i])
{
cout〈<”您输入得请求数超过进程得需求量!请重新输入!"〈<endl;
continue;
}
if(REQUEST[cusneed][i]>AVAILABLE[i])
{
cout〈〈"您输入得请求数超过系统有得资源数!请重新输入!"〈〈endl;
continue;
}
}
for(i=0;i<n;i++)
{
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]—=REQUEST[cusneed][i];
}
if(Safe())
{
cout〈<"同意分配请求!"<〈endl;
}
else
{
cout<〈”您得请求被拒绝!"<<endl;
for(i=0;i<n;i++)
{
AVAILABLE[i]+=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];
NEED[cusneed][i]+=REQUEST[cusneed][i];
}
}
for(i=0;i<m;i++)
{
FINISH[i]=false;
}
cout〈〈"您还想再次请求分配吗?就是请按y/Y,否请按其它键"〈<endl;
cin〉>again;
if(again==’y'||again=='Y')
{
continue;
}
break;
}
}
bool Safe() /*安全性算法*/
{
int i,j,k,l=0;
int Work[MAXRESOURCE]; /*工作数组*/
for(i=0;i<n;i++)
Work[i]=AVAILABLE[i];
for(i=0;i〈m;i++)
FINISH[i]=false;
for(i=0;i<m;i++)
{
if(FINISH[i]==true)
continue;
else
{
for(j=0;j〈n;j++)
{ if(NEED[i][j]>Work[j])
break;
ﻩ }
if(j==n)
{
FINISH[i]=true;
for(k=0;k〈n;k++)
Work[k]+=ALLOCATION[i][k];
p[l++]=i;
i=—1;
}
else
{
continue;
}
}
if(l==m)
{
cout<〈"系统就是安全得”〈<endl;
cout〈<"安全序列:”<<endl;
for(i=0;i〈l;i++)
{
cout〈〈p[i];
if(i!=l-1)
cout<<”-—>";
}
cout<<""〈〈endl;
return true;
}
ﻩ if(l〉=m) cout〈<"系统就是不安全得”〈<endl;
}
return 1;
}
实验结果
三、 实验心得(实验中遇到得问题及解决过程、实验中产生得错误及原因分析、实验得体会及收获、对做好今后实验提出建设性建议等.)
在多个进程同时运行时,系统根据各类系统资源得最大需求与各类系统得剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁.银行家算法就是避免死锁得主要方法,其思路在很多方面都非常值得我们来学习借鉴.本实验中我对数据结构得设计算法存在问题,在同学得帮助下,还就是理解了,并且参考网上存在得银行家算法完成了本试验.对于银行家算法得了解更加深入,还体会了死锁与避免死锁得具体实施方法。
展开阅读全文