银行家算法(操作系统)

《操作系统》实验报告题目:银行家算法班级:网络工程姓名:***学号:E********一、实验目的用代码实现银行家算法,了解通过银行家算法避免死锁的思想。

通过代码的具体实现,加深对算法的核心的理解。

二、实验原理我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

三、实验内容源程序:#include<stdio.h>#include<time.h>#include<stdlib.h>typedef struct Procedure{i nt Max[3]; //满足此进程需要三类资源的数量i nt Allocation[3]; //系统已经为该进程分配的资源情况i nt Need[3]; //该进程还需要资源数量i nt flag; //标志位,执行完之前为0,执行完之后为1 c har p; //在执行完之后,给出相应的编号,如P1,P2 s truct Procedure * pNext;}Pro,*PNODE; //如果系统资源足够多的话,那么所有的安全序列的数量就会是5*4*3*2*1=120个PNODE create_list(int &len);void traverse_list(PNODE pHead);int cnt_exe(PNODE pHead,int *system,int i); //计算目前系统能够执行的进程数int work(PNODE pHead,int *system);int main(){i nt ok;i nt len;s rand(time(0));i nt system[3] = {rand()%5+10,rand()%5+2,rand()%5+5}; p rintf("系统中可用的各类资源数分别为:%d %d %d\n",system[0],system[1],system[2]);P ro *pHead = create_list(len);t raverse_list(pHead);i nt cnt = cnt_exe(pHead,system,3);i f(cnt == 0){printf("对不起,不存在安全序列\n");return 0;}e lse{int ok = work(pHead,system);if(ok == len)printf("恭喜!存在安全序列!\n");elseprintf("很抱歉!不存在安全序列!\n"); }r eturn 0;}PNODE create_list(int &len){i nt i,j;c har c = 'A'; //用来临时存放用户输入的结点的值//分配了一个不存放有效数据的头结点P NODE pHead = (PNODE)malloc(sizeof(Pro));i f (NULL == pHead){printf("分配失败, 程序终止!\n");exit(-1);}P NODE pTail = pHead;p Tail->pNext = NULL;p rintf("请输入您需要生成的链表节点的个数:"); s canf("%d", &len);f or (i=0; i<len; ++i){PNODE pNew = (PNODE)malloc(sizeof(Pro));if (NULL == pNew){printf("分配失败, 程序终止!\n");exit(-1);}for(j=0;j<3;j++){pNew->Max[j] = rand()%5+4;pNew->Allocation[j] = rand()%5;pNew->Need[j] = pNew->Max[j] -pNew->Allocation[j];}pNew->flag = 0;pNew->p = c;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;c++;}r eturn pHead;}void traverse_list(PNODE pHead) {P NODE p = pHead->pNext;i nt i = 1;w hile (NULL != p){printf("第%d个资源的需要资源总数各为:%d %d %d",i, p->Max[0],p->Max[1],p->Max[2]);printf("\n");printf("第%d个资源已分配资源总数各为:%d %d %d",i, p->Allocation[0],p->Allocation[1],p->Allocation[2]);printf("\n");printf("第%d个资源还需要资源总数各为:%d %d %d",i, p->Need[0],p->Need[1],p->Need[2]);printf("\n");printf("\n");p = p->pNext;i++;}p rintf("\n");r eturn;}int cnt_exe(PNODE pHead,int *system,int i){P NODE p;p = pHead->pNext; //p指向第一个节点i nt count = 0;w hile(p != NULL){if(system[0] >= p->Need[0] && system[1] >= p->Need[1] && system[2] >= p->Need[2])count++;p = p->pNext;}r eturn count;}int work(PNODE pHead,int *system){P NODE p;p = pHead->pNext; //p指向第一个节点int ok = 0;w hile(p != NULL){if(system[0] >= p->Need[0] && system[1] >=p->Need[1] && system[2] >= p->Need[2]){system[0] += p->Allocation[0];system[1] += p->Allocation[1];system[2] += p->Allocation[2];p->flag = 1;ok++;printf("系统已经为您执行了进程:%c\n",p->p);PNODE q;q = pHead; //寻找q的前一个节点,方便删掉q 节点while( q->pNext != p ){q = q->pNext;}q->pNext = p->pNext;free(p);p = NULL;p = pHead->pNext;//p又重新指向第一个节点}elsep = p->pNext;}r eturn ok;}存在安全序列的情况:不存在安全序列的情况:四、实验小结用随机数为系统分配三类资源的个数,随后系统为每个作业分配每个资源需要的个数和已经分配的资源数量,那么还需要资源的数量则有最大分配量减去已经分配的数量。

系统在队列中寻找能满足当前条件的作业,运行完之后,将其资源释放,把各类资源重新还给系统。

把运行完之后的作业从队列中删除,系统再从队列开头重新寻找下一个能执行的作业。

如果中途遇到系统无法为任何一个作业运行提供条件时,则不存在安全序列,否则,存在安全序列。

本次实验我用一个变量检测作业数量,若执行完一个作业时,其数量加一,最后检测是否为总作业的个数。

是,则存在安全序列,否则,不存在。

通过本次试验,加深了我对银行家算法的核心的理解。

合集下载

操作系统银行家算法

操作系统银行家算法
在操作系统的资源分配问题中要解决的是:一组并发进程{P1,P2,⋯,Pn}共享一组临界资源{R1,R2,⋯,Rm},Ri指一类资源。;'前,有一个进程Pi向操作系统提出了资源请求Requesta=(rl,r2,⋯,rm)。若系统当前的可分配资源Available=(aba2,⋯,a.11)刁i能满足当前进程的资源请求,即4i符合条件Requesl卜<Available,则拒绝j‘铺百进程的资源请求,阻塞该进程;菪系统当前的可分配资源Available能满足当前进程的资源请求,即符合条件Requestt一<Available,是否分配给该进程所需资源呢?
死锁在操作系统中,是一个重要的概念,它不仅在操作系统中有提到,在数据库,以及只要涉及到并发操作的,几乎都提到了这个问题了……很多人为了解决死锁的困扰,也想出了很多办法,其中著名的就“有银行家算法”,以及“安全性检查算法”等等著名算法,这里,我盟就详细的说一下银行家算法。
银行家通过发放贷款而获取利润,要获取利润必须按时收㈦贷款本金和利息,即贷款企业要按时还本付息,而tI有各企业能不断获得所需资金最终完成项目才能还本付息。要避免的情况是:在某个时刻,备并行推进项目的企业均得到了一部分贷款,要使项目顺利推进还需要贷款,而银行家已经没有多余资金,从而导致各企业问循环等待埘方释放其占有的资金而使项目中断,造成一种僵滞局面,银行家冈收不回贷款而破产。操作系统的资源分配类似于银行家贷款。操作系统就像一个银行家,系统临界资源就像银行家的贷款本金,并发进程就像需要贷款的企业。冈此可把银行家规避风险的算法引入操作系统的资源分配,解决资源分配中的死锁问题。这就是银行家算法这一名称的由来。
这时,我们不得不提一下安全状态,安全状态是指如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。相反,当存在不存在一个安全序列。就有可能导致死锁。

操作系统 银行家算法

操作系统 银行家算法

操作系统银行家算法1. 简介1.1 定义:银行家算法是一种用于避免死锁的资源分配策略,通过判断当前状态是否安全来决定是否为进程提供所需资源。

1.2 目的:保证系统能够按照合理顺序进行并发执行,并防止出现死锁情况。

2. 死锁概述在多道程序环境下,当两个或更多进程因竞争有限数量的资源而无限等待时就会产生死锁。

常见原因包括互斥、占有和不可剥夺性以及循环等待条件。

3. 资源管理模型操作系统中使用了三类数据结构:- 可利用向量(Avlable):表示每种类型可被分配给各个进程实例数目;- 最大需求矩阵(Maximum):记录每个进程对某类资源最大需要量;- 分配矩阵(Allocation) :描述已经成功地将某些单位从总体汇集转移到具体过渡态;4. 进展与请求检查流程(Safety Algorithm)当一个新任务到达后,在满足以下所有条件之前不能接受它: a)如果存在这样一个i使得Request[i] > Need[i],则拒绝请求;b)如果存在这样一个i使得Request[i] > Avlable,则不接受该进程的资源申请。

5. 安全状态检查流程(Safety Algorithm)当新任务到达后,在满足以下所有条件之前不能接受它:a) 如果有某个j, 且Work[j]<Need_i[j], 则将p加入集合T中;b) 若对于每个p∈ T 都有Allocation[p]+ Work >= Need_p ,将p从T移到Finish,并释放其占用的全部资源。

6. 算法实现步骤1)初始化:定义Avlable、Max和Allocation矩阵以及Need数组;2)判断是否安全:使用银行家算法进行系统当前状态下是否会发生死锁的判断;3)处理用户请求:- 检查用户请求所需资源量与可利用向量(Avlable)比较,如大于可利用向量或者超过最大需求(Maximum),则拒绝分配给该进程;- 分配成功时更新相关数据结构(如Avlable、Allocation等);4)回收已完成进程所占据的资源并重新计算各项指标值。

操作系统实验二:银行家算法

操作系统实验二:银行家算法

操作系统实验⼆:银⾏家算法实验⼆银⾏家算法⼀、实验⽬的1、了解什么是操作系统安全状态和不安全状态;2、了解如何避免系统死锁;3、理解银⾏家算法是⼀种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。

⼆、实验内容根据银⾏家算法的基本思想,编写和调试⼀个实现动态资源分配的模拟程序,并能够有效避免死锁的发⽣。

三、实验原理进程申请资源时,系统通过⼀定的算法判断本次申请是否不可能产⽣死锁(处于安全状态)。

若可能产⽣死锁(处于不安全状态),则暂不进⾏本次资源分配,以避免死锁。

算法有著名的银⾏家算法。

1、什么是系统的安全状态和不安全状态?所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直⾄最⼤需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。

如果不存在这样的安全序列,则称系统处于不安全状态。

2、银⾏家算法把操作系统看作是银⾏家,操作系统管理的资源相当于银⾏家管理的资⾦,进程向操作系统请求分配资源相当于⽤户向银⾏家贷款。

为保证资⾦的安全,银⾏家规定:(1) 当⼀个顾客对资⾦的最⼤需求量不超过银⾏家现有的资⾦时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最⼤需求量;(3) 当银⾏家现有的资⾦不能满⾜顾客尚需的贷款数额时,对顾客的贷款可推迟⽀付,但总能使顾客在有限的时间⾥得到贷款;(4) 当顾客得到所需的全部资⾦后,⼀定能在有限的时间⾥归还所有的资⾦。

操作系统按照银⾏家制定的规则设计的银⾏家算法为:(1)进程⾸次申请资源的分配:如果系统现存资源可以满⾜该进程的最⼤需求量,则按当前的申请量分配资源,否则推迟分配。

(2)进程在执⾏中继续申请资源的分配:若该进程已占⽤的资源与本次申请的资源之和不超过对资源的最⼤需求量,且现存资源能满⾜该进程尚需的最⼤资源量,则按当前申请量分配资源,否则推迟分配。

(3)⾄少⼀个进程能完成:在任何时刻保证⾄少有⼀个进程能得到所需的全部资源⽽执⾏到结束。

操作系统——银行家算法(java实现)

操作系统——银行家算法(java实现)

操作系统——银⾏家算法(java实现)1.数据结构1. 可利⽤的资源向量Available:⼀个含有m个元素的数组,其中每⼀个元素代表⼀类可利拥的资源数⽬,其初始值是系统中所配置的该类全部可⽤资源数⽬,其数值随该类资源的分配改变⽽改变。

如果Available[j]=K,则表⽰系统中现有R j类资源K个。

2. 最⼤需求矩阵Max:⼀个n×m的矩阵,它定义了系统中n个进程中的每⼀个进程对m类资源的最⼤需求。

如果Max[i,j]=K,则表⽰进程i需要R j类资源的最⼤数⽬为K。

3. 分配矩阵Allocation:⼀个n×m的矩阵,它定义了系统中每⼀类资源当前已分配给每⼀进程的资源数。

如果Allocation[i,j]=K,则表⽰进程i当前已分得R j类资源的数⽬为K。

4. 需求矩阵Need:⼀个n×m的矩阵,⽤以表⽰每⼀个进程尚需的各类资源数。

如果Need[i,j]=K,则表⽰进程i还需要R j类资源K个⽅能完成其任务。

Need[i,j]=Max[i,j]-Allocation[i,j]2.银⾏家算法在避免死锁的⽅法中,所施加的限制条件较弱,有可能获得令⼈满意的系统性能。

在该⽅法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发⽣死锁。

银⾏家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。

它是最具有代表性的避免死锁的算法。

设进程cusneed提出请求REQUEST [i],则银⾏家算法按如下规则进⾏判断。

(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。

(2)如果REQUEST [cusneed] [i]<= AVAILABLE[i],则转(3);否则,等待。

(3)系统试探分配资源,修改相关数据:AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系统执⾏安全性检查,如安全,则分配成⽴;否则试探险性分配作废,系统恢复原状,进程等待。

#操作系统课程设计-银行家算法(流程图 源代码 设计报告)

#操作系统课程设计-银行家算法(流程图 源代码 设计报告)

操作系统课程设计-银行家算法(流程图+源代码+设计报告)一、实验目的:熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。

二、实验要求:用高级语言编写和调试一个描述银行家算法的程序。

三、实验内容:1、设计一个结构体,用于描述每个进程对资源的要求分配情况。

包括:进程名——name[5],要求资源数目——command[m](m类资源),还需要资源数目——need[m],已分配资源数目——allo[m]。

2、编写三个算法,分别用以完成:①申请资源;②显示资源;③释放资源。

(动态完成)四、程序流程图五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改# define NP 10*//* # define NS 5 */ /*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*//*四、程序流程图:五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改#define NP10*//* #define NS5*//*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/ #include "string.h"#include "stdio.h"#include"dos.h"#include"conio.h"#define MOVEIN1#define GUIYUE2#define ACC3#define OK1#define ERROR0#define MAXSH7#define MAXSHL10#define MAXINPUT50#define maxsize 100int act;int ip=0;int line=0; /*line为要写的行号,全局变量*/int writeok;int right;char wel[30]={"Welcome To Use An_Li System"};char ente[76]={" 警告:未经作者同意不得随意复制更改!"};char rights[40]={"Copyright (c)2002"};struct date today;sssssssssssss;ttttttttttttt{int data[maxsize];int top;}stack;int emptystack(stack*S){if(S->top==48&&S->data[S->top]==35)return(1); /*35is'#'*/else return(0);}int push(stack*S,int x){if(S->top>=maxsize-1)return(-1);else{S->top++;S->data[S->top]=x;return(0);}int gettop(stack*S){return S->data[S->top];}int pop(stack*S){if(emptystack(S)){printf("the stack is empty\n");exit(1);}else S->top--;return S->data[S->top+1];}void initstack(stack*S){int i;S->top=0;S->data[S->top]=35;}/*****模拟打字机的效果*********/delay_fun(){int i;void music();for(i=0;;i++){if(wel!='\0'){delay(1000);textcolor(YELLOW);gotoxy(26+i,8);cprintf("%c",wel);printf("谢谢");printf("网络");music(1,60);}else break;}delay(500000);for(i=0;;i++){if(ente!='\0'){delay(1000);textcolor(RED);/*显示警告及版权*/gotoxy(2+i,11);cprintf("%c",ente);}else break;}delay(40000);for(i=0;;i++){if(rights!='\0'){delay(1000);textcolor(YELLOW);gotoxy(30+i,14);cprintf("%c",rights);music(1,60);}elsebreak;}getch();}/*********登陆后的效果**********/ logined(){int i;clrscr();gotoxy(28,10);textcolor(YELLOW);cprintf("程序正在载入请稍候....."); gotoxy(35,12);for(i=0;i<=50;i++){gotoxy(40,12);delay(8000);cprintf("%02d%已完成",i*2);gotoxy(i+15,13);cprintf("\n");cprintf("|");}main0();}/*********对PC扬声器操作的函数****/void music(int loop,int f)/*f为频率*/ {int i;for(i=0;i<30*loop;i++){sound(f*20);}int analys(int s,int a){int hh,pos;switch(a){case(int)'i':hh=0;break;case(int)'+':hh=1;break;case(int)'*':hh=2;break;case(int)'(':hh=3;break;case(int)')':hh=4;break;case(int)'#':hh=5;break;case(int)'E':hh=6;break;case(int)'T':hh=7;break;case(int)'F':hh=8;break;default:{printf("\n analys()分析发现不该有的字符%c!(位置:%d)",a,ip+1); writeerror('0',"\n............分析出现错误!!!");writeerror(a,"\n 错误类型: 不该有字符");printf("谢谢");printf("网");return ERROR;}}pos=(s-48)*10+hh;switch(pos){case3:case43:case63:case73:act=4;return MOVEIN;case0:case40:case60:case70:act=5;return MOVEIN;case11:case81:act=6;return MOVEIN;case92:case22:act=7;return MOVEIN;case84:act=11;return MOVEIN;/*-------------------------------------------*/case91:case94:case95:act=1;return GUIYUE;case21:act=2;return GUIYUE;case101:case102:case104:case105:act=3;return GUIYUE;case31:case32:case34:case35:act=4;return GUIYUE;case111:case112:case114:case115:act=5;return GUIYUE;case51:case52:case54:case55:act=6;return GUIYUE;/*+++++++++++++++++*/case15:return ACC;/*******************************/case6:return1;case7:case47:return2;case8:case48:case68:return3;case46:return8;case67:return9;case78:return10;default:{if(a=='#')printf("");else printf("\n analys() 分析发现字符%c 不是所期望的!(位置:%d)",a,ip+1);writeerror('0',"\n...........分析出现错误!!!");writeerror(a,"\n 错误类型: 字符");writeerror('0'," 不是所期望的!");printf("谢谢");printf("网");return ERROR;}}}int writefile(int a,char*st){FILE*fp;fp=fopen("an_slr.txt","a");{fprintf(fp,"%s",st); /*若a==-1则为添加的注释*/}else if(a==-2){getdate(&today);gettime(&now);fprintf(fp,"\n测试日期:%d-%d-%d",today.da_year,today.da_mon,today.da_day);测试时间:%02d:%02d:%02d",now.ti_hour,now.ti_min,now.ti_sec); fprintf(fp,"}else if(a>=0)fprintf(fp,"\n step:%02d,%s",a,st);writeok=1;fclose(fp);}return writeok;}int writeerror(char a,char*st) /*错误类型文件*/{FILE*fpp;fpp=fopen("an_slr.txt","a");if(fpp==0){printf("\nwrite error!!");writeok=0;}else{if(a=='0')fprintf(fpp,"%s",st); /*若a=='0' 则为添加的注释*/else fprintf(fpp,"%s\'%c\'(位置:%d)",st,a,ip+1);writeok=1;fclose(fpp);}return writeok;}/*^^^^^^^^^^^^^^^^^^^^^^*/main0(){int an,flag=1,action,lenr;char a,w[MAXINPUT];int len,s,ss,aa,ana;stack*st;char r[MAXSH][MAXSHL];/*初始化产生式*/strcpy(r[0],"S->E");strcpy(r[1],"E->E+T");strcpy(r[2],"E->T");strcpy(r[3],"T->T*F");strcpy(r[4],"T->F");strcpy(r[5],"F->(E)");strcpy(r[6],"F->i");clrscr();printf("\nplease input analyse string:\n");gets(w);len=strlen(w);w[len]='#';w[len+1]='\0';push(st,48); /*(int)0 进栈*/writefile(-1,"\n------------------------SLR(1)词法分析器-------------------------"); writefile(-1,"\n计本003 安完成于2003.01.1214:04"); writefile(-1,"\n谢谢");writefile(-1,"网");writefile(-1,"\n 以下为串");writefile(-1,w);writefile(-1,"('#'为系统添加)的分析结果:");writefile(-2,"");do{s=gettop(st);aa=(int)w[ip];action=analys(s,aa);if(action==MOVEIN){ss=48+act;push(st,aa);push(st,ss); /*if ss=4int=52*/ip++;}else if(action==GUIYUE){lenr=strlen(r[act])-3;for(an=0;an<=2*lenr-1;an++)pop(st); /*#0 */s=gettop(st); /*s=0*/push(st,(int)r[act][0]);/*将产生式左端F 进栈*/ana=analys(s,(int)r[act][0])+48;if(ana>59)printf("\分析出错:ana>59!!!");push(st,ana);/*analys(s,aa)即为goto(s',aa)*/if((line+1)%20==0){printf("\nThis screen is full,press any key to continue!!!");getche();clrscr();}printf("step%02d: %s\n",line++,r[act]);writefile(line,r[act]);}else if(action==ACC){flag=0;right=1;}else if(action==ERROR){flag=0;right=0;}/*接受成功*/else{flag=0;right=0;}/* 出错*/}while(flag==1);if(right==1)printf("\nok,输入串%s 为可接受串!!",w);if(right==0)printf("\nsorry,输入串%s 分析出错!!",w);if(writeok==1){printf("\nAnWin soft have wrote a file an_slr.txt");if(right==1)writefile(-1,"\n最终结果:输入串为可接受串!");}}main() /*主函数*/{clrscr();delay_fun();logined();}六、测试报告-操作系统课程设计-银行家算法(流程图+源代码+设计报告)六、测试报告:(测试结果保存于系统生成的an.txt 文件中)以下为课本上的实例::-------------------------------------------------------------------------------------========================银行家算法测试结果=========================-------------------------------------------------------------------------------------T0 时刻可用资源(Available)A:3,B:3,C:2测试日期:2003-6-28请求分配时间:14:07:29经测试,可为该进程分配资源。

操作系统银行家算法

操作系统银行家算法

一、实验目的银行家算法是由Dijkstra设计的最具代表性的避免死锁的算法,本实验要求用高级语言编写一个银行家的模拟算法,通过本实验可以对预防死锁和银行家算法有更深刻的认识。

二、实验仪器设备三、实验内容1.设置数据结构包括可利用资源向量(Availiable),最大需求矩阵(MAX),分配矩阵(Allocation),需求矩阵(Need)2.设计安全性算法设置工作向量Work表示系统可提供进程继续运行可利用资源数目,Finish表示系统是否有足够的资源分配给进程。

四、实验代码#include<string.H>#include<stdio.h>#include<stdlib.h>#include<conio.H>/*用到了getch()*/#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 A V AILABLE[N]={3,3,2};/*M个进程已分配到的N类数量*/int ALLOCATION[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; /*M个进程已经得到N类资源的资源量*/int NEED[M][N]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};/*M个进程还需要N类资源的资源量*/int Request[N]={0,0,0};void main(){int i=0,j=0;char k;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("类别:ABC\n");printf("");for(j=0;j<N;j++){scanf("%d",&Request[j]);if(Request[j]>NEED[i][j]){printf("%d",i);printf("号进程");printf("申请的资源数>进程");printf("%d",i);printf("还需要");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); goto err;}else{if(Request[j]>A V AILABLE[j]){printf("进程");printf("%d",i);printf("申请的资源数大于系统可用");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); goto err;}}}}changdata(i);if(chkerr(i)){rstordata(i);showdata();}elseshowdata();printf("\n");printf("按'y'或'Y'键继续,否则退出\n");flag=getch();if(flag=='y'||flag=='Y'){goto enter;}else{exit(0);}}/*显示数组*/void showdata(){int i,j;printf("系统可用资源向量:\n");printf("***Available***\n");printf("资源类别:ABC\n");printf("资源数目:");for(j=0;j<N;j++){printf("%d",A VAILABLE[j]);}printf("\n");printf("\n");printf("各进程还需要的资源量:\n"); printf("******Need******\n");printf("资源类别:ABC\n");for(i=0;i<M;i++){printf("");printf("%d",i);printf("号进程:");for(j=0;j<N;j++){printf("%d",NEED[i][j]);}printf("\n");}printf("\n");printf("各进程已经得到的资源量:\n"); printf("***Allocation***\n");printf("资源类别:ABC\n");for(i=0;i<M;i++){printf("");printf("%d",i);printf("号进程:");/*printf(":\n");*/for(j=0;j<N;j++){printf("%d",ALLOCATION[i][j]);}printf("\n");}printf("\n");}/*系统对进程请求响应,资源向量改变*/void changdata(int k){int j;for(j=0;j<N;j++){A V AILABLE[j]=A V AILABLE[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<N;j++){A V AILABLE[j]=A V AILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCA TION[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;for(i=0;i<M;i++)FINISH[i]=FALSE;for(j=0;j<N;j++){WORK=A V AILABLE[j];i=s;while(i<M){if(FINISH[i]==FALSE&&NEED[i][j]<=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;temp[k]=i;k++;i=0;}else{i++;}}for(i=0;i<M;i++)if(FINISH[i]==FALSE){printf("\n");printf("系统不安全!本次资源申请不成功!\n");printf("\n");return 1;}}printf("\n");printf("经安全性检查,系统安全,本次分配成功。

(完整word版)计算机操作系统银行家算法实验报告

计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的.若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。

若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。

2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待.(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available—Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态.3、安全性算法步骤:(1)设置两个向量①工作向量Work。

它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。

它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true.(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②Need〈or=Work如找到,执行步骤(3);否则,执行步骤(4)。

(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向步骤(2).(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。

操作系统课程设计银行家算法参考

3 课程设计三银行家算法(参考1)1设计目的(1)了解多道程序系统中,多个进程并发执行的资源分配。

(2)掌握死锁产生的原因、产生死锁的必要条件和处理死锁的基本方法。

(3)掌握预防死锁的方法,系统安全状态的基本概念。

(4)掌握银行家算法,了解资源在进程并发执行中的资源分配策略。

(5)理解避免死锁在当前计算机系统不常使用的原因。

2.算法描述Dijkstra(1965年)提出了一种能够避免死锁的调度方法,称为银行家算法,它的模型基于一个小城镇的银行家,现将该算法描述如下:假定一个银行家拥有资金,数量为Σ,被N个客户共享。

银行家对客户提出下列约束条件:(1)每个客户必须预先说明自已所要求的最大资金量;(2)每个客户每次提出部分资金量申请各获得分配;(3)如果银行满足了客户对资金的最大需求量,那么,客户在资金动作后,应在有限时间内全部归还银行。

只要每个客户遵守上述约束,银行家将保证做到:若一个客户所要求的最大资金量不超过Σ,则银行一定接纳该客户,并可处理他的资金需求;银行在收到一个客户的资金申请时,可能因资金不足而让客户等待,但保证在有限时间内让客户获得资金。

在银行家算法中,客户可看做进程,资金可看做资源,银行家可看做操作系统。

3. 环境操作系统Windows XP SP2,开发工具VC++6.0或者BCB6.0。

4 功能模块说明1.银行家所能够提供的资源typedef struct node{int a;int b;int c;int remain_a;int remain_b;int remain_c;}bank;2.进程所占用的资源typedef struct node1{char name[20];int a;int b;int c;int need_a;int need_b;int need_c;}process;main()函数:完成对系统运行环境的初始化,定义了简单的选择菜单,调用各功能函数。

操作系统之银行家算法

操作系统之银⾏家算法
银⾏家算法
银⾏家算法是解决死锁问题的。

那么怎么解决呢? 死锁的⼀个原因就是互斥资源, 如上图,有A,B,C三个资源,数量分别是
10,5,7,MAX表⽰的是每个进程需要该资源,需要多少,Allocation表⽰现在分配了多少,Need表⽰他们还需要多少,⾃然Max-
Allocation就能算出need。

那么怎样算Available呢?某个资源⼀共有的减去分配了的,就是当前可⽤的。

work表⽰当前可⽤的资源的数⽬,刚开始肯定就是3 3 2,这个表⽰我们的系统中的资源还剩多少,然后判断可以分配给哪个进程,把这个进程的名字写在前⾯,然后need就是这个进程需要的资源数,Allocation是这个进程当前分配了多少,work+Allocation为把两个加起来,意思就是系统执⾏这个进程,完了以后会释放之前分配给他的,然后这个系统中当前有的资源数就是work+Allocation。

执⾏完,最后的work+Allocation应该跟刚
开始系统的资源数相同。

「怎样判断系统是否安全呢?」 如果每个进程都能执⾏,也就是finish都为true,那么这个系统就是安全的,反之就不安全。

P1发出请求向量,是在他原来需要的1 2 2⾥,先要请求1 0 2,所以先要判断请求的向量是不是⽐需要的多,如果多肯定是不对的。

第⼆步,请求的向量需要⽐当前可⽤的少,这两个条件都满⾜以后,我们就把Allocation的向量增加请求向量,把Need向量减少请求向量,然后继续进⾏计算。

计算机操作系统的银行家算法

计算机操作系统的银行家算法计算机操作系统的银行家算法相信很多小伙伴都一知半解,下面由小编为大家整理了计算机操作系统的银行家算法的相关知识,希望对大家有帮助!计算机操作系统的银行家算法一、需求分析1、进程的状态有:就绪,等待和完成。

当系统不能满足进程的资源请求时,进程出于等待状态。

资源需求总量表示进程运行过程中对资源的总的需求量。

已占资源量表示进程目前已经得到但还为归还的资源量。

因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。

陷入每个进程的资源需求总量不应超过系统拥有的资源总量。

2、银行家算法分配资源的原则是:当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。

若能,则让进程等待,否则,让进程的假分配变为真分配。

(1)查找各进程的剩余请求,检查系统的剩余资源量是否能满足其中一进程,如果能,则转B)。

(2)将资源分配给所选的进程,这样,该进程已获得资源最大请求,最终能运行完成。

标记这个进程为终止进程,并将其占有的全部资源归还给系统。

重复第(1)步(2)步,直到所有进程都标记为终止进程,或知道一个死锁发生。

若所有进程都标记为终止进程,则系统的初始状态是安全的,否则为不安全的。

若安全,则正式将资源分配给它,否则,假定的分配作废,让其等待。

二、系统结构设计1、设计分析当某个进程对某类资源提出请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。

若能,则让进程等待,否则,让进程的假分配变为真分配。

2、数据结构(1)可利用资源向量Available。

这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可利用资源的数目,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可利用资源的数目,其数值随该类资源的分配和回首而动态的改变,如果Available=K,则代表Rj类资源K个。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档