- 相关推荐
模拟银行家算法
课程设计任务书
设计题目:编程序模拟银行家算法
设计目的
1、银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
2、提高学生的程序设计能力、 提高算法设计质量与程序设计素质 ;
设计任务 (在规定的时间内完成下列任务)
思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
1. 需求分析
1.1 课程设计题目
编程序模拟银行家算法
1.2 课程设计目的
1、银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
2、提高自己的程序设计能力、 提高算法设计质量与程序设计素质;
1.3 课程设计任务及要求
思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
银行家算法在系统在分配资源时自始自终地做出正确的选择,这样可以避免死锁的发生。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
1.4 软硬件运行环境及开发工具
1.4.1硬件环境
PC机一台,支持WINDOWS XP,和LINUX。
1.4.2软件环境
在LINUX下运行,在WINDOWS下用WIN-TC 运行或在Turbo C for Windows下运行。
2. 概要设计
2.1 程序流程图
2.2 设计原理及方法
银行家算法的设计思想是:当用户申请一组资源时,系统必须做出判断;如果把这些资源分出去,系统是否还处于安全装他。若是,就可以分出这些资源;否则,该申请暂不能满足。
实现银行家算法要有若干数据结构,它们用来表示资源分配系统的状态。令n表示系统中进程的数目,m表示资源的分类数。还需要以下数据结构:
1. Available是一个长度为m的向量,它表示每类资源可用的数量。Available [j]=k,表示rj类资源可用的数量为k。
2.Max是一个n×m矩阵,它表示每个进程对资源的最大需求。Max [i,j]=k,表示进程pi至多可以申请k个rj类资源单位。
3. Allocation是一个n×m矩阵,它表示当前分给每个进程的资源数目。Allocation [i,j]=k,表示进程pi当前分到k个rj类资源。
4. Need是一个n×m矩阵,它表示每个进程还缺少多少资源。Need[i,j]=k,表示进程pi尚需k个rj类资源才能完成其任务。显然Need[i,j]= Max [i,j]- Allocation [i,j]。
这些数据结构的大小和数值随时间推移而改变。
系统所执行的安全性算法描述如下:
1.设置2个向量:工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work = Available。
Finish[i] :它表示系统是否有足够的资源分配给进程,使之完成运行。开始时先做Finish[i]=true。
2.从进程集合中找到一个满足下述条件的进程:Finish[i]=flase;Need[i,j]≤Work[j];若找到,则执行步骤3,否则,执行步骤4。
3.当进程pi获得资源后,可顺利执行,直至完成,并释放分配给它的资源。
4.如果所有进程的Finish[i]=true都满足。则表示系统处于安全状态;否则,系统处于不安全状态。
3. 详细设计
3.1 程序源代码
#include "string.h"
#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=Y;
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
while(flag==Y||flag==y)
{
i=-1;
while(i<0||i>=M)
{
printf("请输入需申请资源的进程号(从0到");
printf("%d",M-1);
printf(",否则重输入!):");
scanf("%d",&i);
if(i<0||i>=M)printf("输入的进程号不存在,重新输入! ");
}
printf("请输入进程");
printf("%d",i);
printf("申请的资源数 ");
for (j=0;j
{
printf("资源");
printf("%d",j);
printf(":");
scanf("%d",&Request[j]);
if(Request[j]>NEED[i][j])
{
printf("进程");
printf("%d",i);
printf("申请的资源数大于进程");
printf("%d",i);
printf("还需要");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择! ");
flag=N;
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
printf("进程");
printf("%d",i);
printf("申请的资源数大于系统可用");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择! ");
flag=N;
break;
}
}
}
if(flag==Y||flag==y)
{
changdata(i);
if(chkerr(i))
{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
printf(" ");
printf("是否继续银行家算法演示,按Y或y键继续,按N或n键退出演示: ");
scanf("%c",&flag);
}
}
void showdata()
{
int i,j;
printf("系统可用的资源数为: ");
printf(" ");
for (j=0;j
printf(" 资源");
printf("%d",j);
printf(":");
printf("%d",AVAILABLE[j]);
printf(" ");
printf("各进程还需要的资源量: ");
for (i=0;i
{
printf(" 进程");
printf("%d",i);
printf(":");
for (j=0;j
printf("资源");
printf("%d",j);
printf(":");
printf("%d",NEED[i][j]);
/*printf(" ");*/
}
printf(" ");
}
printf("各进程已经得到的资源量: ");
for (i=0;i
{
printf(" 进程");
printf("%d",i);
for (j=0;j
printf("资源");
printf("%d",j);
printf(":");
printf("%d",ALLOCATION[i][j]);
}
printf(" ");
}
}
void changdata(int k)
{
int j;
for (j=0;j
{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
};
void rstordata(int k)
{
int j;
for (j=0;j
{
AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
};
int chkerr(int s)
{
int WORK,FINISH[M],temp[M];
int i,j,k=0;
【模拟银行家算法】相关文章:
小小银行家作文03-12
年假的算法07-11
年假的算法?07-11
我是小小银行家作文06-03
银行家属慰问信07-05
小小银行家作文15篇06-01
焊工的工资算法07-13
关于年假的算法07-11
算法教学设计05-18
小小银行家亲子活动方案04-29