银行家算法详细流程
银行家算法c语言流程图代码全

——银行家算法
院系 班级 学号 姓名
计算机与软件学院 08 软件工程 2 班
20081344066 何丽茗
一、实验目的
银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法 程序�进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念�并掌握避免死锁 的具体实施方法。
四、实验代码以及运行示例
1. 源代码�
#include<iostream>
#include<string.h>
#include<stdio.h>
#define False 0
#define True 1
using namespace std;
intMax[100][100]={0};//各进程所需各类资源的最大需求
for(j=0;j<N;j++)
cout<<Allocation[i][j]<<" ";
cout<<" ";
for(j=0;j<N;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
}
intchangdata(inti)//进行资源分配 {
int j; for (j=0;j<M;j++) {
Y
i加1
提示 错误 重新 输入
所有进程运行 都结束
结束
初始化 need 矩阵 Y Need 矩阵为 0
N
任选一个进程作为当前进程
Need 向量为 0 N
操作系统实验二:银行家算法

操作系统实验⼆:银⾏家算法实验⼆银⾏家算法⼀、实验⽬的1、了解什么是操作系统安全状态和不安全状态;2、了解如何避免系统死锁;3、理解银⾏家算法是⼀种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。
⼆、实验内容根据银⾏家算法的基本思想,编写和调试⼀个实现动态资源分配的模拟程序,并能够有效避免死锁的发⽣。
三、实验原理进程申请资源时,系统通过⼀定的算法判断本次申请是否不可能产⽣死锁(处于安全状态)。
若可能产⽣死锁(处于不安全状态),则暂不进⾏本次资源分配,以避免死锁。
算法有著名的银⾏家算法。
1、什么是系统的安全状态和不安全状态?所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直⾄最⼤需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。
如果不存在这样的安全序列,则称系统处于不安全状态。
2、银⾏家算法把操作系统看作是银⾏家,操作系统管理的资源相当于银⾏家管理的资⾦,进程向操作系统请求分配资源相当于⽤户向银⾏家贷款。
为保证资⾦的安全,银⾏家规定:(1) 当⼀个顾客对资⾦的最⼤需求量不超过银⾏家现有的资⾦时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最⼤需求量;(3) 当银⾏家现有的资⾦不能满⾜顾客尚需的贷款数额时,对顾客的贷款可推迟⽀付,但总能使顾客在有限的时间⾥得到贷款;(4) 当顾客得到所需的全部资⾦后,⼀定能在有限的时间⾥归还所有的资⾦。
操作系统按照银⾏家制定的规则设计的银⾏家算法为:(1)进程⾸次申请资源的分配:如果系统现存资源可以满⾜该进程的最⼤需求量,则按当前的申请量分配资源,否则推迟分配。
(2)进程在执⾏中继续申请资源的分配:若该进程已占⽤的资源与本次申请的资源之和不超过对资源的最⼤需求量,且现存资源能满⾜该进程尚需的最⼤资源量,则按当前申请量分配资源,否则推迟分配。
(3)⾄少⼀个进程能完成:在任何时刻保证⾄少有⼀个进程能得到所需的全部资源⽽执⾏到结束。
简述银行家算法

简述银行家算法银行家算法,也称为银行家安全算法,是一种用于避免系统资源的死锁现象的算法。
在操作系统中,当多个进程需要同时访问同一组资源并且它们的访问不可分割时,就会产生死锁现象。
在这种情况下,所有的进程都会被阻塞,无法进行任何工作。
银行家算法通过对系统资源的分配和管理,可以避免死锁现象的发生。
它主要包括以下几个步骤:1. 初始化系统:在系统启动时,需要确定每种类型的资源的数量和可用数量,并记录每个进程需要的最大资源数和已经分配的资源数。
2. 进行资源请求:当一个进程需要资源时,会向系统发送一个资源请求。
该请求指定了进程需要的资源类型和数量。
如果系统中有足够的资源可以分配给该进程,那么分配成功并将资源分配给该进程。
3. 检查资源分配是否安全:在分配资源之前,需要检查分配后系统是否处于安全状态。
安全状态是指在分配后,所有进程都能够完成它们的工作并释放所有资源。
如果系统处于安全状态,则分配资源并通知进程可以执行它们的任务。
4. 回收资源:当进程完成任务后,会释放它所占用的所有资源并通知系统。
系统会将这些资源重新分配给其他进程。
在银行家算法中,对于每个进程,都会维护一个资源请求向量和一个安全向量。
资源请求向量包含了进程当前所需要的资源数量,安全向量包含了系统中未分配的资源数量。
当系统收到一个资源请求时,会将该请求向量加入到系统资源向量中,并检查是否存在一个安全序列,该安全序列满足所有进程都可以完成它们的任务并释放它们所占用的所有资源。
如果存在这样的安全序列,则分配资源并通知进程可以执行它们的任务;如果不存在,则拒绝资源请求并等待其他进程的资源释放。
通过使用银行家算法,可以避免系统中的死锁现象,保证所有进程都可以完成它们的任务。
这种算法被广泛应用于操作系统和其他复杂的软件系统中,是保障系统安全性的重要工具。
3.14 银行家算法程序实现

3.14.4 银行家算法流程图
3.14.5 安全性算法流程图
3.14.6 算法C语言实现展示
3.14.6 算法JS实现展示
CH 3.14 银行家算法程序实现
3.14.1 银行家算法所需数据结构
(1) 可利用资源向量Available。 (2) 最大需求矩阵Max。 (3) 分配矩阵Allocation。 (4) 需求矩阵Need。
3.14.2 银行家算法
进程i发出请求资源申请, (1)如果Request [j]<=need[i,j],转向步骤(2),否则认为出错,因为他所需要的资源数已经超过它所
时先做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都满足,则表示系统处于安全状态,否则,处于不安全状态。
宣布的最大值。
(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()函数检查此次资源分配后系统是否处于安全状态。 若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该 进程等待。
操作系统课程设计-银行家算法(流程图+源代码+设计报告)

操作系统课程设计-银行家算法(流程图+源代码+设计报告)一、实验目的:熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。
二、实验要求:用高级语言编写和调试一个描述银行家算法的程序。
三、实验内容: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 NP 10*//* # define NS 5 */ /*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/ #include "string.h"#include "stdio.h"#include "dos.h"#include "conio.h"#define MOVEIN 1#define GUIYUE 2#define ACC 3#define OK 1#define ERROR 0#define MAXSH 7#define MAXSHL 10#define MAXINPUT 50#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;struct time now;typedef struct{int data[maxsize];int top;}stack;int emptystack(stack *S){if(S->top==48&&S->data[S->top]==35)return(1); /*35 is '#'*/ 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);music(1,60);}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);delay(200);}nosound();}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){case 3:case 43:case 63:case 73:act=4;return MOVEIN;case 0:case 40:case 60:case 70:act=5;return MOVEIN;case 11:case 81: act=6;return MOVEIN;case 92:case 22:act=7;return MOVEIN;case 84:act=11;return MOVEIN;/*-------------------------------------------*/ case 91:case 94:case 95:act=1;return GUIYUE;case 21:case 24:case 25:act=2;return GUIYUE;case 101:case 102:case 104:case 105:act=3;return GUIYUE;case 31:case 32:case 34:case 35:act=4;return GUIYUE;case 111:case 112:case 114:case 115:act=5;return GUIYUE;case 51:case 52:case 54:case 55:act=6;return GUIYUE;/*+++++++++++++++++*/case 15:return ACC;/*******************************/case 6:return 1;case 7:case 47:return 2;case 8:case 48:case 68:return 3;case 46:return 8;case 67:return 9;case 78:return 10;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");if(fp==0){printf("\nwrite error!!");writeok=0;}else{if(a==-1){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); fprintf(fp," 测试时间:%02d:%02d:%02d",now.ti_hour,now.ti_min,now.ti_sec);}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';initstack(st);push(st,48); /* (int)0 进栈*/writefile(-1,"\n------------------------SLR(1)词法分析器-------------------------");writefile(-1,"\n 计本003 安完成于2003.01.12 14: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=4 int =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经测试,可为该进程分配资源。
银行家算法原理

银行家算法原理银行家算法(BankerAlgorithm)是一种非常传统的算法,它可以帮助计算机系统解决资源分配问题。
银行家算法在现在的计算机系统应用中仍然占有很大优势,它的特点是简单、安全、可靠,有效的利用资源,且它只是做出最基本的分配策略,不仅可以帮助计算机系统解决资源分配问题,而且还具有不倒置和安全性等优点。
银行家算法的基本原理是把关于资源分配问题建模成一个系统。
系统中有n个进程(process),每个进程都有m种资源,包括可用资源A和最大需求量M。
每个进程可以有三种状态:运行状态(Running)、可安全状态(Safe)和不安全状态(Unsafe)。
当系统在给定资源总量的情况下,申请资源时,就需要采用银行家算法,这个算法先检查当前系统是否进入了可安全状态,如果是的话就可以正确的分配资源;如果不是的话就会拒绝该申请,避免资源被滥用并导致系统崩溃。
银行家算法的具体操作步骤如下:(1)首先,系统需要先初始化资源总量A,同时还要记录每个进程的最大需求量M;(2)当某个进程申请资源时,系统首先计算出当前可用资源A 与该进程的最大需求量M的差值,如果该进程仍然需要资源,那么系统就对该进程重新计算最大需求量M,并计算出当前可用资源A与该进程的最大需求量M的差值;(3)如果当前可用资源A大于某个进程的最大需求量M,那么就说明该进程进入可安全状态,此时就可以向该进程分配资源;(4)否则,如果当前可用资源A小于某个进程的最大需求量M,那么就说明该进程处于不安全状态,此时需要将该进程挂起,直到有其他进程释放资源,让当前可用资源A大于该进程的最大需求量M;(5)反复进行(2)~(4)的步骤,直到系统中所有的进程都处于可安全状态,那么系统就成功的解决了资源分配问题。
银行家算法的应用范围也是广泛的,它的主要用途是解决分布式系统中的多进程并发抢占共享资源的问题,例如分配内存,处理文件,调度任务等等。
总的来说,银行家算法的应用很广泛,它可以有效的帮助计算机系统解决资源分配问题,其原理和操作步骤也很容易理解,这让它在现在的计算机系统应用中仍然得到了很大的重视。
银行家算法用C语言编写.全部程序

银行家算法银行家算法是一种最有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。
不安全状态不一定导致死锁。
那么什么是安全序列呢?安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
银行家算法:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
算法:n:系统中进程的总数m:资源类总数Available: ARRAY[1..m] of integer;Max: ARRAY[1..n,1..m] of integer;Allocation: ARRAY[1..n,1..m] of integer;Need: ARRAY[1..n,1..m] of integer;Request: ARRAY[1..n,1..m] of integer;符号说明:Available 可用剩余资源Max 最大需求Allocation 已分配资源Need 需求资源Request 请求资源当进程pi提出资源申请时,系统执行下列步骤:(“=”为赋值符号,“==”为等号)step(1)若Request<=Need, goto step(2);否则错误返回step(2)若Request<=Available, goto step(3);否则进程等待step(3)假设系统分配了资源,则有:Available=Available-Request;Allocation=Allocation+Request;Need=Need-Request若系统新状态是安全的,则分配完成若系统新状态是不安全的,则恢复原状态,进程等待为进行安全性检查,定义数据结构:Work:ARRAY[1..m] of integer;Finish:ARRAY[1..n] of Boolean;安全性检查的步骤:step (1):Work=Available;Finish=false;step (2) 寻找满足条件的i:a.Finish==false;b.Need<=Work;如果不存在,goto step(4)step(3)Work=Work+Allocation;Finish=true;goto step(2)step (4) 若对所有i,Finish=true,则系统处于安全状态,否则处于不安全状态/* 银行家算法,操作系统概念(OS concepts Six Edition)reedit by Johnny hagen,SCAU,run at vc6.0*/#include "malloc.h"#include "stdio.h"#include "stdlib.h"#define alloclen sizeof(struct allocation)#define maxlen sizeof(struct max)#define avalen sizeof(struct available)#define needlen sizeof(struct need)#define finilen sizeof(struct finish)#define pathlen sizeof(struct path)struct allocation{int value;struct allocation *next;};struct max{int value;struct max *next;};struct available /*可用资源数*/{int value;struct available *next;};struct need /*需求资源数*/{int value;struct need *next;};struct path{int value;struct path *next;};struct finish{int stat;struct finish *next;};int main(){int row,colum,status=0,i,j,t,temp,processtest;struct allocation *allochead,*alloc1,*alloc2,*alloctemp;struct max *maxhead,*maxium1,*maxium2,*maxtemp;struct available*avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1; struct need *needhead,*need1,*need2,*needtemp;struct finish *finihead,*finish1,*finish2,*finishtemp;struct path *pathhead,*path1,*path2;printf("\n请输入系统资源的种类数:");scanf("%d",&colum);printf("请输入现时内存中的进程数:");scanf("%d",&row);printf("请输入已分配资源矩阵:\n");for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("请输入已分配给进程p%d 的%c 种系统资源:",i,'A'+j);if(status==0){allochead=alloc1=alloc2=(struct allocation*)malloc(alloclen);alloc1->next=alloc2->next=NULL;scanf("%d",&allochead->value);status++;}else{alloc2=(struct allocation *)malloc(alloclen);scanf("%d,%d",&alloc2->value);if(status==1){allochead->next=alloc2;status++;}alloc1->next=alloc2;alloc1=alloc2;}}}alloc2->next=NULL;status=0;printf("请输入最大需求矩阵:\n");for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("请输入进程p%d 种类%c 系统资源最大需求:",i,'A'+j); if(status==0){maxhead=maxium1=maxium2=(struct max*)malloc(maxlen); maxium1->next=maxium2->next=NULL;scanf("%d",&maxium1->value);status++;}else{maxium2=(struct max *)malloc(maxlen);scanf("%d,%d",&maxium2->value);if(status==1){maxhead->next=maxium2;status++;}maxium1->next=maxium2;maxium1=maxium2;}}maxium2->next=NULL;status=0;printf("请输入现时系统剩余的资源矩阵:\n");for (j=0;j<colum;j++){printf("种类%c 的系统资源剩余:",'A'+j);if(status==0){avahead=available1=available2=(struct available*)malloc(avalen); workhead=work1=work2=(struct available*)malloc(avalen); available1->next=available2->next=NULL;work1->next=work2->next=NULL;scanf("%d",&available1->value);work1->value=available1->value;status++;}else{available2=(struct available*)malloc(avalen);work2=(struct available*)malloc(avalen);scanf("%d,%d",&available2->value);work2->value=available2->value;if(status==1){avahead->next=available2;workhead->next=work2;status++;}available1->next=available2;available1=available2;work1->next=work2;work1=work2;}}available2->next=NULL;work2->next=NULL;status=0;alloctemp=allochead;maxtemp=maxhead;for(i=0;i<row;i++)for (j=0;j<colum;j++)if(status==0){needhead=need1=need2=(struct need*)malloc(needlen); need1->next=need2->next=NULL;need1->value=maxtemp->value-alloctemp->value; status++;}else{need2=(struct need *)malloc(needlen);need2->value=(maxtemp->value)-(alloctemp->value);if(status==1){needhead->next=need2;status++;}need1->next=need2;need1=need2;}maxtemp=maxtemp->next;alloctemp=alloctemp->next;}need2->next=NULL;status=0;for(i=0;i<row;i++){if(status==0){finihead=finish1=finish2=(struct finish*)malloc(finilen); finish1->next=finish2->next=NULL;finish1->stat=0;status++;}else{finish2=(struct finish*)malloc(finilen);finish2->stat=0;if(status==1){finihead->next=finish2;status++;finish1->next=finish2;finish1=finish2;}}finish2->next=NULL; /*Initialization compleated*/status=0;processtest=0;for(temp=0;temp<row;temp++){alloctemp=allochead;needtemp=needhead;finishtemp=finihead;worktemp=workhead;for(i=0;i<row;i++){worktemp1=worktemp;if(finishtemp->stat==0){for(j=0;j<colum;j++,needtemp=needtemp->next,worktemp=worktemp->next) if(needtemp->value<=worktemp->value)processtest++;if(processtest==colum){for(j=0;j<colum;j++){worktemp1->value+=alloctemp->value;worktemp1=worktemp1->next;alloctemp=alloctemp->next;}if(status==0){pathhead=path1=path2=(struct path*)malloc(pathlen);path1->next=path2->next=NULL;path1->value=i;status++;}else{path2=(struct path*)malloc(pathlen);path2->value=i;if(status==1)pathhead->next=path2;status++;}path1->next=path2;path1=path2;}finishtemp->stat=1;}else{for(t=0;t<colum;t++)alloctemp=alloctemp->next; finishtemp->stat=0;}}elsefor(t=0;t<colum;t++){needtemp=needtemp->next; alloctemp=alloctemp->next;}processtest=0;worktemp=workhead;finishtemp=finishtemp->next;}}path2->next=NULL;finishtemp=finihead;for(temp=0;temp<row;temp++) {if(finishtemp->stat==0){printf("\n系统处于非安全状态!\n"); exit(0);}finishtemp=finishtemp->next;}printf("\n系统处于安全状态.\n"); printf("\n安全序列为: \n");do{printf("p%d ",pathhead->value); }while(pathhead=pathhead->next); printf("\n");return 0;}。
银行家算法总结

银行家算法总结银行家算法是一种用于避免死锁的资源分配算法,它通过动态地检查资源的分配情况来避免可能导致死锁发生的资源请求。
本文将对银行家算法进行详细的总结,包括算法原理、应用场景、实现步骤以及优缺点等方面。
1. 算法原理银行家算法基于资源分配图模型,通过对系统资源的动态分配进行控制,来预防和避免死锁的发生。
它根据系统目前的资源分配情况,判断是否可以满足进程的资源请求,如果可以满足则分配资源,否则进程需要等待。
2. 应用场景银行家算法可以应用于各种资源有限的系统,如操作系统、数据库管理系统等。
它特别适用于多进程并发运行的环境,可以有效地避免死锁的发生,保证系统的稳定性和可用性。
3. 实现步骤银行家算法的实现步骤主要包括以下几个方面:(1) 定义系统资源及其总量:包括各种类型的资源和它们的总量。
(2) 定义各进程的最大需求量:根据系统资源的分配情况和各进程的最大需求量,确定每个进程需要的资源数量。
(3) 定义各进程的已分配资源量:根据当前的资源分配情况,记录每个进程已分配的资源数量。
(4) 定义各进程的需求资源量:根据当前的资源请求情况,记录每个进程的资源需求数量。
(5) 通过银行家算法进行资源分配:根据系统目前的资源分配情况和进程的资源请求情况,判断是否可以为进程分配资源,如果可以则分配资源,并更新系统资源和进程的已分配资源量;如果不可以则进程需要等待资源。
4. 优缺点银行家算法的主要优点是能够避免死锁的发生,确保系统的稳定性和可用性。
它通过对资源的动态分配进行控制,有效地防止了资源的浪费和滥用。
另外,银行家算法还具有较高的灵活性和适应性,可以适应不同规模和复杂度的系统。
然而,银行家算法也存在一些缺点。
首先,它对系统资源的使用情况进行了全局监控,需要实时监测各个进程的资源请求和分配情况,因此会增加系统的开销和复杂度。
其次,银行家算法在一定程度上限制了系统的并发性和吞吐量,可能会导致系统的性能降低。
操作系统大作业 银行家算法

编程验证银行家算法一、实验目的银行家算法是避免死锁的一种重要方法,本设计要求编程实现银行家算法程序。
了解银行家算法运行的规律币,加深对银行家算法的了解。
二、实验原理银行家算法的思路:1)、进程一开始向系统提出最大需求量.2)、进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3)、若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待.银行家算法的数据结构.1)、系统剩余资源量A[n],其中A[n]表示第I类资源剩余量.2)、各进程最大需求量,B[m][n],其中B[j][i]表示进程j对i类资源最大需求.3)、已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量.4)、剩余需求量.D[m][n],其中D[j][i]对第i资源尚需的数目.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作:1)、判定E[n]是否大于D[j][n],若大于,表示出错.2)、判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待.3)、若以上两步没有问题,尝试分配,即各变量作调整.4)、按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待."安全性检测"算法1)、先定义两个变量,用来表示推算过程的数据.F[n]=A[n],表示推算过程中,系统中剩余资源量的变化.J[n]=False表示推算过程中各进程是否假设"已完成"2)、流程:在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True(假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行.若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.三、实验内容在codeblock编译器下编写代码首先现编写一个库文件‘s.h’,定义一个结构体:typedef struct {int A;int B;int C;}RESOURCE;结构体里面的三个域分别表示三种资源的数量。
银行家算法描述

银行家算法描述
银行家算法是用于避免死锁的一种资源分配和回收策略。
它基于资源的安全状态,判断当前资源请求是否可以安全分配,从而避免死锁的发生。
银行家算法将资源分为两类:系统资源和进程资源。
系统资源分为固定数量的,如主存、设备等;而进程资源则是由进程动态请求和释放的。
算法的基本思想是:在进程请求资源之前,系统先判断给进程分配资源后,是否仍然能保持系统处于安全状态。
如果是,则允许分配资源;反之,则进程需要等待,直至系统资源处于满足安全状态为止。
具体步骤如下:
1. 初始化系统资源的状态:将每个系统资源的可用数量和每个进程已分配的资源数量记录下来。
2. 进程请求资源:当进程请求一定数量的资源时,系统先判断是否有足够的可用资源满足该请求,并且判断给进程分配资源后,是否仍然能保持系统安全状态。
3. 判断系统状态:系统根据当前的资源分配情况和当前可用资源数量,计算出一个安全序列。
如果存在一个安全序列,即证明当前的资源分配是安全的,进程可以被分配该资源并允许继续执行;反之,则进程需要等待。
4. 更新资源状态:如果进程被分配资源,则系统将更新系统资源状态,包括减少可用资源数量和增加相应进程已分配的资源
数量。
5. 执行进程:系统给进程分配资源后,进程可以执行相应操作。
在完成后,进程释放相应的资源。
6. 回收资源:当进程释放资源后,系统将更新系统资源状态,包括增加可用资源数量和减少相应进程已分配的资源数量。
7. 返回步骤2,循环执行,直至完成。
通过以上步骤,银行家算法可以避免死锁的发生,保证系统资源的安全分配和回收。
实验二银行家算法

实验二银行家算法一、目的:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效地防止和避免死锁的发生。
二、内容:银行家算法是避免死锁的一种重要方法,本实验要求编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
三、编程思想:首先分析银行家算法的数据结构,分析可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need 、进程申请资源的关系,由所学知识可知;Need[i,j]=Max[I,j]-Allocation[i,j];当进程申请资源的时候;a)Requesti>Need[i]。
这种情况表示该进程的资源需求已超过系统所宣布的最大值,出错。
b)Requesti=Need[i]。
这种情况表示该进程现在对他所需的全部资源一次申请完成。
c)Requesti〉Need[i]。
这种情况表示该进程现在对它所需资源再进行部分的申请,剩余的资源以后再次申请。
当进程pi发出资源请求后;a)如果Requesti<=Need[i],转向步骤b,否则显示为出错,因为所需的资源数超过事先要求的最大值。
b)Requesti <=Available,便转向步骤三,否则则表示尚无足够资源,pi需等待。
c)假如系统将资源分配给pi则:Available=Available-RequestiAllocation[i]=Allocation[i]+RequestiNeed[i]=Need[i]-Request安全性算法检查(1)设置向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work[]= Available[]。
Finish[],它表示系统是否有足够的资源分配给每个进程,使之运行完成。
开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。
银行家算法的实施步骤

银行家算法的实施步骤1. 概述银行家算法是一种避免发生死锁的资源分配算法。
它通过判断系统是否处于安全状态来决定是否分配资源给进程。
本文将介绍银行家算法的实施步骤,以帮助读者理解该算法的工作原理和应用场景。
2. 实施步骤银行家算法的实施步骤包括如下几个部分:2.1 初始化首先,需要对系统资源进行初始化。
系统资源分为三类:进程数(n)、资源种类数(m)和每个进程需要的各类资源的数量。
初始化时,需要提供当前系统中每个进程已分配和仍需申请的资源数量。
2.2 设置状态接下来,设置系统的状态。
状态包括可用资源向量(Available)、已分配资源矩阵(Allocation)、需求资源矩阵(Need)等。
•可用资源向量(Available):表示系统中每种资源的可用数量。
初始状态下,可用资源向量的值等于系统中该类资源总量减去已分配给进程的数量。
•已分配资源矩阵(Allocation):表示已分配给各个进程的资源数量。
初始状态下,已分配资源矩阵的值等于每个进程已分配的资源数量。
•需求资源矩阵(Need):表示每个进程尚需的资源数量。
初始状态下,需求资源矩阵的值等于每个进程仍需申请的资源数量。
2.3 进程申请资源在系统运行过程中,进程会不断申请资源。
当进程申请资源时,需要对申请进行检查,以判断是否能够满足进程的资源需求。
2.3.1 检查申请是否合法首先,需要检查申请的资源是否超过了进程所声明的最大需求。
若超过,则拒绝该申请。
2.3.2 检查申请是否安全若申请的资源没有超过进程的最大需求,则需要判断该申请是否会导致系统进入不安全状态,进而引发死锁。
银行家算法通过模拟资源的分配过程,判断系统是否处于安全状态。
具体步骤如下:1.首先,假设当前系统状态是安全状态。
2.检查进程申请资源是否超过了系统可用资源的数量。
若超过,则拒绝该申请。
3.模拟资源分配过程,按照申请的资源数量分配资源给进程。
4.检查分配资源后系统是否仍处于安全状态。
银行家算法c++语言(流程图代码全)

操作系统教程——银行家算法院系计算机与软件学院班级08软件工程2班学号20081344066姓名何丽茗一、实验目的银行家算法是避免死锁的一种重要方法。
通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
二、实验内容根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。
三、实验方法1.算法流程图2.算法数据结构1)可利用资源向量Available ,它是一个最多含有100个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。
其数值随该类资源的分配和回收而动态地改变。
如果Available(j)=k,标是系统中现有j 类资源k个。
2)最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max(i,j)=k,表示进程i需要j类资源的最大数目为k。
3)分配矩阵Allocation,这也是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。
如果Allocation(i,j)=k,表示进程i当前已经分到j类资源的数目为k。
Allocation i表示进程i的分配向量,有矩阵Allocation的第i行构成。
4)需求矩阵Need,这还是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。
如果Need(i,j)=k,表示进程i还需要j类资源k个,才能完成其任务。
Need i 表示进程i的需求向量,由矩阵Need的第i行构成。
5)上述三个矩阵间存在关系:Need(i,j)=Max(i,j)-Allocation(i,j);3.银行家算法设Request[i] 是进程i的请求向量,如果Request[i,j]=K,表示进程i需要K个j类型的资源。
银行家算法简要概述

一.需求分析⏹银行模拟系统要求模拟银行一天0~closetime的营业情况,业务总共分为两类。
存款与取款。
开始银行拥有一定数量的总额total供运行。
程序运行输出银行在处理业务后的事件表。
包括时间,存款数量,取款数量,银行余額,等待情况。
⏹程序输入的形式是按以下顺序输入到屏幕中,只需按照提示操作即可:银行总余額–>银行运行时间->交易时间上、下界->事件时间上、下界->客户存取金额⏹程序输出的形式是按照时间顺序输出银行运行期间的事件表⏹程序的功能是模拟显示银行在整个营业阶段的运行状况二.概要设计本程序中用到的抽象数据类型有伪随机数类random,队列类bankqueue,客户类client伪随机数类random的定义如下:class random{public:random();//空构造函数random(unsigned short initialSeed);//带参构造unsigned short randomInterger();//种子seed产生函数double rabdomDouble();//双精度数产生函数double between(double low ,double high);//围随机数产生函数(double 型)int between(int low,int high);//围随机数产生函数(int型)private:unsigned short seed;};客户类client的定义如下:class Client{public:int num;int money;Client *next;int Dealingtime;int Casetime;};客户队列bankqueue定义如下:class bankqueue{public:int n;bankqueue();//构造~bankqueue();//析构void enqueue(Client * c);//进队列Client* dequeue();//出队列int isEmpty();//判断空否void deleteALLValues();//删除所有元素private:Client *front,*tail;};本程序利用队列结果储存客户信息:三. 详细设计随机数类实现:●随机数类构造 {种子=时钟; }●返回短整数的函数 {乘数=33339;加数=759812;种子=(乘数*种子+加数)%31637687;返回种子; }●在low 和high 之间产生整型随机数{调用返回短整数的函数+low;}银行节点和队列类实现:●银行队列构造函数{前指针=0;尾指针=0;长度=0;}●析构函数{};进队列函数(银行节点指针){节点指针数据复制到新节点指针数据如果队列空{前指针=0;尾指针=0}尾指针=0;长度+1;}出队列{新建指针P头指针向前走查看队列是否为空返回指针P}●判断队列是否为空{返回头指针是否为0;}删除所有元素{长度,尾指针置0;从队列里弹出节点并删除}四.调试分析➢银行模拟系统调试过程中遇到的问题:由于要运用到文件输入输出流,无法访问Bank类的私有数据,故将大部分程序写入Main函数中经验和体会等:从写完代码到调试成功,最后不断的改进和完善,不仅巩固了类定义和实现,还极大的挑战了我们编程能力。
银行家算法通用演示程序

操作系统课程设计报告课程设计名称:银行家算法通用演示程序专业:班级:学号:学生姓名:指导教师:2014年3月15日Dijkstra提出的银行家算法,是最具代表性的避免死锁的算法。
本文对如何用银行家算法来处理操作系统给进程分配资源做了详细的说明,包括需求分析、概要设计、详细设计、测试与分析、总结、源程序清单。
首先做了需求分析,解释了什么是银行家算法,并指出它在资源分配中的重要作用。
然后给出了银行家算法的概要设计,包括算法思路、步骤,以及要用到的主要数据结构、函数模块及其之间的调用关系等。
在概要设计的基础上,又给出了详细的算法设计,实现概要设计中定义的所有函数,对每个函数写出核心算法,并画出了流程图。
接着对编码进行了测试与分析。
最后对整个设计过程进行了总结。
关键词:安全状态;安全序列;银行家算法;安全性算法;安全序列;流程图。
前言 (1)一、实验目的 (22)二、实验内容 (2)三、实验步骤 (3)(1)需求分析 (3)(2)概要设计 (3)(3)详细设计 (4)1、此程序调用函数所用的头文件和全局变量 (4)2、休眠函数SLEEP()用于延缓进入系统时间 (4)3、显示可用资源和各个进程资源非配情况的函数showdata() (5)4、进程资源分配函数int changdata(int i) (6)5、安全性检测函数safe() (6)6、利用银行家算法对申请资源对进行判定函数share() (7)7、添加资源,并检测安全性addresources() (7)8、删除资源,并检测安全性函数 (8)9、删除进程,并检测安全性 (8)10、修改资源数量并检测安全性changeresources() (9)11、添加进程,并检测安全性 (9)12、显示菜单函数version() (9)13、初始化资源种类和大小、进程,并检测安函数init() (10)14、密码初始化函数char *get_password(const char *prompt) (11)15、密码设置函数mima( ) (12)16、主函数void main( ) (12)17、画出函数和过程调用关系流程图 (13)(4)调试分析 (14)(5)测试结果(图) (16)(6)使用说明: (19)四、实验总结 (20)五、附录:程序清单 (21)六、参考资料 (32)前言Dijkstra (1965)提出了一种能够避免死锁的调度算法,称为银行家算法。
计算机操作系统的银行家算法

计算机操作系统的银行家算法一、需求分析1、进程的状态有:就绪,等待和完成。
当系统不能满足进程的资源请求时,进程出于等待状态。
资源需求总量表示进程运行过程中对资源的总的需求量。
已占资源量表示进程目前已经得到但还为归还的资源量。
因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。
陷入每个进程的资源需求总量不应超过系统拥有的资源总量。
2、银行家算法分配资源的原则是:当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。
若能,则让进程等待,否则,让进程的假分配变为真分配。
1查找各进程的剩余请求,检查系统的剩余资源量是否能满足其中一进程,如果能,则转B。
2将资源分配给所选的进程,这样,该进程已获得资源最大请求,最终能运行完成。
标记这个进程为终止进程,并将其占有的全部资源归还给系统。
重复第1步2步,直到所有进程都标记为终止进程,或知道一个死锁发生。
若所有进程都标记为终止进程,则系统的初始状态是安全的,否则为不安全的。
若安全,则正式将资源分配给它,否则,假定的分配作废,让其等待。
二、系统结构设计1、设计分析当某个进程对某类资源提出请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。
若能,则让进程等待,否则,让进程的假分配变为真分配。
2、数据结构1可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可利用资源的数目,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可利用资源的数目,其数值随该类资源的分配和回首而动态的改变,如果Available=K,则代表Rj 类资源K个。
2最大需求矩阵Max。
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
总结银行家算法的算法思想

总结银行家算法的算法思想银行家算法是一种用于解决死锁问题的算法。
它是由英国计算机科学家 Edsger Dijkstra 在1965年提出的,主要用于确保分配资源时不会发生死锁,并且能够尽可能地分配资源满足进程的需求。
银行家算法的核心思想是基于银行家对贷款的管理机制。
在现实生活中,银行家在发放贷款时要求借款人提供一定的担保,以确保借款人有足够的能力偿还贷款。
同样地,银行家算法也要求系统中的进程向系统提供其对各种资源的最大需求量和当前已分配量,以确保系统能够安全地分配资源,并避免死锁的发生。
算法的步骤主要包括以下几个方面:1. 初始化:系统初始化时,银行家算法需要收集每个进程的最大需求量以及当前已分配量,并统计系统中每种资源的总数和已分配量。
2. 请求资源:当进程请求分配资源时,银行家算法会先判断系统是否有足够的资源满足进程的需求。
如果满足,则尝试分配资源给进程,并记录已分配的资源量。
如果不满足,则进程必须等待资源。
3. 检查安全性:每次资源分配后,银行家算法都会检查系统是否仍然处于安全状态。
安全状态意味着系统能够为每个进程分配资源以满足其最大需求量,并避免死锁的发生。
如果系统处于安全状态,则继续分配资源,如果不是,则进程必须等待。
4. 回收资源:当进程使用完资源后,会将已分配的资源归还给系统。
银行家算法将更新系统资源表的已分配量。
银行家算法的核心思想是基于资源的动态分配和安全性检查,以避免死锁的发生。
它能够合理分配资源,保证每个进程都能够得到自己所需的资源,同时也能够确保不会出现死锁的情况。
通过使用银行家算法,系统能够实现资源的最大利用率,提高系统的效率和可靠性。
总之,银行家算法是一种用于解决死锁问题的算法,其思想是基于银行家对贷款的管理机制。
它通过动态分配资源和安全性检查,保证每个进程能够得到所需资源,而不会导致系统死锁,从而提高系统的效率和可靠性。
银行家算法详细流程

算法的实现一、初始化由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
二、银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。
(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
三、安全性检查算法(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED<=Work;如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的进程Finish= true,则表示安全;否则系统不安全。
各算法流程图#include < iostream >using namespace std;#define MAXPROCESS 50 /*最大进程数*/#define MAXRESOURCE 100 /*最大资源数*/int AVAILABLE[MAXRESOURCE]; /*可用资源数组*/int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/ int REQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/bool FINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/int p[MAXPROCESS];/*记录序列*/int m,n;/*m个进程,n个资源*/void Init();bool Safe();void Bank();int main(){Init();Safe();Bank();getchar();}//给出系统拥有的每种资源数,已经分配给每个进程的资源数,还有每个进程最多需要每种资源的个数,让你判断当前系统是不是安全的void Init() /*初始化算法*/{int i,j;cout << " 请输入进程的数目: " ;cin >> m;cout << " 请输入资源的种类: " ;cin >> n;cout << " 请输入每个进程最多所需的各资源数,按照 " << m << " x " << n << "矩阵输入 " << endl;for (i = 0 ;i < m;i ++ )for (j = 0 ;j < n;j ++ )cin >> MAX[i][j];cout << " 请输入每个进程已分配的各资源数,也按照 " << m << " x " << n << "矩阵输入 " << endl;for (i = 0 ;i < m;i ++ ){for (j = 0 ;j < n;j ++ ){cin >> ALLOCATION[i][j];NEED[i][j] = MAX[i][j] - ALLOCATION[i][j];if (NEED[i][j] < 0 ){cout << " 您输入的第 " << i + 1 << " 个进程所拥有的第 " << j + 1 << " 个资源数错误,请重新输入: " << endl;j -- ;continue ;}}cout << " 请输入各个资源现有的数目: "for (i = 0 ;i < n;i ++ ){cin >> AVAILABLE[i];}}void Bank() /*银行家算法*/{int i,cusneed;char again;while ( 1 ){Restart:cout << " 请输入要申请资源的进程号(注:第1个进程号为0,依次类推) " << endl;cin >> cusneed;cout << " 请输入进程所请求的各资源的数量 " << endl;for (i = 0 ;i < n;i ++ ){cin >> REQUEST[cusneed][i];}for (i = 0 ;i < n;i ++ ){if (REQUEST[cusneed][i] > NEED[cusneed][i]){cout << " 您输入的请求数超过进程的需求量!请重新输入! " << endl;goto Restart;}if (REQUEST[cusneed][i] > AVAILABLE[i]){cout << " 您输入的请求数超过系统有的资源数!请重新输入! " << endl;goto Restart;}}for (i = 0 ;i < n;i ++ ){AVAILABLE[i] -= REQUEST[cusneed][i];ALLOCATION[cusneed][i] += REQUEST[cusneed][i];NEED[cusneed][i] -= REQUEST[cusneed][i];}if (Safe()){cout << " 同意分配请求!" << endl;}else{cout << " 您的请求被拒绝! " << endl;for (i = 0 ;i < n;i ++ ){AVAILABLE[i] += REQUEST[cusneed][i];ALLOCATION[cusneed][i] -= REQUEST[cusneed][i];NEED[cusneed][i] += REQUEST[cusneed][i];}}for (i = 0 ;i < m;i ++ ){FINISH[i] = false ;}cout << " 您还想再次请求分配吗?是请按y/Y,否请按其它键 " << endl;cin >> again;if (again == ' y ' || again == ' Y ' ){continue ;}break ;}}bool Safe() /*安全性算法*/{int i,j,k,l = 0 ;int Work[MAXRESOURCE]; /*工作数组*/for (i = 0 ;i < n;i ++ )Work[i] = AVAILABLE[i];for (i = 0 ;i < m;i ++ ){FINISH[i] = false ;}for (i = 0 ;i < m;i ++ ){if (FINISH[i] == true ){continue ;}else{for (j = 0 ;j < n;j ++ ){/*看看所有的资源对于这个进程是不是都有效*/if (NEED[i][j] > Work[j]){break ;}}if (j == n){/*那么你就需要看每个进程还需要每种资源多少,把它计算出来,然后看你剩下的可分配的资源数是不是可以达到其中一个进程的要求,如果可以,就分配给它,让这个进程执行,执行结束后,这个进程释放资源,重新计算系统的可分配的资源*/FINISH[i] = true ;for (k = 0 ;k < n;k ++ ){Work[k] += ALLOCATION[i][k];}p[l ++ ] = i;i =- 1 ;}else{continue ;}}if (l == m){cout << " 系统是安全的 " << endl;cout << " 安全序列: " << endl;for (i = 0 ;i < l;i ++ ){cout << p[i];if (i != l - 1 ){cout << " --> " ;}}cout << "" << endl;return true ;}}cout << " 系统是不安全的 " << endl;return false ;}、银行算法是怎样避免死锁的:银行家算法是这样的:1)当一个用户对资金的最大的需求量不超过银行家现有的资金时就可以接纳该用户。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法的实现一、初始化由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
二、银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。
(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
三、安全性检查算法(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED<=Work;如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的进程Finish= true,则表示安全;否则系统不安全。
各算法流程图#include < iostream >using namespace std;#define MAXPROCESS 50 /*最大进程数*/#define MAXRESOURCE 100 /*最大资源数*/int AVAILABLE[MAXRESOURCE]; /*可用资源数组*/int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/int REQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/ bool FINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/ int p[MAXPROCESS]; /*记录序列*/int m,n; /*m个进程,n个资源*/void Init();bool Safe();void Bank();int main(){Init();Safe();Bank();getchar();}//给出系统拥有的每种资源数,已经分配给每个进程的资源数,还有每个进程最多需要每种资源的个数,让你判断当前系统是不是安全的void Init() /*初始化算法*/{int i,j;cout << " 请输入进程的数目: " ;cin >> m;cout << " 请输入资源的种类: " ;cin >> n;cout << " 请输入每个进程最多所需的各资源数,按照" << m << " x " << n << " 矩阵输入" << endl;for(i = 0 ;i < m;i ++ )for(j = 0 ;j < n;j ++ )cin >> MAX[i][j];cout << " 请输入每个进程已分配的各资源数,也按照" << m << " x " << n << " 矩阵输入" << endl;for(i = 0 ;i < m;i ++ ){for(j = 0 ;j < n;j ++ ){cin >> ALLOCATION[i][j];NEED[i][j] = MAX[i][j] - ALLOCATION[i][j];if(NEED[i][j] < 0 ){cout << " 您输入的第" << i + 1 << " 个进程所拥有的第" << j + 1 << " 个资源数错误,请重新输入: " << endl;j -- ;continue;}}}cout << " 请输入各个资源现有的数目: " << endl;for(i = 0 ;i < n;i ++ ){cin >> AVAILABLE[i];}}void Bank() /* 银行家算法 */{int i,cusneed;char again;while ( 1 ){Restart:cout << " 请输入要申请资源的进程号(注:第1个进程号为0,依次类推) " << endl;cin >> cusneed;cout << " 请输入进程所请求的各资源的数量 " << endl;for (i = 0 ;i < n;i ++ ){cin >> REQUEST[cusneed][i];}for (i = 0 ;i < n;i ++ ){if (REQUEST[cusneed][i] > NEED[cusneed][i]){cout << " 您输入的请求数超过进程的需求量!请重新输入! " << endl;goto Restart;}if (REQUEST[cusneed][i] > AVAILABLE[i]){cout << " 您输入的请求数超过系统有的资源数!请重新输入! " << endl;goto Restart;}}for (i = 0 ;i < n;i ++ ){AVAILABLE[i] -= REQUEST[cusneed][i];ALLOCATION[cusneed][i] += REQUEST[cusneed][i];NEED[cusneed][i] -= REQUEST[cusneed][i];}if (Safe()){cout << " 同意分配请求! " << endl;}else{cout << " 您的请求被拒绝! " << endl;for(i = 0 ;i < n;i ++ ){AVAILABLE[i] += REQUEST[cusneed][i];ALLOCATION[cusneed][i] -= REQUEST[cusneed][i];NEED[cusneed][i] += REQUEST[cusneed][i];}}for(i = 0 ;i < m;i ++ ){FINISH[i] = false;}cout << " 您还想再次请求分配吗?是请按y/Y,否请按其它键" << endl;cin >> again;if(again == ' y ' || again == ' Y ' ){continue;}break;}}bool Safe() /*安全性算法*/{int i,j,k,l = 0 ;int Work[MAXRESOURCE]; /*工作数组*/for(i = 0 ;i < n;i ++ )Work[i] = AVAILABLE[i];for(i = 0 ;i < m;i ++ ){FINISH[i] = false;}for(i = 0 ;i < m;i ++ ){if(FINISH[i] == true){continue;}else{for(j = 0 ;j < n;j ++ ){/*看看所有的资源对于这个进程是不是都有效*/if(NEED[i][j] > Work[j]){break;}}if(j == n){/*那么你就需要看每个进程还需要每种资源多少,把它计算出来,然后看你剩下的可分配的资源数是不是可以达到其中一个进程的要求,如果可以,就分配给它,让这个进程执行,执行结束后,这个进程释放资源,重新计算系统的可分配的资源*/FINISH[i] = true;for(k = 0 ;k < n;k ++ ){Work[k] += ALLOCATION[i][k];}p[l ++ ] = i;i =- 1 ;}else{continue;}}if(l == m){cout << " 系统是安全的" << endl;cout << " 安全序列: " << endl;for(i = 0 ;i < l;i ++ ){cout << p[i];if(i != l - 1 ){cout << " --> " ;}}cout << "" << endl;return true;}}cout << " 系统是不安全的" << endl;return false;}、银行算法是怎样避免死锁的:银行家算法是这样的:1)当一个用户对资金的最大的需求量不超过银行家现有的资金时就可以接纳该用户。
2)用户可以分期贷款,但贷款的总数不能超过最大需求量。