银行家算法课程设计
银行家算法课程设计

银行家算法课程设计1 银行家算法课程设计银行家算法(Banker's algorithm)是一种算法,用于保证系统中的进程能够访问临界资源,即保证系统的安全性和可行性。
银行家算法是一种基于资源分配图的安全性算法,它利用图形表示来检查系统状态,检查系统是否处在安全状态,并在资源分配时避免死锁。
银行家算法在许多计算机科学领域,如计算机系统分析,系统设计,系统编程,操作系统,数据库管理系统,计算机网络,复印设备管理系统等被广泛使用,因为它可以有效地开发高可用性系统,以及可靠的系统安全策略,用于解决资源分配的多个进程之间的相互问题。
因此,银行家算法在操作系统理论中具有重要的地位,是进行操作系统机制设计和实现时必不可少的一门课程设计,它具有较强的实际性和创造性,重要考点包括:理论基础介绍,实际运用,算法设计和实现,以及探究特定的资源调度问题,实现过程指导,进程同步互斥的实现,实验室相关实践,最后结论总结。
在设计银行家算法课程期间,在理论介绍和实际验证等不同阶段,需要按照教学大纲要求,结合教学案例,开展深入的针对性训练,增强学生数学解决问题、分析问题、建立数学模型和验证数学模型的思维能力。
同时,在引导学生完成银行家算法编程实践的各个阶段中,教师及时给予学生有效的反馈和指导,为学生的综合素质的发展提供必要的支持,保证学习效果。
银行家算法课程设计不仅要求学生有丰富的实践能力和创新能力,更重要的是,学生通过学习、实践,能够构建一个可靠的基于数学模型思想的资源分配和安全性模型,以及利用高效算法实现资源分配与安全性策略,从而获得实战技能。
只有通过丰富的数学建模思维能力和运算逻辑能力,才能逐步形成真正的技术依据,开发可靠的系统安全策略,更好地保障操作系统的安全性。
银行家算法课程设计报告

《计算机操作系统》课程设计报告——设计题目:银行家算法学院:计算机科学与工程专业:计算机科学与技术班级:学号:姓名:指导老师:目录1绪论--------------------------------------------2 1.1题目描述------------------------------------21.2设计目的------------------------------------21.3设计要求------------------------------------21.4目的----------------------------------------21.5有关概念的解释------------------------------3 2 概要设计---------------------------------------32.1算法思路------------------------------------32.2银行家算法步骤------------------------------3 2.3安全性算法步骤------------------------------4 2.4源程序结构分析------------------------------4 3 程序流程图-----------------------------------63.1系统主要过程流程图---------------------------6 3.2银行家算法流程图-----------------------------7 3.3安全性算法流程图-----------------------------84 测试-------------------------------------------95、设计心得-------------------------------------136、参考文献-------------------------------------137、实验代码-------------------------------------131绪论1.1题目描述:银行家算法是一种最具有代表性的避免死锁的算法。
第五章 课程设计银行家算法

操作系统课程设计(一号黑体加粗)银行家算法模拟(小二黑体加粗)院系:小二黑体加粗班级:学号:姓名:同组者:时间:目录(小二黑体加粗)一、题目 (3)二、设计目的 (3)三、总体设计思想概述 (3)四、设计要求 (3)五、设计方案 (3)六、说明 (4)七、流程图 (5)八、运行结果 (5)九、源程序 (5)十、总结 (5)十一、参考文献 (5)一、题目:(标题2,即三号黑体加粗)银行家算法模拟。
二、设计目的:通过此课程设计,进行的一次全面的综合训练,使之更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
三、总体设计思想概述:安全状态下系统不会进入死锁,不安全状态可能进入死锁。
在进行资源分配之前,先计算分配的安全性,判断是否为安全状态。
四、设计要求:银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
设计完成后,要求写出一份详细的设计报告。
五、设计方案:编制银行家算法通用程序,并检测所给状态的系统安全性。
1)银行家算法中的数据结构假设有n个进程m类资源,则有如下数据结构:可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
Available[j]=K,则表示系统中现有Rj 类资源K个。
最大需求矩阵Max。
这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
分配矩阵Allocation。
这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
操作系统课程设计-银行家算法(流程图+源代码+设计报告)

操作系统课程设计-银行家算法(流程图+源代码+设计报告)一、实验目的:熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。
二、实验要求:用高级语言编写和调试一个描述银行家算法的程序。
三、实验内容: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经测试,可为该进程分配资源。
操作系统课程设计报告 银行家算法

操作系统课程设计报告题目:银行家算法操作系统课程设计报告题目:银行家算法摘要在多道操作系统中,可以利用多个进程并发执行来改善系统资源利用率,提高系统的吞吐量,但也可能发生人们不想看到的危险——死锁。
为了解决这个问题,人们引入了多种机制处理死锁问题。
本文主要介绍了操作系统如何运用银行家算法和安全性算法避免死锁的产生。
同时运用Java编程语言模拟计算机内部资源分配的过程。
让读者对银行家算法有更深刻的认识。
关键字:死锁银行家算法安全性算法资源分配IAbstractIn much road OS, improve the systematic handling capacity, but also may people happened not thinking of dangerous dead lock seeing that to come to improve system resource utilization ratio being able to make use of many course concurrency to carry out. Have led into various mechanism for problem , people resolving this handle lock fast problem. The main body of a book has been introduced mainly how to apply the banker algorithm and the security algorithm to avoid lock fast creation. Wield Java programming language analog computer inside resource assignment process at the same time. Let reader have deeper cognition to banker algorithm.Key words: Algorithmic algorithmic security of dead lock banker resource assignmentII目录中文摘要 (I)英文摘要 (II)1绪论 (1)2需求分析 (2)3概要设计 (3)4详细设计 (4)5测试与分析 (6)6总结 (11)7参考文献 (12)附录 (13)1绪论银行家算法诞生的背景:操作系统作为裸机上安装的第一层软件,起着控制和管理计算机内部软硬件资源,合理组织计算机工作流程,提高计算机工作效率,用户和计算机硬件接口的重要作用。
操作系统课程设计任务书

操作系统集中上机实验1:银行家算法一、目的和要求银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
二、实验内容1.设计进程对各类资源最大申请表示及初值确定。
2.设定系统提供资源初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其申请是否得到满足。
三、算法描述银行家可以把一定数量的资金供多个用户周转使用,为保证资金的安全银行家规定:1.当一个用户对资金的最大需求量不超过银行家现有的资金就要接纳该用户;2.用户可以分期贷款,但贷的总数不能超过最大需求量;3.当银行家现有的资金不能满足用户的沿需贷数时,对用户的贷款可推迟支付,但总能使用户在有限的时间里得到贷款;4.当用户得到所需的全部资金后,一定能在有限的时间里归还所有的资金。
实验2:时间片轮转法基本思想:将CPU的处理时间划分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片,当时间片结束时,就强迫运行进程让出CPU,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。
在轮转法中,时间片长度的选择非常重要,将宜接影响系统开销和响应时间。
如果时间片长度很小,则调度程序剥夺处理机的次数频繁,加重系统开销;反之,如果时间片长度选择过长,比方说一个时间片就能保证就绪队列中所有进程都执行完毕,则轮转法就退化成先进先出算法。
实验3-4:抢占式(或非抢占式)优先级调度算法基本思想:该算法的基本思想是进程优先级高者优先调度,是一种常用的进程调度算法。
该算法的关键是如何确定优先数。
通常确定优先数的方法有两种,即静态法和动态法。
(1)静态优先权是在创建进程时确定的,其运行特征是优先数确定之后在整个进行运行期间不再改变。
确定静态优先权的依据有进程的类型、进程所使用的资源、进程的估计运行时间等因素。
操作系统课程设计银行家算法参考
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()函数:完成对系统运行环境的初始化,定义了简单的选择菜单,调用各功能函数。
银行家算法课程设计小结
银行家算法课程设计小结银行家算法课程设计小结一、引言近年来,计算机科学和金融领域的交叉发展逐渐成为研究和实践的热点。
其中,银行家算法作为一种重要的操作系统算法,对于保障系统稳定性和安全性具有至关重要的作用。
在本篇文章中,我将对我所参与的银行家算法课程设计进行全面评估,并分享我对该算法的个人观点和理解。
二、银行家算法的深度评估在我所参与的银行家算法课程设计中,我对该算法的深度和广度进行了全面评估,并按照从简到繁、由浅入深的方式展开探讨,以帮助自己更深入地理解。
1. 算法原理(此处可以详细解释银行家算法的原理,如资源分配和安全性检查等)2. 算法应用在我们的课程设计中,我们使用银行家算法来解决并发环境中资源的分配和安全性问题。
通过模拟银行家的行为,我们可以判断在系统中是否存在死锁,并可以采取相应的措施来解决或避免死锁的发生。
3. 算法实现我们在课程设计中使用了Java语言来实现银行家算法。
通过编写相应的代码,我们可以模拟系统中的进程、资源和请求,并通过银行家算法来判断资源是否能够安全分配,并进行相应的操作。
4. 算法优化除了基本的银行家算法外,我们还对其进行了优化,以提高算法的效率和性能。
我们使用了数据结构中的图来表示资源的分配情况,以便更快速地进行资源安全性检查。
我们还通过并行计算技术,提高了算法的并发处理能力,使其更适用于现代高性能计算环境。
三、银行家算法的个人观点和理解在参与课程设计的过程中,我对银行家算法产生了较深的兴趣,并对其产生了一些个人观点和理解。
1. 安全性与效率的平衡银行家算法在资源分配和安全性之间取得了一种平衡。
它通过对系统中的资源需求和可用资源进行合理的分析,以保证系统的安全性,同时又尽可能地提高系统的效率。
这种平衡在实际应用中具有重要的意义,因为我们既需要确保系统的安全性,又需要满足用户的实时需求。
2. 银行家角色的启示银行家算法的设计灵感来自银行家的行为,这给了我一些启示。
银行家算法课程设计
银行家算法一,银行家算法原理说明我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
二,银行家算法的数据结构1)可利用资源向量Available是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Max这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m 类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵Allocation这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj 类资源的数目为K。
4)需求矩阵Need。
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
Need[i,j]=Max[i,j]-Allocation[i,j] 二,银行家算法流程图四,代码实现#include<stdio.h>#include<stdlib.h>#include<conio.h>#define true 1 //定义ture =1#define false 0 //定义false=0int Available[10]; //可使用资源向量int Max[10][10]; //最大需求矩阵int Allocation[10][10]={0}; //分配矩阵int Need[10][10]={0}; //需求矩阵int Work[10]; //工作向量int Finish[10]; //状态标志int Request[10][10]; //进程申请资源向量int Pause[10];int List[10];int i,j;int n; //系统资源总数int m; //总的进程数int a; //当前申请的进程号int l,e; //计数器int b=0,c=0,f=0,g; //计数器void enter()//输入部分{printf("请输入系统总共有的资源数:");scanf("%d",&n);printf("请输入总共有多少个进程:");scanf("%d",&m);for(i=1;i<=n;i++){printf("第%d类资源有的资源实例:",i);scanf("%d",&Available[i]);}for(i=1;i<=m;i++){for(j=1;j<=n;j++){printf("进程P[%d]对第%d类资源的最大需求量:",i,j);scanf("%d",&Max[i][j]);Need[i][j]=Max[i][j];}}}void request() //进程提出新申请{printf("请输入申请资源的进程:");scanf("%d",&a);for(i=1;i<=n;i++){printf("请输入进程P[%d]对%d类资源的申请量:",a,i);scanf("%d",&Request[a][i]);if(Request[a][i]>Need[a][i])printf("\n出错!进程申请的资源数多于它自己申报的最大量\n");if(Request[a][i]>Available[i])printf("\nP[%d]必须等待\n",a);//以下是试探性分配Available[i]=Available[i]-Request[a][i];Allocation[a][i]=Allocation[a][i]+Request[a][i];Need[a][i]=Need[a][i]-Request[a][i];Work[i]=Available[i];}for(i=1;i<=m;i++){Pause[i]=Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面//安全性检查时修改到Available[i]而代替的一维数组Finish[i]=false;}for(g=1;g<=m;g++){for(i=1;i<=m;i++){b=0; //计数器初始化for(j=1;j<=n;j++){if(Need[i][j]<=Pause[j]){b=b+1;}if(Finish[i]==false&&b==n){for(l=1;l<=n;l++){Pause[l]=Pause[l]+Allocation[i][l];}Finish[i]=true;printf("$$ %d ",i);//依次输出进程安全序列之一中每个元素}}}}printf("\n");for(i=1;i<=m;i++){if(Finish[i]==true) f=f+1;//统计Finish[i]==true的个数}if (f==m){printf("safe static");f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备}else{printf(" unsafe static ");//以下代码为当系统被判定为不安全状态时//返回提出申请前的状态for(i=1;i<=n;i++){Available[i]=Available[i]+Request[a][i];Allocation[a][i]=Allocation[a][i]-Request[a][i];Need[a][i]=Need[a][i]+Request[a][i];}}}void print(){printf("当前的系统状态\n");printf(" 目前占有量最大需求量尚需要量\n进程");for(i=1;i<=n;i++)for(j=1;j<=n;j++){printf(" %d类",j);}for(i=1;i<=m;i++){printf("\nP[%d]",i);for(j=1;j<=n;j++){printf(" %d ",Allocation[i][j]);}for(j=1;j<=n;j++){printf(" %d ",Max[i][j]);}for(j=1;j<=n;j++){printf(" %d ",Need[i][j]);}}printf("\n\n系统剩余资源量:");for(i=1;i<=n;i++){printf(" %d ",Available[i]);}printf("\n");}void main(){ int k,h=1;while(h){ system("cls");{printf("\n\n 欢迎使用本程序\n");printf("\n\n 1**********输入系统的资源数、申请进程数、每个类资源的实例数");printf("\n 2:*********输入进程的资源申请");printf("\n 3:*********输出系统状态");printf("\n 4:*********退出程序");printf("\n\n please choose ");scanf("%d",&k);}switch(k){case 1:enter(); break;case 2:request(); break;case 3:print(); break;case 4:h=0; break;}printf("\n");system("pause");}}五,结果运行。
银行家算法课程设计
信息与计算科学操作系统原理课程设计报告题目:银行家算法程序设计班级:姓名:专业:银行家算法程序设计目录1.绪论 (2)2.需求分析 (2)2.1功能需求 (2)2.2数据需求 (2)3. 总体设计 (2)3.1功能模块设 (2)3.2系统设计方案 (3)3.3开发工具 (4)4. 详细设计 (4)4.1银行家算法中的数据结构 (4)4.2银行家算法 (5)4.3安全性算法 (6)5. 调试与测试 (8)6. 结论 (8)结束语 (8)参考文献 (9)附录1-用户手册 (10)附录2-源程序清单.................................................................................... 错误!未定义书签。
1.绪论20世纪末,随着计算机科学的发展,C语言的应用越来越广泛,很多程序都需要使用C语言来编写。
C语言使用方便快捷,它已经成为计算机编程中不可缺少的一部分,而且它也被用于各个方面。
例如:政府部门,银行,学校等等。
银行家算法是判断系统是否安全,并且允许其它进程来申请这里的资源,任何一个进程来申请资源时,必须先登记该进程对资源的申请要求然后由系统检查当前资源的状况,并用银行家算法和安全性算法来检查是否允许分配资源给进程。
通过课程设计,加深我们对利用银行家算法避免死锁的理解。
在设计中主要的难点是用语言编写银行家算法和安全性算法,使系统资源分配能安全进行,避免系统死锁。
2.需求分析2.1 功能需求1.添加进程的可用资源,最大资源,已分配资源;2.判断系统是否安全;3.申请资源;4.申请资源后如何分配;5.进行安全检查。
2.2 数据需求主要数据包括:可用资源,最大资源,已分配资源,申请资源数。
3. 总体设计3.1 功能模块设图1 功能模块图3.2 系统设计方案在程序中设计五个进程,分别为P0,P1,P2,P3,P4。
共享三类资源。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计报告题目:银行家算法安全性算法院(系):计算机科学与工程专业:软件工程班级:130608班学生:姚骏川学号:*********指导教师:***2015年12月28目录摘要 .................................................................................................................错误!未定义书签。
1 绪论 (1)1.1前言 (1)1.2研究意义 (1)2 需求分析 (3)2.1题目描述 (3)2.2银行家算法 (3)2.3基本要求 (3)2.4目的 (3)3 概要设计 (5)3.1算法思路: (5)3.2银行家算法步骤 (5)3.3安全性算法步骤 (5)3.4数据结构: (6)4 详细设计 (8)4.1主要函数的核心代码: (8)4.2系统主要过程流程图 (8)4.3银行家算法流程图 (9)5 测试与分析 (10)5.1测试数据 (10)5.2银行家算法的演示 (10)5.3分配资源由于大于可利用资源则失败。
(11)5.4 增加一个作业得到不安全序列。
(11)5.5分配资源由于大于最大资源则失败。
(12)附录源程序清单 (15)1 绪论1.1前言Dijkstra (1965)提出了一种能够避免死锁的调度算法,称为银行家算法。
它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。
这里将客户比作进程,贷款比作设备,银行家比作系统。
客户们各自做自己的生意,在某些时刻需要贷款。
在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。
一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。
如果忽然所有的客户都申请,希望得到最大贷款额,而银行家无法满足其中任何一个的要求,则发生死锁。
不安全状态并不一定导致死锁,因为客户未必需要其最大贷款额度,但银行家不敢抱这种侥幸心理。
银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。
若是,则不满足该请求;否则便满足。
检查状态是否安全的方法是看他是否有足够的资源满足一个距最大需求最近的客户。
如果可以,则这笔投资认为是能够收回的,然后接着检查下一个距最大需求最近的客户,如此反复下去。
如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。
1.2研究意义在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进。
要预防死锁,有摒弃“请求和保持”条件,摒弃“不剥夺”条件,摒弃“环路等待”条件等方法。
但是,在预防死锁的几种方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统状态分为安全状态和不安全状态,便可避免死锁的发生。
而最具代表性的避免死锁的算法,便是Dijkstra的银行家算法。
利用银行家算法,我们可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。
2 需求分析2.1题目描述银行家算法是一种最具有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。
所谓安全状态,是指系统能按照某种进程顺序{P1,P2,…,Pn}(称{P1,P2,…,Pn }序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。
安全状态一定没有死锁发生。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
那么,什么是安全序列呢?如果对每一个进程Pi(1<i<n),它以后尚需要的资源量不超过系统当前可利用的资源量与所有的进程Pj(j<n)所占有的资源量之和,则称此进程序列{P1,P2,…,Pn}是安全的,称作安全序列。
2.2银行家算法我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。
操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。
若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。
2.3基本要求(1)设计用来保存:可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation 、需求矩阵Need。
(2)编写银行家算法,安全性检测算法。
要求在不安全时输出错误信息。
(3)编写输出函数,能对进程申请后的系统状态进行输出。
2.4目的根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。
明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。
3 概要设计3.1算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
3.2银行家算法步骤(1)如果Requesti<=Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3.3安全性算法步骤(1)设置两个向量①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②Need< =Work;如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finish[i]=true; 转向步骤(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
3.4数据结构:3.4.1主要用到的数据结构:(1)最大需求矩阵Max[][](2)已分配矩阵Allocation[][](3)仍需求矩阵Need[][]=Max[][]-Allocation[][](4)可利用资源向量Available[](5)申请各类资源向量Request[](6)工作向量 work[] , Finish[](7)存放安全序列 temp[](8)存放系统可提供资源 work[](9)资源的名字 name[]3.4.2程序模块:int main()//主函数void showdata()//显示资源矩阵int changdata(int i)//进行资源分配int safe()//安全性算法void share()//利用银行家算法对申请资源对进行判定void addresources(){//添加资源void changeresources(){//修改资源函数void addprocess(){//添加作业3.4.3各模块间的调用关系:主函数void main()要调用: showdata(),safe(),addresources(),addprocess(),changeresources(),changdata(int i)安全性检测函数safe()银行家算法函数share()要调用 changdata(int i), showdata(),safe()4 详细设计4.1主要函数的核心代码:1.进行初始化输入的函数2.输出的函数3.利用安全性算法进行检测的函数4.进行资源分配的函数5.利用银行家算法进行判定的函数4.2系统主要过程流程图图4.1 主要流程图4.3银行家算法流程图图4.2 银行家流程图5 测试与分析5.1测试数据本次测试一共5个进程,分别为p0、p1、p2、p3、p4.,资源分配情况如下表:资源情况进程MaxA B CAllocationA B CNeedA B CAvailableA B CP0 7 5 3 0 1 0 7 4 3 3 3 2P1 3 2 2 2 0 0 1 2 2P2 0 9 2 3 0 2 6 0 0P3 2 2 2 2 1 1 0 1 1P4 4 3 3 0 0 2 4 3 1结果截图:图5.15.2银行家算法的演示进行资源的分配,为进程1分配了(1,0,2),进行安全算法得到如下的结果。
图5.25.3分配资源由于大于可利用资源则失败。
图5.35.4 增加一个作业得到不安全序列。
图5.45.5分配资源由于大于最大资源则失败。
图5.56 总结操作系统的基本特征是并发与共享。
系统允许多个进程并发执行,并且共享系统的软、硬件资源。
为了最大限度的利用计算机系统的资源,操作系统应采用动态分配的策略,但是这样就容易因资源不足,分配不当而引起“死锁”。
而我本次课程设计就是得用银行家算法来避免“死锁”。
银行家算法就是一个分配资源的过程,使分配的序列不会产生死锁。
此算法的中心思想是:按该法分配资源时,每次分配后总存在着一个进程,如果让它单独运行下去,必然可以获得它所需要的全部资源,也就是说,它能结束,而它结束后可以归还这类资源以满足其他申请者的需要。
在程序当中,我们也得强调一下对输入的合法性的判断。