银行家算法实验报告

合集下载

银行家算法实验报告

银行家算法实验报告

银行家算法实验报告银行家算法实验报告引言:在计算机科学领域中,银行家算法是一种用于避免死锁的资源分配算法。

它是由荷兰计算机科学家艾兹赫尔·迪科斯彻在1965年提出的。

银行家算法通过合理的资源分配和安全性检查,确保系统中的进程能够安全地执行,避免了资源竞争和死锁的发生。

本篇文章将详细介绍银行家算法的原理、实验设计和结果分析。

一、银行家算法的原理银行家算法基于资源的最大需求和可用性进行资源分配。

它将系统中的资源分为若干类别,并为每个类别分配一个初始数量。

当进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。

算法的核心思想是避免分配资源后导致系统无法满足其他进程的资源需求,从而避免死锁的发生。

二、实验设计为了验证银行家算法的有效性,我们设计了一个模拟实验。

实验中,我们创建了一个包含多个进程和资源的系统,并模拟了进程对资源的请求和释放。

每个进程都有自己的资源需求和最大需求量,系统中的资源总量也是有限的。

首先,我们初始化系统的资源数量和每个进程的最大需求量。

然后,模拟进程的请求和释放过程。

当一个进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。

当一个进程释放资源时,系统将回收该资源并重新分配给其他进程。

实验的关键是设计合理的资源分配策略和进程请求顺序,以模拟不同的场景。

我们通过调整进程的最大需求量和资源数量,观察系统的运行情况和死锁的发生情况。

三、实验结果分析通过多次实验,我们得出了以下结论:1. 资源数量的合理分配对避免死锁非常重要。

如果资源数量过少,无法满足进程的最大需求量,系统容易发生死锁。

如果资源数量过多,系统的资源利用率低,效率低下。

因此,需要根据系统的实际需求合理分配资源数量。

2. 进程的最大需求量与资源数量的关系也是影响死锁的重要因素。

当进程的最大需求量超过系统资源数量的一半时,系统容易发生死锁。

银行家算法总结

银行家算法总结

银行家算法总结一、银行家算法银行家算法(Banker’s Algorithm),又称银行家管理算法,是一种专门用于系统资源管理的算法,用于解决操作系统中多个用户对多类资源的竞争请求,从而保证合理地分配公共资源,解决资源分配问题,其目的是为了保证单个进程的安全运行,同时保证系统的安全运行。

二、银行家算法的定义银行家算法是一种用于解决多个用户对多类资源的竞争请求的算法,也称作资源分配算法或资源管理算法,它可以确定是否有足够的资源可供一个或多个进程安全运行,如果有足够的资源可供运行,则可以分配该资源,否则系统将进入不满足安全状态。

三、银行家算法的特点(1)安全性:银行家算法可以确定是否有足够的资源可以满足所有进程的最大要求,使系统处于安全态;(2)在安全态下,银行家算法能够有效地检查一个进程是否可以获得资源,并且可以确定该状态下的最优解;(3)银行家算法可以有效检查一个系统是否处于安全态,它可以检查任意多个资源种类的一组资源分配是否安全;(4)银行家算法可以防止死锁的发生,可以有效地确保非抢占式多处理机系统的安全运行;(5)银行家算法设计简单,容易实现,并十分快速;(6)银行家算法不是最优的,它只是一种有效的搜索算法,其实现效率较低;四、银行家算法的使用1、资源分配问题银行家算法可以用于操作系统中的多个用户对多类资源的竞争请求,以此保证资源的合理分配,从而解决资源分配问题。

它可以有效地检查一个进程是否可以获得资源,同时可以确定该状态下的最优解。

2、进程安全性银行家算法可以用于检查一个系统是否处于安全态,并检查任意多个资源种类的一组资源分配是否安全,可以保证系统的安全运行,从而保证单个进程的安全性。

3、防止死锁银行家算法可以防止死锁的发生,这是由于它可以确定是否有足够的资源可以满足所有进程的最大要求,使系统处于安全态,从而阻止死锁发生。

银行家算法操作系统实验报告

银行家算法操作系统实验报告

竭诚为您提供优质文档/双击可除银行家算法操作系统实验报告篇一:计算机操作系统银行家算法实验报告计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

三、问题分析与设计: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 如找到,执行步骤(3);否则,执行步骤(4)。

(3)当进程p获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:work=work+Allocation;Finish[i]=true;转向步骤(2)。

实验二银行家算法汇总

实验二银行家算法汇总

淮海工学院计算机科学系实验报告书课程名:《操作系统原理》题目:银行家算法班级:学号:姓名:操作系统原理实验——银行家算法实验报告1目的与要求:1)本实验目的是通过使用银行家算法实现系统资源的分配和安全性检查模拟,提高学生对操作系统资源分配功能的深刻理解,并培养学生对操作系统开发的兴趣与应用能力;2)实验前必须认真阅读和理解银行家算法的基本原理和实现方法;3)独立使用C或VC++编程语言编写银行家算法模拟程序;4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)5)于2007年6月1日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。

2 实验内容或题目1)设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源总数量分别为10,5,7。

(参考书上用例)2)并行进程可动态地申请资源和释放资源(程序交互输入申请或释放资源数量),系统按各进程的申请动态地分配资源。

3)每当进程动态申请资源或释放资源时,模拟程序应能及时显示或打印各个进程在此时刻的资源分配表、系统可用资源量和安全序列等资源分配信息和安全检查信息。

4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。

3 实验步骤与源程序实验流程图:#include "string.h"#include "iostream.h"#include "stdio.h"#define M 5 //总进程数#define N 3 //总资源数#define FALSE 0#define TRUE 1int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};int AVAILABLE[N]={3,3,2};int ALLOCATION[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};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 p[M]={0,1,2,3,4};void ChangeData(int k);void RestoreData(int k);int Compare(int need[ ],int work[ ]);int Compare1(int need[ ],int work[ ]);int IsSecurity(int available[],int need[][N],int request[]);void out();void out(int t){printf("PCB Max Allocation Need Available\n");printf("PRO A B C A B C A B C A B C\n");int i;for(i=0;i<5;i++){if(p[i]==t)printf("%d %d %d %d %d %d %d %d %d %d %d %d %d\n",p[i],MAX [p[i]][0],MAX[p[i]][1],MAX[p[i]][2],ALLOCATION[p[i]][0],ALLOCATION[p[i]][1],ALLOCATION [p[i]][2],NEED[p[i]][0],NEED[p[i]][1],NEED[p[i]][2],AVAILABLE[0],AVAILABLE[1],AVAILABL E[2]);elseprintf("%d %d %d %d %d %d %d %d %d %d\n",p[i],MAX[p[i]][0],MAX[p [i]][1],MAX[p[i]][2],ALLOCATION[p[i]][0],ALLOCATION[p[i]][1],ALLOCATION[p[i]][2],NEED[ p[i]][0],NEED[p[i]][1],NEED[p[i]][2]);}};void ChangeData(int k) //为进程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 Compare1(int need[ ],int work[ ]){int j;for(j=0;j<N;j++) {if(need[j]>=work[j]){}elsereturn TRUE;}return FALSE;};int Compare(int need[ ],int work[ ]) //安全检查过程中判断进程需求资源是否大于现有资源{int j;for(j=0;j<N;j++) {if(need[j]>work[j]){return FALSE;}}return TRUE;};int IsSecurity(int available[],int need[][N],int request[]){//安全检查程序段int i,j,k=0,flag,finish[M],work[N];for(i=0;i<M;i++) {finish[i]=FALSE;}for(j=0;j<N;j++) {work[j]=available[j];}while(TRUE) {//寻找安全进程序列flag=FALSE;for(i=0;i<M;i++) { //每一趟循环将找到当前可分配资源的进程,并回收其已分配资源if(finish[i]==FALSE&&Compare(need[i],work)==TRUE) {for(j=0;j<N;j++) work[j]+=ALLOCATION[i][j];finish[i]=TRUE;p[k++]=i;//将进程序号填入数组,后面根据它打印安全序列flag=TRUE;break; //结束FOR循环,表示WORK中资源满足某一进程的资源需求}}if(flag==FALSE) { //只要有一个进程全部资源得到满足,则继续while(TRUE)循环for(i=0;i<M;i++) {if(finish[i]==FALSE) return FALSE; //遇到某一进程的finish[i]不成立,则不安全}return TRUE; //对所有进程检查后,finish[i]均为TRUE,则有安全序列}}};void main(){int pro=-1;while(1){//1.打印当前进程的资源需求状态和系统可用资源状态out(pro);//2.从键盘输入某个进程的资源请求,注意进程号,下面比较资源时要用到//int pro; //存放申请资源的进程号printf("请输入进程号和该进程的资源请求量:\n");scanf("%d%d%d%d",&pro,&Request[0],&Request[1],&Request[2]);if(Compare1(NEED[pro],Request))//此处的比较操作可通过改造ppt中的compare 函数完成 ,下同{printf("资源请求大于该进程的需求值,出错了,退出循环!\n");//输出信息:资源请求大于该进程的需求值,出错了,退出循环break;}else{if(Compare1(AVAILABLE,Request)){printf("资源请求大于系统可用资源总数,不能满足要求,请重新输入!\n");//输出信息:资源请求大于系统可用资源总数,不能满足要求,请重新输入!continue;}else // 下面开始进行资源预分配,并判断系统是否安全{ChangeData(pro);//3.资源预分配代码if(IsSecurity(AVAILABLE,NEED,Request)==TRUE){//输出信息:系统处于安全状态,该进程的资源请求获准printf("系统处于安全状态,该进程的资源请求获准!\n");//4.打印进程的安全序列,就是将P数组中的内容输出for(int m=0;m<5;m++){printf("%d\t",p[m]);}printf("\n");}else{//输出信息:系统处于不安全状态,可能导致死锁,该进程的资源请求不能批准,请重新输入资源请求printf("系统处于不安全状态,可能导致死锁,该进程的资源请求不能批准,请重新输入0资源请求!\n");//5.将预分配资源进行恢复RestoreData(pro);}}}}} //输出信4 测试数据与实验结果(可以抓图粘贴)5 结果分析与实验体会通过本次银行家算法的实验,我对银行家算法有了更进一步的了解,虽说我对操作系统这门课的兴趣不大,但是老师上课非常的认真、负责,对银行家算法讲解的非常详细。

银行家算法结果分析与实验心得

银行家算法结果分析与实验心得

银行家算法结果分析与实验心得银行家算法是一种用于避免死锁的资源分配算法,用于分配有限的可用资源给多个进程或线程以避免死锁并保证安全性。

它是由银行家提出的一种资源分配算法,主要用于操作系统中的进程管理。

下面是我对银行家算法的结果分析与实验心得:1. 结果分析银行家算法的运行结果主要包括两个方面:是否发生死锁和是否保证资源安全性。

首先,通过实验可以发现,银行家算法能够有效地避免死锁的发生。

当系统中某个进程或线程请求资源时,如果系统可用的资源数量无法满足其需求,银行家算法会判断该请求是否会导致死锁的发生,如果是则拒绝该请求,直到系统可用的资源满足该请求为止。

其次,银行家算法能够保证资源的安全性。

在银行家算法中,每一个进程或线程有一个最大资源需求量和已分配资源量,系统有一个可用资源量和已分配资源量,银行家算法通过计算当前可用资源量是否能够满足某个进程或线程的资源需求来判断是否能够分配资源给该进程或线程。

在分配之前,会先对资源的状态进行检查,如果分配该资源将使系统处于不安全状态,则不能分配。

2. 实验心得在实验中,我使用了一些简单的示例来演示银行家算法的应用,例如汽车工厂生产线、餐厅就餐服务等。

在实验过程中,我发现银行家算法的确可以有效避免死锁的发生,而且能够保证资源的安全性。

但是,在实际应用中,由于每个进程或线程的资源需求量和已分配资源量的变化是动态的,因此需要不断地进行资源状态检查和更新,这会增加一定的系统开销,降低系统的性能。

另外,银行家算法也有一些局限性,如它只适用于静态资源分配问题,即资源需求量和可用资源量都是固定的,而且每个进程或线程的最大需求量必须在分配资源前就知道。

如果资源需求量和可用资源量是动态变化的,银行家算法就无法满足需求,因此需要采用其他的算法来解决这类问题。

总之,银行家算法是一种很有用的资源分配算法,它可以有效避免死锁的发生,保证资源的安全性,但在实际应用中需要根据具体情况来选择合适的算法。

银行家算法实验报告(同名22949)

银行家算法实验报告(同名22949)

银行家算法实验报告(同名22949)计算机操作系统实验报告何美西 1 一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

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

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

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

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

(2) 如果 Reques t 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 )。

实验四 银行家算法

实验四 银行家算法

银行家算法的模拟实现一.实验目的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()函数检查此次资源分配后系统是否处于平安状态。

实验七 银行家算法模拟实验

实验七  银行家算法模拟实验

实验七银行家算法模拟实验一、实验目的(1)进一步理解利用银行家算法避免死锁的问题;(2)在了解和掌握银行家算法的基础上,编写银行家算法通用程序,友好显示调试结果;(3)理解和掌握安全序列、安全性算法。

二、实验环境(1)装有Microsoft Visual Studio C++6.0专业版或企业版。

三、实验内容及原理(一)实验内容理解什么是死锁?理解利用银行家算法避免死锁的原理;会使用某种编程语言模拟实验银行家算法。

(二)实验原理1、安全状态指系统能按照某种顺序如<P1,P2,…,Pn>(称为<P1,P2,…,Pn>序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。

2、银行家算法假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。

系统按下述步骤进行安全检查:(1)如果Request i[]≤Need[]则继续以下检查,否则显示需求申请超出最大需求值的错误。

(2)如果Request i[]≤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等待。

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

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

操作系统(实验报告)银行家算法姓名:*****学号:*****专业班级:*****学验日期:2011/11/22指导老师:***一、实验名称:利用银行家算法避免死锁二、实验内容:需要利用到银行家算法,来模拟避免死锁:设计M个进程共享N类资源,M个进程可以动态的申请资源,并可以判断系统的安全性,进行打印出,相应的安全序列和分配表,以及最后可用的各资源的数量。

三、实验目的:银行家算法是一种最有代表性的避免死锁的算法,在避免死锁的方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

为实现银行家算法,系统必须设置若干数据结构,所以通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁,产生死锁的必要条件,安全状态等重要的概念,并掌握避免死锁的具体实施方法。

四、实验过程1.基本思想:我们可以把操作系统看成是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

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

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

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

安全状态就是如果存在一个由系统中所有进程构成的安全序列P1……则系统处于安全状态。

安全状态是没有死锁发生。

而不安全状态则是不存在这样一个安全序列,从而一定会导致死锁。

2.主要数据结构:(1)可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类的资源的分配和回收而动态地改变,如果Available[j]=K,则表示系统中现有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个,方能完成其任务。

而且上述的矩阵间存在下述的关系:Need[i,j]=Max[i,j]-Allocation[i,j]3.输入输出每次开始运行程序,则要求用户开始输入可用资源量Allocation,最大需求矩阵Max,及已分配的资源,然后根据上述的公式计算出需求矩阵Need,最后用循环将此时的状态输出,若此状态是安全的,则可以要用户继续输入请求各个资源的数量,经安检后,若仍是安全的,予以分配,并打印出,若不安全,则不予以分配,将原状态输出。

4. 程序流程图5.截屏安全实例:不安全实例:6.源程序:package com.bank;import java.util.Scanner;class init{public boolean Run = true, flag = true;public int m, n;public int num[];public int count=0;public int available[];public int max[][];public int allocation[][];public int need[][];public int work[];public boolean finish[];public int request[];public init() {available = new int[15];max = new int[15][15];allocation = new int[15][15];need = new int[15][15];work = new int[15];request = new int[15];finish = new boolean[15];num=new int[15];}public void Input() {System.out.println("请输入进程的个数");Scanner reader = new Scanner(System.in);int x=reader.nextInt();n = x;//} catch (Exception e) {}System.out.println("请输入资源类型个数");x=reader.nextInt();m = x;System.out.println("请输入每种资源可用的数量");for (int i = 0; i < m; i++){available[i] = reader.nextInt();}System.out.println("请输入每个进程对每种资源的最大需求");for (int i = 0; i < n; i++){ System.out.println();for (int j = 0; j < m; j++){max[i][j] = reader.nextInt();}}while (Run){ flag = true;System.out.println("请输入每个进程已经分配的各种类型资源的数量");for (int i = 0; i < n; i++){System.out.println();for (int j = 0; j < m; j++) {allocation[i][j] = reader.nextInt();}}for (int i = 0; i < n; i++) //计算need的值for (int j = 0; j < m; j++)need[i][j] = max[i][j] - allocation[i][j];for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (need[i][j] < 0){flag = false;System.out.println("第"+ (i + 1) + "行第"+ (j + 1)+ "列输入有错误。

");}}}if (flag == false) {System.out.println("以上错误的值不应该大于“最大需求”矩阵相应位置的值。

");System.out.println("请重新输入:\n");continue;} elseRun = false;}}public void Output() {System.out.println("系统状态如下:\n\n");System.out.println("各个进程最大资源数:");for(int i=0;i<n;i++){System.out.print("P"+(i+1)+":");for(int j=0;j<m;j++){System.out.print(max[i][j]+" ");}System.out.println();}System.out.println();System.out.println("各个进程已经分配资源数:");for(int i=0;i<n;i++){System.out.print("P"+(i+1)+":");for(int j=0;j<m;j++){System.out.print(allocation[i][j]+" ");}System.out.println();}System.out.println("各个进程还需要资源数:");for(int i=0;i<n;i++){System.out.print("P"+(i+1)+":");for(int j=0;j<m;j++){System.out.print(need[i][j]+" ");}System.out.println();}System.out.println("目前各资源可用的数量分别为:");for (int j = 0; j < m; j++)System.out.print(available[j]+" ");System.out.println();}}class Security {public init io;public boolean Run = true;public int k=0;public Security(init io) {this.io=io;}public boolean Isless(int a[][], int i, int b[]) { int j;for (j = 0; j < io.m; j++) {if (a[i][j] > b[j])return false;}return true;}// 检验系统是否处于安全性状态public boolean check() {for (int i = 0; i < io.m; i++)//对work进行初始化io.work[i] = io.available[i];for (int i = 0; i < io.n; i++)//对finish进行初始化io.finish[i] = false;while (Run) {for (int i = 0; i < io.n; i++){k++;//用以控制Run的值,以便对while进行控制if (io.finish[i] == false && Isless(io.need, i, io.work) == true){k--;io.finish[i] = true;for (int j = 0; j < io.m; j++){io.work[j] = io.work[j] + io.allocation[i][j];}io.num[io.count]=i+1;io.count++;}}if(k==io.n){Run=false;}else{Run = true;k=0;}}for (int i = 0; i < io.n; i++){if (io.finish[i] == false){System.out.println("系统处于不安全状态,找不到一个安全序列。

相关文档
最新文档