实验一 银行家算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称操作系统实验
实验名称银行家算法
实验类型设计型
实验地点实验日期
指导教师
专业计算机科学与技术
班级
学号
姓名
成绩______________ 辽宁石油化工大学计算机与通信工程学院
辽宁石油化工大学计算机与通信工程学院实验报告
(1)实验目的:
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
(2)实验内容:
1.设计进程对各类资源最大申请表示及初值确定。
2.设定系统提供资源初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其申请是否得到满足。
(3)实验原理:
当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是否还处于安全状态。
若是,就可以分出这些资源;否则,该申请暂不予满足。
1.数据结构
假设有M个进程N类资源,则有如下数据结构:
MAX[M*N] M个进程对N类资源的最大需求量
A V AILABLE[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]<=A V AILABLE,则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
A V AILABLE=A V AILABLE-REQUEST
ALLOCATION=ALLOCA TION+REQUEST
NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3.安全性检查
(1)设置两个工作向量WORK=A V AILABLE;FINISH[M]=FALSE
(2)从进程集合中找到一个满足下述条件的进程,
FINISH[i]=FALSE
NEED<=WORK
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATION
FINISH=TRUE
GO TO 2
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。(4)实验环境:
软件环境:Visual C++6.0
(5)实验步骤:
#include
#include
#include
#include
#define M 5 /*进程数*/
#define N 3 /*资源数*/
#define FALSE 0
#define TRUE 1
/*M个进程对N类资源最大资源需求量*/
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
/*系统可用资源数*/
int AVAILABLE[N]={10,5,7};
/*M个进程对N类资源最大资源需求量*/
int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; /*M个进程已经得到N类资源的资源量*/
int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*M个进程还需要N类资源的资源量*/
int Request[N]={0,0,0};
void main()
{
int i=0,j=0;
char flag;
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
enter:{
printf("请输入需申请资源的进程号(从0到");
printf("%d",M-1);
printf("):");
scanf("%d",&i);
}
if(i<0||i>=M)
{
printf("输入的进程号不存在,重新输入!\n");
goto enter;
}
err:{
printf("请输入进程");
printf("%d",i);
printf("申请的资源数\n");
printf("类别: A B C\n");
printf(" ");
for (j=0;j { scanf("%d",&Request[j]); if(Request[j]>NEED[i][j]) { printf("%d",i); printf("号进程"); printf("申请的资源数> 进程"); printf("%d",i); printf("还需要"); printf("%d",j);