银行家算法解题方法
- 格式:pdf
- 大小:149.03 KB
- 文档页数:8
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),所请求的资源量是许可的。
操作系统实验⼆:银⾏家算法实验⼆银⾏家算法⼀、实验⽬的1、了解什么是操作系统安全状态和不安全状态;2、了解如何避免系统死锁;3、理解银⾏家算法是⼀种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。
⼆、实验内容根据银⾏家算法的基本思想,编写和调试⼀个实现动态资源分配的模拟程序,并能够有效避免死锁的发⽣。
三、实验原理进程申请资源时,系统通过⼀定的算法判断本次申请是否不可能产⽣死锁(处于安全状态)。
若可能产⽣死锁(处于不安全状态),则暂不进⾏本次资源分配,以避免死锁。
算法有著名的银⾏家算法。
1、什么是系统的安全状态和不安全状态?所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直⾄最⼤需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。
如果不存在这样的安全序列,则称系统处于不安全状态。
2、银⾏家算法把操作系统看作是银⾏家,操作系统管理的资源相当于银⾏家管理的资⾦,进程向操作系统请求分配资源相当于⽤户向银⾏家贷款。
为保证资⾦的安全,银⾏家规定:(1) 当⼀个顾客对资⾦的最⼤需求量不超过银⾏家现有的资⾦时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最⼤需求量;(3) 当银⾏家现有的资⾦不能满⾜顾客尚需的贷款数额时,对顾客的贷款可推迟⽀付,但总能使顾客在有限的时间⾥得到贷款;(4) 当顾客得到所需的全部资⾦后,⼀定能在有限的时间⾥归还所有的资⾦。
操作系统按照银⾏家制定的规则设计的银⾏家算法为:(1)进程⾸次申请资源的分配:如果系统现存资源可以满⾜该进程的最⼤需求量,则按当前的申请量分配资源,否则推迟分配。
(2)进程在执⾏中继续申请资源的分配:若该进程已占⽤的资源与本次申请的资源之和不超过对资源的最⼤需求量,且现存资源能满⾜该进程尚需的最⼤资源量,则按当前申请量分配资源,否则推迟分配。
(3)⾄少⼀个进程能完成:在任何时刻保证⾄少有⼀个进程能得到所需的全部资源⽽执⾏到结束。
总结银行家算法的算法思想银行家算法是一种用于解决死锁问题的算法。
它是由英国计算机科学家 Edsger Dijkstra 在1965年提出的,主要用于确保分配资源时不会发生死锁,并且能够尽可能地分配资源满足进程的需求。
银行家算法的核心思想是基于银行家对贷款的管理机制。
在现实生活中,银行家在发放贷款时要求借款人提供一定的担保,以确保借款人有足够的能力偿还贷款。
同样地,银行家算法也要求系统中的进程向系统提供其对各种资源的最大需求量和当前已分配量,以确保系统能够安全地分配资源,并避免死锁的发生。
算法的步骤主要包括以下几个方面:1. 初始化:系统初始化时,银行家算法需要收集每个进程的最大需求量以及当前已分配量,并统计系统中每种资源的总数和已分配量。
2. 请求资源:当进程请求分配资源时,银行家算法会先判断系统是否有足够的资源满足进程的需求。
如果满足,则尝试分配资源给进程,并记录已分配的资源量。
如果不满足,则进程必须等待资源。
3. 检查安全性:每次资源分配后,银行家算法都会检查系统是否仍然处于安全状态。
安全状态意味着系统能够为每个进程分配资源以满足其最大需求量,并避免死锁的发生。
如果系统处于安全状态,则继续分配资源,如果不是,则进程必须等待。
4. 回收资源:当进程使用完资源后,会将已分配的资源归还给系统。
银行家算法将更新系统资源表的已分配量。
银行家算法的核心思想是基于资源的动态分配和安全性检查,以避免死锁的发生。
它能够合理分配资源,保证每个进程都能够得到自己所需的资源,同时也能够确保不会出现死锁的情况。
通过使用银行家算法,系统能够实现资源的最大利用率,提高系统的效率和可靠性。
总之,银行家算法是一种用于解决死锁问题的算法,其思想是基于银行家对贷款的管理机制。
它通过动态分配资源和安全性检查,保证每个进程能够得到所需资源,而不会导致系统死锁,从而提高系统的效率和可靠性。
银行家算法例题详解算法设计题详解算法设计的特征:有穷性,确定性,输入和输出,可行性运行算法的时间:硬件的速度。
书写程序的语言。
问题的规模,编译生成程序的代码质量算法复杂度: 时间复杂度和空间复杂度1.迭代法迭代法又称为辗转法,是用计算机解决问题的一种基本方法,为一种不断用变量的旧值递推新值的过程,与直接法相对应,一次性解决问题。
迭代法分为精确迭代和近似迭代,“二分法”和“牛顿迭代法”属于近似迭代法。
迭代法利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:1. 确定迭代变量(在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
)2. 建立迭代关系式(所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。
迭代关系式的建立是解决迭代问题的关键,通常可以顺推或倒推的方法来完成。
)3. 对迭代过程进行控制(在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。
不能让迭代过程无休止地重复执行下去。
迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。
对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
)2.穷举搜索法穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。
即本方法使用可以理解为暴力循环方法,穷举所有可能性,一般这种方法的时间效率太低,不易使用。
但是方法简单,易理解。
3.递推法递推是计算机数值计算中的一个重要算法,思路是通过数学推导,将复杂的运算化解为若干重复的简单运算,以充分发挥计算机长于重复处理的特点。
银⾏家算法在操作系统的运⾏当中,多个进程由于对于临界资源的竞争或者进程推进的顺序不对可能会产⽣死锁现象。
⼀、产⽣死锁的四个条件1、互斥条件2、保持和请求条件3、不剥夺条件4、环路等待条件⼆、处理死锁的基本⽅法1、预防死锁(不会发⽣死锁)2、避免死锁()3、监测死锁4、解除死锁(死锁已经发⽣之后的补救措施)三、预防死锁去掉产⽣死锁的后三个条件,这样死锁不会产⽣四、避免死锁死锁可能会产⽣,但是我们要去避免它。
这⾥需要介绍银⾏家算法。
1、所谓银⾏家算法是是指,系统在为进程分配资源之前,⾸先计算此次资源分配的安全性,如果是安全的,则进⾏分配;如果这次分配会导致进⼊不安全状态,不进⾏分配。
所谓的安装状态是指存在⼀个进程序列,如果按照这个顺序为各个进程分配资源,则所有的进程都能顺利运⾏完成,这是我们说系统是安全的,这个序列叫做安全序列。
2、银⾏家算具体过程这⾥⾸先是⼏个符号定义可⽤资源向量available i,i=1,2,3,...,N资源需求矩阵need j i,i=1,2,3,...,N.j=1,2,3,...,K,表⽰第j个进程对第i种资源的最多还需要多少资源,也就是系统最多还可以分给这个进程多少个资源i。
资源分配矩阵allocation j i,i=1,2,3,...,N.j=1,2,3,...,K,表⽰第j个进程⽬前所占有的第i种资源的数量。
最⼤需求矩阵max j i,i=1,2,3,...,N.j=1,2,3,...,K,表⽰第j个进程对第i种资源的最多的需要资源总量。
上⾯的矩阵有下⾯的关系allocation+need=max所以在下⾯的算法当中实际上并没有⽤到max矩阵假设现在有个进程发出了资源请求request i,i表⽰第i个进程step 1、判断request i是否⼩于need i,如果是转⼊step 2,否则,exit,因为进程在说谎step 2、判断request i是否⼩于available,如果是则进⼊step 3,否则将进程挂起,因为没有⾜够资源step 3、⾸先假设满⾜进程i的资源请求available=available−requestneed=need−requestallocation=allocation+requeststep 4、进⾏安全性监测找到⼀个进程它的need⼩于available,则表明可以⾸先运⾏这个进程,这个进程运⾏完之后,会释放资源,所以增加available。
银行家算法基本步骤银行家算法是一种用于避免死锁的算法,它可以判断系统中是否存在安全序列,从而决定是否分配资源。
本文将详细介绍银行家算法的基本步骤。
一、银行家算法概述银行家算法是由荷兰计算机科学家埃德加·迪科斯彻(Edsger Dijkstra)于1965年提出的。
它是一种避免死锁的算法,主要用于操作系统中进程管理和资源分配。
银行家算法通过计算当前系统中可用资源和各进程所需资源,来判断是否存在安全序列,从而决定是否分配资源。
二、银行家算法基本概念1. 资源:指系统中可供进程使用的资源,如内存、CPU等。
2. 进程:指正在运行的程序,在操作系统中被视为一个独立的实体。
3. 最大需求矩阵:指每个进程所需要的最大资源数量矩阵。
4. 分配矩阵:指当前已经分配给每个进程的资源数量矩阵。
5. 需求矩阵:指每个进程还需要的资源数量矩阵。
6. 可利用资源向量:指当前系统中可供使用的各类资源数量。
7. 安全序列:指一组进程的执行顺序,使得每个进程都能够获得它所需要的资源,从而顺利完成任务。
三、银行家算法基本步骤1. 初始化:在系统启动时,需要对各类资源数量进行初始化,并建立最大需求矩阵、分配矩阵和需求矩阵。
2. 请求资源:当一个进程请求资源时,需要判断该请求是否合法。
如果该请求的资源数量小于等于当前系统中可用的相应资源数量,并且加上该进程已经分配到的资源数量不超过该进程所需的最大资源数量,则该请求是合法的。
3. 分配资源:如果一个请求是合法的,则可以将相应的资源分配给该进程,并更新分配矩阵和需求矩阵。
同时,也需要更新可利用资源向量。
4. 判断安全性:在每次分配资源后,都需要判断当前系统是否存在安全序列。
具体做法是通过模拟各个进程对各类资源的请求和释放过程,来判断是否存在一组安全序列。
如果存在安全序列,则说明当前系统是安全的;否则就不能再分配资源了。
5. 回收资源:当一个进程完成任务后,需要释放已经占用的所有资源,并更新可利用资源向量、分配矩阵和需求矩阵。
银⾏家算法处理死锁的⽅法:预防死锁,避免死锁,检测死锁,解除死锁其中,避免死锁的著名算法:Dijkstra的银⾏家算法。
(这是由于该算法能⽤于银⾏系统现⾦贷款的发放⽽得名的)要实现该算法,系统中需要设置如下⼏个数据结构:1)可利⽤资源向量Available。
Available[j]=K表⽰系统中j类可⽤资源有K个。
2)最⼤需求矩阵Max。
Max[i,j]=K表⽰进程i对j类资源的最⼤需求个数为K个。
3)已分配资源矩阵Allocation。
Allocation[i,j]=K表⽰已为进程i分配J类资源K个。
4)需求矩阵Need。
Need[i,j]=K表⽰进程i还需要请求j类资源K个。
银⾏家算法:Request[i,j]=K表⽰进程i请求j类资源K个。
1)⽐较Request[i,j]与Need[i,j],如果Request[i,j]<=Need[i,j],则执⾏步骤2,否则认为出错,请求的数量超出需求的最⼤数量。
2)⽐较Request[i,j]与Available[j],如果Request[i,j]<=Available[j],则执⾏步骤3,否则进程i需要等待,系统⽆⾜够的可⽤资源。
3)系统尝试为进程i分配请求的j类资源K, available[j]:=available[j]-request[i,j] allocation[i,j]:=allocation[i,j]+request[i,j] need[i,j]:=need[i,j]-request[i,j]4)调⽤安全算法,如果检测出此次分配后系统处于安全状态,则正式分配资源,否则将本次试探分配作废,所有数据量还原,放弃本次资源分配。
安全算法:安全算法⽤于检测资源分配后,系统是否处于安全状态。
1)设置两个向量:(1)work,它表⽰系统可提供给进程各类资源的数⽬,在执⾏安全算法开始时,work:=available(2)finish,它表⽰系统是否有⾜够的资源分配给进程,使之运⾏完成。
3 课程设计三银行家算法(参考1)1设计目的(1)了解多道程序系统中,多个进程并发执行的资源分配。
(2)掌握死锁产生的原因、产生死锁的必要条件和处理死锁的基本方法。
(3)掌握预防死锁的方法,系统安全状态的基本概念。
(4)掌握银行家算法,了解资源在进程并发执行中的资源分配策略。
(5)理解避免死锁在当前计算机系统不常使用的原因。
2.算法描述Dijkstra(1965年)提出了一种能够避免死锁的调度方法,称为银行家算法,它的模型基于一个小城镇的银行家,现将该算法描述如下:假定一个银行家拥有资金,数量为Σ,被N个客户共享。
银行家对客户提出下列约束条件:(1)每个客户必须预先说明自已所要求的最大资金量;(2)每个客户每次提出部分资金量申请各获得分配;(3)如果银行满足了客户对资金的最大需求量,那么,客户在资金动作后,应在有限时间内全部归还银行。
只要每个客户遵守上述约束,银行家将保证做到:若一个客户所要求的最大资金量不超过Σ,则银行一定接纳该客户,并可处理他的资金需求;银行在收到一个客户的资金申请时,可能因资金不足而让客户等待,但保证在有限时间内让客户获得资金。
在银行家算法中,客户可看做进程,资金可看做资源,银行家可看做操作系统。
3. 环境操作系统Windows XP SP2,开发工具VC++6.0或者BCB6.0。
4 功能模块说明1.银行家所能够提供的资源typedef struct node{int a;int b;int c;int remain_a;int remain_b;int remain_c;}bank;2.进程所占用的资源typedef struct node1{char name[20];int a;int b;int c;int need_a;int need_b;int need_c;}process;main()函数:完成对系统运行环境的初始化,定义了简单的选择菜单,调用各功能函数。
操作系统之银⾏家算法
银⾏家算法
银⾏家算法是解决死锁问题的。
那么怎么解决呢? 死锁的⼀个原因就是互斥资源, 如上图,有A,B,C三个资源,数量分别是
10,5,7,MAX表⽰的是每个进程需要该资源,需要多少,Allocation表⽰现在分配了多少,Need表⽰他们还需要多少,⾃然Max-
Allocation就能算出need。
那么怎样算Available呢?某个资源⼀共有的减去分配了的,就是当前可⽤的。
work表⽰当前可⽤的资源的数⽬,刚开始肯定就是3 3 2,这个表⽰我们的系统中的资源还剩多少,然后判断可以分配给哪个进程,把这个进程的名字写在前⾯,然后need就是这个进程需要的资源数,Allocation是这个进程当前分配了多少,work+Allocation为把两个加起来,意思就是系统执⾏这个进程,完了以后会释放之前分配给他的,然后这个系统中当前有的资源数就是work+Allocation。
执⾏完,最后的work+Allocation应该跟刚
开始系统的资源数相同。
「怎样判断系统是否安全呢?」 如果每个进程都能执⾏,也就是finish都为true,那么这个系统就是安全的,反之就不安全。
P1发出请求向量,是在他原来需要的1 2 2⾥,先要请求1 0 2,所以先要判断请求的向量是不是⽐需要的多,如果多肯定是不对的。
第⼆步,请求的向量需要⽐当前可⽤的少,这两个条件都满⾜以后,我们就把Allocation的向量增加请求向量,把Need向量减少请求向量,然后继续进⾏计算。
银行家算法例题具体步骤
银行家算法是一种避免死锁的著名算法,主要应用于避免操作系统中的死锁问题。
以下是使用银行家算法解决死锁问题的一个具体例子:假设系统中有三种类型的资源(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)设计思想说明设计银⾏家算法是为了避免死锁三、实验⽅法内容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#include#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{ j=chksec(i);if (j==0) break;}if (i>=M)cout<<"错误提⽰:经安全性检查发现,系统的初始状态不安全\n"< else{ cout<<"提⽰:经安全性检查发现,系统的初始状态安全!"<bank();}}void inputdata(){ int i=0,j=0,p;cout<<"请输⼊总进程数:"<do{cin>>M;if (M>W) cout<}while (M>W);cout<cout<<"请输⼊资源的种类数:"<do {cin>>N;if (N>R)cout<R);cout<cout<<"请依次输⼊各类资源的总数量,即设置向量all_resource:"<for(i=0;i>ALL_RESOURCE[i];cout<cout<<"请依次输⼊各进程所需要的最⼤资源数量,即设置矩阵max:"<for (i=0;i{for (j=0;j{do { cin>>MAX[i][j];if (MAX[i][j]>ALL_RESOURCE[j])cout<ALL_RESOURCE[j]);}}cout<cout<<"请依次输⼊各进程已经占据的各类资源数量,即设置矩阵allocation:"< for (i=0;i{for (j=0;j{do{ cin>>ALLOCATION[i][j];if (ALLOCATION[i][j]>MAX[i][j])cout<}while (ALLOCATION[i][j]>MAX[i][j]);}}cout<for (i=0;ifor(j=0;jNEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for (j=0;j{ p=ALL_RESOURCE[j];for (i=0;i{ p=p-ALLOCATION[i][j];AVAILABLE[j]=p;if(AVAILABLE[j]<0)AVAILABLE[j]=0;}}}void showdata(){ int i,j;cout<<"各种资源的总数量,即向量all_resource为:"<cout<<" ";for (j=0;jcout<<" 资源"<cout<cout<<"当前系统中各类资源的可⽤数量,即向量available为:"< for (j=0;jcout<<" 资源"<cout<cout<<"各进程还需要的资源数量,即矩阵need为:"<for (i=0;i{ cout<<"进程P"<for (j=0;jcout<cout<}cout<cout<<"各进程已经得到的资源量,即矩阵allocation为: "<for (i=0;i{ cout<<"进程P"<for (j=0;jcout<cout<} cout<}void changdata(int k){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{ 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;iFINISH[i]=FALSE;for(j=0;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++;}if(FINISH[i]==FALSE){ return 1;}} return 0;}int chkmax(int s){ int j,flag=0;for(j=0;j{if (MAX[s][j]==ALLOCATION[s][j]){ flag=1;AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];MAX[s][j]=0;}} return flag;}Void bank(){int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){i=-1;while(i<0||i>=M){ cout<<"请输⼊需申请资源的进程号(从P0到P"< cin>>i;if(i<0||i>=M)cout<<"输⼊的进程号不存在,重新输⼊!"<}cout<<"请输⼊进程P"<for (j=0;j{ cout<<" 资源"<cin>>Request[j];if(Request[j]>NEED[i][j]){ cout<<"进程P"<量!";cout<<"申请不合理,出错!请重新选择!"<flag='N';break;}else{ if(Request[j]>AVAILABLE[j]){ cout<<"进程P"<cout<<"申请不合理,出错!请重新选择!"<flag='N';break;}}}if(flag=='Y'||flag=='y'){ changdata(i);if(chksec(i)){ cout<cout<<"该分配会导致系统不安全本次资源申请不成功,不予分配"<cout<restoredata(i);}else{ cout<cout<<"经安全性检查,系统安全,本次分配成功,且资源分配状况如下所⽰:"< cout<showdata();if(chkmax(i)){cout<<"在资源分配成功之后,由于该进程所需的某些资源的最⼤需求量已经满⾜,"< cout<<"因此在进程结束后系统将回收这些资源!"<cout<<"在资源收回之后,各进程的资源需求和分配情况如下所⽰:"<showdata();}}}cout<cout<<" 是否继续银⾏家算法演⽰,按'Y'或'y'键继续,按'N'或'n'键退出演⽰: "; cin>>flag; }}五、实验结果1.执⾏结果2.结果分析银⾏家算法就是当接收到⼀个系统资源的分配后找到⼀个安全序列,使得进程间不会发⽣死锁,若发⽣死锁则让进程等待。
操作系统实验之银行家算法操作系统实验——银行家算法一、实验目的1、理解银行家算法。
2、掌握进程安全性检查的方法与资源分配的方法。
二、实验内容与基本要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:1、现在系统是否处于安全状态?2、如果现在进程P1提出需要0、4、2、0个资源的请求,系统能否满足它的请求?三、实验报告内容1、银行家算法和安全性检查算法原理银行家算法:银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。
在OS设计中,也可以用它来避免死锁。
为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。
当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。
若两项均满足,则系统试分配资源并执行安全性检查算法。
安全性检查算法 :安全性检查算法用于检查系统进行资源分配后是否安全,若安全系统才可以执行此次分配;若不安全,则系统不执行此次分配。
安全性检查算法原理为:在系统试分配资源后,算法从现有进程列表寻找出一个可执行的进程进行执行,执行完成后回收进程占用资源;进而寻找下一个可执行进程。
当进程需求量大于系统可分配量时,进程无法执行。
当所有进程均可执行,则产生一个安全执行序列,系统资源分配成功。
若进程无法全部执行,即无法找到一条安全序列,则说明系统在分配资源后会不安全,所以此次分配失败。
2、程序流程图3、程序及注释#include////////////////////////////////////////////////////////////////////////// //全局变量定义int Available[100]; //可利用资源数组int Max[50][100]; //最大需求矩阵int Allocation[50][100]; //分配矩阵int Need[50][100]; //需求矩阵int Request[50][100]; //M个进程还需要N类资源的资源量int Finish[50];int p[50];int m,n; //M个进程,N类资源///////////////////////////////////////////////////////////////////////// //安全性算法int Safe{int i,j,l=0;int Work[100]; //可利用资源数组for i=0;iWork[i]=Available[i];for i=0;iFinish[i]=0;for i=0;i{if Finish[i]==1continue;else{for j=0;j{if Need[i][j]>Work[j]break;}if j==n{Finish[i]=1;forint k=0;kWork[k]+=Allocation[i][k]; p[l++]=i;i=-1;}else continue;}if l==m{cout<<"系统是安全的"<<'\n'; cout<<"系统安全序列是:\n"; for i=0;i{cout<if i!=l-1cout<<"-->";}cout<<'\n';return 1;}}}////////////////////////////////////////////////////////////////////////////// /////银行家算法int main{int i,j,mi;cout<<"输入进程的数目:\n";cin>>m;cout<<"输入资源的种类:\n";cin>>n;cout<<"输入每个进程最多所需的各类资源数,按照"<for i=0;iforj=0;jcin>>Max[i][j];cout<<"输入每个进程已经分配的各类资源数,按照"<for i=0;i{forj=0;j{cin>>Allocation[i][j];Need[i][j]=Max[i][j]-Allocation[i][j];if Need[i][j]<0{cout<<"你输入的第"<j--;continue;}}}cout<<"请输入各个资源现有的数目:\n";for i=0;icin>>Available[i];Safe;while 1{cout<<"输入要申请的资源的进程号:第一个进程号为0,第二个进程号为1,依此类推\n";cin>>mi;cout<<"输入进程所请求的各个资源的数量\n";for i=0;icin>>Request[mi][i];for i=0;i{if Request[mi][i]>Need[mi][i]{cout<<"所请求资源数超过进程的需求量!\n";return 0;}if Request[mi][i]>Available[i]{cout<<"所请求资源数超过系统所有的资源数!\n"; return 0;}}for i=0;i{Available[i]-=Request[mi][i];Allocation[mi][i]+=Request[mi][i];Need[mi][i]-=Request[mi][i];}if Safecout<<"同意分配请求\n";else{cout<<"SORRY╮╯▽╰╭……你的请求被拒绝…\n"; for i=0;iAvailable[i]+=Request[mi][i];Allocation[mi][i]-=Request[mi][i];Need[mi][i]+=Request[mi][i];}}for i=0;iFinish[i]=0;char Flag; //标志位cout<<"是否再次请求分配?是请按Y/y,否请按N/n"; while 1{cin>>Flag;if Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n' break;else{cout<<"请按要求重新输入:\n";continue;}}if Flag=='Y'||Flag=='y'continue;else break;}4、运行结果以及结论图示为题目所给定的条件下的程序运行结果。
银行家算法详解银行家算法( banker's algorithm )由 Dijkstra(1065)提出。
他将死锁的问题演示为一个银行家贷款的模型。
一个银行家向一群客户发放信用卡,每个客户有不同的信用额度。
每个客户可以提出信用额度内的任意额度的请求,直到额度用完后再一次性还款。
银行家承诺每个客户最终都能获得自己需要的额度。
所谓“最终”,是说银行家可以先挂起某个额度请求较大的客户的请求,优先满足小额度的请求,等小额度的请求还款后,再处理挂起的请求。
这样,资金能够永远流通。
银行家算法可以用以下图表表示:每个客户和银行家都有交易限额。
银行家只能和限额小于自己限额的客户进行交易。
一旦银行家的限额小于所有客户的限额,便发生了死锁。
如上图所示。
银行家分别和客户1,客户2,客户3进行了交易。
第一次交易时,所有客户的限额都小于银行家的限额,任何客户都可以实现借款;第二次交易时,客户3的限额大小银行家的限额,这时银行家会挂起客户3 的请求;第三次交易时,只有客户3可以进行交易,其它的交易都会被挂起。
直到客户3还款后,银行家才会考虑处理其它客户的交易。
银行家算法其核心是:保证自己的限额至少不小于一个客户的限额。
我们可以用填表法来快速解决银行家算法。
建立一个二维表格:每列数据表示每次交易各个参与者的限额。
这个表格第一列数据是银行家是客户的交易限额,每发生一次交易,增加一列,同时将银行家和发生交易的客户的限额减小。
直到银行家的限额小于某个客户的限额时,交易不能继续进行。
否则便发生死锁。
例题:1、操作系统分配资源时的一个重要考虑是避免死锁的发生.若系统中有同类资源 16 个,由四个进程 P1、P2、P3 和 P4 共享该资源。
已知P1、P2、P3、P4 所需的资源总数分别为8、5、9、6。
各进程请求资源的次序如下表,若系统采用银行家算法为它们分配资源,那么_(1)__依次申请分配会使系统进入不安全状态。
进程申请资源的情况。
实验二银行家算法一、目的:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效地防止和避免死锁的发生。
二、内容:银行家算法是避免死锁的一种重要方法,本实验要求编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
三、编程思想:首先分析银行家算法的数据结构,分析可利用资源向量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。
银行家算法(操作系统)银行家算法(操作系统)一、概述银行家算法是一种用于避免进程死锁的资源分配算法。
在多进程并发执行的系统中,进程需要申请和释放资源,而银行家算法可以通过判断资源申请是否会导致系统陷入死锁状态,从而保证系统的安全性和可靠性。
二、系统资源1. 资源类型系统中的资源可以分为不同类型,比如A、B、C等。
每种资源类型都有固定的数量,例如A类型资源有10个。
不同资源类型之间是独立的,即没有关联性。
2. 可用资源在系统中,每种资源类型都有一定数量的可用资源。
初始情况下,可用资源数目应该与系统中实际可用资源数目相对应。
3. 进程资源申请和释放进程可以通过申请资源来执行运算或操作。
如果系统能够满足进程的资源需求,则满足其资源请求,否则,该进程必须等待直到所需资源变得可用。
当进程完成了对资源的操作后,必须释放这些资源,以便其他进程可以使用。
三、银行家算法原理1. 数据结构银行家算法通过维护以下数据结构来判断系统是否处于安全状态:- Avlable: 一维数组,表示每种资源类型的可用数量。
- Max: 二维数组,表示每个进程对每种资源类型的最大需求量。
- Allocation: 二维数组,表示每个进程已经分配到的资源数量。
- Need: 二维数组,表示每个进程还需要的资源数量。
2. 安全状态系统处于安全状态的条件是:存在一个安全序列,使得该序列中每个进程的资源需求能够被满足。
3. 安全检查银行家算法通过进行安全检查来判断系统是否处于安全状态。
检查过程包括以下步骤:- 初始化Work为Avlable。
- 找到一个进程i,使得Need[i] <= Work。
如果这样的进程不存在,则转到步骤5。
- 分配资源给进程i。
- 执行资源分配后的安全性检查,即临时修改Work和Allocation。
- 如果系统处于安全状态,则转到步骤2;否则,继续进行步骤5。
- 如果所有进程都获得了所需的资源,则系统处于安全状态;否则,系统处于不安全状态。
银行家算法例题系统中原有三类资源A、B、C和五个进程P1、P2、P3、P4、P5,A资源17,B资源5,C资源20。
当前(T0时刻)系统资源分配和进程最大需求如下表。
1、现在系统T0时刻是否处于安全状态?2、是否可以允许以下请求?(1)T1时刻:P2 Request2=(0,3,4)(2)T2时刻:P4 Request4=(2,0,1)(3)T3时刻:P1 Request1=(0,2,0)注:T0 T1 T2 T3时刻是前后顺序,后一时刻是建立在前一时刻的基础上。
解:由题设可知Need=Max-AllocationAvailableA=17-(2+4+4+2+3)=2(原有-分配)同理AvailableB=3,AvailableC=3可得T0时刻资源分配表如下所示(表中数据顺序均为A B C):1、判断T0时刻是否安全,需要执行安全算法找安全序列,过程如下表:T0时刻能找到一个安全序列{P4,P3,P2,P5,P1},故T0时刻系统处于安全状态。
2、判断T1 T2 T3时刻是否满足进程请求进行资源分配。
(1)T1时刻,P2 Request2=(0,3,4)//第一步判断条件①满足Request2=(0,3,4)<=Need2(1,3,4)②不满足Request2=(0,3,4)<=Available(2,3,3)故系统不能将资源分配给它,此时P2必须等待。
(2)T2时刻,P4 Request4=(2,0,1)//第一步判断条件①满足Request4=(2,0,1)<=Need4(2,2,1)②满足Request4=(2,0,1)<=Available(2,3,3)//第二步修改Need、Available、Allocation的值Available=Available-Request4= (0,3,2)Allocation4=Allocation4+Request4=(4,0,5)Need4=Need4-Request4=(0,2,0)//第三步执行安全算法,找安全序列(注解:先写上work,其初值是系统当前进行试分配后的Available(0,3,2) ,找五个进程中Need小于work的进程,比如Need4<=Work满足,则将P4写在第一行的最前面,同时写出P4的Need和Allocation,以此类推)//第四步在此时刻(T2时刻)存在安全序列{P4,P2,P3,P5,P1},则满足Request4请求,将Request4=(2,0,1)分配给P4。