银行家算法实现资源分配
- 格式:doc
- 大小:272.00 KB
- 文档页数:10
学号P7******* 专业计算机科学与技术姓名实验日期2017。
11.9 教师签字成绩实验报告【实验名称】银行家算法【实验目的】掌握银行家算法,用银行家算法模拟操作系统避免死锁的方法【实验原理】银行家算法又称“资源分配拒绝"法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。
这时系统将该进程从进程集合中将其清除。
此时系统中的资源就更多了.反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。
请进程等待用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配.程序能模拟多个进程共享多种资源的情形.进程可动态地申请资源,系统按各进程的申请动态地分配资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况【数据结构和符号说明】可利用资源向量Available最大需求矩阵Max分配矩阵Allocation需求矩阵Need工作向量Work标记向量Finishchar name[100][10];//定义最大100个进程,每个大小为10int Max[100][100]; //定义int Allocation[100][100];//可利用资源向量资源数int Need[100][100];//需求矩阵int avaiable[100];//系统可利用资源int avaiable1[100];int state[100];//进程状态数组char name1[100][10];//进程名int bigger; ;//是否大于int N; //进程数int n; //资源数int counter;函数:void Input()//输入函数void Init()//初始化void output()//输出安全序列或等待void insert_pcb()//请求进程或更新进程void show()//显示界面与选择int CmpRequestAvailable(int Pos,int n)//比较Request和Available的大小int CmpRequestNeed(int Pos,int n)//比较Request和Need的大小void Reset(int n,int Pos)//更新request之后的Need,Allocation,Available 的值void Banker()//银行家算法【实验流程图及算法实现】用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。
银行家算法实验报告银行家算法实验报告引言:在计算机科学领域中,银行家算法是一种用于避免死锁的资源分配算法。
它是由荷兰计算机科学家艾兹赫尔·迪科斯彻在1965年提出的。
银行家算法通过合理的资源分配和安全性检查,确保系统中的进程能够安全地执行,避免了资源竞争和死锁的发生。
本篇文章将详细介绍银行家算法的原理、实验设计和结果分析。
一、银行家算法的原理银行家算法基于资源的最大需求和可用性进行资源分配。
它将系统中的资源分为若干类别,并为每个类别分配一个初始数量。
当进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。
算法的核心思想是避免分配资源后导致系统无法满足其他进程的资源需求,从而避免死锁的发生。
二、实验设计为了验证银行家算法的有效性,我们设计了一个模拟实验。
实验中,我们创建了一个包含多个进程和资源的系统,并模拟了进程对资源的请求和释放。
每个进程都有自己的资源需求和最大需求量,系统中的资源总量也是有限的。
首先,我们初始化系统的资源数量和每个进程的最大需求量。
然后,模拟进程的请求和释放过程。
当一个进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。
当一个进程释放资源时,系统将回收该资源并重新分配给其他进程。
实验的关键是设计合理的资源分配策略和进程请求顺序,以模拟不同的场景。
我们通过调整进程的最大需求量和资源数量,观察系统的运行情况和死锁的发生情况。
三、实验结果分析通过多次实验,我们得出了以下结论:1. 资源数量的合理分配对避免死锁非常重要。
如果资源数量过少,无法满足进程的最大需求量,系统容易发生死锁。
如果资源数量过多,系统的资源利用率低,效率低下。
因此,需要根据系统的实际需求合理分配资源数量。
2. 进程的最大需求量与资源数量的关系也是影响死锁的重要因素。
当进程的最大需求量超过系统资源数量的一半时,系统容易发生死锁。
银行家算法总结银行家算法是一种经典的避免死锁的算法,在操作系统中得到了广泛的应用。
本文将对银行家算法进行总结,介绍其原理和应用。
## 1. 银行家算法简介银行家算法是一种资源分配和安全性检查的算法,用于避免在多个进程竞争有限资源时产生死锁。
它通过预先分配资源,检查每个进程请求资源后是否会导致系统进入不安全状态,从而避免死锁的发生。
## 2. 银行家算法原理银行家算法基于以下前提条件和原理:- 每个进程对资源的最大需求量是固定的,并在程序开始时规定。
- 系统中的资源被分为多类,每类资源的数目也是固定的。
- 每个进程在请求资源时需要指定所需资源的数量。
- 当进程请求资源时,系统会先检查此次请求是否安全,如果安全则分配资源,否则将此次请求置于等待状态。
银行家算法的原理可以归纳为以下几个步骤:1. 初始化阶段:系统初始化可分配资源和进程的最大需求量,并记录当前已分配资源和已请求资源的情况。
2. 请求资源阶段:当进程请求资源时,系统首先判断此次请求是否会导致系统进入不安全状态。
3. 安全检查阶段:系统通过安全性检查算法,判断当前系统状态下是否有足够的资源分配给进程,避免产生死锁。
4. 分配资源阶段:如果系统通过安全检查,则分配资源给进程,并将进程从等待状态转换为运行状态。
5. 进程释放资源:当进程完成任务后,释放已分配的资源。
6. 终止进程阶段:在释放资源后,检查是否有其他进程的请求可以被满足,如果满足则继续分配资源。
## 3. 银行家算法应用场景银行家算法主要应用于多进程共享有限资源的场景,如操作系统、数据库管理系统等。
以下是一些常见的应用场景:1. 操作系统资源管理:在多任务操作系统中,为了确保资源的高效利用,避免死锁的发生,可以使用银行家算法进行资源分配和调度。
2. 分布式系统:在分布式系统中,各个节点之间可能存在资源争用的情况。
使用银行家算法可以保证资源的分配和调度是安全的,避免死锁和资源竞争。
3. 并发编程:在并发编程中,多个线程可能会竞争同一资源。
银行家算法(Banker's Algorithm)是一种用于避免死锁的资源分配算法,最初由Edsger Dijkstra 提出。
这个算法主要用于多道程序设计和并发系统,确保在分配资源时不会导致系统陷入不可解的等待环路。
在 Excel 中并没有直接提供银行家算法的实现,因为 Excel 不是一个操作系统。
然而,可以通过 Excel 的一些函数和公式来模拟这个算法的基本原理。
以下是一个简单的例子,演示如何使用 Excel 实现银行家算法的一部分。
假设有三种资源(A、B、C)和三个进程(P1、P2、P3)。
每个进程需要的资源如下:进程需要资源A 需要资源B 需要资源CP1 7 5 3P2 3 2 2P3 9 0 2现在,我们有一定数量的可用资源:可用资源资源A 资源B 资源C3 3 2我们可以使用 Excel 的一些函数来检查是否可以安全地分配资源,以避免死锁。
以下是一种可能的实现方法:1.使用 SUM 函数计算每个进程已分配的资源总和:这个公式计算了进程P1已分配的资源总和,B2:D2分别代表资源A、B、C 已分配的数量。
2.使用 SUM 函数计算每个资源的已分配总和:这个公式计算了资源A已分配的总和,B2:B4分别代表进程P1、P2、P3已分配的数量。
3.使用减法计算每个资源的可用数量:这个公式计算了资源A的可用数量,E2是资源A总数,F2是资源A已分配的总和。
4.使用 IF 函数检查是否满足银行家算法的条件:这个公式检查资源A是否足够分配给进程P4。
如果结果是"Safe",则说明可以安全分配;如果是"Unsafe",则说明分配这个资源会导致死锁。
这只是一个简单的演示,实际上,银行家算法涉及到更复杂的资源分配和回收机制。
在实际应用中,可能需要更多的列和更多的公式来模拟整个资源分配的过程。
c语言银行家算法在C语言中实现银行家算法,首先需要了解该算法的基本概念和原理。
银行家算法是一种避免死锁的资源分配算法,它模拟了银行贷款的过程。
当一个进程请求资源时,系统先检查分配后是否安全,如果是,则分配资源。
否则,进程必须等待,直到足够的资源可用。
以下是一个简单的银行家算法的C语言实现:```c#include <stdio.h>#define MaxProcs 5#define MaxResources 3int Allocation[MaxProcs][MaxResources] = {0};int Max[MaxProcs][MaxResources] = {0};int Allocation[MaxProcs][MaxResources] = {0};int Available[MaxResources] = {0};int Need[MaxProcs][MaxResources] = {0};int Work[MaxResources] = {0};int safeSeq[MaxProcs] = {0};int count = 0;void calcNeed() {for (int p = 0; p < MaxProcs; p++) {for (int r = 0; r < MaxResources; r++) {Need[p][r] = Max[p][r] - Allocation[p][r];}}}void checkSafe() {int finish[MaxProcs] = {0};int k, j;for (k = 0; k < MaxProcs; k++) {safeSeq[k] = -1;}while (count < MaxProcs) {for (k = 0; k < MaxProcs; k++) {if (finish[k] == 0) {for (j = 0; j < MaxResources; j++) {if (Need[k][j] > Work[j]) {break;}}if (j == MaxResources) {for (j = 0; j < MaxResources; j++) {Work[j] += Allocation[k][j];safeSeq[count++] = k;finish[k] = 1;}}}}}if (count == MaxProcs) {printf("系统是安全的\n");} else {printf("系统是不安全的\n");}}```。
银行家算法的资源利用率银行家算法是一种广泛应用于操作系统中进程调度的算法。
该算法主要用于确保系统内所有进程在资源分配中不会发生死锁现象。
银行家算法的主要特点是根据可用资源量来分配资源,以确保系统内所有进程都能得到所需的资源。
银行家算法的资源利用率非常高,因为它可以在分配资源时进行有效的管理。
当进程请求额外资源时,该算法会先检查是否有足够的资源可供分配。
如果没有足够的资源,则该算法会将该请求挂起,直到有足够的资源可供分配给该进程。
这意味着系统内所有进程都得到了所需的资源,并且没有任何资源浪费。
此外,银行家算法还可以有效地避免死锁现象的发生。
在进行资源分配时,该算法会检查系统内的资源分配情况,以确定是否有足够的资源可供分配给请求资源的进程。
如果没有足够的资源,该算法会等待其他进程释放资源,然后再进行分配。
这样可以有效地避免资源浪费和死锁现象的发生,从而提高资源利用率。
银行家算法还可以避免资源争夺的问题。
在多用户环境中,可能会有多个进程同时请求同一资源。
如果没有一定的控制机制,这些进程可能会在资源分配方面产生争夺。
银行家算法可以有效地解决这个问题。
该算法会先检查可用资源量,然后为每个进程分配所需的资源,以避免任何资源争夺的情况。
总之,银行家算法是一种非常高效和可靠的资源分配算法。
它可以有效地管理可用资源量,并确保系统内所有进程都得到所需的资源,同时避免资源浪费和死锁现象的发生。
通过使用银行家算法,系统可以实现高效的资源利用率,从而提高系统的整体性能和稳定性。
操作系统实验报告课题:银行家算法专业:班级:学号:姓名:年月日目录一实验目的……………………………………………………错误!未定义书签。
二实验容 (3)三问题描述 (3)四设计思路 (4)五详细设计 (5)六运行结果 (10)七心得体会 (16)八参考文献 (17)附源程序 (17)一、实验目的模拟实现银行家算法,用银行家算法实现资源分配。
1.加深了解有关资源申请、避免死锁等概念。
2.体会和了解死锁和避免死锁的具体实施方法。
3、输入:1.系统中各类资源表2.每个进程需要各类资源总数系统分配给各个进程各类资源数4、输出:1.判断T0时刻的安全性2.如果系统是安全的,任意给出某个进程的一个资源请求方式并判断系统能否接受此请求,如果可以接受,其输出全部安全序列,反之,不予分配。
二、实验容1.设计进程对各类资源最大申请表示及初值的确定。
2.设定系统提供资源的初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其资源申请是否得到满足。
5.显示资源申请和分配时的变化情况。
三、问题描述银行家算法.顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
在死锁的避免中,银行家算法把系统状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,便可以避免发生死锁。
所谓安全状态,是指系统能按某种顺序为每个进程分配所需资源,直到最大需求,使每一个进程都可以顺利完成,即可找到一个安全资源分配序列。
模拟实现这个工作过程。
四、设计思路我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
java银行家算法代码实现=================一、算法简介------银行家算法是一种用于避免系统发生死锁的算法,它通过分析系统资源分配情况,判断系统是否处于安全状态,从而避免死锁的发生。
Java银行家算法是一种基于Java语言的实现,它通过模拟系统资源分配情况,判断系统是否处于安全状态。
二、算法实现------以下是一个简单的Java银行家算法代码实现:```javapublicclassBankerAlgorithm{//资源数量和最大需求量privateint[]resource=newint[10];//例如:包括x,y,z三种资源,分别对应i-x1-x2-z...-xi-yi-zi...privateint[]maxDemand=newint[10];privateint[]available=newint[10];//当前可用资源数量privateint[]allocation=newint[10];//当前已分配资源数量privateint[]need=newint[10];//当前进程需求量privateint[]saved=newint[10];//已保存的安全序列中最后一个进程的资源需求量privateint[]process=newint[5];//进程集合,包括进程编号和进程所需资源量privateint[]processMax=newint[5];//进程最大需求量集合privateint[]systemSafe=0;//系统是否处于安全状态的标志位privateinttotalSystemSafe=0;//总共是否有足够资源可以安全运行的标志位//初始化资源分配信息publicvoidinitialize(int[][]allocationMatrix){for(inti=0;i<allocationMatrix.length;i++){process[i]=allocationMatrix[i][0];//进程编号processMax[i]=allocationMatrix[i][1];//进程最大需求量available[i]=allocationMatrix[i][2];//当前可用资源数量need[i]=allocationMatrix[i][3];//当前进程需求量maxDemand[i]=allocationMatrix[i][4];//当前进程最大需求量}systemSafe=true;//系统默认处于安全状态totalSystemSafe=true;//总共是否有足够资源可以安全运行的标志位默认设置为true}//检查系统是否处于安全状态,并返回检查结果和可能的执行序列(从开始到结束)publicboolean[]checkAndPrintSafePath(){intcurrentSystemSafe=false;//检查后的系统是否处于安全状态的标志位boolean[]safePath=newboolean[process.length];//安全序列for(inti=0;i<process.length;i++){if(need[i]<=available[i]){//如果当前进程需要的资源小于等于当前可用资源数量,则可以继续执行下去safePath[i]=true;//将当前进程标记为已执行过,并加入到安全序列中available[i]-=need[i];//将当前可用资源数量减去当前进程的已分配量,表示系统多出来的资源数量为已分配的减去需求的currentSystemSafe=true;//将当前系统的安全状态标记为true,因为已经有至少一个进程能够执行下去了}else{//如果当前进程需要的资源大于当前可用资源数量,则需要检查系统是否有足够的资源可以继续执行下去intavailableSum=0;//系统剩余的可用资源数量之和for(intj=0;j<process.length;j++){//将所有可用资源的数量累加起来availableSum+=available[j];}if(availableSum>=processMax[i]){//如果系统剩余的可用资源数量之和大于等于当前进程的最大需求量,则系统可以继续执行下去,否则需要重新分配资源并返回结果重新开始执行安全序列为null;如果为空说明不满足要求否则输出一个安全的执行序列,开始输出可执行的进程数以及所分配的资源和后续的系统安全状态标记等信息totalSystemSafe=false;//将当前系统安全状态的标志位置为false,因为此时不满足安全状态的要求,需要重新开始执行程序,且此次循环的完整性和执行性需要考虑已经完成过的安全序列重新考虑这些因素的修改可能会被重用)确保安全性序列不再更改);再次输出完整的信息需要重新考虑这些因素以确保安全性序列不再更改)并返回结果;如果为true则说明系统已经处于安全状态并输出一个安全的执行序列;如果为false则说明。
银行家算法资源分配银行家算法--多资源1、银行家算法-- 死锁的避免(系统安全状态、银行家算法)例题:假设某系统中有4类资源(R1、R2、R3、R4),每一种资源的可用量为(10,5,7),在某个时刻系统中共有5个进程,进程P1,P2,P3,P4,P5的最大资源需求数向量和此时已经分配到的资源数向量分别如表所示:系统中当前可用资源向量为(3,3,2),问:(1)、当前系统是否安全根据当前资源分配情况,可通过Safe()检测安全性,得到安全序列:(2)、进程P1发出请求向量Request1(2,0,4),系统能否将资源分配给它?步骤:Request1(2,0,4)> Need1(7,4,3),所请求的资源量超过了资源的缺口数量。
系统是不能许可的——出错返回。
(3)、如果进程P3发出请求向量Request3(4,0,0),系统能否将资源分配给它?步骤:①Request3(4,0,0)②Request3(4,0,0)> Available(3,3,2),当前可用资源不能满足它的需求,推迟此次分配并阻塞该进程。
(4)、如果此刻进程P2发出请求向量Request2(1,0,2),系统能否将资源分配给它?步骤:①Request2(1,0,2)Allocation 2 = (3,0,2) Need2 = (0,2,0)Available = (2,3,0) { P2,P4,P5,P3,P1 }系统的资源分配与占有情况如下表:资源分牌(试探性分配情况)④调用安全算法Safe()对该状态进行安全检测,系统仍然是安全的。
系统支持本次试探性分配。
(5)、如果又有进程P5发出请求向量Request5(2,2,0),系统能否将资源分配给它?步骤:①Request5(2,2,0)Allocation5 = (2,2,2) Need5 = (2,1,1)Available = (0,1,0)④调用安全算法Safe()对该状态进行安全检测,系统找不到一个安全序列。
银行家算法的资源利用率分析银行家算法(Banker's Algorithm)是一种资源分配算法,用于确保在多个进程同时请求资源时,系统能够避免死锁的发生。
它通过预先判断进程所需的资源是否能够被满足,来决定是否能够分配资源给该进程。
本文将深入探讨银行家算法的资源利用率分析,并分享对该算法的见解。
1. 算法背景及原理解析银行家算法最早由E. W. Dijkstra在1965年提出,它针对系统资源的请求和释放情况进行管理,以避免出现死锁。
在实际应用中,操作系统通过使用银行家算法来分配进程所需的资源,从而保证系统的稳定性和安全性。
银行家算法的基本原理是基于资源的安全性来进行资源的分配。
它通过判断系统是否处于安全状态,即是否存在一种资源分配的序列,使得所有进程都能够完成并释放资源,而不会发生死锁。
2. 资源利用率的分析银行家算法的目标之一是实现资源的高效利用。
通过对资源的分配和释放进行控制,可以使系统的资源利用率达到最佳状态。
资源利用率的分析可以从以下几个方面来进行:2.1 资源分配策略银行家算法采用的资源分配策略是基于安全性和资源的可用性。
系统在分配资源时需要检查分配给某个进程后是否仍然能够保持安全状态,如果安全则允许分配,否则需要等待。
这样可以保证资源的合理利用,避免出现死锁和资源浪费的情况。
2.2 资源释放机制当进程完成任务后,银行家算法需要及时释放已占用的资源,以便其他进程能够继续使用。
资源释放的及时性可以提高资源的利用率,并且避免资源被长时间占用而导致其他进程无法执行的情况。
2.3 资源回收与再利用银行家算法还可以通过回收已释放的资源,并将其重新分配给其他进程,以提高资源的再利用率。
这样可以减少资源的浪费,使得系统资源得到更加充分地利用。
3. 观点与理解银行家算法在资源管理和分配方面具有重要的意义。
它通过合理分配和利用系统资源,确保系统的稳定性和安全性,避免了死锁的发生。
这对于大规模的多用户系统尤为重要,能够有效提高系统性能和资源利用率。
《操作系统》实验报告实验二银行家算法实现资源分配一、实验目的:在了解和掌握银行家算法的基础上,能熟练的处理课本例题中所给状态的安全性问题。
能编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。
二、实验内容:、用银行家算法判断系统能否将资源分配给它;(2)若进程P3提出请求Request(1,1,2),用银行家算法程序验证系统能否将资源分配给它。
三、实验要求:本实验要求用高级语言编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
四、实验步骤:数据结构:1.可利用资源向量Available2.最大需求矩阵Max3.分配矩阵Allocation4.需求矩阵Need功能介绍:模拟实现Dijkstra的银行家算法以避免死锁的出现.分两部分组成:第一部分:银行家算法(扫描)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;转24. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!五.程序清单:编写代码如下:#include <iostream.h>#include <iomanip.h>#define M 5 /*M个进程,N个资源*/#define N 3int AVAILABLE[N]; /*可用资源数组*/int MAX[M][N]; /*最大需求矩阵*/int ALLOCATION[M][N]; /*分配矩阵*/int NEED[M][N]; /*需求矩阵*/int REQUEST[M][N]; /*进程需要资源数*/bool FINISH[M]; /*系统是否有足够的资源分配*/int p[M]; /*记录序列*/void Init();bool Safe();void Banker();void Output();void main(){Init();Safe();Banker();}void Init() /*初始化算法*/{int i,j;cout<<"请输入每个进程最多所需的各资源数,按照"<<M<<"x"<<N<<"矩阵输入:"<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++)cin>>MAX[i][j];cout<<"请输入每个进程已分配的各资源数,按照"<<M<<"x"<<N<<"矩阵输入:"<<endl;for(i=0;i<M;i++){for(j=0;j<N;j++){cin>>ALLOCATION[i][j];NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];if(NEED[i][j]<0){cout<<"您输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:"<<endl;j--;continue;}}}cout<<"请输入各个资源现有的数目:"<<endl;for(i=0;i<N;i++){cin>>AVAILABLE[i];}}void Banker() /*银行家算法*/{int i,pneed;char flag;while(1){cout<<"请输入要申请资源的进程号(注:第1个进程号为0,依次类推)"<<endl;cin>>pneed;cout<<"请输入进程所请求的各资源的数量"<<endl;for(i=0;i<N;i++){cin>>REQUEST[pneed][i];}for(i=0;i<N;i++){if(REQUEST[pneed][i]>NEED[pneed][i]){cout<<"您输入的对"<<i<<"进程的请求数超过进程的需求量!请重新输入!"<<endl;continue;}if(REQUEST[pneed][i]>AVAILABLE[i]){cout<<"您输入的对"<<i<<"进程的请求数超过系统有的资源数!请重新输入!"<<endl;continue;}}for(i=0;i<N;i++){AVAILABLE[i]-=REQUEST[pneed][i];ALLOCATION[pneed][i]+=REQUEST[pneed][i];NEED[pneed][i]-=REQUEST[pneed][i];}if(Safe()){cout<<"同意分配请求!"<<endl;}else{cout<<"您的请求被拒绝!"<<endl;for(i=0;i<N;i++){AVAILABLE[i]+=REQUEST[pneed][i];ALLOCATION[pneed][i]-=REQUEST[pneed][i];NEED[pneed][i]+=REQUEST[pneed][i];}}for(i=0;i<M;i++){FINISH[i]=false;}cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<<endl;cin>>flag;if(flag=='y'||flag=='Y'){continue;}break;}}void Output() /*输出*/{int i,j;cout<<"资源分配表:"<<endl<<"进程名 Max Allocation Need Available"<<endl;for (i=0;i<M;i++){cout<<"P"<<i<<": ";for (j=0;j<N;j++)cout<<setw(2)<<MAX[i][j]<<" ";cout<<" ";for (j=0;j<N;j++)cout<<setw(2)<<ALLOCATION[i][j]<<" ";cout<<" ";for (j=0;j<N;j++)cout<<setw(2)<<NEED[i][j]<<" ";cout<<" ";if(i==0)for (j=0;j<N;j++)cout<<setw(2)<<AVAILABLE[j]<<" ";cout<<endl;}}bool Safe() /*安全性算法*/{int i,j,k,l=0;int Work[N]; /*工作数组*/for(i=0;i<N;i++)Work[i]=AVAILABLE[i];for(i=0;i<M;i++){FINISH[i]=false;}cout<<"安全性:"<<endl<<"进程名 Work Need Allocation W+A Finish"<<endl;for(i=0;i<M;i++){if(FINISH[i]==true){continue;}else{for(j=0;j<N;j++){if(NEED[i][j]>Work[j]){break;}}if(j==N){FINISH[i]=true;cout<<"P"<<i<<": ";for (int z=0;z<N;z++)cout<<setw(2)<<Work[z]<<" ";cout<<" ";for (z=0;z<N;z++)cout<<setw(2)<<NEED[i][z]<<" ";cout<<" ";for (z=0;z<N;z++)cout<<setw(2)<<ALLOCATION[i][z]<<" ";cout<<" ";for(k=0;k<N;k++){Work[k]+=ALLOCATION[i][k];}for (z=0;z<N;z++)cout<<setw(2)<<Work[z]<<" ";cout<<" true"<<endl;p[l++]=i;i=-1;}else{continue;}}if(l==M){cout<<"系统是安全的!"<<endl; cout<<"安全序列:"<<endl;for(i=0;i<l;i++){cout<<p[i];if(i!=l-1){cout<<"->";}}cout<<""<<endl;Output();return true;}}cout<<"系统是不安全的!"<<endl;Output();return false;}六.实验结果分析:七.总结通过本次试验熟练地掌握了利用高级语言C语言编写和调试一个动态分配资源的简单程序,实现了避免死锁的银行家算法。