银行家死锁避免算法模拟
银行家算法-- 多资源
1、银行家算法--死锁的避免(系统安全状态、银行家算法)例题:假设某系统中有4类资源(R1、R2、R3、R4),每一种资源的可用量为(10,5,7),在某个时刻系统中共有5个进程,进程P1,P2,P3,P4,P5的最大资源需求数向量和此时已经分配到的资源数向量分别如表所示:系统中当前可用资源向量为(3,3,2),问:(1)、当前系统是否安全根据当前资源分配情况,可通过Safe()检测安全性,得到安全序列:{ P2,P4,P5,P3,P1 }(2)、进程P1发出请求向量Request1(2,0,4),系统能否将资源分配给它?步骤:Request1(2,0,4)> Need1(7,4,3),所请求的资源量超过了资源的缺口数量。
系统是不能许可的——出错返回。
(3)、如果进程P3发出请求向量Request3(4,0,0),系统能否将资源分配给它?步骤:①Request3(4,0,0)<= Need3(6,0,0),所请求的资源量是许可的。
②Request3(4,0,0)> Available(3,3,2),当前可用资源不能满足它的需求,推迟此次分配并阻塞该进程。
(4)、如果此刻进程P2发出请求向量Request2(1,0,2),系统能否将资源分配给它?步骤:①Request2(1,0,2)<= Need2(1,2,2),所请求的资源量是许可的。
②Request2(1,0,2)<= Available(3,3,2),当前可用资源能满足它的需求。
③将资源试探性地分配给进程P2,使得:Allocation 2 = (3,0,2)Need2 = (0,2,0)Available = (2,3,0)系统的资源分配与占有情况如下表:资源分牌(试探性分配情况)④调用安全算法Safe()对该状态进行安全检测,系统仍然是安全的。
系统支持本次试探性分配。
(5)、如果又有进程P5发出请求向量Request5(2,2,0),系统能否将资源分配给它?步骤:①Request5(2,2,0)<= Need5(4,3,1),所请求的资源量是许可的。
银行家算法典型例题
银行家算法典型例题银行家算法是一种死锁避免策略,适用于系统中有多个进程和多种资源的情况。
在该算法中,每个进程需要预先声明其最大资源需求和当前已经分配的资源数量,同时系统也需要知道每种资源的总数量和已经分配的数量。
通过比较每个进程的资源需求和系统当前可用资源数量,可以判断系统是否处于安全状态,以及是否能够分配资源给某个进程。
在本例中,系统中有3种资源A、B、C,分别有10、5、7个。
同时有5个进程P0至P4,它们的最大资源需求和已分配资源情况如下表所示。
在T0时刻,系统状态如表所示。
根据银行家算法,我们可以回答以下问题:1) 在T0时刻,系统处于安全状态,安全序列为P1、P3、P4、P2、P0.2) 若进程P1在T0时刻发出资源请求Request(1,0,2),则可以实施资源分配。
因为该请求的资源需求小于进程P1的最大需求,且系统当前可用资源数量足够满足该请求。
3) 在P1请求资源之后,若进程P4发出资源请求Request(3,3,0),则无法实施资源分配。
因为该请求的资源需求大于进程P4的最大需求,且系统当前可用资源数量不足以满足该请求。
因此,P4需要等待其他进程释放资源后再尝试请求。
4) 在P1请求资源之后,若进程P0发出资源请求Request(0,2,0),则可以实施资源分配。
因为该请求的资源需求小于进程P0的最大需求,且系统当前可用资源数量足够满足该请求。
Process n Need AvailableP0 0 3 20 0 1 21 6 2 2P1 1 0 01 7 5 0P2 1 2 2 3 5 6P3 3 3 20 6 5 2P4 0 1 40 6 5 6n: (1) Is the system in a safe state。
(2) If process P2 requests (1,2,2,2)。
can the system allocate the resources to it?Answer: (1) Using the safety algorithm。
银行家算法iebo.pptx
12
Allocation
CNhaepetedr 3 处理机调度与死锁
P0
010
743
P1
200
122
P2
302
600
P3
211
011
P4
002
431
Work P1 3 3 2 P3 5 3 2 P0 7 4 3
Need 122 011 743
Allocation Work+Allocation Finish
100 012 300 010 210
Available r1 r2 r3
120
26
练习
试问: 1) 该状态是否安全? 2) 如果进程P2提出请求Request(0,1,0),系统
能否将资源分配给它? 3) 如果系统立即满足P2的上述请求,则系统是否
立即进入死锁状态?
27
Need 122 011 743 600
Allocation Work+Allocation Finish
2 0 0 5 3 2 true
2 1 1 7 4 3 true
010 302
7 5 3 true 10 5 5 true
14
Allocation
CNhaepetedr 3 处理机调度与死锁
P0
19
银行家算法实例
④ 执行安全性算法: a. Work :=Available=(2, 3, 0); Finish[ i ]:=false;
b. 在进程集合中找到 Need1=(0, 2, 0) ≤Work;
c. 则设 P1可顺利执行完成,从而有: Work :=Work+Allocation1 =(2, 3, 0)+(3, 0, 2)=(5, 3, 2) Finish[ 1 ]:=true
excel 银行家算法
银行家算法(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",则说明分配这个资源会导致死锁。
这只是一个简单的演示,实际上,银行家算法涉及到更复杂的资源分配和回收机制。
在实际应用中,可能需要更多的列和更多的公式来模拟整个资源分配的过程。
利用银行家算法避免死锁
12
利用银行家算法避免死锁
(3)安全性算法 安全性算法执行步骤如下: ⅰ. 初始化设置工作向量Work[m]表示 系统可提供的各类资源数目,用以保 护原数据结构有关值。Work = Available,设置完成标志向量 Finish[n]。Finish[i] = false 表示i进程 尚末完成,如值为true则表示进程i已 完成。 ⅱ.从进程集合n中找到一个能满足下述 二个条件: Finish[i] = false和 Necdi≤Work,如找到则执行步骤ⅲ, 如找不到同时满足以上二条件的进程 则执行步骤ⅳ。
3
死锁的预防(Deadlock Prevention)
预防死锁的方法是破坏四个产生死锁的必要条件之一。 破坏互斥条件
互斥使用是资源本身特征所决定的。使用硬软件结合 可改变资源本身特性,例如采用SPOOLing技术可将“ 独享” 打印机改变为“共享”的打印机。
破坏不可抢占条件
如果一个进程的申请没有实现,它要释放所有占 有的资源 破坏请求和保持条件
7 5
3 0 2 7 2 1 1
0 0 2
6 0 0
0 1 1 4 3 1
⑤ 7 5
② 5 3 2 ③ 7 4 3 7 7
The system is in a safe state since the sequence 16
(2) P1 Request (1,0,2)
检查Request1(1,0,2)≤Need1(1,2,2), (that is
13
利用银行家算法避免死锁-4
当进程Pi获得资源后可顺利执行直到完 成,并释放出分配给它的资源,表示如下:
ⅲ.
work = work+Allocationi ; Finish[i]=true ;转 执行步骤 ⅱ 。
操作系统实验报告实验二银行家算法
江南大学理学院实验报告课程名称:计算机操作系统实验名称:银行家算法实验日期:2013.11.29 班级:信计1103 姓名:陈鹭学号:1301110301实验报告要求:1.实验目的 2.实验内容与要求 3.流程图与模块调用 4.实验分析5.运行情况6.实验体会1.实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。
本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。
2.实验内容与要求内容:银行家算法流程安全算法流程要求:设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。
系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;3.流程图与模块调用数据结构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。
Allocation 表示进程i的分配向量,有矩阵Allocation的第i行构成。
i4.需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。
如果Need (i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。
c语言银行家算法
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");}}```。
银行家算法的模拟实现
{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记录每个进程是否安全
java银行家算法代码实现
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.目的和要求本实验的目的是通过银行家算法模拟设计,了解死锁避免的基本原理,掌握安全状态和银行家算法算法。
2.实验内容用高级语言实现银行家算法,避免系统中的进程陷入死锁状态。
3.实验环境4.实验提示4.1 银行家算法在实施资源分配之前,先计算该次分配后所产生的状态是否安全,即是否存在一种顺序,使得所有的进程都能执行结束。
若安全则分配,否则拒绝分配。
Ps:安全状态:指系统能按照某种顺序如<P1,P2,…Pn>(称其为安全序列),来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。
若不存在这样的一个安全序列,则称系统处于不安全状态。
○1银行算法中的数据结构:1.可利用资源向量Available:是一个含有m个元素的数组,其中每个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类资源全部可用资源数目。
2.最大需求矩阵Max:是一个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]○2安全性算法:1.设置两个向量:1)工作向量Work。
表示系统可供给进程继续运行所需要的各类资源数目。
2)Finish。
表示系统是否有足够的资源分配给进程。
2.从进程集合中找到一个能满足下述条件的进程:Finish[i]=false; Need i<=Work;如找到,执行步骤3;否则,执行步骤4。
3.当进程P i获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work=Work+Allocation;Finish[i]=true ;go to step 2;4.如果所有进程P i的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、央供编写战调试一个系统动背调配资材的简朴模拟步调,瞅察死锁爆收的条件,并采与银止家算法,灵验的预防战预防死锁的爆收.二、真验真质:用银止家算法真止资材调配:安排五个进程{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.(2)从进程集中中找到一个能谦脚下述条件的进程:①Finish[i]=false②Need<or=Work如找到,真止步调(3);可则,真止步调(4).(3)当进程P赢得资材后,可成功真止,曲至完毕,并释搁出调配给它的资材,故应真止:Work=Work+Allocation;Finish[i]=true;转背步调(2).(4)如果所有进程的Finish[i]=true,则表示系统处于仄安状态;可则,系统处于没有服安状态.4、过程图:系统主要历程过程图银止家算法过程图仄安性算法过程图5、主要数据结构假设有M个进程N类资材,则犹如下数据结构:int max[M*N] M个进程对于N类资材的最大需要量int available[N] 系统可用资材数int allocated[M*N] M个进程已经得到N类资材的资材量int need[M*N] M个进程还需要N类资材的资材量int worked[] 系统提供给进程继承运止所需的百般资材数目四、源代码import java.awt.*;import javax.swing.*;import java.util.*;import java.awt.event.*;import javax.swing.border.*;public class OsBanker extends JFrame { // 界里安排JLabel labelInfo;JLabel labelInfo1;int resourceNum, processNum;int count = 0;JButton buttonRequest, buttonSetInit, button, button1, buttonsearch,button2;JTextField tf1, tf2;JTextField[] textAvailable;JTextField[][] textAllocation;JTextField[][] textNeed;JTextField textProcessName;JTextField[] textRequest;int available[];int max[][];int need[][];int allocated[][];int SafeSequence[];int request[];boolean Finish[];int worked[];boolean flag = false;JFrame f1;JFrame f2;JFrame f3;JTextArea jt;void display() {Border border = BorderFactory.createLoweredBevelBorder(); Border borderTitled = BorderFactory.createTitledBorder(border, "按钮区");textAvailable = new JTextField[5];textAllocation = new JTextField[6][5];textNeed = new JTextField[6][5];textProcessName = new JTextField(""); textProcessName.setEnabled(false);textRequest = new JTextField[5];tf1 = new JTextField(20);tf2 = new JTextField(20);labelInfo = new JLabel("请先输进资材个数战进程个数(1~6),后单打决定");JPanel contentPane;contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(null);contentPane.setBackground(Color.pink);labelInfo.setBounds(50, 10, 300, 40);labelInfo.setOpaque(true);labelInfo.setForeground(Color.red);labelInfo.setBackground(Color.pink);contentPane.add(labelInfo, null);JLabel b1 = new JLabel("资材个数:");b1.setForeground(Color.blue);JLabel b2 = new JLabel("进程个数:");b2.setForeground(Color.blue);b1.setBounds(50, 80, 80, 30);contentPane.add(b1, null);tf1.setBounds(180, 80, 170, 30);contentPane.add(tf1, null);b2.setBounds(50, 150, 80, 30);contentPane.add(b2, null);tf2.setBounds(180, 150, 170, 30);contentPane.add(tf2, null);button1 = new JButton("决定");button = new JButton("沉置");button1.setBounds(80, 200, 80, 30);contentPane.add(button1, null);button.setBounds(220, 200, 80, 30);contentPane.add(button, null);this.setSize(400, 300);this.setResizable(false);this.setTitle("银止家算法(SXJ)");this.setLocationRelativeTo(null);this.setDefaultClo搜索引擎劣化peration(EXIT_ON_CLOSE); this.setVisible(true);f1 = new JFrame();labelInfo1 = new JLabel("请先输进最大需要战调配矩阵,而后单打初初化");JPanel contentPane1;contentPane1 = (JPanel) f1.getContentPane();contentPane1.setLayout(null);contentPane1.setBackground(Color.pink);labelInfo1.setOpaque(true);labelInfo1.setBounds(75, 10, 400, 40);labelInfo1.setBackground(Color.pink);labelInfo1.setForeground(Color.blue);contentPane1.add(labelInfo1, null);JLabel labelAvailableLabel = new JLabel("AllResource:"); JLabel labelNeedLabel = new JLabel("MaxNeed:");JLabel labelAllocationLabel = new JLabel("allocated:"); JLabel labelRequestLabel = new JLabel("request process:"); labelNeedLabel.setBounds(75, 90, 100, 20);// x,y,width,heightcontentPane1.add(labelNeedLabel, null); labelAllocationLabel.setBounds(75, 240, 100, 20); contentPane1.add(labelAllocationLabel, null); labelAvailableLabel.setBounds(75, 70, 100, 20); contentPane1.add(labelAvailableLabel, null); labelRequestLabel.setBounds(75, 400, 100, 20);contentPane1.add(labelRequestLabel, null);JLabel[] labelProcessLabel1 = { new JLabel("进程1"), new JLabel("进程2"),new JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") };JLabel[] labelProcessLabel2 = { new JLabel("进程1"), new JLabel("进程2"),new JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") };JPanel pPanel1 = new JPanel(), pPanel2 = new JPanel(), pPanel3 = new JPanel(), pPanel4 = new JPanel();pPanel1.setLayout(null);pPanel2.setLayout(null);/** pPanel4.setLayout(null); pPanel4.setBounds(440,120,90,270); * pPanel4.setBorder(borderTitled);*/buttonSetInit = new JButton("初初化");buttonsearch = new JButton("检测仄安性");button2 = new JButton("沉置");buttonRequest = new JButton("哀供资材");buttonSetInit.setBounds(420, 140, 100, 30);contentPane1.add(buttonSetInit, null);buttonsearch.setBounds(420, 240, 100, 30);contentPane1.add(buttonsearch, null);button2.setBounds(420, 340, 100, 30);contentPane1.add(button2, null);buttonRequest.setBounds(420, 425, 100, 30); contentPane1.add(buttonRequest, null);for (int pi = 0; pi < 6; pi++) {labelProcessLabel1[pi].setBounds(0, 0 + pi * 20, 60, 20); labelProcessLabel2[pi].setBounds(0, 0 + pi * 20, 60, 20); }pPanel1.setBounds(75, 120, 60, 120);pPanel2.setBounds(75, 270, 60, 120);for (int pi = 0; pi < 6; pi++) {pPanel1.add(labelProcessLabel1[pi], null);pPanel2.add(labelProcessLabel2[pi], null);}contentPane1.add(pPanel1);contentPane1.add(pPanel2);contentPane1.add(pPanel4);for (int si = 0; si < 5; si++)for (int pi = 0; pi < 6; pi++) {textNeed[pi][si] = new JTextField();textNeed[pi][si].setBounds(150 + si * 50, 120 + pi * 20, 50, 20); textNeed[pi][si].setEditable(false);textAllocation[pi][si] = new JTextField();textAllocation[pi][si].setBounds(150 + si * 50, 270 + pi * 20, 50, 20);textAllocation[pi][si].setEditable(false);}for (int si = 0; si < 5; si++) {textAvailable[si] = new JTextField();textAvailable[si].setEditable(false);textAvailable[si].setBounds(150 + si * 50, 70, 50, 20); textRequest[si] = new JTextField();textRequest[si].setEditable(false);textRequest[si].setBounds(150 + si * 50, 430, 50, 20); contentPane1.add(textAvailable[si], null);contentPane1.add(textRequest[si], null);}for (int pi = 0; pi < 6; pi++)for (int si = 0; si < 5; si++) {contentPane1.add(textNeed[pi][si], null);contentPane1.add(textAllocation[pi][si], null);}textProcessName.setBounds(80, 430, 50, 20); contentPane1.add(textProcessName, null);f1.setSize(550, 500);f1.setResizable(false);f1.setTitle("银止家算法(SXJ)");f1.setLocationRelativeTo(null);f1.setDefaultClo搜索引擎劣化peration(EXIT_ON_CLOSE); // f1.setVisible(true);f1.setVisible(false);f2 = new JFrame("仄安序列隐现框");jt = new JTextArea(75, 40);jt.setBackground(Color.pink);jt.setForeground(Color.blue);JScrollPane scrollPane = new JScrollPane(jt); // 加滑动条scrollPane.setBorder(BorderFactory.createLoweredBevelBorder ());// 鸿沟(f2.getContentPane()).add(scrollPane);f2.setSize(450, 400);f2.setResizable(false);f2.setDefaultClo搜索引擎劣化peration(EXIT_ON_CLOSE); f2.setVisible(false);buttonSetInit.setEnabled(false);buttonRequest.setEnabled(false);buttonsearch.setEnabled(false);button1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// labelInfo.setText("请先初初化allocated战Maxneed,后单打初初化按钮");f1.setVisible(true);buttonSetInit.setEnabled(true);resourceNum = Integer.parseInt(tf1.getText());processNum = Integer.parseInt(tf2.getText());for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {textNeed[i][j].setEditable(true);textAllocation[i][j].setEditable(true);textAvailable[j].setEditable(true);}}}});buttonSetInit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {Init();buttonsearch.setEnabled(true);}buttonsearch.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {count = 0;SafeSequence = new int[processNum];worked = new int[resourceNum];Finish = new boolean[processNum];copyVector(worked, available);Safety(0);jt.append("仄安序列数量:" + count);if (flag) {labelInfo1.setText("目前系统状态:仄安");f2.setVisible(true);buttonRequest.setEnabled(true); textProcessName.setEnabled(true);for (int i = 0; i < resourceNum; i++) {textRequest[i].setEditable(true);}} else {labelInfo1.setText("目前系统状态:没有服安");}buttonSetInit.setEnabled(false);});buttonRequest.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {count = 0;for (int i = 0; i < processNum; i++) {Finish[i] = false;}jt.setText("");flag = false;RequestResource();}});button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {/** tf1.setText(""); tf2.setText("");*/f2.setVisible(false);jt.setText("");for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {textNeed[i][j].setText("");textAllocation[i][j].setText("");textAvailable[j].setText("");textRequest[j].setText("");// textNeed[i][j].setEditable(false);// textAllocation[i][j].setEditable(false);// textAvailable[j].setEditable(false);textRequest[j].setEditable(false);textProcessName.setText("");Finish[i] = false;}}flag = false;buttonsearch.setEnabled(false);// labelInfo.setText("请先输进资材个数战进程个数,后单打决定");}});button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {tf1.setText("");tf2.setText("");f2.setVisible(false);jt.setText("");flag = false;}});}void copyVector(int[] v1, int[] v2) { for (int i = 0; i < v1.length; i++)v1[i] = v2[i];}void Add(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++)v1[i] += v2[i];}void Sub(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++)v1[i] -= v2[i];}boolean Smaller(int[] v1, int[] v2) { boolean value = true;for (int i = 0; i < v1.length; i++)if (v1[i] > v2[i]) {value = false;break;}return value;}public static void main(String[] args) {OsBanker ob = new OsBanker();ob.display();// System.out.println(" "+count);}void Init() // 初初化支配矩阵{available = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {available[i] = Integer.parseInt(textAvailable[i].getText()); }max = new int[processNum][resourceNum];allocated = new int[processNum][resourceNum];need = new int[processNum][resourceNum];for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {max[i][j] = Integer.parseInt(textNeed[i][j].getText());allocated[i][j] = Integer.parseInt(textAllocation[i][j] .getText());}}for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++)need[j][i] = max[j][i] - allocated[j][i];for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++) {available[i] -= allocated[j][i];if (available[i] < 0) {labelInfo.setText("您输进的数据有误,请沉新输进"); }}}void Safety(int n) // 查找所有仄安序列{if (n == processNum) {count++;for (int i = 0; i < processNum; i++) {jt.append("进程" + (SafeSequence[i] + 1) + " ");}jt.append("\n");flag = true;return;}for (int i = 0; i < processNum; i++) { if (Finish[i] == false) {boolean OK = true;for (int j = 0; j < resourceNum; j++) { if (need[i][j] > worked[j]) {OK = false;break;}}if (OK) {for (int j = 0; j < resourceNum; j++) { worked[j] += allocated[i][j];}Finish[i] = true;SafeSequence[n] = i;Safety(n + 1);Finish[i] = false;SafeSequence[n] = -1;// num++;for (int j = 0; j < resourceNum; j++) {worked[j] -= allocated[i][j];}}}}}void RequestResource() { // 哀供资材jt.setText("");int processname = (Integer.parseInt(textProcessName.getText()) - 1);request = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {request[i] = Integer.parseInt(textRequest[i].getText());}if (!Smaller(request, need[processname])) {labelInfo.setText("资材哀供没有符该进程的需要量.");} else if (!Smaller(request, available)) {labelInfo1.setText("可用资材缺累以谦脚哀供,进程需要等待.");} else {Sub(available, request);Add(allocated[processname], request);Sub(need[processname], request);copyVector(worked, available);Safety(0);if (flag) {labelInfo1.setText("可坐时调配给该进程!");} else {labelInfo1.setText("调配后引导系统处于没有服安状态!,没有创制时调配");Add(available, request);Sub(allocated[processname], request);Add(need[processname], request);}}// }}}五、真验截止:初初界里:初初化:检测仄安性:哀供资材:(1)进程2(1,0,2)(2)进程5(3,3,0)(3)进程1(0,2,0)六、逢到的问题及缺累之处:1、步调编写的时间确定最大资材数战最大进程数均<=6.2、步调曲交初初化了6个进程框,既浪费了内存空间,又对于可视化界里的好瞅制成做用.3、已对于输进非常十分举止处理:比圆正在哀供资材的第一个圆框中只可挖进进程的数字编号,当挖进的为非整数时,步调会扔出非常十分.4、已办理进程名中对于字符串的处理,曲交牢固进程名为数字,用户没有克没有及曲交输进本有的进程名,制成短佳的用户感受.。
银行家算法例题具体步骤
银行家算法例题具体步骤
银行家算法是一种避免死锁的著名算法,主要应用于避免操作系统中的死锁问题。
以下是使用银行家算法解决死锁问题的一个具体例子:假设系统中有三种类型的资源(A、B、C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量为19。
首先,我们需要确定各进程对各类资源的最大需求量。
在这个例子中,我们已经知道P1需要(0、0、6),P2需要(1、0、0),P3需要(0、1、2),P4需要(3、4、7),P5需要(0、3、5)。
然后,我们需要计算每个进程已分配的资源向量和当前资源剩余向量。
这些向量通常可以通过系统当前的资源分配情况进行计算。
接下来,我们需要判断系统当前是否处于安全状态。
如果系统处于安全状态,则意味着系统能够满足所有进程的请求而不会发生死锁。
否则,系统处于不安全状态,需要采取措施避免死锁的发生。
具体来说,我们可以使用银行家算法来计算安全序列。
安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
在这个例子中,存在一个安全序列:P1-P3-P2-P4-P5。
这意味着按照这个序列执行进程是安全的,不会发生死锁。
如果系统处于不安全状态,则需要重新调整资源分配或者采取其他措施来避免死锁的发生。
需要注意的是,银行家算法是一种理论上的算法,实际应用中还需要
考虑其他因素,比如资源的动态分配和请求的实时性等。
因此,在实际应用中需要根据具体情况进行调整和改进。
《死锁避免》实验报告
一、实验目的本次实验旨在通过模拟操作系统的资源分配和请求过程,深入理解死锁的概念、产生死锁的必要条件以及如何通过银行家算法来避免死锁的发生。
通过实验,学生能够掌握以下知识点: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. 分析实验结果,验证银行家算法是否能够避免死锁的发生。
死锁避免与银行家算法
一、【实验目的】1.理解并掌握死锁有关概念;2.理解并掌握银行家算法;3.掌握进程安全性检查的方法及资源分配的方法。
二、【实验任务】任务描述:编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
某系统有A、B、C、D四类资源共5个进程(P0、P1、P2、P3、P4)共享,各进程对现在系统中A、B、C、D四类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:①现在系统是否处于安全状态?②如果现在进程P1提出资源请求(0、4、2、0),系统能否满足它的请求?任务梳理:1.死锁:在操作系统中,“死锁”用于描述资源分配时,进程互相抢占资源,又因为需求的资源被别的进程抢占,只好互相等待,以至于等待循环中的所有进程均无法正常运行的情况。
死锁形成需要四个条件,这四个条件缺少一个,就不会形成死锁。
死锁的四个条件:1)互斥条件即对于某资源在一段时间内仅允许一个进程占有使用。
2)占有且等待条件/请求和保持条件在进程已经占有一个或多个资源的情况下,若它仍申请新的资源,在等待获得新的资源时,进程仍会继续占有旧有资源,不会主动释放。
3)不可抢占条件直到占有该资源的进程使用完毕之前,其他任何进程均不应该强行抢占该资源。
4)循环等待条件若干个进程之间形成了一个等待循环。
2.安全状态若针对目前资源分配情况,系统可以找到某种次序为进程分配资源,使得所有进程能够依次运行成功,则称系统此时的分配状态是安全的,分配资源的次序称为“安全序列”。
安全状态时系统中无死锁,所以所有避免死锁的算法都尽可能地使系统进入安全状态。
值得注意的是,即使是安全状态下的系统,如果资源分配不当,仍然可以使系统变为不安全状态。
3.银行家算法1)设计思想在系统中,进程发起一项资源分配请求,由系统检查是否可以满足该分配请求,若可以,应暂时满足该请求,并查看此时系统是否仍是安全状态。
2)程序流程图可以分为三个功能模块,第一个模块检查需求是否可以被满足,第二个模块检查系统是否安全,第三个模块是主程序,通过调用前两个模块实现资源分配或请求驳回。
实验二银行家算法
实验二银行家算法一、目的:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效地防止和避免死锁的发生。
二、内容:银行家算法是避免死锁的一种重要方法,本实验要求编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
三、编程思想:首先分析银行家算法的数据结构,分析可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need 、进程申请资源的关系,由所学知识可知;Need[i,j]=Max[I,j]-Allocation[i,j];当进程申请资源的时候;a)Requesti>Need[i]。
这种情况表示该进程的资源需求已超过系统所宣布的最大值,出错。
b)Requesti=Need[i]。
这种情况表示该进程现在对他所需的全部资源一次申请完成。
c)Requesti〉Need[i]。
这种情况表示该进程现在对它所需资源再进行部分的申请,剩余的资源以后再次申请。
当进程pi发出资源请求后;a)如果Requesti<=Need[i],转向步骤b,否则显示为出错,因为所需的资源数超过事先要求的最大值。
b)Requesti <=Available,便转向步骤三,否则则表示尚无足够资源,pi需等待。
c)假如系统将资源分配给pi则:Available=Available-RequestiAllocation[i]=Allocation[i]+RequestiNeed[i]=Need[i]-Request安全性算法检查(1)设置向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work[]= Available[]。
Finish[],它表示系统是否有足够的资源分配给每个进程,使之运行完成。
开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。
预防进程死锁的银行家算法
实验三预防进程死锁的银行家算法一、【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
二、【实验内容】问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j 类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。
三、【实验要求】程序要求:1)判断当前状态是否安全,如果安全给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后系统是否安全。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全,输出安全的进程序列,不安全则提示信息。
实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int Available[MaxNumber];int Max[MaxNumber][MaxNumber];int Allocation[MaxNumber][MaxNumber];int Need[MaxNumber][MaxNumber];int Request[MaxNumber];int SafeOrder[MaxNumber];2)进程调度的实现过程如下:变量初始化;接收用户输入n,m,(输入或者默认的)Allocation ij,Need ij;按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;如果安全,提示用户输入下一时刻进程P k的资源请求Request(R1, … ,R m);如果不安全或者无新请求则退出。
四、【实验代码】#include<iostream>using namespace std;#define MaxNumber 100int Available[MaxNumber];//可利用资源int Max[MaxNumber][MaxNumber];//最大需求矩阵int Allocation[MaxNumber][MaxNumber];//分配矩阵int Need[MaxNumber][MaxNumber];//需求矩阵int Request[MaxNumber];//请求资源int SafeOrder[MaxNumber];//安全序列int ProcessNumber;int TypeNumber;bool Finish[MaxNumber];int Work[MaxNumber];int i,j,go=1;void init();bool bank();bool IsSafe();void init(){cout<<"请输入进程的个数:";cin>>ProcessNumber;cout<<"请输入资源种类的个数:";cin>>TypeNumber;for(i=0;i<ProcessNumber;i++){cout<<endl<<"P"<<i<<"已经分配:";for(j=0;j<TypeNumber;j++){cin>>Allocation[i][j];}cout<<"P"<<i<<"还需分配:";for(j=0;j<TypeNumber;j++){cin>>Need[i][j];Max[i][j]=Allocation[i][j]+Need[i][j];}}cout<<"请输入各类可利用资源个数:";for(j=0;j<TypeNumber;j++){cin>>Available[j];}}bool bank(){cout<<"请输入请求资源下标:";cin>>i;cout<<"P"<<i<<"请求各类资源数分别是:";for(j=0;j<TypeNumber;j++){cin>>Request[j];if(Request[j]>Need[i][j]){cout<<"请求资源超过其需要这类资源的最大值,请求失败";return false;}else if(Request[j]>Available[j]){cout<<"没有足够的资源,P"<<i<<"必须等待";return false;}}//银行家算法for(j=0;j<TypeNumber;j++){Available[j]=Available[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j];}return true;}bool IsSafe(){for(i=0;i<ProcessNumber;i++){Finish[i]=false;}for(j=0;j<TypeNumber;j++){Work[j]=Available[j];}int flag=0,k=0;//flag用来控制while循环,使得每个进程都能重新检测到while(flag!=-1){for(i=0;i<ProcessNumber;i++){flag=-1;if(Finish[i]==false){for(j=0;j<TypeNumber;j++){if(Need[i][j]>Work[j])break;}if(j==TypeNumber){for(j=0;j<TypeNumber;j++){Work[j]=Work[j]+Allocation[i][j];Finish[i]=true;}SafeOrder[k]=i;//入安全序列k++;flag=1;//再次进行进程循环break;}}}}for(i=0;i<ProcessNumber;i++){if(Finish[i]==true&&i==ProcessNumber-1){cout<<"系统处于安全状态,存在一个安全序列是:{";for(i=0;i<ProcessNumber;i++)cout<<"P"<<SafeOrder[i]<<",";cout<<"}"<<endl;return true;}else if(Finish[i]==false){cout<<"系统进入不安全状态"<<endl;return false;}}}void main(){init();if(IsSafe()){while(go==1){cout<<endl<<"是否继续为进程分配资源(Y/N): ";char a;cin>>a;if(a=='Y'||a=='y'){if(bank()){if(IsSafe())cout<<"系统处于安全状态,请求成功"<<endl;else{cout<<"请求失败"<<endl;break;}}}else if(a=='N'||a=='n'){cout<<"没有进程请求资源"<<endl;break;}}}elsecout<<"该请求不安全,没有安全序列"<<endl; }五、【实验结果】。
银行家算法例子+答案
1、设系统中有3种类型的资源(A ,B ,C )和5个进程P1、P2、P3、P4、P5,A 资源的数量为17,B 资源的数量为5,C 资源的数量为20。
在T 0时刻系统状态见下表(T 0时刻系统状态表)所示。
系统采用银行家算法实施死锁避免策略。
(12分)T 0时刻系统状态表(1)T 0时刻是否为安全状态?若是,请给出安全序列。
(2)在T 0时刻若进程P2请求资源(0,3,4),是否能实施资源分配?为什么?(3)在(2)的基础上,若进程P4请求资源(2,0,1),是否能实施资源分配?为什么?(4)在(3)的基础上,若进程P1请求资源(0,2,0),是否能实施资源分配?为什么?答:当前的系统状态描述为:⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=4245241104635955C ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=413402504204212A ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=-011122600431743A C ()20517=R()332=V(1)在T0时刻,由于V (2,3,3)大于等于(C-A )中P5所在行的向量(1,1,0),因此V 能满足P5的运行,在P5运行后,系统的状态为:⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=000402504204212A ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=-000122600431743A C ()745'=V 同样的,在P5运行后,V ’(5,4,7)也大于等于C-A 中P4所在的行(2,2,1),则能满足P4的运行。
P4运行后,系统的状态为:⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=000000504204212A ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=-000000600431743A C ()1147'=V 按照上述同样的方法,P4运行后,P3,P2,P1也能按顺序运行。
(备注:考试时需要都写出来)。
因此,在T0时刻,存在安全序列:P5、P4、P3、P2、P1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
银行家死锁避免算法模拟一.课程设计目的通过本次实验掌握银行家死锁避免算法的基本思想。
当进程提出资源申请时,能够用该算法判断是否拒绝进程请求。
二.课程设计摘要银行家算法:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
四.课程设计原理分析在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。
为保证系统中诸进程的正常运行,应事先采取必要的措施,来预防死锁。
最有代表性的避免死锁的方法,是Dijkstra的银行家算法。
死锁:死锁的产生,必须同时满足四个条件,第一个为互斥条件,即一个资源每次只能由一个进程占用;第二个为请求和保持条件,指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
银行家算法原理:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
银行家算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.算法思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。
银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
五.算法实现1.程序流程图:2.算法描述:银行家算法的设计思想是:当用户申请一组资源时,系统必须做出判断;如果把这些资源分出去,系统是否还处于安全装他。
若是,就可以分出这些资源;否则,该申请暂不能满足。
3.数据结构描述:(n表示系统中进程的数目,m表示资源的分类数。
)3.1. Available是一个长度为m的向量,它表示每类资源可用的数量。
Available [j]=k,表示rj类资源可用的数量为k。
3.2.Max是一个n×m矩阵,它表示每个进程对资源的最大需求。
Max [i,j]=k,表示进程pi至多可以申请k个rj类资源单位。
3.3. Allocation是一个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<<"*******************************************"<<endl;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,分配情况如下:进程需求总量已占资源还需数量0 8 3 51 42 22 9 4 5注:“系统不安全”表示此种情况是银行家算法也解不了的死锁。