实 验 报 告
课程名称_
实验名称
操作系统实验
银行家算法____
实验类型________设计型_________________
实验地点____304 机房_实验日_2010.4.27____
指导教师______李文超___________________
专
班
学
姓
成
业___计算机科学与技术__
级___算计 0901____________
号___0911010123__________
名___胡建勇____________
绩 ______________
辽宁石油化工大学计算机与通信工程学院
一.实验目的
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一
个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和
了解死锁和避免死锁的具体实施方法。
二.实验原理
当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是
否还处于安全状态。
若是,就可以分出这些资源;否则,该申请暂不予满足。
1.数据结构
假设有 M 个进程 N 类资源,则有如下数据结构:
MAX[M*N] M 个进程对 N 类资源的最大需求量
AVAILABLE[N] 系统可用资源数
ALLOCATION[M*N] M 个进程已经得到 N 类资源的资源量
NEED[M*N] M 个进程还需要 N 类资源的资源量
2.银行家算法
设进程 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)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢
复原状,进程等待。
3.安全性检查
(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,则表示安全;否则系统不安全。
辽宁石油化工大学计算机与通信工程学院实验报告
三.实验内容
1.设计进程对各类资源最大申请表示及初值确定。
2.设定系统提供资源初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其申请是否得到满足。
四.实验环境
软件环境:Tc 或 Visual C++
五.实验方案
1.定义银行家算法中的数据结构 Available[],Allocation[],Need[],等利用定义的
全局变量进行函数间值的传递
2.此实验通过 3 个函数实现,a:主函数 main()b:安全检测函数 Check,b:输
出函数 Print()。
3,。主函数 main()的实现:输入已知条件,利用安全检测函数检测已知的进程
分配情况是否安全状况。如果为安全,则输入需请求资源的进程号和所需资源数,
否则结束主函数。Reqi 为进程 i 的请求向量。进行银行家算法:
(1):如果 reqi[j]>Need[i][j]则认为出错,输出请求的资源数超过它所需的最大数;
否则执行(2);
(2):如果 reqi[j]>Available[i][i]则输出尚无足够的资源;否则执行(3).
(3):系统试探着把资源分配给进程 i,并修改下面数据结构中的数值:
Available[i]= Available[i]-reqi[j];
Allocation[i][j]=Allocation[i][j+reqi[j];
Need[i][j]=Need[i][j]-reqi[j];并且保存修改前的数值。
4.安全检测函数 Check():
(1)设置两个向量 work 和 finish:work=Available,表示系统可提供给进程继续
运行所需的各类资源数目;finish 表示系统是否有足够的资源分配给进程,使
之 完 成 。 开 始 时 先 做 finish[i]=false; 当 有 足 够 资 源 分 配 给 进 程 时 , 再 令
finish[i]=true。
(2) 从 进 程 集 合 中 找 到 一 个 能 满 足 下 述 条 件 的 进 程 : a : finish[i]=false;
b;Need[i][j]=work[j]; 若找到,执行(3),否则,执行(4)。
(3):当进程 i 获得资源后,可顺利执行,直到完成,并释放出分配给它的资源,
故应执行:
Work[i]=work[i]+Allocation[i][j];
Finish[i]=true;
a[v++]=I;
go to step 2;
(记录安全序列)
(4):如果所有进程的 finish[i]=true 都满足,则表示系统处于安全状态,输出安
全状态序列;否则,系统处于不安全状态。
5.输出函数 Print();利用循环体输出各个进程号,已分配的资源数,仍需要的资
源数,剩余的可用资源数。
六.实验步骤:
1.程序流程图:
主函数:
银行家算法
安全性检查
2.程序源代码:
#include
#define M 10//宏定义二维数组的储存空间大小
int Allocation[M][M],Need[M][M],Available[M];
int n,m,r;
void main()
{
void Check();//声明安全性检测函数
void Print();//声明输出函数
//定义全局变量
int i,j,p=0,q=0;
char k;
int req[M],all[M][M],need[M][M],ava[M];//暂存当前各进程的资源状态数组
printf("欢迎使用检测避免进程死锁系统\n");
printf("请输入进程数目:");//输入已知进程数以及各个进程的资源状况
scanf("%d",&n);
printf("请输入资源的种类总数:");
scanf("%d",&m);
printf("请输入已知各个进程分配资源数:\n");
printf("Allocation:\n");
for(i=0;iNeed[i][j])/*判断请求是否超过该进程所需的各类最大资
源数*/
p=1;
printf("请求的资源已超出最大资源数");
//如果超出,输出申请资源失败原因
if(p)
else
{
for(j=0;j<=m;j++)
if(req[j]>Available[j])/*判断申请的资源数是否超出该进程的可
用的各类资源数
*/
q=1;
if(q)
//如果超出,输出申请资源失败的原因
printf("该进程没有足够的给类的可用的资源了");
else
{
for(j=0;j