华工2016春操作系统大作业银行家死锁避免算法模拟(含源文件)

华南理工“计算机操作系统”课程设计大作业一、实验题目: 银行家死锁避免算法模拟二、实验目的:通过本次实验掌握银行家死锁避免算法的基本思想。

当进程提出资源申请时,能够用该算法判断是否拒绝进程请求。

三、实验内容认真阅读教材(计算机操作系统(第三版),汤小丹,西安电子科技大学出版社)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注:“系统不安全”表示此种情况是银行家算法也解不了的死锁。

合集下载

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实验报告(死锁的避免)

实验报告(死锁的避免)
允许进程动态地申请资源和释放资源,系统按进程的申请动态地分配资源。程序能够在进程提出资源申请后判断系统是否处于安全状态,如果安全则打印资源分配表和安全序列;如果不安全则输出不能分配的提示。
三、程序设计和说明
1.算法描述
2.算法实现
四、实课程实验报告
实验名称:死锁的避免
姓名:
学号:
专业:
五邑大学计算机学院
一、实验目的
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
二、实验内容
编写一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法有效地避免死锁的发生。实验要求设计一个有三类资源A、B、C的系统,它们的资源总量分别为10、5、7,资源由五个进程p0、p1、p2、p3、p4共享。假设当前的资源分配状态为:

银行家算法的模拟实现实验报告

银行家算法的模拟实现实验报告

银行家算法的模拟实现实验报告银行家算法的模拟实现一、实验题目:模拟实现银行家算法的处理过程二、实验目的:银行家算法是避免死锁的代表性算法。

本实习旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。

然后依照本实习,自行设计模拟程序。

三、实验原理: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. 分析实验结果,验证银行家算法是否能够避免死锁的发生。

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