操作系统课程设计报告课程名称:银行家算法姓名:刘成启学号:20101221149班级:计算机1008班指导老师:袁宁共享资源分配与银行家算法一、实验目的[问题描述]本题主要内容是模拟实现资源分配。
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
通过对这个算法的设计,让学生能够对书本知识有更深的理解,在操作和其它方面有更高的提升。
二、实验内容[基本要求]具体用银行家算法实现资源分配。
要求如下:(1) 设计一个3个并发进程共享3类不同资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2) 设计用银行家算法,实现资源分配,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3) 确定一组各进程依次申请资源数的序列,输出运行结果。
[方案设计及开发过程]1银行家分配算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,每个进程都无法继续执行下去的死锁现象。
把个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.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-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3.安全性检查(1)设置两个工作向量WORK=A V AILABLE;FINISH[M]=FALSE(2)从进程集合中找到一个满足下述条件的进程,FINISH[i]=FALSENEED<=WORK如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATIONFINISH=TRUEGO TO 2(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
3.数据结构假设有M个进程N类资源,则有如下数据结构:#define W 10#define R 20int M ; //总进程数int N ; //资源种类int ALL_RESOURCE[W]; //各种资源的数目总和int MAX[W][R]; //M个进程对N类资源最大资源需求量int A V AILABLE[R]; //系统可用资源数int ALLOCATION[W][R]; //M个进程已经得到N类资源的资源量int NEED[W][R]; //M个进程还需要N类资源的资源量int Request[R]; //请求资源个数三、程序及运行情况#include<stdio.h>#define false 0#define true 1#define W 10 //进程的最大个数#define R 20 //初始化资源的最大种类个数int M=2 ; //总进程数int N=3 ; //资源种类char name[R]; //各资源的名称int MAX[W][R]; //M个进程对N类资源最大资源需求量int A V AILABLE[R]; //系统可用资源数int ALLOCATION[W][R]; //M个进程已经得到N类资源的资源量int NEED[W][R]; //M个进程还需要N类资源的资源量int Request[R]; //请求资源个数//int Work[R]; //存放系统可提供资源void Show() //显示资源矩阵{int i,j;printf("\n进程\t已占有的资源\t还需要的资源\t 可用的资源\t最大资源需求量\n");printf(" ");for(i=0;i<4;i++){for(j=0;j<N;j++){printf("%3c ",name[j]);}printf(" ");}printf("\n");for(i=0;i<M;i++){printf(" %d ",i);for(j=0;j<N;j++){printf("%3d ",ALLOCATION[i][j]);}printf(" ");for(j=0;j<N;j++){printf("%3d ",NEED[i][j]);}printf(" ");for(j=0;j<N;j++){printf("%3d ",A V AILABLE[j]);}printf(" ");for(j=0;j<N;j++){printf("%3d ",MAX[i][j]);}printf("\n");}}bool check()//安全性检查{//int WORK[R];int SAFE[W];static int P = 0;int i =0, j= 0;//循环控制bool FINISH[W] = {false,false,false,false,false,false,false,false,false,false};for(i = 0; i < M; i++)//外层循环:无论能否运行完毕,从零开始检查,直到都运行完毕或无法都无法执行{if(FINISH[i]){continue;}for(j = 0; j < N; j++){if(NEED[i][j]!=0) //>A V AILABLE[j]{break;}}SAFE[P++] = i;if(N == j) //i进程可以执行完毕,WORK = WORK + ALLOCATION,外层从零开始检查{FINISH[i] = true;//SAFE[P++] = i;for(int k = 0; k < N; k++){A V AILABLE[k]+= ALLOCATION[i][k];ALLOCATION[i][k]=0;}printf("第%d进程已经执行完毕",&i);}else{continue;}i = -1;}for(int k = 0; k < M; k++)//判断是否所有进程都运行完毕{if(!FINISH[k]){return false;}}printf("\n安全序列:{");for(i = 0; i < M; i++){printf(" %d",SAFE[i]);}printf(" }");P = 0;return true;}void main(){int i,j,flag;char ch='y';printf("===========================银行家算法============================\n\n");printf("*****************一、请分别输入%d个资源信息***********************\n",N);printf("\n");for(i=0;i<N;i++){printf("请输入第%d个资源的名称:",i);scanf("%s",&name[i]);printf("请输入第%d个资源的资源量(小于20的数):",i);scanf("%d",&A V AILABLE[i]);printf("\n");}printf("*****************二、请分别输入%d个进程信息***********************\n",M);printf("\n");do{flag=0;for(i=0;i<M;i++){for(j=0;j<N;j++){printf("请输入第%d个进程对%c类资源的最大需求量:",i,name[j]);scanf("%d",&MAX[i][j]);printf("请输入第%d个进程已分配的%c类资源的数量:",i,name[j]);scanf("%d",&ALLOCATION[i][j]);}}for(i=0;i<M&&flag!=1;i++){for(j=0;j<N&&flag!=1;j++){if(MAX[i][j]>A V AILABLE[j]||ALLOCATION[i][j]>MAX[i][j]){printf("sorry!您所输入的最大需求量超过系统的资源总量,或者申请的资源大于最大需求量!请重新输入!\n");flag=1;}else{NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];//需求的数目=最大需求-已分配A V AILABLE[j]=A V AILABLE[j]-ALLOCATION[i][j];//可分配的数目减去已经分配的数目}}}}while(flag);Show();while(ch=='y'||ch=='Y'){printf("*****************三、请输入请求资源的进程:***********************\n");scanf("%d",&i);do{flag=0;for(j=0;j<N;j++){printf("请输入请求资源%c的数量",name[j]);scanf("%d",&Request[j]);if(Request[j]>NEED[i][j]||Request[j]>A V AILABLE[j]){flag=1;printf("申请该类资源大于需求量,请重新输入!\n");}else{ALLOCATION[i][j]+=Request[j];NEED[i][j]-=Request[j];A V AILABLE[j]-=Request[j];}}check();Show();}while(flag);printf("是否继续请求资源(y/n)?");scanf("%s",&ch);}}四、实验过程中出现的问题及解决方法安全序列生成方面还要改进,是乱码。