操作系统课程设计----模拟银行家算法避免死锁

合集下载

操作系统实验报告-死锁的避免

操作系统实验报告-死锁的避免

操作系统实验报告-死锁的避免操作系统实验(二)死锁的避免1.实验内容使用C++实现模拟随机算法和银行家算法2.实验目的(1)了解死锁的产生原因(随机算法)(2)理解死锁的解决办法(银行家算法)3.实验题目使用随机算法和银行家算法设计程序4.程序流程图主要过程流程图银行家算法流程图安全性算法流程图5.程序代码和运行结果#include <stdio.h>#include<stdlib.h> typedef struct{int A;int B;int C;}RES;#define false 0#define true 1//系统中所有进程数量#define PNUMBER 3//最大需求矩阵RES Max[PNUMBER];//已分配资源数矩阵RES Allocation[PNUMBER];//需求矩阵RES Need[PNUMBER];//可用资源向量RES Available={0,0,0};//安全序列int safe[PNUMBER];void setConfig(){int i=0,j=0;printf("================开始手动配置资源==================\n");//可分配资源printf("输入可分配资源\n");scanf("%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩阵MAXprintf("输入最大需求矩阵%dx%d\n",PNUMBER,PNUMBER );for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分配矩阵Allocprintf("输入已分配矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Allocation[i].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵printf("输入需求矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);}printf("================结束配置资源==================\n");}void loadConfig(){FILE *fp1;if ((fp1=fopen("config.txt","r"))==NULL){printf("没有发现配置文件,请手动输入\n");setConfig();}else{int i=0;printf("发现配置文件,开始导入..\n");//可分配资源fscanf(fp1,"%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩阵MAXfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分配矩阵Allocfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵for (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);}}}//试探分配void ProbeAlloc(int process,RES *res){Available.A -= res->A;Available.B -= res->B;Available.C -= res->C;Allocation[process].A += res->A;Allocation[process].B += res->B;Allocation[process].C += res->C;Need[process].A -= res->A;Need[process].B -= res->B;Need[process].C -= res->C;}//若试探分配后进入不安全状态,将分配回滚void RollBack(int process,RES *res){Available.A += res->A;Available.B += res->B;Available.C += res->C;Allocation[process].A -= res->A;Allocation[process].B -= res->B;Allocation[process].C -= res->C;Need[process].A += res->A;Need[process].B += res->B;Need[process].C += res->C;}//安全性检查bool SafeCheck(){RES Work;Work.A = Available.A;Work.B = Available.B;Work.C = Available.C;bool Finish[PNUMBER] = {false,false,false};int i;int j = 0;for (i = 0; i < PNUMBER; i++){//是否已检查过if(Finish[i] == false){//是否有足够的资源分配给该进程if(Need[i].A <= Work.A && Need[i].B <= Work.B && Need[i].C <= Work.C){//有则使其执行完成,并将已分配给该进程的资源全部回收Work.A += Allocation[i].A;Work.B += Allocation[i].B;Work.C += Allocation[i].C;Finish[i] = true;safe[j++] = i;i = -1; //重新进行遍历}}}//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态for (i = 0; i < PNUMBER; i++){if (Finish[i] == false){return false;}}return true;}//资源分配请求bool request(int process,RES *res){//request向量需小于Need矩阵中对应的向量if(res->A <= Need[process].A && res->B <= Need[process].B && res->C <=Need[process].C){//request向量需小于Available向量if(res->A <= Available.A && res->B <= Available.B && res->C <= Available.C){//试探分配ProbeAlloc(process,res);//如果安全检查成立,则请求成功,否则将分配回滚并返回失败if(SafeCheck()){return true;}else{printf("安全性检查失败。

操作系统实验报告 预防进程死锁的银行家算法

操作系统实验报告 预防进程死锁的银行家算法

操作系统实验预防进程死锁的银行家算法一、需求分析:1、实验目的:通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。

2、问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。

假设系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。

3、程序要求:1)判断当前状态是否安全,如果安全给出安全序列;如果不安全给出理由。

2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后系统是否安全。

3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全,输出安全的进程序列,不安全则提示信息。

二、概要设计:1、进程调度的实现过程2、程序中的变量及数据结构struct ResItem{string Name;int Number;}; //资源项typedef vector<ResItem> Resource;struct Progress{string Name;Resource Max; //最大需求Resource Allocation; //分配Resource Need; //需求}; //进程vector <Progress> Progresses; //所有进程vector <ResItem> Available; //可利用资源向量vector <Progress> SafeOrder; //安全序列3、主要函数//初始化数据void InitData(int &n);//判断rs1是否小于等于rs2,是返回true,否则返回falseinline bool LessThan(Resource rs1,Resource rs2);//安全性算法bool SafeAlg();//银行家算法bool BankerAlg(Resource request,Progress &pro);4、主函数int main(){int n;InitData(n);cout<<"\n\n=============================================\n ";if(SafeAlg()){cout<<"由安全性检查可知:可以找到一个安全序列为:{";for(int i = 0 ; i < SafeOrder.size(); i++)cout<<SafeOrder[i].Name<<",";cout<<"}。

银行家死锁避免算法模拟

银行家死锁避免算法模拟

银行家死锁避免算法模拟一. 课程设计目得通过本次实验掌握银行家死锁避免算法得基本思想。

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

二.课程设计摘要银行家算法:我们可以把操作系统瞧作就是银行家,操作系统管理得资源相当于银行家管理得资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

操作系统按照银行家制定得规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源得最大需求量,如果系统现存得资源可以满足它得最大需求量则按当前得申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用得资源数与本次申请得资源数之与就是否超过了该进程对资源得最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存得资源能否满足该进程尚需得最大资源量,若能满足则按当前得申请量分配资源,否则也要推迟分配.四.课程设计原理分析在多道程序系统中,虽可借助于多个进程得并发执行,来改善系统得资源利用率,提高系统得吞吐量,但可能发生一种危险-—死锁.所谓死锁,就是指多个进程在运行过程中因争夺资源而造成得一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。

为保证系统中诸进程得正常运行,应事先采取必要得措施,来预防死锁.最有代表性得避免死锁得方法,就是Dijkstra得银行家算法。

死锁:死锁得产生,必须同时满足四个条件,第一个为互斥条件,即一个资源每次只能由一个进程占用;第二个为请求与保持条件,指进程已经保持了至少一个资源,但又提出了新得资源请求,而该资源又被其她进程占有,此时请求进程阻塞,但又对自己已获得得其她资源保持不放;第三个为非剥夺条件,即在出现死锁得系统中一定有不可剥夺使用得资源;第四个为循环等待条件,系统中存在若干个循环等待得进程,即其中每一个进程分别等待它前一个进程所持有得资源。

防止死锁得机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。

银行家算法原理:银行家算法就是避免死锁得一种重要方法,通过编写一个简单得银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会与了解死锁与避免死锁得具体实施方法。

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

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

操作系统课程设计报告题目:银行家算法操作系统课程设计报告题目:银行家算法摘要在多道操作系统中,可以利用多个进程并发执行来改善系统资源利用率,提高系统的吞吐量,但也可能发生人们不想看到的危险——死锁。

为了解决这个问题,人们引入了多种机制处理死锁问题。

本文主要介绍了操作系统如何运用银行家算法和安全性算法避免死锁的产生。

同时运用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)静态优先权是在创建进程时确定的,其运行特征是优先数确定之后在整个进行运行期间不再改变。

确定静态优先权的依据有进程的类型、进程所使用的资源、进程的估计运行时间等因素。

操作系统课设(模拟实现银行家算法实现死锁避免)

操作系统课设(模拟实现银行家算法实现死锁避免)

计算机与信息工程系《计算机系统与系统软件》课程设计报告题目:模拟实现银行家算法实现死锁避免专业:信息管理与信息系统班级:信管082班学号:姓名:指导老师:2010年9 月9 日一、实验题目模拟实现银行家算法实现死锁避免二、目的:1、了解进程产生死锁的原因,了解为什么要进行死锁的避免。

2、掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。

三、内容:模拟实现银行家算法实现死锁避免。

要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。

四、实验提示:1、整个银行家算法的思路。

先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。

2、算法用到的主要数据结构和C语言说明。

(1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。

(2)、最大需求矩阵INT MAX[N][M] N为进程的数量。

(3)、已分配矩阵INT ALLOCA TION[N][M](4)、还需求矩阵INT NEED[N][N](5)、申请各类资源数量int Request[x]; //(6)、工作向量int Work[x];(7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是3、银行家算法(主程序)(1)、系统初始化。

输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。

(3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。

如果条件不符则提示重新输入,即不允许索取大于需求量(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=A V ALIABLE[I,J]。

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

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

《 操作系统 》课程设计报告系 别: 信息科学与技术系专业班级:学生姓名:指导教师:(课程设计时间:2010年7月5日——2010年7月9日)目 录一、课程设计目的和意义 (3)二、课程设计题目描述及算法 (3)三、课程设计报告内容 (3)1.算法描述 (3)2.数据结构 (4)3.主要函数说明 (4)4.算法流程图 (5)5.运行结果及说明 (7)6.附录清单及分析 (8)四、总结 (14)一、课程设计目的和意义了解掌握银行家算法,学会模拟实现资源分配,同时有要求编写和调试一个系统分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生二、课程设计题目描述及算法题目:银行家算法设计设计要求:编制银行家算法通用程序,并检测所给状态的系统安全性。

设进程I提出请求Request[N],则银行家算法按如下规则进行判断。

(1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。

(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:AVAILABLE=AVAILABLE-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

上述三个矩阵存在如下关系:Need[i,j]= Max[i,j]- Allocation[i,j]三、课程设计报告内容1.算法描述设Request[i] 是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K 个Rj类型的资源,当Pi发出资源请求后,系统按下面步骤进行检查:,便转向步骤2;否则认为出错,因为它所需(1)如果Requesti[j]<=Need[i,j]要的资源数已超过它所宣布的最大值。

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

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

计算机操作系统实验报告题目利用银行家算法避免死锁一、实验目的:1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

2、要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。

二、实验内容:用银行家算法实现资源分配:设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。

进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。

三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。

若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。

若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。

2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。

(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

3、安全性算法步骤:(1)设置两个向量①工作向量Work。

它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。

它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。

操作系统课程设计模拟银行家算法避免死锁

操作系统课程设计模拟银行家算法避免死锁

模拟通过银行家算法避免死锁一、银行家算法产生的背景及目的1: 在多道程序系统中, 虽然借助于多个进程的并发执行来改善系统的运用率, 提高系统的吞吐量, 但也许发生一种危险—死锁。

死锁就是多个进程在运营过程中因争夺资源而导致的一种僵局, 当进程处在这种僵局状态时, 如无外力作用, 他们将无法再向前进行, 如再把信号量作为同步工具时, 多个Wait和Signal操作顺序不妥, 会产生进程死锁。

然而产生死锁的必要条件有互斥条件, 请求和保持条件, 不剥夺条件和环路等待条件。

在防止死锁的几种方法中, 都施加了较强的限制条件, 在避免死锁的方法中, 所施加的条件较弱, 有也许获得令人满意的系统性能。

在该方法中把系统的状态分为安全状态和不安全状态, 只要能使系统都处在安全状态, 便可避免死锁。

2:实验目的:让学生独立的使用编程语言编写和调试一个系统分派资源的简朴模拟程序, 了解死锁产生的因素及条件。

采用银行家算法及时避免死锁的产生, 进一步理解课堂上老师讲的相关知识点。

银行家算法是从当前状态出发, 逐个按安全序列检查各客户中谁能完毕其工作, 然后假定其完毕工作且归还所有贷款, 再进而检查下一个能完毕工作的客户。

假如所有客户都能完毕工作, 则找到一个安全序列, 银行家才是安全的。

二: 银行家算法中的数据结构1:可运用资源向量Available。

这是一个具有m个元素的数组, 其中的每个元素代表一类可运用的资源数目, 其初始值是系统中所配置的该类所有可用资源的数目, 其数值随该类资源的分派和回收而动态的改变。

假如Available[j]=k, z则表达系统中现有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个。

死锁避免算法设计报告

死锁避免算法设计报告

漳州师范学院操作系统课程设计死锁避免算法设计姓名:学号:系别:专业:年级:指导教师:一、课程设计题目介绍(含设计目的)死锁避免算法设计是通过模拟实现银行家算法实现死锁避免目的:1、了解进程产生死锁的原因,了解为什么要进行死锁的避免。

2、掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。

3、通过运用Dijkstra的银行家算法来避免多个进程运行中因争夺资源而造成僵局,即死锁要求:本课程设计可以实现教材3.6.3节中所描述的银行家避免死锁算法。

可自定义进程数目、资源类型和每种类型资源的数目;可输入每个进程对每种资源的最大需求、已经获得的数量;当某进程发起某种资源请求时,计算系统状态是否安全。

思想:操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配,从而达到死锁的避免。

二、总体设计(含系统的结构、原理框图或模块介绍等)1.系统的结构2.原理框图从主函数开始进入银行家算法系统,先调用初始化函数chushihua()分别输入Allocation[i][j],Max[i][j],All[y]并判断是否符合条件,在调用函数show(),输出当前状态Available,Max[i][j],Allocation[i][j],Need[i][j]。

然后调用安全性算法函数safe()判断在该时刻是否处于安全状态,并输出安全序列。

然后调用银行家算法函数bank()进行试分配后再调用安全性算法函数判断在该时刻是否处于安全状态,若不安全,则恢复试分配时改变的值。

《死锁避免》实验报告

《死锁避免》实验报告

一、实验目的本次实验旨在通过模拟操作系统的资源分配和请求过程,深入理解死锁的概念、产生死锁的必要条件以及如何通过银行家算法来避免死锁的发生。

通过实验,学生能够掌握以下知识点: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. 分析实验结果,验证银行家算法是否能够避免死锁的发生。

银行家死锁避免算法模拟

银行家死锁避免算法模拟

银内行逝世锁防止算法模仿一.课程设计目标经由过程本次实验控制银内行逝世锁防止算法的根本思惟.当过程提出资本申请时,可以或许用该算法断定是否谢绝过程请求.二.课程设计摘要银内行算法:我们可以把操纵体系看作是银内行,操纵体系治理的资本相当于银内行治理的资金,过程向操纵体系请求分派资本相当于用户向银内行贷款.操纵体系按照银内行制订的规矩为过程分派资本,当过程初次申请资本时,要测试该过程对资本的最大需求量,假如体系现存的资本可以知足它的最大需求量则按当前的申请量分派资本,不然就推迟分派.当过程在履行中持续申请资本时,先测试该过程已占用的资本数与本次申请的资本数之和是否超出了该过程对资本的最大需求量.若超出则谢绝分派资本,若没有超出则再测试体系现存的资本可否知足该过程尚需的最大资本量,若能知足则按当前的申请量分派资本,不然也要推迟分派.四.课程设计道理剖析在多道程序体系中,虽可借助于多个过程的并发履行,来改良体系的资本应用率,进步体系的吞吐量,但可能产生一种安全——逝世锁.所谓逝世锁,是指多个过程在运行过程中因争取资本而造成的一种僵局,当过程处于这种僵局状况时,若无外力感化,它们都将无法再向前推动.为包管体系中诸过程的正常运行,应事先采纳须要的措施,来预防逝世锁.最有代表性的防止逝世锁的办法,是Dijkstra的银内行算法.逝世锁:逝世锁的产生,必须同时知足四个前提,第一个为互斥前提,即一个资本每次只能由一个过程占用;第二个为要乞降保持前提,指过程已经保持了至少一个资本,但又提出了新的资本请求,而该资本又被其他过程占领,此时请求过程壅塞,但又对本身已获得的其他资本保持不放;第三个为非褫夺前提,即在消失逝世锁的体系中必定有不成褫夺应用的资本;第四个为轮回等待前提,体系中消失若干个轮回等待的过程,即个中每一个过程分离等待它前一个过程所持有的资本.防止逝世锁的机构只能确保上述四个前提之一不消失,则体系就不会产逝世活锁.银内行算法道理:银内行算法是防止逝世锁的一种主要办法,经由过程编写一个简略的银内行算法程序,加深懂得有关资本申请.防止逝世锁等概念,并领会和懂得逝世锁和防止逝世锁的具体实行办法.经由过程这个算法可以用来解决生涯中的现实问题,如银行贷款等.银内行算法,顾名思义是起源于银行的假贷营业,必定命量的本金要应多个客户的假贷周转,为了防止银内行资金无法周转而倒闭,对每一笔贷款,必须考核其是否能限日清偿.在操纵体系中研讨资本分派计谋时也有相似问题,体系中有限的资本要供多个过程应用,必须包管得到的资本的过程能在有限的时光内清偿资本,以供其他过程应用资本.假如资本分派不得到就会产生过程轮回等待资本,则过程都无法持续履行下去的逝世锁现象.把一个过程须要和已占领资本的情形记载在过程控制中,假定过程控制块PCB个中“状况”有停当态.等待态和完成态.当过程在处于等待态时,暗示体系不克不及知足该过程当前的资本申请.“资本需求总量”暗示过程在全部履行过程中总共要申请的资本量.显然,,每个过程的资本需求总量不克不及超出体系失去的资本总数, 银行算法进行资本分派可以防止逝世锁.算法思惟:将必定命量的资金供多个用户周转应用,当用户对资金的最大申请量不超消失存资金时可回收一个新客户,客户可以分期乞贷,但乞贷总数不克不及超出最大的申请量.银内行对客户的乞贷可以推迟付出,但是可以或许使客户在有限的时光内得到乞贷,客户得到所有的乞贷后能在有限的时光内清偿.用银内行算法分派资本时,测试过程对资本的最大需求量,若现存资本能知足最大需求就知足当前过程的申请,不然推迟分派,如许可以或许包管至少有一个过程可以得到所需的全体资本而履行到停止,然后清偿资本,若OS能包管所有过程在有限的时光内得到所需资本则称体系处于安然状况.五.算法实现1.程序流程图:2.算法描写:银内行算法的设计思惟是:当用户申请一组资本时,体系必须做出断定;假如把这些资本分出去,体系是否还处于平装配他.若是,就可以分出这些资本;不然,该申请暂不克不及知足.3.数据构造描写:(n暗示体系中过程的数量,m暗示资本的分类数.)3.1. Available是一个长度为m的向量,它暗示每类资本可用的数量.Available [j]=k,暗示rj类资本可用的数量为k.3.是一个n×m矩阵,它暗示每个过程对资本的最大需求.Max[i,j]=k,暗示过程pi至多可以申请k个rj类资本单位.3.是一个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;flag=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];}N=N-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()//主函数{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<<"*******************************************"<<e ndl;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,分派情形如下:注:“体系不服安”暗示此种情形是银内行算法也解不了的逝世锁.3.假设体系有2种资本a,b,a的残剩数量为4,b的残剩数量为3,分派情形如下:经由过程本次实验,加深了本身对于逝世锁问题和银内行算法的懂得.对于银内行算法的思惟有了加倍深入的熟悉,并且意识到银内行算法其实不是能防止所有的逝世锁,可以称这种情形为潜在的逝世锁.。

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

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

//判断申请是否大于当前资源,若大于则 { cout<<"进程"<<i<<"申请的资源大于系统现在可利
用的资源"; cout<<" 分配出错,不予分配!"<<endl; ch='n'; break;
} } } if(ch=='y') { changdata(i); //根据进程需求量变换资源 showdata(); //根据进程需求量显示变换后的资源 safe(); //根据进程需求量进行银行家算法判断 } }
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<<"资源的数量:";
cin>>number;
Avaliable[i]=number;
}
cou程的数量:";
cin>>m;
M=m; cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵):" <<endl; for(i=0;i<m;i++)

模拟银行家算法实现死锁避免课程设计报告

模拟银行家算法实现死锁避免课程设计报告

模拟银行家算法实现死锁避免课程设计报告《操作系统》课程设计报告院系:计算机与信息工程学院题目:模拟银行家算法实现死锁避免评分表:目录题目:模拟银行家算法实现死锁避免 (1)评分表: (2)一课程设计目的 (3)二课程设计内容 (3)三课程设计环境 (4)四课程设计步骤 (4)41.需求分析 (4)4.1.1 问题的提出 (4)4.1.2 银行家算法原理 (4)4.1.3银行家算法详细解析 (5)4.1.4 银行安全性算法目的 (6)4.2概要设计 (6)4.2.1 功能模块设计如下: (6)4.2.2 功能模块描述 (7)4.3详细设计 (7)4.3.1基本数据结构的设计 (7)4.3.2算法的设计 (8)五课程设计结果 (9)5.1运行结果 (9)5.2测试分析 (12)六课程设计心得与体会 (12)总结 (12)七参考文献 (13)八程序清单 (14)8.1 操作主界面代码: (14)8.2 功能实现代码: (17)一课程设计目的在熟练掌握死锁发生原理和解决死锁问题的基础上,利用一种程序设计语言模拟实现利用银行家算法实现死锁避免,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。

二课程设计内容模拟实现银行家算法对系统资源进行分配,以防止死锁的出现。

本课题肯定不可能实现对实际操作系统的资源管理,而是通过对模拟资源数据的处理,检测银行家算法在防止死锁出现的作用。

银行家算法描述:第一部分:银行家算法(扫描)1.如果Request<=Need,则转向2;否则,出错2.如果Request<=Available,则转向3,否则等待3.系统试探分配请求的资源给进程4.系统执行安全性算法第二部分:安全性算法1.设置两个向量(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(i为资源类别)3.进程P获得第i类资源,则顺利执行直至完成,并释放资源:Work=Work+Allocation;Finish[i]=true;转2请充分理解以上银行家算法描述的核心思想。

2.操作系统试验--死锁的避免——银行家算法

2.操作系统试验--死锁的避免——银行家算法

操作系统实验二死锁的避免——银行家算法一、实验目的银行家算法是避免死锁的一种重要算法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。

加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

二、实验要求:编制程序, 依据银行家算法判定本次分配是否安全。

三.算法所用數據結構讲解1.数据结构假设有m个进程N类资源,则有如下数据结构MAX[M*N] M个进程对N 类资源的最大需求量;A V AILABEL[N] 系统可用资源数;ALLOCATION[M*N] M个进程已得到N 类资源的资源量;NEED[M*N] M个进程还需要N 类资源的资源量;2.行家算法设进程I 提出请求Request[N],则(1)若Request[N]<= NEED[I,N],则转(2);否则出错。

(2)若NEED[I,N] <= A V AILABEL[N],则转3;否则出错。

3.安全性检查(1)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false; ②Needi≤Work.如找到,执行步骤(2);否则执行步骤(3)。

(2)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故执行:Work:=Work+Allocation; Finish[i]:=true; Goto step1;(3)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。

四.实验报告要求1.写出实验目的2。

写出实验要求3。

写出实验内容(包括算法,程序流程图及部分实验结果)4.实验总结与体会附:#include "stdio.h"#define M 5 /*总进程数*/#define N 3 /*总资源数*/#define FALSE 0#define TRUE 1/*M个进程对N类资源最大资源需求量*/int MAX[M][N]= {{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系统可用资源数*/int A V AILABLE[N]={3,3,2};/* M个进程已经得到N类资源的资源量*/int ALLOCATION[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};/* M个进程还需要N类资源的资源量*/int NEED[M][N]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};int Request[N]={0,0,0};int i=0,j=0;void main(){char flag='Y';void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();while (flag=='Y'||flag=='y'){printf("输入申请资源的进程号(0~4):");scanf("%d",&i);while (i<0||i>=M){printf("输入的进程号不存在,请重输入申请资源的进程号(0~4):");scanf("%d",&i);}for(j=0;j<N;j++){printf("申请资源%d :",j);scanf("%d",&Request[j]);if (Request[j]>NEED[i][j]){printf("进程%d申请的资源数大于进程%d还需要%d类资源的资源量!",i,i,j);printf("申请不合理,出错!请重新选择\n");exit(0);}else{if (Request[j]>A V AILABLE[j]){printf("进程%d 申请的资源数大于系统可用%d类资源的资源量!",i,j);printf("本次分配不成功。

操作系统课程设计银行家算法模拟实现

操作系统课程设计银行家算法模拟实现

课程设计报告课程设计名称:银行家算法模拟实现系:学生姓名:班级:学号:成绩:指导教师:开课时间:学年学期题目要求:一.设计题目银行家算法模拟实现二.主要内容设计目的1、了解多道程序系统中,多个进程并发执行的资源分配。

2、掌握思索的产生原因、产生死锁的必要条件和处理死锁的基本方法。

3、掌握预防死锁的方法,系统安全状态的基本概念。

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

5、理解死锁避免在当前计算机系统不常使用的原因。

三.具体要求设计一个n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。

要求采用银行家算法实现。

四.进度安排五.成绩评定考核方法:根据学生平时表现、测试检查、课程设计报告、运行演示和学生回答问题相结合的形式作为考核依据,考察学生的动手能力,独立分析解决问题的能力和创新精神,并根据学生的学习态度综合考评。

平时表现(占30%),课程设计报告(占40%),课程答辩(占30%)。

成绩评定:成绩分“优秀”、“良好”、“中等”、“及格”、“不及格”五个级别。

“优秀”为100分到90分,“良好”为89分到80分,“中等”为79分到70分,“及格”为69分到60分,“不及格”为60分以下。

目录1.需求分析 (4)2.概要设计 (4)3.详细设计 (6)4.调试分析 (12)5.总结 (16)6.参考文献 (16)1.需求分析1、始化这组进程的最大资源请求和一次申请的资源序列。

把各进程已占用和需求资源情况记录在进程控制块中。

假定进程控制块的内容包括:进程名,状态,当前申请量,资源需求总量,已占资源量,能执行完标志。

其中,进程的状态有:就绪,等待和完成。

当系统不能满足进程的资源请求时,进程出于等待状态。

资源需求总量表示进程运行过程中对资源的总的需求量。

已占资源量表示进程目前已经得到但还为归还的资源量。

因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。

系统避免死锁的银行家算法课程设计

系统避免死锁的银行家算法课程设计

泰山医学院操作系统课程设计题目:银行家算法院(部)系信息工程学院所学专业信息管理与信息系统年级、班级学号学生姓名指导教师姓名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)共享。

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

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

计算机操作系统实验报告题目利用银行家算法避免死锁一、实验目的:1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

2、要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。

二、实验内容:用银行家算法实现资源分配:设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。

进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。

三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。

若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。

若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。

2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。

(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

3、安全性算法步骤:(1)设置两个向量①工作向量Work。

它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。

它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。

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

模拟通过银行家算法避免死锁
一、银行家算法产生的背景及目的
1:在多道程序系统中,虽然借助于多个进程的并发执行来改善系统的利用率,提高系统的吞吐量,但可能发生一种危险—死锁。

死锁就是多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,如无外力作用,他们将无法再向前进行,如再把信号量作为同步工具时,多个Wait 和Signal操作顺序不当,会产生进程死锁。

然而产生死锁的必要条件有互斥条件,请求和保持条件,不剥夺条件和环路等待条件。

在预防死锁的几种方法中,都施加了较强的限制条件,在避免死锁的方法中,所施加的条件较弱,有可能获得令人满意的系统性能。

在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统都处于安全状态,便可避免死锁。

2:实验目的:让学生独立的使用编程语言编写和调试一个系统分配资源的简单模拟程序,了解死锁产生的原因及条件。

采用银行家算法及时避免死锁的产生,进一步理解课堂上老师讲的相关知识点。

银行家算法是从当前状态出发,逐个按安全序列检查各客户中谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户。

如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。

二:银行家算法中的数据结构
1:可利用资源向量Available。

这是一个含有m个元素的数组,其中的每个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态的改变。

如果Available[j]=k,z
则表示系统中现有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个。

三、银行家算法及安全性算法
1:银行家算法
设Request[i]是进程Pi的请求向量,若Request[i][j]=k;表示进程需要j 类资源k个。

当Pi发出资源请求时,系统按下属步骤进行检查;
(1)如果Request[i][j]<=Need[i][j];便转向步骤(2),否则认
为出错,因为它所需要的资源数已超过他所宣布的最大值。

(2)如果Request[i][j]<=Available[i][j],便转向步骤(3),
否则认为尚无足够资源,进程需等待。

(3)系统试探着把资源分配给进程,并修改下面数据结构的数据
Available[i][j]=Available[i][j]-Request[i][j];
Allocation[i][j]=Allocation[i][j]+Request[i][j];
Need[i][j]=Need[i][j]-Request[i][j];
(4)系统执行安全性算法,检查此次资源分配后系统是否处于安
全状态。

若安全,才正式将资源分配给进程Pi,已完成此次分配。

否则,将本次的试探分配作废,回复原来的资源分配状态,将进程Pi等待。

2:安全性算法
(1)设置两个向量;
1:工作向量Work,表示系统可提供给进程运行所需的各类资源数目,它含有m个元素,初始时Work=Available
2:Finish ,表示系统是否有足够的资源分配给进程,使之运行完成。

开始时先做Finish[i]=true
(2)从进程中找到一个能满需下属条件的进程
1;Finish[i]=false;
2:Need[i][j]<=Work[j];若找到执行步骤(3),否则执行步骤(4)
(3)当进程Pi顺利获得资源后,直至完成,并释放分配给它的资源,执行:
Work[j]=Work[j]+Allocation[i][j];
Finish[i]=true;
Go to step (2);
(5)如果所有的进程Finish[i]都满足,则表示系统处于安全状
态,否则,处于不安全状态。

四、模块设计与分析及整体功能概述
模块设计与分析:
整个银行家算法分为初始化函数Init(),安全性算法函数 safe(),银行家算法函数bank()三部分。

初始化函数生成开始时刻系统中的进程和资源情况,安全性算法判断当某进程申请资源时,系统能否处于安全状态。

在本实验中,若系统处于安全状态,便生成一个安全进程序列(安全序列可能有多个)。

银行家算法函数bank()负责整体的检查与异常判断。

整体功能概述:
死锁会引起系统陷入僵局,操作系统必须防止此现象的发生。

本实验通过一个动态分配资源的模拟程序,更清楚的理解死锁产生的原因和条件。

Dijkstra的银行家算法是最有代表性的避免死锁的方法。

运行程序时用户设定系统中进程和可利用资源的种类数目。

输入各进程的可利用资源Available,最大需求MAX,已分配资源Allocation ,需求资源Need,之后各系统发出资源请求Request,利用实验中的安全性算法判断能否产生一个安全性队列,若能,则给该进程分配成功,否则,不予分配。

五、流程图设计
六、源代码及调试分析
#include<>
#define MAXm 50
用Vc++编译
程序编写银行家算法,进一步理解到通过银行家算法避免死锁的思想,同时也理解了系统死锁产生的原因及条件。

2.在实验过程中所有的设计步骤遵循老师教授的程序功能化的思想,分别定义了三个函数,init()初始化函数,safealg()安全性算法函数,bank()银行家算法函数,体现了函数的模块化思想。

这样的话,不仅提高了程序的可读性和可操作性,而且还提高了CPU的利用率和内存的利用率,因为程序的运行是局部性的,这种思想对于段页式存储管理系统尤为重要。

3.实验过程中遇到的种种疑难问题通过自己上网查找答案,锻炼了自己纠错能力和搜索有价值信息的能力及自学的能力,并且进一步巩固了自己以前学过的专业知识。

相关文档
最新文档