华工2016春操作系统大作业银行家死锁避免算法模拟(含源文件)
- 格式:doc
- 大小:1.20 MB
- 文档页数:17
操作系统实验⼆:银⾏家算法实验⼆银⾏家算法⼀、实验⽬的1、了解什么是操作系统安全状态和不安全状态;2、了解如何避免系统死锁;3、理解银⾏家算法是⼀种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。
⼆、实验内容根据银⾏家算法的基本思想,编写和调试⼀个实现动态资源分配的模拟程序,并能够有效避免死锁的发⽣。
三、实验原理进程申请资源时,系统通过⼀定的算法判断本次申请是否不可能产⽣死锁(处于安全状态)。
若可能产⽣死锁(处于不安全状态),则暂不进⾏本次资源分配,以避免死锁。
算法有著名的银⾏家算法。
1、什么是系统的安全状态和不安全状态?所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直⾄最⼤需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。
如果不存在这样的安全序列,则称系统处于不安全状态。
2、银⾏家算法把操作系统看作是银⾏家,操作系统管理的资源相当于银⾏家管理的资⾦,进程向操作系统请求分配资源相当于⽤户向银⾏家贷款。
为保证资⾦的安全,银⾏家规定:(1) 当⼀个顾客对资⾦的最⼤需求量不超过银⾏家现有的资⾦时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最⼤需求量;(3) 当银⾏家现有的资⾦不能满⾜顾客尚需的贷款数额时,对顾客的贷款可推迟⽀付,但总能使顾客在有限的时间⾥得到贷款;(4) 当顾客得到所需的全部资⾦后,⼀定能在有限的时间⾥归还所有的资⾦。
操作系统按照银⾏家制定的规则设计的银⾏家算法为:(1)进程⾸次申请资源的分配:如果系统现存资源可以满⾜该进程的最⼤需求量,则按当前的申请量分配资源,否则推迟分配。
(2)进程在执⾏中继续申请资源的分配:若该进程已占⽤的资源与本次申请的资源之和不超过对资源的最⼤需求量,且现存资源能满⾜该进程尚需的最⼤资源量,则按当前申请量分配资源,否则推迟分配。
(3)⾄少⼀个进程能完成:在任何时刻保证⾄少有⼀个进程能得到所需的全部资源⽽执⾏到结束。
银行家算法的模拟实现实验报告银行家算法的模拟实现一、实验题目:模拟实现银行家算法的处理过程二、实验目的:银行家算法是避免死锁的代表性算法。
本实习旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。
然后依照本实习,自行设计模拟程序。
三、实验原理:1.我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源。
当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2. 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。
不安全状态一定导致死锁。
安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
3. 设requesti为进程p[i]的请求向量,如果requesti[j]=K,表示进程p[i]需要K个Rj资源。
当系统发出请求后,系统按下述步骤开始检查:1)如果requesti[j]<=need[i][j],转向步骤2;否则报告出错,申请的资源已经大于它需要的最大值。
2)如果requesti[j]<=available[j],转向步骤3;否则报告出错,尚无足够的资源。
3)系统试探着把资源分配给p[i],并修改下列数据结构中的值:available[j]=available[j]-request[j]allocation[i][j]=allocation[i][j]+request[j]need[i][j]=need[i][j]-request[j]4)系统进行安全性算法,检查此次分配后,系统是否还处于安全状态,若安全,把资源分配给进程p[i];否则,恢复原来的资源分配状态,让进程p[i]等待。
实验六死锁避免的算法【实验目的】1、了解死锁避免的原理。
2、研究银行家算法的实现方法。
【实验内容】编程实现银行家算法。
通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
要求如下:(1)模拟一个银行家算法;(2)初始化时让系统拥有一定的资源;(3)用键盘输入的方式申请资源;(4)如果预分配后,系统处于安全状态,则修改系统的资源分配情况;(5)如果预分配后,系统处于不安全状态,则提示不能满足请求,【实验报告】1、列出调试通过程序的清单,并附上文档说明。
2、总结上机调试过程中所遇到的问题和解决方法及感想。
【实验相关资料】一、死锁概念多个并发进程,每个进程占有部分资源,又都等待其它进程释放所占资源,造成均不能向前推进的现象。
二、死锁的避免死锁避免原理就是使系统始终处于安全状态。
安全状态:所谓安全状态是指能够找到一个安全序列,系统能够按照这个安全序列依次为进程分配资源,使所有进程都能执行完毕,如果找不到这样的安全序列,系统就处于不安全状态。
三、银行家算法银行家算法要求每个进程的最大资源需求,其基本思想是:始终保持系统处于安全状态,当进程提出资源请求时,系统先进行预分配,再判断系统分配后是否仍然处于安全状态。
如果仍然处于安全状态,就进行实际分配;如果处于不安全状态,则拒绝该进程的资源请求。
四、银行家算法相关数据结构1. 最大需求矩阵:d (t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m d d d d d d d d d .........212222111211 其中,行表示进程,列表示资源,如:d ij =5表示第 i 个进程最多需要j 类资源5个。
2. 资源分配矩阵:a(t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m a a a a a a a a a .........212222111211 元素a ij =8表示分配给第 i 进程8个j 类资源。
实验二死锁的避免班级:学号:姓名:1.实验内容模拟进程的资源分配算法2.实验目的为了了解系统的资源分配情况,假定系统的任何一种资源在任一时刻只能被一个进程使用。
任何进程已经占用的资源只能由进程自己释放,而不能由其他进程抢占。
当进程申请的资源不能满足时,必须等待。
因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。
编写模拟系统进行资源调度的程序,采用银行家算法,有效地避免死锁的产生。
模拟进程的资源分配算法,了解死锁的产生和避免的方法。
3.实验设计3.1 数据结构设计使用银行家算法过程中,当某个进程提出资源请求时,假定系统先分配给它,之后用系统安全性检查算法对系统进行安全性检查。
若系统安全,则假定分配变成真的分配,若系统不安全,假定分配作废,让进程等待。
void judge()//利用银行家算法对申请资源对进行判定{ char ch;int i=0,j=0;ch='y';cout<<"请输入需要资源的进程号(0-"<<N-1<<"):";cin>>i;//输入须申请的进程号cout<<"请输入进程 "<<i<<" 申请的资源:"<<endl;for(j=0;j<M;j++){ cout<<name[j]<<":";cin>>Request[j];//需要申请的资源}for (j=0;j<M;j++){if(Request[j]>Need[i][j]||Request[j]>Avaliable[j])//判断申请是否大于需求和可分配的资源数目{ cout<<"进程 "<<i<<"申请的资源不符合要求";cout<<" 无法分配!"<<endl;ch='n';break;}}if(ch=='y'){ resource_allocation(i);//根据进程需求量变换资源show();//根据进程需求量显示变换后的资源safe();//根据进程需求量进行银行家算法判断}}在进行系统安全性检查时,第一步,把各进程的剩余资源量与系统的剩余资源量进行比较,检查系统剩余资源量是否可供分配,若是,进行第二步,若不是,进行第三步。
实验二银行家算法模拟实验学时:2实验类型:设计实验要求:必修一、实验目的(1)进一步理解利用银行家算法避免死锁的问题;(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。
(3)理解和掌握安全序列、安全性算法二、实验内容(1)了解和理解死锁;(2)理解利用银行家算法避免死锁的原理;(3)会使用某种编程语言。
三、实验原理(一)安全状态指系统能按照某种顺序如<P1,P2,…,Pn>(称为<P1,P2,…,Pn>序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。
(二)银行家算法假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。
系统按下述步骤进行安全检查:(1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。
(2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,Pi阻塞等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]∶=Available[j]-Requesti[j];Allocation[i,j]∶=Allocation[i,j]+Requesti[j];Need[i,j]∶=Need[i,j]-Requesti[j];(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
(三)安全性算法(1)设置两个向量:①工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m 个元素,在执行安全算法开始时,Work∶=Available;② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。
一、实验目的本次实验旨在通过模拟操作系统的资源分配和请求过程,深入理解死锁的概念、产生死锁的必要条件以及如何通过银行家算法来避免死锁的发生。
通过实验,学生能够掌握以下知识点:1. 死锁的概念及产生条件;2. 银行家算法的基本原理和实现方法;3. 资源分配和请求过程中的安全性检查;4. 通过银行家算法避免死锁的发生。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 实验环境:一台配置较高的计算机三、实验原理1. 死锁的概念死锁是指多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,这些进程都将无法继续执行。
2. 产生死锁的必要条件产生死锁的必要条件有四个,分别为:(1)互斥条件:资源不能被多个进程同时使用;(2)持有和等待条件:进程已获得至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时该进程会等待;(3)非抢占条件:已分配给进程的资源,在进程完成之前,不能被抢占;(4)循环等待条件:存在一种进程资源的循环等待链,即进程P1等待P2占有的资源,P2等待P3占有的资源,以此类推,最后Pn等待P1占有的资源。
3. 银行家算法银行家算法是一种避免死锁的算法,通过以下步骤实现:(1)初始化系统资源、进程最大需求、已分配资源等数据结构;(2)当进程请求资源时,判断是否满足以下条件:a. 当前可用资源数量大于等于进程请求的资源数量;b. 根据当前资源分配情况,系统处于安全状态;若满足以上条件,则分配资源;否则,进程等待。
(3)当进程释放资源时,更新可用资源数量和分配资源情况。
四、实验内容1. 设计系统资源、进程最大需求、已分配资源等数据结构;2. 实现银行家算法,包括资源分配、安全性检查等功能;3. 模拟进程请求资源和释放资源的过程,观察系统状态变化;4. 分析实验结果,验证银行家算法是否能够避免死锁的发生。
实验10 利用银行家算法避免死锁一.实验目的1.加深对死锁概念的理解。
2.能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。
二.实验内容利用银行家算法写一个程序,判定系统的安全性。
已知某系统有5个进程P0、P1、P2、P3、P4,三类资源A,B,C。
死锁检测程序工作时各进程对资源的需求和占用情况如表10-1所示,当前可用资源向量available=(0,0,0)。
表10-1 进程需求资源情况三.实验程序及分析# define m 3# define n 5main(){int test(int av[],int ned[],int all[]);int available[m]={0,0,0}, need[n][m];int allocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}};int i,j,g=1;int finish[n]={0,0,0,0,0};clrscr();printf("please input the need resource data\n");for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&need[i][j]); /*输入need*/j=0; /*以下循环用来寻找能够运行完成的进程Pi*/do{for(i=0;i<n;i++)if (finish[i]==0 && test(need[i],available,allocation[i]))finish[i]=1;j++;}while(j<n);for(i=0;i<n;i++) /*g表示系统是否处于安全状态*/ g=g&&finish[i];if (g) printf("safe state");else printf("not safe state");}int test(int nd[],int av[],int all[]){int z=0;int i;for(i=0;i<m;i++)if (nd[i]>av[i]) break;if (i==m) z=1;if (z==1)for(i=0;i<m;i++)av[i]=av[i]+all[i];return(z);}运行输入:0 0 22 2 20 0 01 0 00 0 2输出结果:safe state10for(int i=0;i<n;i++){cout<<"名称:";cin>>name[flag];cout<<"数量:";cin>>Avaliable[flag++];}showdata();safe();}void changeresources(){//修改资源函数cout<<"系统目前可用的资源[Avaliable]:"<<endl;for(int i=0;i<N;i++)cout<<name[i]<<":"<<Avaliable[i]<<endl; cout<<"输入系统可用资源[Avaliable]:"<<endl;cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; cout<<"经修改后的系统可用资源为"<<endl;for (int k=0;k<N;k++)cout<<name[k]<<":"<<Avaliable[k]<<endl; showdata();safe();}void delresources(){//删除资源char ming;int i,flag=1;cout<<"请输入需要删除的资源名称:";do{cin>>ming;for(i=0;i<N;i++)if(ming==name[i]){flag=0;break;}if(i==N)cout<<"该资源名称不存在,请重新输入:";}while(flag);for(int j=i;j<N-1;j++){name[j]=name[j+1];Avaliable[j]=Avaliable[j+1];}N=N-1;showdata();11safe();}void addprocess(){//添加作业int flag=M;M=M+1;cout<<"请输入该作业的最大需求量[Max]"<<endl;for(int i=0;i<N;i++){cout<<name[i]<<":";cin>>Max[flag][i];Need[flag][i]=Max[flag][i]-Allocation[flag][i]; }showdata();safe();}int main()//主函数int i,j,number,choice,m,n,flag; char ming;cout<<"*****************资源管理系统的设计与实现*****************"<<endl;cout<<"请首先输入系统可供资源种类的数量:";cin>>n;N=n;for(i=0;i<n;i++){cout<<"资源"<<i+1<<"的名称:";cin>>ming;name[i]=ming;cout<<"资源的数量:";cin>>number;Avaliable[i]=number;}cout<<endl;cout<<"请输入作业的数量:";cin>>m;M=m;cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>Max[i][j];do{flag=0;cout<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++){cin>>Allocation[i][j];if(Allocation[i][j]>Max[i][j])flag=1;Need[i][j]=Max[i][j]-Allocation[i][j];}if(flag)cout<<"申请的资源大于最大需求量,请重新输入!\n";}while(flag);showdata();//显示各种资源safe();//用银行家算法判定系统是否安全while(choice){cout<<"**************银行家算法演示***************"<<endl;cout<<" 1:增加资源"<<endl;cout<<" 2:删除资源"<<endl;cout<<" 3:修改资源"<<endl;cout<<" 4:分配资源"<<endl;cout<<" 5:增加作业"<<endl;cout<<" 0:离开"<<endl;cout<<"*******************************************"<<endl;cout<<"请选择功能号:";cin>>choice;switch(choice){case 1: addresources();break;case 2: delresources();break;case 3: changeresources();break;case 4: share();break;case 5: addprocess();break;case 0: choice=0;break;default: cout<<"请正确选择功能号(0-5)!"<<endl;break;}}return 1;}。
模拟实现死锁避免的实验
一实验目的
通过本实验,使学生进一步了解死锁、系统安全与不安全和资源动态分配的概念,学会编程实现银行家算法检验系统状态是否安全的方法,从而为将来在实际系统中使用该方法打下基础。
二编程说明
设计模拟实现死锁避免的程序,要求:
1,输入并显示资源类型数,进程数,每类资源的个体数;
2,输入每个进程对每类资源的最大需求量,已分量,算出其剩余需求量。
算出系统每类资源的当前剩余量;显示输入和计算出的数据;
3,按银行家算法检测系统当前是否处于安全状态,若是,往下;若否,转1,重新设置数据;
4,给出某个进程的资源分配请求,按死锁避免方法检测可否将资源分配给它?若可,输出一个进程安全序列、资源分配成功的说明和新的系统资源分配状态表;若否,输出“资源分配失败”和失败的原因:①,申请量大于系统的当前剩余量,②,申请量大于自己的剩余需求量,③,若分配系统将处于不安全状态。
【说明】
1,程序每次运行都要重新输入数据,第一次可以按书上P93的数据输入;
2,使用银行家算法检测系统的安全性;
3,要有分配成功和分配失败两种情况的演示。
三实验报告
1,给出程序流程图;
2,给出源程序及源程序中的注释;
3,给出程序中使用的数据结构和符号变量的说明;
4,给出一个分配成功的结果输出;
5,给出一个分配失败的结果输出;
6,收获体会及对该题的改进意见。
实验三预防进程死锁的银行家算法1、需求分析(1) 输入的形式和输入值的范围首先输入进程个数,然后再输入资源类型数,接着输入每种资源的可用数目,然后输入每个进程所需要的各种资源最大值,然后输入进程已经分配的资源,银行家算法初始化的输入完成。
输入进程是否继续,如果继续则输入请求的进程的应用,然后输入进程的请求量。
(2) 输出的形式状态安全则输出安全的序列,不安全则输出提示信息。
不管安全与否都会提醒用户是否继续输入。
3)程序所能达到的功能假设系统中有n个进程P1, … ,Pn,有m类可分配的资源R1, … ,Rm,在T0时刻,进程Pi分配到的j类资源为Allocationij个,它还需要j类资源Need ij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。
设计程序模拟预防进程死锁的银行家算法的工作过程。
4) 测试数据2.概要设计int Available[MaxNumber];int Max[MaxNumber][MaxNumber];int Allocation[MaxNumber][MaxNumber];int Need[MaxNumber][MaxNumber];int Request[MaxNumber];int SafeOrder[MaxNumber];输入资源类型数目输入每种资源的可用数目输入每个进程所需各种资源的最大值输入每个进程已经分配的资源输入要申请的进程号输入所请求的资源量是否再次申请是输入进程个数3.详细设计1)安全性算法用于检测当前时刻系统的安全性步骤:1. 从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②Need[i,j]<=Work[j] 若找到执行步骤2,找不到执行步骤32. 进程满足上述条件,进程能完成且释放资源,故Work[j]+=Allocation[i,j]Finish[i]=true;返回步骤13. 如果所有进程满足Finish[i]=true,则系统处于安全状态,否则系统处于不安全状态2)银行家算法在该函数内,建立一个while(1)的循环,在循环内首先输入要申请的进程号和一个for语句判断Request[number][i]是否小于Need[number][i],不小于等于则出错,接着判断Request[number][i]是否小于Available[i],如果不小于等于则出错,接着系统把资源分配给所申请的进程号,并修改如下数据Available[i]=Available[i]-Request[number][i]Allocation[number][i]+=Request[number][i];Need[number][i]-=Request[number][i];接着进行安全性算法检查,算法返回true则为安全,否则为不安全接着输入y表示还要继续分配,否则结束分配4、调试分析1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析在调试过程中将请求量容易输入错误,会造成不同的结果。
操作系统实验利用银行家算法避免死锁实验报告一、实验题目:利用银行家算法避免死锁二、实验内容:编程实现银行家算法,要求能够输入资源数和作业数,输出进程的安全状况。
若进程安全,输出安全序列。
三、实验目的:通过实验加强对银行家算法避免死锁的理解和掌握。
四、实验过程: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。
任务五、死锁的避免一、实验目的在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进。
我们可以在分配资源时加上限制条件就可以预防死锁,但是,在每一种预防死锁的方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
二、实验内容利用银行家算法来避免死锁的发生三、实验代码#include<stdio.h>#define N 5 //进程个数#define M 3 //资源种类数void print();int check_safe();int check_distribution(int* p,int k);char processnema[N]; //进程名int Request[M]; //请求向量int Finish[N]; //标记某一个进程是否可以执行int Work[N][M]; //初始为Available[][],随寻找安全序列而变化,防止安全序列未找到而丢了初始状态的值int Available[M]; //资源清单--系统中现有各资源空闲个数int Work_Allocation[N][M];int Max[N][M]; //最大需求矩阵--每个进程对各类资源的最大需求数int Allocation[N][M];//分配矩阵--系统给每个进程已分配的各类资源数int Need[N][M]; //需求矩阵--每个进程还需要每种资源的个数int sequence[N]={0};//存放安全序列号void main(){int i=0,j=0,k=0;//记录申请资源的进程的序列号int flag=0; //标记输入的进程名是否存在int safe=0; //标志系统是否出于安全状态,0表示不安全,1表示安全int distribution=0; //标志是否可以进行试分配0表示可以,1表示不可以char flag1; //标记是否有进程申请资源//Need[N][M]=Max[N][M]-Allocation[N][M];char name; //要请求资源的进程名printf("~~~~~~~~~~~银行家算法~~~~~~~~~~~~~\n");printf(" 请分别初始化各矩阵信息 \n");printf("*请输入各进程的进程名\n"); //进程名连续输入for(i=0; i<N; i++){scanf("%c",&processnema[i]);}printf("请输入现有各资源空闲个数\n");for(i=0; i<M; i++){scanf("%d",&Available[i]);}printf("请分别输入每个进程对各类资源的最大需求数\n");for(i=0; i<N; i++){for(j=0; j<M; j++){scanf("%d",&Max[i][j]);}}printf("请分别输入系统给每个进程已分配的各类资源数\n");for(i=0; i<N; i++){for(j=0; j<M; j++){scanf("%d",&Allocation[i][j]);}}//printf("请分别输入每个进程还需要每种资源的个数\n");for(i=0; i<N; i++){for(j=0; j<M; j++){Need[i][j]=Max[i][j]-Allocation[i][j];}}printf("信息输入完毕\n");for(i=0; i<N; i++){sequence[i]=i;}print();safe=check_safe(); //检查初始状态是否安全if(0 == safe){printf("系统现处于不安状态,不能为进程分配资源,进入死锁状态。
泰山医学院操作系统课程设计题目:银行家算法院(部)系信息工程学院所学专业信息管理与信息系统年级、班级学号学生姓名指导教师姓名1、概述一、设计目的1、了解多道程序系统中,多个进程并发执行的资源分配。
2、掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。
3、掌握预防死锁的方法,系统安全状态的基本概念。
4、掌握银行家算法,了解资源在进程并发执行中的资源分配策略。
5、理解死锁避免在当前计算机系统不常使用的原因二、开发环境2、需求分析避免多道程序系统中程序的死锁。
一、死锁概念:在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。
所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
二、关于死锁的一些结论:Ø参与死锁的进程最少是两个(两个以上进程才会出现死锁)Ø参与死锁的进程至少有两个已经占有资源Ø参与死锁的所有进程都在等待资源Ø参与死锁的进程是当前系统中所有进程的子集注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
三、资源分类:永久性资源:可以被多个进程多次使用(可再用资源)l 可抢占资源l 不可抢占资源临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等(可消耗性资源)“申请--分配--使用--释放”模式四、产生死锁的四个必要条件:1、互斥使用(资源独占)一个资源每次只能给一个进程使用2、不可强占(不可剥夺)资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放3、请求和保持(部分分配,占有申请)一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)4、循环等待存在一个进程等待队列{P1 , P2 , … , Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路5、死锁的解决方案5.1 产生死锁的例子申请不同类型资源产生死锁P1:…申请打印机申请扫描仪使用释放打印机释放扫描仪…P2:…申请扫描仪申请打印机使用释放打印机释放扫描仪…申请同类资源产生死锁(如内存)设有资源R,R有m个分配单位,由n个进程P1,P2,…,Pn(n > m)共享。
模拟银行家算法实现死锁避免课程设计.院系:计算机与信息工程学院题目:模拟银行家算法实现死锁避免学生姓名:学生学号:专业班级:指导教师:日完成时间:2012年9月6..评分表:课题名称指导教师评语姓名成绩成绩评定学号日期年月日..目录题目:模拟银行家算法实现死锁避免 (1)评分表: .................................................................... ................... 2 一课程设计目的 ..................................................................... ........... 5 二课程设计内容 ..................................................................... ........... 5 三课程设计环境 ..................................................................... ........... 6 四课程设计步骤 ..................................................................... .. (6)41.需求分析 ..................................................................... .. (6)4.1.1 问题的提出 .....................................................................64.1.2 银行家算法原理 (6)4.1.3银行家算法详细解析 (7)4.1.4 银行安全性算法目的 (8)4.2概要设计 ..................................................................... (8)4.2.1 功能模块设计如下: (8)4.2.2 功能模块描述 (9)4.3详细设计 ..................................................................... (9)4.3.1基本数据结构的设计 (9)4.3.2算法的设计 ...................................................................10 ..五课程设计结果 ..................................................................... (11)5.1运行结果 ..................................................................... . (11)5.2测试分析 ............................................................................... 14 六课程设计心得与体会. (14)总结 ..................................................................... ............................. 14 七参考文献 ..................................................................... ................ 15 八程序清单 ..................................................................... . (16)8.1 操作主界面代码: (16)8.2 功能实现代码: ....................................................................19..一课程设计目的在熟练掌握死锁发生原理和解决死锁问题的基础上,利用一种程序设计语言模拟实现利用银行家算法实现死锁避免,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。
沈阳工程学院学生实验报告(课程名称:操作系统)一、实验题目死锁避免实验。
二、实验要求编写一段程序模拟银行家算法。
三、实验目的多个进程动态地共享系统的资源时可能会产生死锁现象。
银行家算法是通过对资源的分配进行动态地检查来达到避免死锁的目的。
本实验通过模拟银行家算法的应用,使读者了解银行家算法的执行过程。
从而进一步理解死锁产生的条件和避免死锁问题产生的方法。
四、实验原理分析⑴死锁的产生必须同时满足4个条件:●互斥条件,即一个资源每次只能由一个进程占用。
●请求与保持条件,即一进程请求资源不能满足时,它必须等待,同时它仍保持已得到的所有其它资源。
●不可剥夺条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源。
●环路等待条件,系统进入死锁的状态时,进程和资源之间形成一个封闭的环路。
⑵银行家算法是一种具有代表性的避免死锁的算法。
银行家算法为资源分配定义了两种状态,安全状态和不安全状态。
●安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
处于安全状态的系统一定没有死锁发生。
●不安全状态:当系统中不存在一个安全序列时系统处于不安全状态。
不安全状态下一定导致死锁发生。
五、实验过程记录1.流程图安全算法流程图银行家算法2.实验结果图1图2图3图43.结果分析1.对于图1来说因为P0 申请的资源大于他所需求的,所以认为此次分配出错2.对于图2来说因为P0申请的资源大于剩余的资源,所以此次分配出错3对于图3来说对于系统安全且能分配序列的t0安全时刻表资源情况进程max Need allocation Work+allocationfinishQ W QWQ W Q WP0 4 5 1 2 3 3 4 11 true P1 3 6 1 2 2 4 6 15 true P2 5 7 1 2 4 5 10 20 trueP0申请资源是的安全性检查资源情况进程work need allocation Work+allocation finish Q W Q W Q W Q WP0 0 7 0 1 4 4 4 11 truep1 4 11 1 2 2 4 6 15 True P2 6 15 1 2 4 5 10 20 TRUE4.对于图4来说因为最大需求大于可利用资源所以系统不安全五、成绩评定优良中及格不及格出勤内容格式分析总评指导教师:年月日源代码#include <iostream>using namespace std;#define False 0#define True 1int Max[100][100]={0};int Allocation[100][100]={0};int Need[100][100]={0};int Available[100]={0};int Work[100]={0};char name[100]={0};int temp[100]={0};int S=100,P=100;int safequeue[100]={0};int Request[100]={0};//void Showdata(){int i,j,k,l;cout<<"\t资源分配情况\n"<<endl;cout<<"\tMax"<<"\t已分配"<<"\tNeed"<<endl;cout<<"\t";for(j=0;j<3;j++){for (i=0;i<S;i++){cout<<name[i]<<" ";}cout<<"\t";}cout<<endl;for(i=0;i<P;i++){cout<<i<<"\t";for (j=0;j<S;j++){cout<<Max[i][j]<<" ";}cout<<"\t";for (k=0;k<S;k++){cout<<Allocation[i][k]<<" ";}cout<<"\t";for (l=0;l<S;l++){cout<<Need[i][l]<<" ";}cout<<endl;}cout<<"\nAvailable"<<endl;for (i=0;i<S;i++){cout<<name[i]<<" ";}cout<<endl;for (i=0;i<S;i++){cout<<Available[i]<<" ";}cout<<endl;}int Judgesafe(){int tempwork[100][100]={0};int i,x,k=0,m,apply,Finish[100]={0};int j;int flag=0;for (i=0;i<S;i++){Work[i]=Available[i];}for(i=0;i<P;i++){apply=0;for(j=0;j<S;j++){if (Finish[i]==False&&Need[i][j]<=Work[j]){apply++;if(apply==S){for(m=0;m<S;m++){tempwork[i][m]=Work[m];Work[m]=Work[m]+Allocation[i][m];}Finish[i]=True;temp[k]=i;i=-1;k++;flag++;}}}}for(i=0;i<P;i++)if(Finish[i]==False){cout<<"系统不安全"<<endl;return -1;}}cout<<"系统是安全的"<<endl;cout<<"分配的序列:";for(i=0;i<P;i++){cout<<temp[i];if(i<P-1) cout<<"->";}cout<<endl;return 0;}void Changedata(int flag){for (int i=0;i<S;i++){Available[i]=Available[i]-Request[i];Allocation[flag][i]=Allocation[flag][i]+Request[i];Need[flag][i]=Need[flag][i]-Request[i];}//void Share(){int i,flag;char ch='Y';cout<<"输入请求资源的进程:"<<endl;cin>>flag;if (flag>=P){cout<<"此进程不存在!"<<endl;}else{cout<<"输入此进程对各个资源的请求数量:"<<endl;for (i=0;i<S;i++){cin>>Request[i];}for (i=0;i<S;i++){if (Request[i]>Need[flag][i]){cout<<"进程"<<flag<<"申请的资源大于它所需要的资源!"<<endl;cout<<"分配不合理不予分配!"<<endl;ch='N';break;}else if (Request[i]>Available[i]){cout<<"进程"<<flag<<"申请的资源大于可利用的资源。
华南理工“计算机操作系统”课程设计大作业一、实验题目: 银行家死锁避免算法模拟二、实验目的:通过本次实验掌握银行家死锁避免算法的基本思想。
当进程提出资源申请时,能够用该算法判断是否拒绝进程请求。
三、实验内容认真阅读教材(计算机操作系统(第三版),汤小丹,西安电子科技大学出版社)P108-P111页3.6.3节银行家算法的实现思想,理解该算法是如何能够实现死锁避免的。
编写一个银行家算法模拟程序用于处理进程的资源申请。
1。
假设系统共有5类资源,分别以A、B、C、D、E来标识,每类资源的初始数量全部为50。
2。
进程可以通过程序界面随时提交新的资源申请,提交的信息包括进程名称、对5类资源的最大需求数量。
3。
每次当有资源申请时,先输出系统当前状态(5类资源当前可用数量,每个进程已分配的每类资源数量),再利用银行家算法判断是否该满足进程请求。
如果可以分配,输出给该进程分配资源后的系统状态,再输出至少一个“安全序列”。
四、实验要求:每人完成一份大作业实验报告。
报告分设计思想、数据定义、处理流程、源程序、运行结果截图、设计体会等部分。
1)给出数据定义和详细说明;2)给出实现思想和设计流程;3)调试完成源程序;4)屏幕观察运行结果;5)总结自己的设计体会;编程语言及操作系统平台不限。
五、提交内容本大作业每个人必须单独完成。
最后需提交的内容包括:源程序(关键代码需要注释说明)、可运行程序、算法思路及流程图、心得体会。
将以上内容刻入光盘,光盘上写明班级、学号、姓名信息,再将大作业要求、源程序及注释、算法思路及流程图、心得体会等打印出来。
最后将打印稿及光盘统一交给网络学院教务员。
银行家算法实现一.课程设计目的1. 加深对死锁概念的理解。
2. 能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。
二.课程设计摘要银行家算法:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
三.开发环境系统软件硬件环境软件:Windows 7; VC++ 6.0硬件:CPU 2.40GHz;2G内存四.课程设计原理分析在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。
为保证系统中诸进程的正常运行,应事先采取必要的措施,来预防死锁。
最有代表性的避免死锁的方法,是Dijkstra 的银行家算法。
死锁:死锁的产生,必须同时满足四个条件,第一个为互斥条件,即一个资源每次只能由一个进程占用;第二个为请求和保持条件,指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
银行家算法原理:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
银行家算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.算法思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。
银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
五.算法实现1.程序流程图:2.2.算法描述:银行家算法的设计思想是:当用户申请一组资源时,系统必须做出判断;如果把这些资源分出去,系统是否还处于安全装他。
若是,就可以分出这些资源;否则,该申请暂不能满足。
3.数据结构描述:(n表示系统中进程的数目,m表示资源的分类数。
)3.1. Available是一个长度为m的向量,它表示每类资源可用的数量。
Available [j]=k,表示rj类资源可用的数量为k。
3.2.Max是一个n×m矩阵,它表示每个进程对资源的最大需求。
Max [i,j]=k,表示进程pi至多可以申请k个rj类资源单位。
3.3. Allocation是一个n×m矩阵,它表示当前分给每个进程的资源数目。
Allocation [i,j]=k,表示进程pi当前分到k个rj类资源。
3.4. Need是一个n×m矩阵,它表示每个进程还缺少多少资源。
Need[i,j]=k,表示进程pi尚需k个rj类资源才能完成其任务。
显然Need[i,j]= Max [i,j]- Allocation [i,j]。
这些数据结构的大小和数值随时间推移而改变。
4.系统所执行的安全性算法描述如下:4.1.设置2个向量:工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work = Available。
Finish[i] :它表示系统是否有足够的资源分配给进程,使之完成运行。
开始时先做Finish[i]=true。
4.2.从进程集合中找到一个满足下述条件的进程:Finish[i]=flase;Need[i,j]≤Work[j];若找到,则执行步骤3,否则,执行步骤4。
4.3.当进程pi获得资源后,可顺利执行,直至完成,并释放分配给它的资源。
4.4.如果所有进程的Finish[i]=true都满足。
则表示系统处于安全状态;否则,系统处于不安全状态。
六.程序源代码#include<iostream>#include<string>#include<stdio.h>using namespace std;#define False 0#define True 1int 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;//作业的最大数为100int N=100;//资源的最大数为100void showdata()//显示资源矩阵{int i,j;cout<<"系统目前可用的资源[Avaliable]:"<<endl;for(i=0;i<N;i++)cout<<name[i]<<" ";cout<<endl;for (j=0;j<N;j++)cout<<Avaliable[j]<<" ";//输出分配资源cout<<endl;cout<<" Max Allocation Need"<<endl; cout<<"进程名 ";for(j=0;j<3;j++){for(i=0;i<N;i++)cout<<name[i]<<" ";cout<<" ";}cout<<endl;for(i=0;i<M;i++){cout<<" "<<i<<" ";for(j=0;j<N;j++)cout<<Max[i][j]<<" ";cout<<" ";for(j=0;j<N;j++)cout<<Allocation[i][j]<<" ";cout<<" ";for(j=0;j<N;j++)cout<<Need[i][j]<<" ";cout<<endl;}}int changdata(int i)//进行资源分配{int j;for (j=0;j<M;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 i,k=0,m,apply,Finish[100]={0};int j;int flag=0;Work[0]=Avaliable[0];Work[1]=Avaliable[1];Work[2]=Avaliable[2];for(i=0;i<M;i++){apply=0;for(j=0;j<N;j++){if (Finish[i]==False&&Need[i][j]<=Work[j]){ apply++;if(apply==N){for(m=0;m<N;m++)Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True;temp[k]=i;i=-1;k++;flag++;}}}}for(i=0;i<M;i++){if(Finish[i]==False){cout<<"系统不安全"<<endl;//不成功系统不安全return -1;}}cout<<"系统是安全的!"<<endl;//如果安全,输出成功 cout<<"分配的序列:";for(i=0;i<M;i++){//输出运行进程数组cout<<temp[i];if(i<M-1) cout<<"->";}cout<<endl;return 0;}void share()//利用银行家算法对申请资源对进行判定{char ch;int i=0,j=0;ch='y';cout<<"请输入要求分配的资源进程号(0-"<<M-1<<"):";cin>>i;//输入须申请的资源号cout<<"请输入进程 "<<i<<" 申请的资源:"<<endl;for(j=0;j<N;j++){cout<<name[j]<<":";cin>>Request[j];//输入需要申请的资源}for (j=0;j<N;j++){if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错{cout<<"进程 "<<i<<"申请的资源大于它需要的资源";cout<<" 分配不合理,不予分配!"<<endl;ch='n';break;}else {if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则 { //出错cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";cout<<" 分配出错,不予分配!"<<endl;ch='n';break;}}}if(ch=='y') {changdata(i);//根据进程需求量变换资源showdata();//根据进程需求量显示变换后的资源safe();//根据进程需求量进行银行家算法判断}}void addresources(){//添加资源int n,flag;cout<<"请输入需要添加资源种类的数量:";cin>>n;N=N+n;for(int i=0;i<n;i++){cout<<"名称:";cin>>name[flag];cout<<"数量:";cin>>Avaliable[flag++];}showdata();safe();}void changeresources(){//修改资源函数cout<<"系统目前可用的资源[Avaliable]:"<<endl; for(int i=0;i<N;i++)cout<<name[i]<<":"<<Avaliable[i]<<endl; cout<<"输入系统可用资源[Avaliable]:"<<endl; cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; cout<<"经修改后的系统可用资源为"<<endl;for (int k=0;k<N;k++)cout<<name[k]<<":"<<Avaliable[k]<<endl; showdata();safe();}void delresources(){//删除资源char ming;int i,flag=1;cout<<"请输入需要删除的资源名称:";do{cin>>ming;for(i=0;i<N;i++)if(ming==name[i]){flag=0;break;}if(i==N)cout<<"该资源名称不存在,请重新输入:";}while(flag);for(int j=i;j<N-1;j++){name[j]=name[j+1];Avaliable[j]=Avaliable[j+1];}showdata();safe();}void addprocess(){//添加作业int flag=M;M=M+1;cout<<"请输入该作业的最大需求量[Max]"<<endl;for(int i=0;i<N;i++){cout<<name[i]<<":";cin>>Max[flag][i];Need[flag][i]=Max[flag][i]-Allocation[flag][i];}showdata();safe();}int main()//主函数{<m<<"*"<<n<<"矩阵)[Max]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>Max[i][j];do{flag=0;cout<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++){cin>>Allocation[i][j];if(Allocation[i][j]>Max[i][j])flag=1;Need[i][j]=Max[i][j]-Allocation[i][j];}if(flag)cout<<"申请的资源大于最大需求量,请重新输入!\n";}while(flag);showdata();//显示各种资源safe();//用银行家算法判定系统是否安全while(choice){cout<<"**************银行家算法演示***************"<<endl;cout<<" 1:增加资源 "<<endl;cout<<" 2:删除资源 "<<endl;cout<<" 3:修改资源 "<<endl;cout<<" 4:分配资源 "<<endl;cout<<" 5:增加作业 "<<endl;cout<<" 0:离开 "<<endl;cout<<"*******************************************"<<endl;cout<<"请选择功能号:";cin>>choice;switch(choice){case 1: addresources();break;case 2: delresources();break;case 3: changeresources();break;case 4: share();break;case 5: addprocess();break;case 0: choice=0;break;default: cout<<"请正确选择功能号(0-5)!"<<endl;break;}}return 1;}调试及运行结果:检测结果如下:1.假设系统只有一种资源a,剩余数量为2,分配情况如下:2.假设系统只有一种资源a,剩余数量为2,分配情况如下:进程需求总量已占资源还需数量0 8 3 51 42 22 9 4 5注:“系统不安全”表示此种情况是银行家算法也解不了的死锁。