实验四银行家算法
- 格式:doc
- 大小:676.50 KB
- 文档页数:16
实验四银行家算法的实现1、实验目的通过编写和调试银行家算法的模拟程序以加深对避免死锁方案的理解。
熟悉银行家算法的分配思想。
2、实验要求设计一个银行家方案。
并编写模拟程序实现之。
已知系统总共的资源数、进程名、进程已分配的资源、进程运行完毕最大最资源的需求量,以书上例题为例,分析某一时刻系统是否会产生死锁。
3、算法描述银行家算法中数据结构如下:n :系统中的进程个数;m :系统中的资源类数。
1)Available(m):现有资源向量。
Available(j)=k表示k个未分配的j类资源2)Max(n,m):资源最大申请量矩阵。
Max(i,j)=k表示第i个进程在运行过程中对第j类资源的最大申请量为k。
3)Allocation(n,m):资源分配矩阵。
Allocation(i,j)=k表示进程i已占有k个j类资源。
4)Need(n,m):进程以后还需要的资源矩阵。
Need(i,j)=k表示进程i以后还需要k个第j类资源。
显然有Need[i,j]=Max[i,j]-Allocation[i,j]。
5)Request(n,m):进程申请资源矩阵。
Request(i,j)=k表示进程i申请k个第j类资源。
银行家算法思想如下:若进程i申请资源,申请资源向量为Request(i),则有如下资源分配过程:1)如果Request(i)〉Need(i),则报错返回。
2)如果Request(i)〉Avaliable,则进程i进入等待资源状态,返回。
3)假设进程进程i的申请已获批准,于是修改系统状态:Avaliable=Avaliable-Request(i)Allocation(i)=Allocation(i)+Request(i)Need(i)=Need(i)-Request(i)4)调用安全状态检查算法。
设Work(m)为临时工作向量。
初始时Work=Available。
令N={1,2,……n}。
寻求j∈N 使其满足:Need(j)<=Work,若不存在这样的j则转至3)。
银行家算法实验报告总结一、实验目的与背景银行家算法是一种用于避免死锁和保证系统稳定运行的算法。
通过模拟银行贷款行为的策略,银行家算法可以有效地避免系统的资源枯竭,从而保证系统的正常运行。
在本实验中,我们通过使用银行家算法对实际的系统进行模拟,验证其有效性。
二、算法原理与流程银行家算法的主要原理是:将系统中的所有资源按照类型进行分类,并对每种资源设置一个最大值和最小值,分别表示该资源的最大需求量和最小剩余量。
同时,对于每个进程,需要定义其最大需求量、已分配资源和需求量,并根据这些信息来决定是否分配资源。
具体流程如下:初始化:将所有资源的最大值和最小值进行初始化,并给每个进程分配一个唯一的标识符。
请求资源:每个进程在执行过程中,如果需要更多的资源,则向系统发送请求。
分配资源:系统根据银行家算法的原理,将资源分配给满足条件的进程。
更新资源:系统更新已分配给进程的资源,并检查是否满足每个进程的最大需求量。
重复执行:如果存在多个进程需要资源,则重复执行步骤2-4,直到所有进程都满足其最大需求量或系统中的资源不足以为更多的进程分配资源为止。
三、实验数据与结果在本实验中,我们使用了10个进程,每个进程的需求量和已分配资源均随机生成。
实验结果表明,在满足了每个进程的最大需求量后,系统中仍有剩余资源,证明了银行家算法可以有效地避免资源的浪费。
四、结果分析通过对实验结果进行分析,我们发现银行家算法可以有效地保证系统的稳定性,避免出现死锁和资源枯竭等问题。
同时,该算法需要较少的系统开销,因为只需要对每个进程的请求进行处理和更新,不需要进行额外的检查和管理。
五、性能对比分析为了进一步验证银行家算法的性能,我们将其与其他常见的资源管理算法进行了比较。
在同等条件下,与其他算法相比,银行家算法具有更高的系统吞吐量和更低的响应时间。
银行家算法在系统吞吐量和响应时间方面均优于其他常见算法,而在死锁发生率上,银行家算法则表现出了更高的稳定性。
银行家算法实验报告银行家算法实验报告引言:在计算机科学领域中,银行家算法是一种用于避免死锁的资源分配算法。
它是由荷兰计算机科学家艾兹赫尔·迪科斯彻在1965年提出的。
银行家算法通过合理的资源分配和安全性检查,确保系统中的进程能够安全地执行,避免了资源竞争和死锁的发生。
本篇文章将详细介绍银行家算法的原理、实验设计和结果分析。
一、银行家算法的原理银行家算法基于资源的最大需求和可用性进行资源分配。
它将系统中的资源分为若干类别,并为每个类别分配一个初始数量。
当进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。
算法的核心思想是避免分配资源后导致系统无法满足其他进程的资源需求,从而避免死锁的发生。
二、实验设计为了验证银行家算法的有效性,我们设计了一个模拟实验。
实验中,我们创建了一个包含多个进程和资源的系统,并模拟了进程对资源的请求和释放。
每个进程都有自己的资源需求和最大需求量,系统中的资源总量也是有限的。
首先,我们初始化系统的资源数量和每个进程的最大需求量。
然后,模拟进程的请求和释放过程。
当一个进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。
当一个进程释放资源时,系统将回收该资源并重新分配给其他进程。
实验的关键是设计合理的资源分配策略和进程请求顺序,以模拟不同的场景。
我们通过调整进程的最大需求量和资源数量,观察系统的运行情况和死锁的发生情况。
三、实验结果分析通过多次实验,我们得出了以下结论:1. 资源数量的合理分配对避免死锁非常重要。
如果资源数量过少,无法满足进程的最大需求量,系统容易发生死锁。
如果资源数量过多,系统的资源利用率低,效率低下。
因此,需要根据系统的实际需求合理分配资源数量。
2. 进程的最大需求量与资源数量的关系也是影响死锁的重要因素。
当进程的最大需求量超过系统资源数量的一半时,系统容易发生死锁。
银行家算法实验报告一、实验题目为了了解系统的资源分配情况,假定系统的任何一种资源在任一种资源在任意时刻只能被一个进程使用。
任何进程已经占用的资源只能由进程自己释放,而不能任由其他进程抢占。
当进程申请的资源不能满足时,必须等待。
因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。
而银行家算法是避免死锁的一种重要方法。
通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法二、实验要求要求编写系统进行资源调度的程序,模拟进程的资源分配算法,了解死锁的产生和避免的办法。
一个是随机动态地进行资源分配的模拟程序,即只要系统当前剩余资源满足进程的当前要求,就立即将资源分配给进程,以观察死锁产生情况;一个是采用银行家算法,有效地避免死锁的产生。
要求用银行家算法和随机算法实现资源分配。
1.设计3-4个并发进程,共享系统的10个同类不可抢占的资源。
各进程动态进行资源的申请和释放。
2.用银行家算法和随机算法分别设计一个资源分配程序,运行这两个程序,观察系统运行情况,并对系统运行的每一步情况进行显示。
二、总的设计思想及语言环境、工具等1.算法设计思路银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。
这时系统将该进程从进程集合中将其清除。
此时系统中的资源就更多了。
反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他,请进程等待。
2.语言环境、工具计算机基本配置要求:操作系统:WIN 98/2000/XP/2003 等Windows平台内存:256MB及以上主存64KB(Memory)(以KB为单位分配)开发语言:Visual C++ 6.0四、数据结构与模块说明(功能与框图)五、源程序(指导老师验收通过)#include<string.h>#include<iostream.h>#define FALSE 0#define TRUE 1#define W 10 //最大进程数W=10#define R 20 //最大资源总数R=20int M ;int N ;int ALL_RESOURCE[W];int AVAILABLE[R]; //可利用资源向量int MAX[W][R]; //最大需求矩阵int ALLOCATION[W][R]; //分配矩阵int NEED[W][R]; //需求矩阵int Request[R]; //进程请求向量void inputdata(); //数据输入void showdata(); //数据显示void changdata(int k);//进程请求资源数据改变void restoredata(int k); //数据恢复int chksec(int s); //系统安全性的检测int chkmax(int s); //检测最大需求void bank(); //检测分配的资源是否合理void main(){ int i,j;inputdata();for(i=0;i<M;i++){ j=chksec(i);if (j==0) break;}if (i>=M)cout<<"错误提示:经安全性检查发现,系统的初始状态不安全\n"<<endl;else{ cout<<"提示:经安全性检查发现,系统的初始状态安全!"<<endl;bank();}}void inputdata(){ int i=0,j=0,p;cout<<"请输入总进程数:"<<endl;do{cin>>M;if (M>W) cout<<endl<<"总进程数超过了程序允许的最大进程数,请重新输入:"<<endl;}while (M>W);cout<<endl;cout<<"请输入资源的种类数:"<<endl;do {cin>>N;if (N>R)cout<<endl<<"资源的种类数超过了程序允许的最大资源种类数,请重新输入:"<<endl; }while (N>R);cout<<endl;cout<<"请依次输入各类资源的总数量,即设置向量all_resource:"<<endl;for(i=0;i<N;i++) cin>>ALL_RESOURCE[i];cout<<endl;cout<<"请依次输入各进程所需要的最大资源数量,即设置矩阵max:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do { cin>>MAX[i][j];if (MAX[i][j]>ALL_RESOURCE[j])cout<<endl<<"该最大资源数量超过了声明的该资源总数,请重新输入:"<<endl; }while (MAX[i][j]>ALL_RESOURCE[j]);}}cout<<endl;cout<<"请依次输入各进程已经占据的各类资源数量,即设置矩阵allocation:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do{ cin>>ALLOCATION[i][j];if (ALLOCATION[i][j]>MAX[i][j])cout<<endl<<"已占有的资源数量超过了声明的最大资源数量,请重新输入:"<<endl;}while (ALLOCATION[i][j]>MAX[i][j]);}}cout<<endl;for (i=0;i<M;i++)for(j=0;j<N;j++)NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for (j=0;j<N;j++){ p=ALL_RESOURCE[j];for (i=0;i<M;i++){ p=p-ALLOCATION[i][j];AVAILABLE[j]=p;if(AVAILABLE[j]<0)AVAILABLE[j]=0;}}}void showdata(){ int i,j;cout<<"各种资源的总数量,即向量all_resource为:"<<endl;cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];cout<<endl<<endl;cout<<"当前系统中各类资源的可用数量,即向量available为:"<<endl; cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];cout<<endl<<endl;cout<<"各进程还需要的资源数量,即矩阵need为:"<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<NEED[i][j]<<" ";cout<<endl;}cout<<endl;cout<<"各进程已经得到的资源量,即矩阵allocation为: "<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<" ";cout<<endl;} cout<<endl;}void changdata(int k){ int j;for (j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]-Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];NEED[k][j]=NEED[k][j]-Request[j];}}void restoredata(int k){int j;for (j=0;j<N;j++){ AVAILABLE[j]=AVAILABLE[j]+Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];NEED[k][j]=NEED[k][j]+Request[j];}}int chksec(int s){int WORK,FINISH[W];int i,j,k=0;for(i=0;i<M;i++)FINISH[i]=FALSE;for(j=0;j<N;j++){ WORK=AVAILABLE[j];i=s;do{ if(FINISH[i]==FALSE&&NEED[i][j]<=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;i=0;}else{ i++;}}while(i<M);for(i=0;i<M;i++)if(FINISH[i]==FALSE){ return 1;}} return 0;}int chkmax(int s){ int j,flag=0;for(j=0;j<N;j++){if (MAX[s][j]==ALLOCATION[s][j]){ flag=1;AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];MAX[s][j]=0;}} return flag;}c{int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){i=-1;while(i<0||i>=M){ cout<<"请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重新输入!):"; cout<<"p";cin>>i;if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!"<<endl;}cout<<"请输入进程P"<<i<<"申请的资源数:"<<endl;for (j=0;j<N;j++){ cout<<" 资源"<<j<<": ";cin>>Request[j];if(Request[j]>NEED[i][j]){ cout<<"进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}else{ if(Request[j]>AVAILABLE[j]){ cout<<"进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}}}if(flag=='Y'||flag=='y'){ changdata(i);if(chksec(i)){ cout<<endl;cout<<"该分配会导致系统不安全本次资源申请不成功,不予分配"<<endl;cout<<endl;restoredata(i);}else{ cout<<endl;cout<<"经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示:"<<endl;cout<<endl;showdata();if(chkmax(i)){cout<<"在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,"<<endl;cout<<"因此在进程结束后系统将回收这些资源!"<<endl;cout<<"在资源收回之后,各进程的资源需求和分配情况如下所示:"<<endl;showdata();}}}cout<<endl;cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";cin>>flag; }}六、运行结果分析1.输入进程数、资源种类数、各类资源总数量、各进程所需要的最大资源数量、各进程所已经占据的各类资源数量2.经安全性检验,系统状态安全,进程P0申请资源3.经安全性检验,系统状态安全,进程P0获得所申请资源4.进程P3申请资源5.经安全性检验,系统状态安全,进程P3获得所申请资源6.进程P1申请资源7.经安全性检验,系统状态安全,进程P1获得所申请资源8.进程P2申请资源9.经安全性检验,系统状态安全,进程P2获得所申请资源5.进程P1申请资源6.经安全性检验,系统状态安全,进程P1获得所申请资源七、总结这次实验中我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统实验实验四银行家算法学号 1115102002姓名蔡凤武班级 11电子A华侨大学电子工程系实验目的1、理解银行家算法。
2、掌握进程安全性检查的方法与资源分配的方法。
实验内容与基本要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:1、现在系统是否处于安全状态?2、如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?1、银行家算法和安全性检查算法原理。
操作系统的银行家算法:当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
1、程序流程描述。
银行家算法:(1) 步骤:1如果Request [j]<=Need[i],转向步骤(2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。
(2) 步骤2;如果:Request [i]<=Available[i],转向步骤(3),否则提示尚无足够资源,进程i需等待。
(3) 步骤3:系统试探分配相关资源,并修改下面数据:Available[i]= Available[i]- Request [j];Allocation[i]= Allocat ion[i]+ Request [i];Need[i]= Need[i]- Request [i];(4) 步骤4:执行安全性检查,如安全,则分配成立;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
安全性检查算法:安全性检查算法主要是根据银行家算法进行资源分配后,检查资源分配后的系统状态之中。
具体算法如下:(1) 步骤1:设置两个向量: Work= Available,Finish[i]=false;说明:Finish(它表示系统是否有足够的资源分配给进程)Work(它表示系统可提供给进程继续运行所需的各类资源数目)(2) 步骤2:在进程中查找符合以下条件的进程:Finish[i]=false,need<=Work 若能找到,则执行步骤(3),否则,执行步骤(4)(3) 步骤3:当进程获得资源后,可顺利执行,直至完成,从而释放资源:Work= Work+ Allocation; Finish=true; goto step (2);(4) 步骤4:如果所有进程的Finish=true都满足,则表示系统处于安全状态,否则,系统不安全状态。
实验四银行家算法一、实验学时2 学时二、实验目的与要求(1)了解多道程序系统中,多个进程并发执行的资源分配。
(2)掌握死锁产生的原因、产生死锁的必要条件和处理死锁的基本方法。
(3)掌握预防死锁的方法,系统安全状态的基本概念。
(4)掌握银行家算法,了解资源在进程并发执行中的资源分配策略。
(5)理解避免死锁在当前计算机系统中不常使用的原因。
三、实验内容在多道程序系统中,虽可借助于多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
死锁是指多个进程在运行中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,他们都将无法再向前推进。
银行家算法是最具代表性的避免死锁的算法,它的基本思想是分配资源之前,判断系统是否是安全的,若是才分配资源。
设计一个n个并发进程共享m个系统资源的程序实现银行家算法。
要求包含:1、一个简单的界面。
2、显示或修改当前系统资源情况。
3、添加进程对资源的需求。
4、判断是否存在死锁,若无死锁则显示其安全序列。
5、若产生死锁,制定策略,以最小的代价解决死锁问题。
四、实验重点、难点银行家算法的实现、解除死锁的策略。
五、实验教学方法集中讲授,讨论需求,由学生独立完成六、运行结果分析1、给出一组初始数据。
2、根据给出的数据得出运行结果。
3、分析结果是否符合原理。
4、产生死锁时你采用的策略是什么?为什么?5、分析所写程序还有什么可以改进的地方。
七、关键数据结构及源代码1、带注释的源代码。
实验四银行家算法模拟【实验目的】(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: 它表示系统是否有足够的资源分配给进程,使之运行完成。
开始时先做Finish [i]∶=false; 当有足够资源分配给进程时,再令Finish[i]∶=true。
计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计: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。
(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②Need<or=Work如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向步骤(2)。
银行家算法实验报告实验目的:了解和掌握银行家算法,进一步熟悉进程和如何避免死锁。
实验内容:1、主要程序结构(a)resource allocation algorithm如果要求的资源量+占有的资源总的资源需求量可以carry out allocation(b) test for safety algorithm注:《--- 》中的内容为未具体写明但说明其功能的程序段bool safe(struct state new ){bool possible = true,found=false;process rest[n];//正在执行的进程号int p=n;// 正在执行的进程数量int currentavail[m];//可用资源的一个副本《---为rest和currentavail赋值---》while(possible==true&&p>0){int g=0;《---寻找可以执行完成的进程---》if(found==true){int c=0;《---假设可以执行完的进程以完成,及currentavail[*]=currentavail[*]+new.alloc[g][*];---》rest[g] = -1;--p;found =false;}else{possible=false;}}return possible;}2、实验步骤1)设计结构体#ifndef STATE_H_#define m 3#define n 5struct state{int resource[m];int available[m];int claim[n][m];int alloc[n][m];} ;#define STATE_H_#endif /* STATE_H_ */2)设计实现程序的结构的具体程序Safe算法的具体代码bool safe(struct state new ){bool possible = true,found=false;process rest[n]; //正在执行的进程号int f=0,p=n;// 正在执行的进程数量do{rest[f]=f;++f;}while(f<n);int currentavail[m]; //可用资源的一个副本int i=0;do{currentavail[i]=new.available[i];++i;}while(i<m);while(possible==true&&p>0){int g=0;/*------------------寻找可以执行完成的进程------------------------------------------*/ while(g<n){int h = 0;/*while(h<m){if((new.claim[g][h]-new.alloc[g][h])<=currentavail[h]&&rest[g]!=(-1)){if(h==m-1){found=true;}}++h;}if(found==true)break;++g;}/*-------------------------------------------------------------------------------------*/ if(found==true){int c=0;while(c<m){currentavail[c]=currentavail[c]+new.alloc[g][c];c++;}rest[g] = -1;--p;found =false;}else{possible=false;}}return possible;}实验代码:/*============================================================================ Name : pre.cAuthor :Version :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================ */#include <stdio.h>#include <stdlib.h>#include"state.h"#define bool int#define process int#define false 0#define true 1int main(void) {bool alloc(int,int[],struct state );struct state sta1={{10,5,7},{3,3,2},{{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}},{{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}};int request[m];int k=0;while(k>=0){puts("输入要改变资源的进程号");scanf("%d",&k);puts("输入要改变的资源");int i =0;while(i<m){scanf("%d",&request[i]);i++;}if(alloc(k,request,sta1)==true){i=0;puts("输出个进程占用的资源");while(i<n){int j=0;printf("%d ",i);while(j<m){if(i==k){sta1.alloc[k][j]=request[j]+sta1.alloc[k][j];sta1.available[j]=sta1.available[j]-request[j];}printf("%d ",sta1.alloc[i][j]);j++;}printf("\n");++i;}}puts("银行家算法");}return 0;}bool alloc(int l,int request[m],struct state nest){bool safe(struct state news);bool t = false;int i=0;while(i<m){if(nest.alloc[l][i]+request[i]>nest.claim[l][i]){puts("!!resource request error!!");return false;}else if(request[i]>nest.available[i]){puts("suspend process");return false;}else{if(i==m-1){int f=0;while(f<m){nest.alloc[l][f]=nest.alloc[l][f]+request[f];nest.available[f]=nest.available[f]-request[f];f++;}if(safe(nest)==true){t=true;}else{puts(" no safe suspend process");t=false;}}}i++;}return t;}bool safe(struct state new ){bool possible = true,found=false;process rest[n];int f=0,p=n;do{rest[f]=f;++f;}while(f<n);int currentavail[m];int i=0;do{currentavail[i]=new.available[i];++i;}while(i<m);while(possible==true&&p>0){int g=0;while(g<n){int h = 0;while(h<m&&(new.claim[g][h]-new.alloc[g][h])<=currentavail[h]&&rest[g]!=(-1)){if(h==m-1){found=true;}++h;}if(found==true)break;++g;}if(found==true){int c=0;while(c<m){currentavail[c]=currentavail[c]+new.alloc[g][c];c++;}rest[g] = -1;--p;found =false;}else{possible=false;}}return possible;}。
银行家算法的模拟实现一.实验目的1.了解进程产生死锁原因,了解为什么要防止死锁。
2.掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。
二.实验内容:采用银行家算法来实现一个n 个并发进程共享m 个系统资源的系统。
进程可以申请和释放资源,系统可以按照各进程的申请计算是否可以分配给其资源。
三.实验原理1.银行家算法的思路先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。
假设请求合法,那么进行试分配。
最后对试分配后的状态调用平安性检查算法进行平安性检查。
假设平安,那么分配,否那么,不分配,恢复原来状态,拒绝申请。
2.银行家算法中用到的主要数据结构可利用资源向量int Available[j] j为资源的种类。
最大需求矩阵 int Max[i][j] i为进程的数量。
分配矩阵 int Allocation[i][j]需求矩阵 int need[i][j]= Max[i][j]- Allocation[i][j]申请各类资源数量int Request i[j] i进程申请j资源的数量工作向量int Work[x]int Finish[y]3.银行家算法bank()进程i发出请求申请k个j资源,Request i[j]=k(1)检查申请量是否不大于需求量:Request i[j]<=need[i,j],假设条件不符重新输入,不允许申请大于需求量。
(2)检查申请量是否小于系统中的可利用资源数量:Request i[j]<=available[i,j],假设条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。
(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)试分配后,执行平安性检查,调用safe()函数检查此次资源分配后系统是否处于平安状态。
操作系统实验实验四银行家算法学号 1115102002姓名蔡凤武班级 11电子A华侨大学电子工程系实验目的1、理解银行家算法。
2、掌握进程安全性检查的方法与资源分配的方法。
实验内容与基本要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:1、现在系统是否处于安全状态?2、如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?1、银行家算法和安全性检查算法原理。
操作系统的银行家算法:当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
1、程序流程描述。
银行家算法:(1) 步骤:1如果Request [j]<=Need[i],转向步骤(2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。
(2) 步骤2;如果:Request [i]<=Available[i],转向步骤(3),否则提示尚无足够资源,进程i需等待。
(3) 步骤3:系统试探分配相关资源,并修改下面数据:Available[i]= Available[i]- Request [j]; Allocation[i]= Allocation[i]+ Request [i];Need[i]= Need[i]- Request [i];(4) 步骤4:执行安全性检查,如安全,则分配成立;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
安全性检查算法:安全性检查算法主要是根据银行家算法进行资源分配后,检查资源分配后的系统状态之中。
具体算法如下:(1) 步骤1:设置两个向量:Work= Available,Finish[i]=false;说明:Finish (它表示系统是否有足够的资源分配给进程)Work(它表示系统可提供给进程继续运行所需的各类资源数目)(2) 步骤2:在进程中查找符合以下条件的进程:Finish[i]=false,need<=Work 若能找到,则执行步骤(3),否则,执行步骤(4)(3) 步骤3:当进程获得资源后,可顺利执行,直至完成,从而释放资源:Work= Work+ Allocation;Finish=true;goto step (2);(4) 步骤4:如果所有进程的Finish=true都满足,则表示系统处于安全状态,否则,系统不安全状态。
流程图:主函数:2、程序及注释。
#include <stdio.h>#include <stdlib.h>#include <conio.h># define m 50# define false 0# define true 1int no1; //进程数int no2; //资源数int r;int allocation[m][m], max[m][m],need[m][m], available[m];char name1[m], name2[m]; //定义全局变量void main(){void check();void print();void shoudon();int i,j,p=0,q=0;char c;int s;int request[m],allocation1[m][m],need1[m][m],available1[m],f[m];int mx[5][4]={{0,0,1,2},{1,7,5,0},{2,3,5,6},{0,6,5,2},{0,6,5,6}};int an[5][4]={{0,0,1,2},{1,0,0,0},{1,3,5,4},{0,6,3,2},{0,0,1,4}};int ann[5][4]={{0,0,1,2},{1,4,2,0},{2,3,5,6},{0,6,5,2},{0,6,5,6}};printf("**********************************************\n");printf("*** sf银行家算法演示***\n");printf("**********************************************\n");printf("\n1.演示报告给定系统1.");printf("\n2.演示报告给定系统2.(P1提出需要(0、4、2、0)个资源)"); printf("\n3.演示手动输入系统.");printf("\n0.退出程序.");printf("\n请选择(0~3):");scanf("%d",&s);switch(s){case 1:{no1=5; no2=4;for(i=0;i<no1;i++)for(j=0;j<no2;j++){max[i][j]=mx[i][j];allocation[i][j]=an[i][j];}}break;case 2:{no1=5; no2=4;for(i=0;i<no1;i++)for(j=0;j<no2;j++){max[i][j]=mx[i][j];allocation[i][j]=ann[i][j];}}break;case 3:shoudon();break;case 0:printf("\n thanks for you watching! \n");exit(0); /*退出程序*/default:printf("\n请输入有效指令\n"); break; /*提示输入无效提示*/}for(i=0;i<no1;i++)for(j=0;j<no2;j++)need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计算出need矩阵的值printf("请输入Available矩阵\n");for(i=0;i<no2;i++)scanf("%d",&available[i]); //输入已知的可用资源数print(); //输出系统check(); //检测T0时刻系统的安全状态if(r==1) //如果安全则执行以下代码{do{q=0;p=0;printf("\n请输入请求资源的进程号(0~4):\n");for(j=0;j<=10;j++){scanf("%d",&i);if(i>=no1){printf("输入错误,请重新输入:\n");continue;}else break;}printf("\n请输入该进程所请求的资源数request[j]:\n");for(j=0;j<no2;j++)scanf("%d",&request[j]);for(j=0;j<no2;j++)if(request[j]>need[i][j])p=1; //判断请求是否超过该进程所需要的资源数if(p)printf("请求资源超过该进程资源需求量,请求失败!\n");else{for(j=0;j<no2;j++)if(request[j]>available[j]) //判断请求是否超过可用资源数q=1;if(q)printf("没有做够的资源分配,请求失败!\n");else //请求满足条件{for(j=0;j<no2;j++){available1[j]=available[j];allocation1[i][j]=allocation[i][j];need1[i][j]=need[i][j]; // 寄存(原已分配的资源数、仍需要的资源数、可用的资源数)available[j]=available[j]-request[j];allocation[i][j]+=request[j];need[i][j]=need[i][j]-request[j]; //系统尝试把资源分配给请求的进程}check(); //检测分配后的安全性if(r==1)for(j=0;j<no2;j++){ f[j]=allocation1[i][j]+request[j];if(f[j]==max[i][j])allocation[i][j]=0;else allocation[i][j]=f[j];available[j]=available1[j]+allocation1[i][j]-allocation[i][j]; // 改写(已分配的资源数、仍需要的资源数、可用的资源数)need[i][j]=need1[i][j]-request[j];}else //如果分配后系统不安全{for(j=0;j<no2;j++){available[j]=available1[j];allocation[i][j]=allocation1[i][j];need[i][j]=need1[i][j]; // 还原(已分配的资源数、仍需要的资源数、可用的资源数)}}print(); //显示相关信息printf("返回分配前资源数\n");}}printf("\n你还要继续分配吗?Y or N ?\n"); //判断是否继续进行资源分配c=getche();}while(c=='y'||c=='Y');}}//手动输入void shoudon(){int i,j;printf("请输入进程总数:\n");scanf("%d",&no1);printf("请输入资源种类数:\n");scanf("%d",&no2);printf("请输入Max矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&max[i][j]); //输入已知进程最大资源需求量printf("请输入Allocation矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&allocation[i][j]); //输入已知的进程已分配的资源数return;}//安全算法函数void check(){int k,f,v=0,i,j;int work[m],a[m];int finish[m];r=1; //安全标志for(i=0;i<no1;i++)finish[i]=false; // 初始化进程均没得到足够资源数,未完成for(i=0;i<no2;i++)work[i]=available[i]; //work[i]表示可提供进程继续运行的各类资源数k=no1;do{for(i=0;i<no1;i++){if(finish[i]==false){f=1;for(j=0;j<no2;j++)if(need[i][j]>work[j])f=0;if(f==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程{finish[i]=true; //标记完成a[v++]=i; //记录安全序列号for(j=0;j<no2;j++)work[j]+=allocation[i][j]; //释放该进程已分配的资源}}}k--; //每完成一个进程分配,未完成的进程数就减1}while(k>0);f=1;for(i=0;i<no1;i++) //判断是否所有的进程都完成{if(finish[i]==false) //未完成{ f=0; break; }}if(f==0) //若有进程没完成,则为不安全状态{printf("系统处在不安全状态!");r=0;}else{printf("\n系统当前为安全状态,安全序列为:\n");for(i=0;i<no1;i++)printf("p%d ",a[i]); //输出安全序列}}//显示函数void print(){int i,j;printf("\n");printf("***************************资源分配情况****************************\n"); printf("进程名/号码| Max | Allocation | Need |\n");for (i = 0; i < no1; i++){printf(" p%d/%d ",i,i);for (j = 0; j < no2; j++){printf("%d ",max[i][j]);}for (j = 0; j < no2; j++){printf(" %d",allocation[i][j]); }for (j = 0; j < no2; j++){printf(" %d",need[i][j]);}printf("\n");}printf("\n");printf("各类资源可利用的资源数为:");for (j = 0; j < no2; j++){printf(" %d",available[j]);}printf("\n");}3、运行结果以及结论。