《银行家算法的模拟实现》—实验报告
银行家算法实验报告总结
银行家算法实验报告总结一、实验目的与背景银行家算法是一种用于避免死锁和保证系统稳定运行的算法。
通过模拟银行贷款行为的策略,银行家算法可以有效地避免系统的资源枯竭,从而保证系统的正常运行。
在本实验中,我们通过使用银行家算法对实际的系统进行模拟,验证其有效性。
二、算法原理与流程银行家算法的主要原理是:将系统中的所有资源按照类型进行分类,并对每种资源设置一个最大值和最小值,分别表示该资源的最大需求量和最小剩余量。
同时,对于每个进程,需要定义其最大需求量、已分配资源和需求量,并根据这些信息来决定是否分配资源。
具体流程如下:初始化:将所有资源的最大值和最小值进行初始化,并给每个进程分配一个唯一的标识符。
请求资源:每个进程在执行过程中,如果需要更多的资源,则向系统发送请求。
分配资源:系统根据银行家算法的原理,将资源分配给满足条件的进程。
更新资源:系统更新已分配给进程的资源,并检查是否满足每个进程的最大需求量。
重复执行:如果存在多个进程需要资源,则重复执行步骤2-4,直到所有进程都满足其最大需求量或系统中的资源不足以为更多的进程分配资源为止。
三、实验数据与结果在本实验中,我们使用了10个进程,每个进程的需求量和已分配资源均随机生成。
实验结果表明,在满足了每个进程的最大需求量后,系统中仍有剩余资源,证明了银行家算法可以有效地避免资源的浪费。
四、结果分析通过对实验结果进行分析,我们发现银行家算法可以有效地保证系统的稳定性,避免出现死锁和资源枯竭等问题。
同时,该算法需要较少的系统开销,因为只需要对每个进程的请求进行处理和更新,不需要进行额外的检查和管理。
五、性能对比分析为了进一步验证银行家算法的性能,我们将其与其他常见的资源管理算法进行了比较。
在同等条件下,与其他算法相比,银行家算法具有更高的系统吞吐量和更低的响应时间。
银行家算法在系统吞吐量和响应时间方面均优于其他常见算法,而在死锁发生率上,银行家算法则表现出了更高的稳定性。
银行家算法实验报告
银行家算法实验报告银行家算法实验报告引言:在计算机科学领域中,银行家算法是一种用于避免死锁的资源分配算法。
它是由荷兰计算机科学家艾兹赫尔·迪科斯彻在1965年提出的。
银行家算法通过合理的资源分配和安全性检查,确保系统中的进程能够安全地执行,避免了资源竞争和死锁的发生。
本篇文章将详细介绍银行家算法的原理、实验设计和结果分析。
一、银行家算法的原理银行家算法基于资源的最大需求和可用性进行资源分配。
它将系统中的资源分为若干类别,并为每个类别分配一个初始数量。
当进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。
算法的核心思想是避免分配资源后导致系统无法满足其他进程的资源需求,从而避免死锁的发生。
二、实验设计为了验证银行家算法的有效性,我们设计了一个模拟实验。
实验中,我们创建了一个包含多个进程和资源的系统,并模拟了进程对资源的请求和释放。
每个进程都有自己的资源需求和最大需求量,系统中的资源总量也是有限的。
首先,我们初始化系统的资源数量和每个进程的最大需求量。
然后,模拟进程的请求和释放过程。
当一个进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。
当一个进程释放资源时,系统将回收该资源并重新分配给其他进程。
实验的关键是设计合理的资源分配策略和进程请求顺序,以模拟不同的场景。
我们通过调整进程的最大需求量和资源数量,观察系统的运行情况和死锁的发生情况。
三、实验结果分析通过多次实验,我们得出了以下结论:1. 资源数量的合理分配对避免死锁非常重要。
如果资源数量过少,无法满足进程的最大需求量,系统容易发生死锁。
如果资源数量过多,系统的资源利用率低,效率低下。
因此,需要根据系统的实际需求合理分配资源数量。
2. 进程的最大需求量与资源数量的关系也是影响死锁的重要因素。
当进程的最大需求量超过系统资源数量的一半时,系统容易发生死锁。
实验二:银行家算法实验报告书
淮海工学院计算机工程学院实验报告书课程名:《操作系统原理A》题目:银行家算法班级:学号:姓名:操作系统原理实验——银行家算法实验报告1目的与要求:1)本实验目的是通过使用银行家算法实现系统资源的分配和安全性检查模拟,提高学生对操作系统资源分配功能的深刻理解,并培养学生对操作系统开发的兴趣与应用能力;2)实验前必须认真阅读和理解银行家算法的基本原理和实现方法;3)独立使用C或VC++编程语言编写银行家算法模拟程序;4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及相关实验数据与运行结果)5)于2015年5月10日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。
2 实验内容或题目1)设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源总数量分别为10,5,7。
(参考书上用例)2)并行进程可动态地申请资源和释放资源(程序交互输入申请或释放资源数量),系统按各进程的申请动态地分配资源。
3)每当进程动态申请资源或释放资源时,模拟程序应能及时显示或打印各个进程在此时刻的资源分配表、系统可用资源量和安全序列等资源分配信息和安全检查信息。
4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。
3 实验步骤与源程序#include<string.h>#include<stdio.h>#define M 5 //定义进程数#define N 3 //定义资源数 s#define False 0#define True 1int Max[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //每个进程对每类资源的最大需求int Allocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};// 系统已分配资源int Avaliable[3]={3,3,2}; //系统可利用资源int Need[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//还需要资源int Request[3];void showdata()//显示资源矩阵{int i,j;printf("系统目前可利用的资源数量:\n A,B,C\n"); printf("resouce: ");for (j=0;j<N;j++)printf("%d,",Avaliable[j]);//输出分配资源printf("\n");printf("各进程的资源需求:\n");for (i=0;i<M;i++){printf("pr%d: ",i);for (j=0;j<N;j++){printf("%d,",Max[i][j]);//输出最大需求资源数}printf("\n");}printf("各进程得到资源:\n");for (i=0;i<M;i++){printf("pr%d: ",i);for(j=0;j<N;j++)printf("%d,",Allocation[i][j]);//输出已分配资源数printf("\n");}printf("各进程还需求资源:\n");for (i=0;i<M;i++){printf("pr%d: ",i);for(j=0;j<N;j++)printf("%d,",Need[i][j]);//输出还需要资源数printf("\n");}}void release(int i)//判断是否安全,若不安全则释放第j类资源{int j;for (j=0;j<N;j++){Avaliable[j]=Avaliable[j]+Request[j];Allocation[i][j]=Allocation[i][j]-Request[j];Need[i][j]=Need[i][j]+Request[j];}}void distribute(int i)//若符合条件则对第j类资源进行分配{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];}}void safeAlgorithm()//安全性算法{int Work[3],Finish[M]={0},result[M],run;/* work:表示系统可提供给进程继续运行的所需的各类资源数目finish:表示系统是否有足够的资源分配给进程result用来存放依次执行成功的线程*/int i,j,k=0,m,demand;for(i=0;i<3;i++){Work[i]=Avaliable[i]; //开始的时候work=available}for(i=0;i<M;i++){demand=0;for(j=0;j<N;j++){if (Finish[i]==False&&Need[i][j]<=Work[j]){ demand++;if(demand==3)//只有ABC三类资源都满足才把相应的线程记入数组result中{for(m=0;m<N;m++)Work[m]=Work[m]+Allocation[i][m];//重新分配第i 类线程的当前可利用资源Finish[i]=True;result[k]=i;i=-1;k++;}}elseif(Finish[i]==False){if(i==M-1){printf("系统不安全\n");//如果不成功,输出系统不安全run=False;}break;}}printf("系统资源分配成功!");//如果安全,输出成功printf("分配的序列:\n");for(i=0;i<M;i++)//输出运行进程数{printf("pr%d ",result[i]);}}void bankerAlgorithm()//利用银行家算法对申请资源对进行判定{int i,j,OK=1,run=True;printf("\n请输入第一个要求分配的资源进程号从(0 to 4):");scanf("%d",&i);//输入须申请的资源号printf("请输入进程 %d 申请的资源:\n",i);for(j=0;j<3;j++){printf("第 %d 个资源:",j+1);scanf("%d",&Request[j]);//输入需要申请的资源}for (j=0;j<N;j++){if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错{printf("进程%d 申请的资源大于它需要的资源",i);printf(" error!\n");OK=0;break;}else{if(Request[j]>Avaliable[j]) //判断申请是否大于当前资源,若大于则出错{printf("进程 %d 申请的资源大于当前可利用资源",i);printf(" error!\n");OK=0;break;}}}if(OK==1) //若都符合条件,则进行分配{distribute(i); //根据进程请求分配资源showdata(); //显示变换后的资源safeAlgorithm(); //通过安全算法判断该序列是否安if(run==False) //若不安全,则进行释放第I类资源release(i);}}}void main()//主函数{int choice;showdata();safeAlgorithm();do{ printf("\n输入接下来你要进行的操作1:分配资源 2:显示资源否则按任意键退出");scanf("%d",&choice);switch(choice){ case 1: bankerAlgorithm(); break;case 2: showdata(); break;default: break;}}while((choice==1)||(choice==2));}4 测试数据与实验结果(可以抓图粘贴)5 结果分析与实验体会(学生自己填写)2. 版面格式:(1)各级标题:黑体,小四,段前/段后:6磅(2)正文内容:宋体、五号,行间距1.25倍;(3)程序代码:宋体、五号,单倍行间距;(4)A4纸,上、下、左、右边距:2厘米注:蓝色字体部分为注释,正式报告中将其删除。
银行家算法的模拟实现
{cout << p[i];
if (i != l - 1)
{ cout << "-->";
}
} cout << "" << endl;
return true;
}
实验模拟结果:
总
结
银行结算法有效避免了系统在资源分配中的死锁问题。通过至此实验更是加深了对这一方面的理解与认识,对系统进程分配资源的过程和实现该过程的算法结构认识更加深刻。
{ if (FINISH[i] == true)
{ continue;
}for (j = 0; j < n; j++)//循环查找第i个进程需要的各个资源数是否超过系统现有的对应的资源数
}
if (NEED[i][j] > Work[j])//第i个进程需要的第j个资源数>系统现有的第j个资源数
{ break ;
goto input;
}
} for (i = 0; i < n; i++)//如果请求合理,那么下面
{ AVAILABLE[i] -= REQUEST[cusneed][i];//系统可用资源减去申请了的
ALLOCATION[cusneed][i] += REQUEST[cusneed][i];//线程被分配的资源加上已申请了的
Work[i] = AVAILABLE[i];
for (i = 0; i < m; i++)
{ FINISH[i] = false;//FINISH记录每个进程是否安全
(完整word版)《银行家算法的模拟实现》—实验报告
《银行家算法的模拟实现》 --实验报告题目: 银行家算法的模拟实现专业:班级:组员:指导老师:一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。
本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。
二、实验内容模拟实现银行家算法实现死锁避免。
要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。
三、实验分析过程1、整个银行家算法的思路。
先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。
1)进程一开始向系统提出最大需求量.2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待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]。
银行家算法实验报告13551
操作系统实验报告课题:银行家算法专业:班级:学号:姓名:年月日目录一实验目的……………………………………………………错误!未定义书签。
二实验容 (3)三问题描述 (3)四设计思路 (4)五详细设计 (5)六运行结果 (10)七心得体会 (16)八参考文献 (17)附源程序 (17)一、实验目的模拟实现银行家算法,用银行家算法实现资源分配。
1.加深了解有关资源申请、避免死锁等概念。
2.体会和了解死锁和避免死锁的具体实施方法。
3、输入:1.系统中各类资源表2.每个进程需要各类资源总数系统分配给各个进程各类资源数4、输出:1.判断T0时刻的安全性2.如果系统是安全的,任意给出某个进程的一个资源请求方式并判断系统能否接受此请求,如果可以接受,其输出全部安全序列,反之,不予分配。
二、实验容1.设计进程对各类资源最大申请表示及初值的确定。
2.设定系统提供资源的初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其资源申请是否得到满足。
5.显示资源申请和分配时的变化情况。
三、问题描述银行家算法.顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
在死锁的避免中,银行家算法把系统状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,便可以避免发生死锁。
所谓安全状态,是指系统能按某种顺序为每个进程分配所需资源,直到最大需求,使每一个进程都可以顺利完成,即可找到一个安全资源分配序列。
模拟实现这个工作过程。
四、设计思路我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
银行家算法实验报告
计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计: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)。
银行家算法实验报告绪论
一、实验背景在计算机系统中,资源分配和死锁问题是操作系统领域的重要研究课题。
在多进程环境下,进程之间会共享系统资源,如CPU、内存、磁盘等。
然而,当多个进程同时申请资源时,可能会出现死锁现象,导致系统瘫痪。
为了避免死锁,研究者提出了多种资源分配算法,其中最具代表性的就是银行家算法。
银行家算法最初由Edsger Dijkstra于1965年提出,旨在解决银行在贷款业务中可能出现的死锁问题。
该算法通过模拟银行家在贷款业务中的决策过程,对资源分配进行动态规划,以确保系统处于安全状态,从而避免死锁的发生。
二、实验目的本次实验旨在通过实现银行家算法,加深对资源分配、死锁和安全性概念的理解,并掌握以下内容:1. 了解资源分配的基本原理和死锁的概念。
2. 掌握银行家算法的原理和实现方法。
3. 能够运用银行家算法对系统资源进行动态分配,并确保系统处于安全状态。
4. 分析实验结果,验证银行家算法的有效性。
三、实验原理1. 资源分配资源分配是指操作系统将资源分配给进程的过程。
在多进程环境下,资源分配策略需要考虑以下因素:(1)资源的类型和数量。
(2)进程对资源的最大需求。
(3)进程当前已分配的资源。
(4)系统可利用的资源。
2. 死锁死锁是指多个进程在执行过程中,因争夺资源而相互等待,导致系统无法继续执行的现象。
产生死锁的必要条件包括:(1)互斥条件:资源不能被多个进程同时占用。
(2)请求和保持条件:进程在等待资源时,仍保持已占有的资源。
(3)不剥夺条件:进程不能被强制剥夺已占有的资源。
(4)循环等待条件:存在一个进程序列,其中每个进程都在等待前一个进程所持有的资源。
3. 安全状态安全状态是指系统可以按照某种顺序为每个进程分配资源,使得所有进程都可以顺利完成的状态。
判断系统是否处于安全状态的方法如下:(1)计算每个进程的最大需求。
(2)计算系统可利用的资源。
(3)从最大需求中减去已分配的资源,得到剩余需求。
(4)判断剩余需求是否小于等于系统可利用的资源。
银行家算法实验报告
银行家算法实验报告引言:在计算机科学领域,由于资源的有限性,进程资源分配问题一直备受关注。
而银行家算法被广泛应用于操作系统中,用于确保资源的安全分配。
本文旨在介绍银行家算法的原理和应用,并通过实验报告来验证该算法的有效性和可行性。
1. 银行家算法简介银行家算法是由美国学者Dijkstra提出的一种资源分配和避免死锁的算法。
其基本思想是通过银行家的原则来避免系统陷入死锁状态,保证资源分配的安全性和可行性。
银行家算法适用于具有多个进程和多个资源的并发系统中。
2. 银行家算法原理银行家算法基于两个重要的概念:安全性和可分配性。
安全性表示在系统当前状态下,是否存在一种资源分配序列可以使系统避免死锁状态。
可分配性表示系统是否能够满足进程对资源的请求。
银行家算法的实现需要以下几个关键步骤:(1) 初始化:对每个进程设置最大需求量、已分配资源量和需求资源量。
(2) 效验:判断系统当前状态下资源是否满足所有进程的需求,即判断系统是否处于安全状态。
(3) 分配:若系统处于安全状态,则根据某种资源分配策略,为进程分配资源。
(4) 请求:进程请求资源。
(5) 回收:进程释放资源。
3. 银行家算法的实验验证为了验证银行家算法的有效性和可行性,我们设置了一个简单的实验环境,模拟一个有限的资源系统,包含3个进程和3种不同类型的资源。
实验过程如下:(1) 初始化:对每个进程设置最大需求量、已分配资源量和需求资源量。
设置3个进程的最大需求量分别为{5, 4, 3},已分配资源量分别为{1, 2, 2},需求资源量分别为{3, 2, 0}。
(2) 效验:判断系统当前状态下资源是否满足所有进程的需求。
经过实验验证,我们发现系统当前状态下资源无法满足进程2的资源需求。
为了保证系统的安全性和避免死锁,根据银行家算法原理,我们将不满足资源需求的进程2暂停,并回滚到初始状态。
重新调整资源分配后,系统进入了安全状态。
(3) 分配:为进程1和进程3分配资源。
银行家算法试验报告
一、实验题目:银行家算法的实现二、设计内容设计一个n 个并发进程共享m 个系统资源的系统。
进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。
要求采用银行家算法实现。
三、开发环境windows环境,java1.5平台。
四、分析设计<一>实验原理♦银行家算法是从当前状态出发,逐个按安全序列检查各客户中谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户。
如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。
♦与预防死锁的几种方法相比较,限制条件少,资源利用程度提高了。
♦缺点:该算法要求客户数保持固定不变,这在多道程序系统中是难以做到的;该算法保证所有客户在有限的时间内得到满足,但实时客户要求快速响应,所以要考虑这个因素;由于要寻找一个安全序列,实际上增加了系统的开销.Banker algorithm 最重要的一点是:保证操作系统的安全状态!这也是操作系统判断是否分配给一个进程资源的标准!那什么是安全状态?举个小例子,进程P 需要申请8 个资源(假设都是一样的),已经申请了 5 个资源,还差3 个资源。
若这个时候操作系统还剩下 2 个资源。
很显然,这个时候操作系统无论如何都不能再分配资源给进程P 了,因为即使全部给了他也不够,还很可能会造成死锁。
若这个时候操作系统还有 3 个资源,无论P 这一次申请几个资源,操作系统都可以满足他,因为操作系统可以保证P 不死锁,只要他不把剩余的资源分配给别人,进程P 就一定能顺利完成任务。
为什么银行家算法是可行的呢?这里需要严格的证明一下。
不管任何时候,操作系统分配资源的时候都可以保证当前接受资源的进程不会陷入死锁,因为操作系统总是可以满足该进程需要的资源的。
假设有n 个进程{p1, p2, p3, …pn} ,最后一个分配到资源的是pi ,pi 还需要mi 个资源,假设此时操作系统还有m 个资源剩余。
那么很显然m>=mi !而且如果之后操作系统又把资源分配给其他进程了,假设是pj ,pj 还需要mj 个资源,同理可知m>=mj !也就是说在所有的进程中,还需要的资源数总是有小于m 的!这样就可以保证资源数永远不会为0 ,即使可能暂时性为0 。
银行家算法实验报告c语言
银行家算法实验报告c语言银行家算法实验报告引言:计算机科学中的银行家算法是一种资源分配和避免死锁的算法。
它是由艾德加·戴克斯特拉(Edsger Dijkstra)在1965年提出的。
银行家算法通过判断一个系统是否处于安全状态来决定是否分配资源给进程。
本实验旨在使用C语言实现银行家算法,并通过一系列的实例来验证其有效性。
一、实验背景银行家算法是为了解决资源分配中的死锁问题而提出的。
在多进程系统中,每个进程都需要一定数量的资源来完成任务。
然而,如果资源分配不当,可能会导致死锁的发生,即所有进程都陷入无法继续执行的状态。
银行家算法通过合理地分配资源,避免了死锁的发生。
二、实验目的本实验的主要目的是通过C语言实现银行家算法,并通过实例验证其正确性和有效性。
具体而言,我们将模拟一个系统中的多个进程,并为每个进程分配资源。
然后,我们将使用银行家算法来判断系统是否处于安全状态,从而决定是否继续分配资源。
三、实验过程1. 创建进程和资源我们首先创建了5个进程和3种资源。
每个进程需要的资源数量是随机生成的,以模拟真实情况下的资源需求。
2. 分配资源根据银行家算法的原则,我们按照以下步骤来分配资源:- 首先,检查每个进程的资源需求是否小于等于系统当前可用的资源数量。
- 如果满足条件,将资源分配给该进程,并更新系统剩余资源数量。
- 如果不满足条件,暂时不分配资源给该进程,继续检查下一个进程。
3. 判断系统状态在每次资源分配后,我们需要判断系统是否处于安全状态。
为此,我们使用银行家算法的核心原则:只有当系统能够为每个进程提供所需的资源时,系统才是安全的。
我们通过遍历所有进程来检查其资源需求是否小于等于系统剩余资源数量,如果满足条件,说明系统是安全的。
4. 实例验证我们进行了多个实例验证,以确保银行家算法的正确性。
在每个实例中,我们模拟了不同的进程和资源需求,并观察系统的状态。
通过比较实验结果和预期结果,我们验证了银行家算法的有效性。
银行家算法的模拟【实验报告】.
实验二银行家算法的模拟专业:信息管理与信息系统学号:2014******姓名:陈*实验日期:2016年12月20日一、实验目的银行家算法是一种最具有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。
所谓安全状态,是指系统能按照某种进程顺序{P1,P2,…,Pn}(称{P1,P2,…,Pn}序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。
安全状态一定没有死锁发生。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
那么,什么是安全序列呢?如果对每一个进程Pi(1<i<n),它以后尚需要的资源量不超过系统当前可利用的资源量与所有的进程Pj(j<n)所占有的资源量之和,则称此进程序列{P1,P2,…,Pn}是安全的,称作安全序列。
利用银行家算法,我们可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。
通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法二、实验要求用高级语言编写和调试一个动态资源分配(银行家算法)的模拟程序,以加深对避免死锁算法的理解。
三、实验方法内容1.算法设计思路(流程图)2.算法中用到的数据结构最大需求矩阵Max[][]已分配矩阵Allocation[][]仍需求矩阵Need[][]=Max[][]-Allocation[][]可利用资源向量Available[]申请各类资源向量Request[]工作向量work[],Finish[]3.主要模块(函数名)(1)int getRequest();获取用户输入的进程和对应请求的资源(2)int checkNeed(int no)检查用户的请求是否大于还需要的资源(3)int checkAvailable()检查用户的请求是否大于现有的可利用的资源(4)int isSafe(int proNo)安全性算法,检查预分配资源后系统是否安全(5)int Bank(int proNo)银行家算法四、实验结果1.执行结果2.结果分析(1)当输入的进程请求的资源超过该进程还需要的资源时,该请求不合法;(2)当输入的进程请求的资源大于系统当前可利用的资源时,该请求不合法,需等待;(3)当输入的进程请求合法,且分配资源后系统处于安全状态,则分配资源给该进程;(4)当输入的进程请求合法,但分配资源后系统处于不安求状态,则不分配资源,需等待;五、实验总结(1)通过此次试验,我对死锁、产生死锁的必要条件、安全状态灯概念有了进一步的了解;(2)通过银行家算法的模拟,掌握了避免死锁的具体实施方法;。
实验三银行家算法实验报告
实验三银行家算法实验报告一、实验目的银行家算法是一种用于避免死锁的算法,本次实验旨在通过编程实现银行家算法,并通过模拟银行家算法的运行过程来加深对该算法的理解。
二、实验过程及结果1. 系统设计为了模拟银行家算法的运行过程,需要设计一个包含多个进程和资源的系统。
每个进程都有一定的最大需求资源数和已分配资源数。
系统中还有一定数量的可用资源,进程可以请求资源和释放资源。
2. 算法实现在程序中实现银行家算法需要以下几个关键的函数:(1)银行家算法的主函数:实现进程的请求资源和释放资源操作,并在此过程中判断是否产生死锁;(2)安全检查函数:用于判断系统状态是否安全,即是否存在一个安全序列,如果存在则表示系统处于安全状态,否则表示系统处于不安全状态;(3)资源请求函数:用于进程请求资源的操作,根据银行家算法的要求进行判断;(4)资源释放函数:用于进程释放资源的操作。
3. 算法运行通过对编写的程序进行多次运行测试,模拟不同进程对资源的请求和释放,观察系统是否能够始终处于安全状态。
在每次运行中,记录并输出系统的安全序列和进程的状态等信息。
4. 实验结果分析通过实验运行结果的分析,可以得出以下结论:(1)银行家算法能够有效地避免死锁的发生;(2)系统中资源的分配和释放过程需要合理,否则可能导致系统陷入死锁;(3)资源的分配策略对系统的安全状态有重要影响。
三、实验总结通过本次实验,深入了解了银行家算法的原理和实现过程,并通过编程实践加深了对该算法的理解。
银行家算法是一种重要的死锁避免算法,能够保证系统处于安全状态下运行,并且能够合理地分配系统资源,避免系统陷入死锁。
四、参考文献[1] 《操作系统概念》,Abraham Silberschatz,Peter B. Galvin,Greg Gagne,电子工业出版社,2014年五、附录(示例代码省略)以上是本次实验的实验报告,通过实验我们深入了解了银行家算法,了解了它在操作系统中的应用和重要性。
银行家算法实验报告
《银行家算法的模拟实现》实验报告题目:银行家算法的模拟实现专业:软件工程班级:B184学号:20180614423姓名:吴文骏日期:2020年5月23日一、实验目的1、理解银行家算法。
2、掌握进程安全性检查的方法与资源分配的方法二、实验内容与基本要求编制模拟银行家算法的程序,并给出一个例子验证所编写的程序的正确性。
三、实验报告内容银行家算法和安全性检查算法原理:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;(2)顾客可以分期贷款,但贷款的总数不能超过最大需求量;(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
(一)银行家算法(bank()函数):进程i发出请求资源申请,(1)如果Request [j]<=need[i,j],转向步骤(2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。
(2)如果:Request i[j]<=available[i,j],转向步骤(3),否则表示尚无足够资源,进程i需等待。
(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:Available[i,j]= Available[i,j]- Request [j];Allocation[i][j]= Allocation[i][j]+ Request [j];need[i][j]= need[i][j]- Request [j];(4)试分配后,执行安全性检查,调用check()函数检查此次资源分配后系统是否处于安全状态。
银行家算法实习报告
青岛农业大学学生实习报告实习名称:软件系统课程设计实习时间: -- 年第 2学期专业班级:姓名(学号):同组成员:***师:***年 3 月 22 日(一)编译原理部分一、实习题目将词法分析器设计成单独旳程序或供语法分析器调用旳子程序,功能涉及:规定可以辨认数字、标记符、核心字、运算符等。
二、设计思路及算法描述词法分析程序旳功能:输入源程序,输出单词符号,如图所示:源程序单词符号解决过程:在扫描源程序字符串时,一旦辨认出核心字、分隔符、标记符、无符号常数中之一,即以单词形式(各类单词均采用相似旳构造,即二元式编码形式)输出。
每次调用词法分析程序,它均能自动继续扫描下去,形成下一种单词,直至整个源程序所有扫描完毕,并形成相应旳单词串形式旳源程序。
本程序规定:(1)核心字"begin","end","if","then","else","while","write","read","do", "call","const","char","until","procedure","repeat"(2)运算符:"+","-","*","/","="(3)界符:"{","}","[","]",";",",",".","(",")",":"(4)其他标记如字符串,表达以字母开头旳标记符。
银行家算法实验报告-计算机操作系统教程(第三版)
计算机操作系统教程(第三版)银行家算法实验报告一、实验目的银行家算法是避免死锁的一种重要方法。
通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法二、实验要求根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。
(1)设计思想说明设计银行家算法是为了避免死锁三、实验方法内容1.算法设计思路银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。
这时系统将该进程从进程集合中将其清除。
此时系统中的资源就更多了。
反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。
请进程等待2.算法流程图3.算法中用到的数据结构数据结构的说明1.可利用资源向量AVAILABLE。
这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改变。
2.最大需求矩阵MAX。
这是一个M*N的矩阵,它定义了系统中N个进程中的每一个进程对M类资源的最大需求。
3.分配矩阵ALLOCATION。
这也是一个M*N的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
4.需求矩阵NEED。
这也是一个M*N的矩阵,用以表示每一个进程尚需的各类资源数。
5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]4.主要的常量变量#define W 10 //最大进程数W=10#define R 20 //最大资源总数R=20 int AVAILABLE[R]; //可利用资源向量int MAX[W][R]; //最大需求矩阵int ALLOCATION[W][R]; //分配矩阵int NEED[W][R]; //需求矩阵int Request[R]; //进程请求向量void changdata(int k);//进程请求资源数据改变int chksec(int s); //系统安全性的检测5.主要模块void inputdata()void showdata()void changdata(int k)void restoredata(int k) int chksec(int s)int chkmax(int s)四、实验代码#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.结果分析银行家算法就是当接收到一个系统资源的分配后找到一个安全序列,使得进程间不会发生死锁,若发生死锁则让进程等待。
银行家算法实验报告 (2)
一.绪论这次课程设计要求完成一个资源管理系统,该系统必须包括资源的添加、删除和修改等功能,并且允许其它进程来申请这里的资源,任何一个进程来申请资源时,必须先登记该进程对资源的申请要求,然后由系统检查当前资源的状况,并用银行家算法和安全性算法来检查是否允许分配资源给进程。
通过课程设计,加深我们对利用银行家算法避免死锁的理解。
在设计中主要的难点是用语言编写银行家算法和安全性算法,使系统资源分配能安全进行,避免系统死锁。
二.设计目的在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用提高吞吐量,但可能发生一种危险——死锁。
所谓死锁,是指多个进程运行中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,他们都无法再向前推进。
虽然进程在运行过程中,可能发生死锁,但死锁的发生必须同时具备四个条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件;防止死锁的机构只须确保上述四个条件之一不出现,则系统不会发生死锁。
系统的状态分为安全状态和不安全状态,只要能使系统都处于安全状态,便可避免死锁。
所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,P n),来为每个进程P i分配其所需分配,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。
如果系统无法找到一个这样地安全系列,则称系统处于不安全状态。
在操作系统中研究资源分配策略时也有类似的问题,系统中有限的资源要供多个进程使用,必须保证得到资源的进程能在有限的时间内归还资源,以供它进程使用资源。
如果资源分配不得当就会发生进程循环等待资源,各进程都无法继续执行下去的死锁现象。
而最有代表性的避免死锁的算法,是Dijkstra的银行家算法。
银行家算法是避免死锁的一种重要方法,在课程设计中用C语言编写一个资源管理系统,并要用银行家算法和安全性算法检查是否允许分配资源给进程,避免死锁。
通过课程设计,加深我们对了解有关资源申请、避免死锁等概念,并加深我们对银行家算法理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《银行家算法的模拟实现》 --实验报告题目: 银行家算法的模拟实现专业:班级:组员:指导老师:一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。
本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。
二、实验内容模拟实现银行家算法实现死锁避免。
要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。
三、实验分析过程1、整个银行家算法的思路。
先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。
1)进程一开始向系统提出最大需求量.2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待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]。
如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)(5)、进行资源的预分配,语句如下:A V ALIBLE[I][J]= A V ALIBLE[I][J]-K;ALLOCATION[I][J]= ALLOCATION[I][J]+K;NEED[I][J]=NEED[I][J]-K;(6)、系统调用安全性检查算法(checksafe()函数)进行检查,如果检查通过,则不用回收,否则进行回收,进程资源申请失败进入等待。
4、安全性检查算法(checksafe()子函数)(1)、设置两个临时变量。
FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1,也可设为其它非零值以表示执行的先后次序。
WORK[M]记录模拟执行中资源的回收情况,初值为A V AILABLE[M]的值。
(2)、在进程中查找符合以下条件的进程。
条件1:FINISH[I]=0条件2:NEED[I][J]〈=WORK[J](3)、如果查找成功则进行资源的模拟回收,语句如下:WORK[J]=WORK[J]+ALLOCA TION[I][J];FINISH[I]=1 或查找到的顺序号(4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成功标志。
否则返回成功标志。
四、系统流程图五、程序源代码#include <iostream.h>#include<stdio.h>#include<stdlib.h>const unsigned short c=3;//资源类数const unsigned short t=5;//进程数void print();//用于打印输出表格的函数void input();//用于输入的函数void tryfenpei(int i);//试分配函数;void refenpei(int i);//恢复数据函数void checksafe(int s);//安全检测函数int temp[t];int work[c];//定义初始化数组int need[t][c],request[c],available[c];int max[t][c]={3, 5, 7 ,9 ,11,6 ,8 ,2 ,9, 5,6 ,3 ,5 ,7 ,4};int allocation[t][c]={1 ,2 ,5 ,4, 8,5 ,4, 1 ,8 ,3 ,3 ,2 ,4, 3, 1};int total[c]={17,21,25};int in;//用户选择的进程号/*------------------main函数-----------------------------*/int main(int argc,char *argv[]){int i;char ch='Y';int l=0,m=0,a;for( i=0;i<t;i++){for(int j=0;j<c;j++)need[i][j]=max[i][j]-allocation[i][j];}for( m=0;m<c;m++){a=0;for(int l=0;l<t;l++)a+=allocation[l][m];available[m]=total[m]-a;}do {if(ch=='Y'||ch=='y'){cout<<"ok,现在开始进入实验……"<<endl;cout<<"请输入需要请求的进程号(0-4):";while(cin>>in){if(!(0<=in&&in<=4)){cout<<"这里没有该进程,请重新输入~"<<endl;}else break;}cout<<"您输入的是"<<"p["<<in<<"]"<<" 进程"<<endl;cout<<"该进程需求量为:";for(i=0;i<c;i++){need[in][i]=max[in][i]-allocation[in][i];cout<<need[in][i]<<" ";}cout<<endl;cout<<endl;cout<<"请输入请求资源向量:";//输入格式为xfor(i=0;i<c;i++){while(cin>>request[i]){if(request[i]<0) cout<<"sorry,输入的数字无效~"<<endl;else if(request[i]>need[in][i])cout<<"超出进程需求量~"<<endl<<endl;if(request[i]>available[i])cout<<"系统没有足够多的可用资源量满足进程需要~"<<endl<<endl;else break;}}cout<<"输入成功~,您输入的是:"<<request[0]<<" "<<request[1]<<" "<<request[2];cout<<"等待已久的银行家算法开始执行~"<<endl;tryfenpei(in);//分配函数cout<<"试分配完成~"<<endl;cout<<"现在进入安全性检测……"<<endl;checksafe(in);//安全性检测函数cout<<"您还想继续银行家算法的实验吗~?(y-继续n终止)";}else if(ch=='N'||ch=='n'){cout<<"感谢您的使用,Bye~"<<endl<<"退出ing……"<<endl;break;}elsecout<<"输出无效!请重新输入"<<endl;}while (cin>>ch);}/*-------输出函数-------*/void print(){int i,j;cout<<"更新数据中..."<<endl;cout<<"|-------|------------|-----------|----------|-----------|"<<endl;cout<<"|-------|最大需求矩阵|已分配矩阵-|-需求矩阵-|可利用资源-|"<<endl;cout<<"| 资源| Max | Allocation| Need | available |"<<endl;cout<<"| | A B C | A B C | A B C | A B C |"<<endl;cout<<"|进程| | | | |"<<endl;cout<<"|-------|------------|-----------|----------|-----------|"<<endl;for(i=0;i<5;i++){cout<<"| p"<<i<<" | ";for(j=0;j<3;j++) {cout<<max[i][j]<<" "; }cout<<" | ";for(j=0;j<3;j++) {cout<<" "<<allocation[i][j]; }cout<<" | ";for(j=0;j<3;j++) {cout<<" "<<need[i][j]; }cout<<" |";if(i==0) {for(j=0;j<3;j++) {cout<<" "<<available[j]; }cout<<" |"; }if(i>0){cout<<" |"; }cout<<endl; }cout<<"|-------|------------|-----------|----------|-----------|"<<endl;}/*--------试分配函数-------*/void tryfenpei(int i){for(int f=0;f<c;f++){available[f]=available[f]-request[f];allocation[i][f]=allocation[i][f]+request[f];need[i][f]=need[i][f]-request[f];}/*--------恢复数据函数-------*/void refenpei(int i){for(int f=0;f<c;f++){available[f]=available[f]+request[f];allocation[i][f]=allocation[i][f]-request[f];need[i][f]=need[i][f]+request[f];}}int com(int *p,int *q){int i;for(i=0;i<c;i++)if(p[i]>q[i])return 0;return 1;}/*--------安全检测函数---------*/void checksafe(int s){int flag,temp[t],i,j,l,k=0;bool finish[t];for(i=0;i<t;i++)finish[i]=false;for(j=0;j<c;j++)work[j]=available[j];cout<<"|-------|-----------------|----------|"<<endl;cout<<"| resource |-Work+Allocation-|--Finish--|"<<endl;cout<<"| | A B C | T/F |"<<endl;cout<<"|programme | | |"<<endl;cout<<"|-------|-----------------|----------|"<<endl;for(i=0;i<t;i++){l=0;for(j=0;j<c;j++){if(need[i][j]>work[j])l=1;break;}if(finish[i]==false&&l==0){cout<<"| p"<<i<<" | ";for(j=0;j<c;j++){work[j]=work[j]+allocation[i][j];if(work[j]>9)cout<<" "<<work[j]<<" ";elsecout<<" "<<work[j]<<" ";}cout<<" ";cout<<"|";cout<<" ";finish[i]=true;cout<<"true ";cout<<"|";temp[k]=i;//cout<<'temp="<<temp[k]<<endl;k++;i=-1; //从用户选择的进程开始对每个进程都要检测cout<<endl;}}cout<<"|-------|-----------------|----------|"<<endl<<endl;for(i=0;i<t;i++){if(finish[i]==false)flag=1;if(flag==1){cout<<"系统不安全!本次资源申请不成功感!"<<endl;cout<<"正在恢复原来的数据..."<<endl;refenpei(in);cout<<"恢复数据成功!正在打印输出..."<<endl;print();}else{cout<<"找到一个安全系列:";for(i=0;i<t;i++)cout<<"P"<<temp[i]<<"--->";cout<<endl<<"已通过安全性测试!"<<endl<<endl<<endl;cout<<"开始给第"<<"p]"<<in<<"]"<<"进程分配资源..."<<endl;cout<<"分配完成!打印输出..."<<endl<<endl;print();cout<<endl;}}}五、程序运行结果及分析1、运行结果输入初值,进行安全性测试,结果安全序列,依次为P4-P0-P1-P2-P3分配资源:资源不足,无法继续实验:2、出现问题及解决方案本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设计,尽可能使程序设计的更加完美。