操作系统之银行家算法检测死锁

合集下载

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

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

目录第一章功能需求描述 (2)1.1功能列表与说明 (2)1.2操作界面和操作方法 (2)第二章设计描述 (3)2.1任务分解说明 (3)2.2主要数据结构设计说明 (3)2.3主要函数接口设计说明 (3)第三章算法描述 (5)第四章开发过程描述 (14)4.1程序代码 (14)4.2设计中的问题和解决方法 (23)4.3测试用例和测试方法 (24)第五章设计心得体会 (32)计算机科学与技术学院课程设计任务书第一章功能需求描述1.1功能列表与说明(1)添加进程:规定现在操作系统中运行的进程数。

(2)添加资源:规定当前需要资源的种类数和各种类资源的数目。

(3)分配资源:给各进程分配资源。

(4)安全性检查:检查资源分配后是否会发生死锁,若发生则不这样进行分配。

(5)资源释放:当一个进程结束后释放其所占有的各类资源。

(6)得到安全序列:当资源分配能够保证各进程顺利结束,则得到进程的安全序列。

(7)删除资源:即取消某资源1.2操作界面和操作方法*************银行家算法演示****************请首先输入系统可供资源种类的数量:资源*的名称:资源的数量:请输入作业的数量:请输入各进程的最大需求量:请输入各进程已经申请的资源量:系统目前可用资源:系统是否安全?分配的序列:********银行家算法演示***********1:增加资源2:删除资源3:修改资源4:分配资源5:增加作业0:离开在如上的操作界面中分别按照提示进行输入,按回车键表示当前输入完毕,然后进行下个步骤的输入或者得到最终结果。

第二章设计描述2.1任务分解说明银行家算法的实现过程主要分为以下几个部分:为实现银行家算法,系统中必须设置若干数据结构。

其中有allocation,记录已经分配的系统资源;max,记录每个进程的资源最大需求;available,记录剩余资源;need用来记录现在每个进程需要多少资源,need=max-allocation;request 请求资源;temp,记录路径,即输出的顺序;finish,用来实现循环,以判断是否安全,这也就是安全性检查。

第六章死锁

第六章死锁
• 环境:某些资源互斥地使用。 • 原因:(1)系统资源不足;
(2)进程推进的顺序不合适。
6.1死锁问题的提出
6.2 死锁的必要条件
• 资源的概念 – 分配方式: “可抢占”资源, “不可抢占”资源 – 使用方式: “共享”资源, “独占”资源 – 使用期限: 永久资源, 临时资源 – 资源的共同性质:一个进程由于请求一个资 源而未被满足,从而该进程被阻塞.
• 预先静态分配法(破坏部分分配条件) 作业调度时,仅当系统满足作业运行时所需的 全部资源时,才把该作业调入内存运行.在作 业运行前一次性将其所需的全部资源分配给 它,于是在作业运行过程中不再会提出新的资 源请求.
6.3 死锁的预防
• 有序资源使用法: (破坏循环等待条件) 策略: 把系统中的全部资源分别分给一个
已占 还申
P
5
Q
2
3 或5 3或4 4
1
21 21
R
3
6
36 45
然而将2个资源分给Q (只需一个)则
P44 Q 3 0 Q可运行结
束、释放
R27
P44
系统资源回 收为4个
R27
此后可将4个资源分组P…

QPR
银行家算法
由此可见,按银行家算法来分配资源是不会产生 死锁的。因为按该算法分配资源时,每次分配后总存 在一个进程,如果让它独立单独运行下去,必然可获 得它所需的全部资源,也就是说它能结束。而它结束 后可以归还这类资源来满足其它申请者的需要。这也 说明了存在一个合理的系统状态序列,可确保系统不 会进入死锁状态的路径。
有若干种资源中的某一种,同时每个进程还要求 (链上)下一进程所占有的资源.
6.3防止死锁发生(破坏条件之一)

银行家算法例题详解

银行家算法例题详解

银行家算法例题详解银行家算法是一种资源分配算法,用于避免死锁并确保系统中的所有进程能够顺利完成任务。

它最初由银行家提出,并应用于操作系统中。

在银行家算法中,系统有一定数量的资源,包括进程所需的资源以及可供分配的资源。

每个进程都会向系统请求资源,系统会检查该请求是否能够满足,并采取相应的措施。

下面以一个例题来详细解释银行家算法的工作原理:假设有3个进程P1,P2和P3,以及4种资源A,B,C和D。

它们的资源需求和可用资源如下表所示:进程 Max需求已分配需求可用P1 7,5,3,2 0,1,0,0 7,4,3,1 3,3,2,2P2 3,2,2,1 2,0,0,0 1,2,2,1P3 9,0,2,2 3,0,2,2 6,0,0,0首先,我们需要计算每个进程的需求和已分配资源之间的差异。

这可以通过需求矩阵和分配矩阵的减法来实现。

例如,对于P1进程,需求矩阵减去分配矩阵得到需求矩阵:需求矩阵P1 = Max矩阵P1 - 分配矩阵P1 = 7,5,3,2 - 0,1,0,0 = 7,4,3,2接下来,我们需要检查是否存在一个安全序列,即一个进程执行顺序,使得每个进程能够顺利完成任务。

安全序列的判断基于两个条件:1. 对于每个进程i,需求矩阵的第i行的每个元素都小于等于可用资源的对应元素。

2. 如果进程i的需求矩阵的第i行的每个元素都小于等于可用资源的对应元素,那么将进程i的已分配资源加到可用资源中,再继续判断下一个进程。

根据上述条件,我们可以开始判断是否存在安全序列:1. 首先,我们看到P1的需求矩阵的第一行的每个元素都小于等于可用资源的对应元素。

因此,我们将P1的已分配资源加到可用资源中,可用资源现在变为6,5,3,2。

2. 接下来,我们看到P2的需求矩阵的第二行的每个元素都小于等于可用资源的对应元素。

因此,我们将P2的已分配资源加到可用资源中,可用资源现在变为7,5,3,2。

3. 最后,我们看到P3的需求矩阵的第三行的每个元素都小于等于可用资源的对应元素。

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

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

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

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

三、实验内容: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经测试,可为该进程分配资源。

银行家算法实验报告

银行家算法实验报告

银行家算法分析、设计与实现一、设计理论描述本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。

要求如下:(1)模拟一个银行家算法;(2)初始化时让系统拥有一定的资源;(3)用键盘输入的方式申请资源;(4)如果预分配后,系统处于安全状态,则修改系统的资源分配情况;(5)如果预分配后,系统处于不安全状态,则提示不能满足请求,设计的主要内容是模拟实现动态资源分配。

同时编写和调试一个系统动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。

银行家算法.顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。

在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。

如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。

把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。

当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。

“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。

显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.二、算法描述及数据结构模型1.银行家算法:设进程i提出请求Request[n],则银行家算法按如下规则进行判断。

(1)如果Request[n]>Need[i,n],则报错返回。

(2)如果Request[n]>Available,则进程i进入等待资源状态,返回。

(3)假设进程i的申请已获批准,于是修改系统状态:Available=Available-RequestAllocation=Allocation+RequestNeed=Need-Request(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

os07死锁

os07死锁
的顺序;添加新的资源时要重新编号
第七章 死锁
7.4 死锁的避免和银行家算法
死锁的避免和预防的区别
预防:严格控制死锁必要条件的出现 避免:在有可能出现死锁的时候,采取措施
避免发生死锁
著名的死锁避免算法:银行家算法。由 Dijkstra在1965年提出并解决,借鉴银行 家的经营策略,保证操作系统能够安全 的回收资源
终止(abort)所有死锁进程 将死锁进程退回到钱一个检查点,从这个检
查点重新启动 相继的逐个终止死锁进程,直到死锁不再存
在 相继的逐个抢占死锁进程的资源,直到死锁
不再存在
第七章 死锁
7.5 死锁的检测与恢复
死锁的恢复:
选择被终止的死锁进程的原则
使用最少处理器时间的进程 使用最少输出工作量的进程 具有最多剩余时间的进程 得到资源最少的进程 具有最小优先级的进程
第七章 死锁
7.2 死锁的必要条件
资源的类型
从资源的使用策略上分
可抢占资源 不可抢占资源
从资源的使用方式上分
共享资源 独占资源
从资源的使用期限上分
永久资源 临时资源
死锁的原因
第七章 死锁
7.2 死锁的必要条件
死锁的必要条件
互斥条件:一个资源一次只能被一个进程使用; 不可抢占条件:一个资源只能被占用它的资源释放,
0 1
1 1
0 1
110
111
C=
0 3
1 1
1 0
001
请同学们尝试其它的 分配顺序,看是否能 得到同样的结果。
111
P4
C=
0 3
1 1
1 0
000
000
P1
C=
0 3

银行家算法

山东理工大学计算机学院课程设计(操作系统与编译器内核设计)班级计科1004姓名邢贵洋学号1011051140指导教师菊传香二○一三年十一月二十二日课程设计任务书及成绩评定课题名称 1. 银行家算法的设计与实现Ⅰ、题目的目的和要求:(1)设计一个小型的死锁避免系统,在系统中体现银行家算法及安全性算法;(2)用户请求及系统当前的资源分配状态从键盘输入;(3)输出能够判断当前的系统状态是否是安全的?若安全,给出至少一个安全序列;若不安全,给出原因(4)某进程提出一个请求,该请求能够满足,但会使系统进入不安全状态(5)某进程提出一个请求,该请求不能满足Ⅱ、设计进度及完成情况Ⅲ、主要参考文献及资料[1] 汤子赢等.计算机操作系统(第二版).西安电子科技大学出版社,2006.8[2] 冯耀霖等.操作系统,西安电子科技大学出版社.1992[3] 张尧学等.计算机操作系统教程(第2版).清华大学出版社,2001.4[4] 谭耀铭.操作系统.中国人民大学出版社,2003.4[5] Abraham Silberschatz,Peter Galvin & Greg Gagne,Applied Operating System Concepts,Higher Education Press,2002Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○一三年十一月二十二日目录一、设计目的 (1)二、设计内容 (1)三、设计原理 (1)四、算法实现 (2)五、流程图 (4)六、源程序 (8)七、运行示例及结果分析 (15)八、心得体会 (19)银行家算法一、设计目的1)掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。

2)了解多道程序系统中,多个进程并发执行的资源分配。

3)掌握预防死锁的方法,系统安全状态的基本概念4)理解死锁避免在当前计算机系统不常使用的原因。

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

《操作系统》第三章 - 死 锁


令n表示系统中进程的数目,m表示资源分类数。
可以把矩阵Allocation和Need中的每一行当做一个 向量,并分别写成Allocationi和Needi。Allocationi表 示当前分给进程pi的资源。
1.资源分配算法 • 令Requesti表示进程pi的申请向量。Requesti[j]= k,表示进 程pi需要申请k个rj类资源。当进程pi申请资源时,就执行下列 动作: ① 若Requesti>Needi,表示出错, ② 如果Requesti>Available,则pi等待。 ③ 假设系统把申请的资源分给进程pi,则应对有关数据结构进 行修改: Available:= Available – Requesti Allocationi:= Allocationi + Requesti Needi:= Needi – Requesti ④ 系统执行安全性算法,查看此时系统状态是否安全。如果是 安全的,就实际分配资源,满足进程pi 的此次申请;否则, 若新状态是不安全的,则pi等待,对所申请资源暂不予分配, 并且把资源分配状态恢复成③之前的情况。
第3章 死
内容提要: 3.1 3.2 3.3 3.4 3.5 3.6

资 源 死锁概念 死锁的预防 死锁的避免 死锁的检测和恢复 处理死锁的综合方式
3.1 资

3.1.1 资源使用模式
1.申请 2.使用 3.释放
3.1.2 可剥夺资源与不可剥夺资源
1.可剥夺资源 • 另外进程可以从拥有它的进程那里把它剥 夺过去为己所用,并且不会产生任何不良 影响。例如,内存就是可剥夺资源。 2.不可剥夺资源 • 不能从当前占有它的进程那里强行抢占的 资源,必须由拥有者自动释放,否则会引 起相关计算的失效。

操作系统-徐甲同 2版 习题答案 第三章进程-死锁

缺点:必须事先知道进程所需所有资源;资源得不到充分利用; 3.15 进程需获得所有资源后才可运行,导致进程会延迟运行。
计算机操作系统
第三章 进程管理
3.破坏“循环等待”条件 采用资源有序/顺序分配法: 把系统中所有资源编 号, 进程在申请资源时必须严格按资源编号的递增次 序进行,否则操作系统不予分配。打破环。 例如:1,2,3,…,10
计算机操作系统
第三章 进程管理
R1
A
B
此列子表明; 进程竞争资源有可能死锁。 但不一定就会死锁,这取决于各 进程的推进速度和对资源的请求 顺序。 死锁是一种与时间有关的错误。 进程竞争的资源应是互斥
R2
进程死锁例1的环路表示
3.4
计算机操作系统
第三章 进程管理
A r1
死锁的举例 例2:
进 程 A A r2 A r3 A r4 B r1 进 程 B B r2 B r3 B r4 请求 读卡 机请 求打 印机 释放 打卡 机 释放 读卡 机 读卡 机 请求 打印 机 请求 读卡 机 释放 打印 机 释放 读卡 机 打印 机
4、 Ar1 Br1 Ar2 Br2 Ar3 Ar4 Br3 Br4
3.6
计算机操作系统
第三章 进程管理
二、产生死锁的四个必要条件
1) 互斥条件(资源独占): 一个资源每次只能给一个进程使用 2) 不可剥夺条件(不可强占): 资源申请者不能强行的从资源占有者手中夺取资 源, 资源只能由占有者自愿释放 3) 请求和保持条件: (部分分配,占有申请) 在申请新的资源的同时保持对原有资源的占有。 4) 循环等待条件: 存在一个进程-等待资源环形链 {P1 , P2 , … , Pn}, 其中P1等待P2占有的资源, P2等待P3占有的资源, …, Pn等待P1占有的资源。

计算机操作系统 第5章 死 锁


5.2
死 锁 预 防(Deadlock Prevention) -2
所有进程对资源的请求必须严格按资源序号递增的次序提出。 这样在所形成的资源分配图中不可能再出现环路,因而摒弃 了“环路等待”条件,在采用这种策略时总有一个进程占据 了较高序号的资源,它继续请求的资源必然是空闲的,因而 进程可以一直向前推进。这种预防死锁的策略可以提高资源 利用率,但在进程使用各类资源的顺序与系统规定的顺序不 同时会造成资源浪费的情况。 • 资源按级分配法 该方法是把资源递增排序成若干等级(如L1、L2…….Lm), 其中每级可包含几类资源,要求每个进程在获得了Lj级中资 源之后 ,它才能申请更高级的LK(LK>Lj)级中的资源;如 果它还需申请比LK级低的LI级(LI<LK)资源,则必须先释放 所有大于LI级的资源。该方法是Haveder 1968年在设计IBM/ 360 OS时提出的,资源共分三级,第一级数据集或文件,第 二级主存,第三级I/O设备。
5.2
死 锁 预 防(Deadlock Prevention) -1
3。破坏请求和保持条件 破坏请求和保持条件 系统可采用资源静态予分配方式 资源静态予分配方式来破坏请求保持条件。系 资源静态予分配方式 统要求所有进程一次性地申请在整个运行过程中全部资源, 若系统有足够资源满足给进程,则在运行前,一次性将其所 需要的所有资源分配给该进程。这样该进程在整个运行期间, 便不再提出资源要求,从而摒弃了请求条件。这种预防死锁 的方法,优点是简单、易予实现且很安全,但其资源利用率 很低,进程也延迟运行。 4。破坏循环等待条件 破坏循环等待条件 • 有序资源使用法 该方法将所有的资源按类型进行线性排队,并赋予不同的 序号。例如令输入机的序号为1,打印机序号为2,磁盘机序 号为3等。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验 利用银行家算法避免死锁 实验报告

一、实验题目:利用银行家算法避免死锁 二、实验内容:编程实现银行家算法,要求能够输入资源数和作业数,输出进程的安全状况。若进程安全,输出安全序列。

三、实验目的:通过实验加强对银行家算法避免死锁的理解和掌握。 四、实验过程: 1、基本思想:银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。详细如下: 设进程i提出请求Request [j],则银行家算法按如下规则进行判断。 (1)如果Request [i][j]<= Need[i][j],则转(2);否则出错。 (2)如果Request [i] [j]<= Available[j],则转(3);否则出错。 (3)系统试分配资源,修改相关数据: Available[j]=Available[j]-Request[i][j]; Allocation[i][j]=Allocation[j]+Request[i][j]; (4)系统执行安全性检查,如安全,则分配成立;否则试分配作废,系统恢复原状,进程等待。 安全性检查算法 (1)设置两个工作向量Work=Available;Finish[i]=false (2)从进程集合中找到一个满足下述条件的进程, Finish==false; Need<=Work; 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 Work+=Allocation Finish=true; GOTO step2 (4)如所有的进程Finish= true,则表示安全;否则系统不安全。

2、主要数据结构: (1)可利用资源向量Available。定义为一个一元数组,Available[j]=K表示系统中有j类资源K个。 (2)最大需求Max。定义为一个n*m的矩阵,Max[i][j]=K表示进程i需要j资源的最大数目为K个。 (3)分配矩阵Allocation。定义为一个n*m的矩阵,Allocation[i][j]=K表示进程i已经得到j资源K个。 (4)需求矩阵Need。定义为一个n*m的矩阵,Need[i][j]=K表示进程i还需要j资源K个来完成任务。 3、输入、输出: (1)成功分配的例子:输入资源数2(各3),进程数2,最大需求1 1,已分配 0 1。输出: 1 1 1 0 Max Allocation Need 进程名 A B A B A B 0 1 1 0 1 1 0 1 1 1 1 0 0 1 (2)不安全,会出现死锁的:输入资源数2(各2),进程数2,最大需求3 3,已分配 0 0。输出: 3 3 0 0 Max Allocation Need 进程名 A B A B A B 0 3 3 0 0 3 3 1 3 3 0 0 3 3 没有安全序列 (3)若输入时已分配大于最大需求:输入资源数1(5个资源),进程数1,Max=3 ,Allocation=5,则会产生提示,发生错误,申请的大于最大需求量。需要重新输入。 4、程序流程图 大于最大需求 小于最大需求 未通过 通过

5、实验结果截屏

输入资源种数 判断已分配是否大于最大需求

输入资源名称 输入资源数量 输入进程数 输入最大需求矩阵

输入已分配矩阵

进行预分配 成功分配并输出安全系列

安全性算法 预分配失败,资源不分配 6、源程序代码(共214行) #include #include #include #define False 0 #define True 1 using namespace std;

int Max[100][100]={0}; //各进程所需各类资源的最大需求; int Avaliable[100]={0}; //系统可用资源; char name[100]={0}; //资源的名称; int Allocation[100][100]={0}; //系统已分配资源; int Need[100][100]={0}; //还需要资源 int Request[100]={0}; //请求资源向量; int temp[100]={0}; //存放安全序列; int Work[100]={0}; //存放系统可提供资源; int M=100; //作业的最大数 int N=100; //资源的最大数 void showdata()//显示资源矩阵 { int i,j;

cout<<"系统可用资源[Available]:"

cout

cout<<"进程名 ";

for (j=0;j<3;j++)//MAX ALLOCATION NEED 共列 { for (i=0;i{ cout<} cout<<" "; } cout

cout<<" "

cout

cout

int changedata(int i)//进行资源分配; { int j;

for (j=0;j{ Avaliable[j]=Avaliable[j]-Request[j]; Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j]; } return 1; }

int safe()//安全性算法 { int k=0,m,apply,Finish[100]={0}; int j;

for(int i=0;i{ Work[i]=Avaliable[i]; } for (int i=0;i{ apply=0; for (int j=0;j{ if (Finish[i]==False&&Need[i][j]<=Work[j]){

apply++;//经过验证之后apply会增加到和资源数相等

if (apply==N) { for(m=0;m

Work[m]=Work[m]+Allocation[i][m];//释放可用资源

Finish[i]=True;//置安全 temp[k]=i;//记录安全进程名 i=-1;// 让i跳出资源层循环时回到初始状态 k++;//安全序列下标前进位

} } } } for(int i=0;iif(Finish[i]==False){

cout<<"系统不安全;"

cout<<"系统是安全的!"<

cout<<"分配的序列:"; for(int i=0;icout

void share()//判定申请资源 { char ch; int i=0,j=0; ch='y';

cout<<"请输入要求分配的资源进程号(0-"<

cin>>i;//输入须申请的资源号; cout<<"请输入进程"

cin>>Request[j];//输入需要申请的资源数目; } for (int j=0;j{ if (Request[j]>Need[i][j]) {

cout<<"进程"<

cout<<"不予分配!"

if(Request[j]>Avaliable[j])//申请是否大于当前资源 { cout<<"进程"<

源"; cout<<"不予分配!"

int main(){ int i,j,number,m,n,flag;

相关文档
最新文档