实验报告
课程名称:
操作系统
实验名称:
C 语言实现银行家算法
实验类型:
设计性
实验地点: 学院 307 实验日期: 2017.11.3
指导教师:
徐华
专业: 计算机科学与技术
班级:
算机 1504
学号:
1511010403
成绩:
辽宁石油化工大学计算机与通信工程学院
实验报告说明
(1)实验目的
掌握银行计算法,加深对避免死锁方法的理解
(2)实验内容与要求
用 C 或 C++语言实现下列要求,并写出实验报告,报告内容包括:题目、目的、
内容和要求、程序清单、运行情况(输入、输出)、总结。 系统中有进程 P0、P1、
P2、P3、P4,三种资源数量分别为 A=10、 B=5、C=7,T0 时刻资源情况如下:
分析 T0 时刻安全性,输出分析结果,若安全输出安全序列。
输入 P1 提出请求 : Request1(1,0,2)用银行家算法分析这个请求是否可满足,输出
分析结果。若可满足,输出系统安全序列
(3)实验原理
如果我们把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资
金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾
客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可
推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,
要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求
量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源
时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则
拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
(4)实验步骤:
一:银行家算法
进程 i 发出请求资源申请,
(1)如果 Request [j]<=need[i,j],转向步骤(2),否则认为出错,因为他所需要的
资源数已经超过它所宣布的最大值。
(2)如果:Request i[j]<=available[i,j],转向步骤(3),否则表示尚无足够资源,
进程 i 需等待。
(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面
数据结构中的数值:
Available[i,j]= Available[i,j]- Request [j];
Allocation[i][j]= Allocation[i][j]+ Request [j];
need[i][j]= need[i][j]- Request [j];
(4)试分配后,执行安全性检查,调用 check()函数检查此次资源分配后系统是否
处于安全状态。若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来
的资源分配状态,让该进程等待。
(5)用 do{…}while 循环语句实现输入字符 y/n 判断是否继续进行资源申请。
二:安全性算法
(1)设置两个向量:
工作向量 Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全
性算法开始时,Work= Available。
工作向量 Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时
先做 Finish[i]=false;当有足够的资源分配给进程时,再令 Finish[i]=true
(2)在进程中查找符合以下条件的进程:
条件 1:Finish[i]=false;
条件 2:need[i][j]<=Work[j]
若找到,则执行步骤(3)否则,执行步骤(4)
(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]= Work[j]+ Allocation[i][j];
Finish[i]=true;
goto step (2);
(4)如果所有的 Finish[i]=true 都满足,则表示系统处于安全状态,否则,处于不安
全状态。
银行家算法
系统初始化
输入进程个数 no1
输入资源类数 no2
输 入 进 程 最 大 需 求 矩 阵 Max 、 已 分 配 矩 阵
Allocation 和可利用资源矩阵 Available
Need[][]=Max[][]-Allocation[][]
打印输出此时资源分配情况表
输入欲申请资源进程号
输入是否合
Y
输入该进程申请的资源量
Request[]>Need[][]
N
Request[]>Available[][
N
预分配
调用 check()函数进行安全性检查
退出系统
N
Y
Y
Y
继续分配(Y)?
or
退出(N)?
N
安全性算法
N
调用 check()函数
work[]=available[]
finish[]=false
need[][]<=work[
]
Y
work[]=work[]+allocation[][]
finish[]=true
所 有 进 程 的
Y
N
输出安全序列,并打印
出当前资源分配情况
输出提示:系统不安全
调用结束
C 语言代码如下:
#include
#include
#include
# define m 50
int no1; //进程数
int no2; //资源数
int r;
int allocation[m][m],need[m][m],available[m],max[m][m];
char name1[m],name2[m];
void main()
{
//定义全局变量
void check();
void print();
int i,j,p=0,q=0;
char c;
int request[m],allocation1[m][m],need1[m][m],available1[m];
printf("\t\t**********************************************\n");
printf("\t\t*
*\n");
printf("\t\t**********************************************\n");
printf("请输入进程总数:\n");
scanf("%d",&no1);
printf("请输入资源种类数:\n");
scanf("%d",&no2);
printf("请输入 Max 矩阵:\n");
for(i=0;i
for(j=0;j<=10;j++)
{
scanf("%d",&i);
if(i>=no1)
{
printf("输入错误,请重新输入:\n");
continue;
}
else break;
}
printf("\n 请输入该进程所请求的资源数 request[j]:\n");
for(j=0;j
need[i][j]) p=1;
//判断请求是否超过该进程所需要的资源数
if(p)
printf("请求资源超过该进程资源需求量,请求失败!\n");
else
{
for(j=0;javailable[j]) q=1;
//判断请求是否超过可用资源数
if(q)
printf("没有做够的资源分配,请求失败!\n");
//请求满足条件
else
{
for(j=0;jfor(j=0;jwork[j])
续运行的资源数的进程
f=0;
if(f==1)
{
//找到还没有完成且需求数小于可提供进程继
finish[i]=true;
a[v++]=i;
for(j=0;j