银行家算法例题——四步走解题
银行家算法习题1
银行家算法流程安全性算法流程图银行家算法例题 1.假定系统中有4个进程1P ,2P ,3P ,4P , 3种类型的资源1R ,2R ,3R ,数量分别为9,3,6, 0T 时刻的资源分配情况如表2-1所示。
表2-1 T 0时刻的资源分配情况试问:(1) T 0时刻是否安全?(2) T 0时刻以后,若进程P 2发出资源请求Request 2(1,0,1), 系统能否将资源分配给它? (3) 在进程P 2申请资源后,若P1发出资源请求Request 1(1,0,1), 系统能否将资源分配给它?(4) 在进程P 1申请资源后,若P3发出资源请求Request 3(0,0,1), 系统能否将资源分配给它?2. 在银行家算法中,出现以下资源分配情况(见表2-2)系统剩余资源数量=(3,3,2)(1) 该状态是否安全(给出详细的检查过程) (2) 如果进程依次有如下资源请求:P1:资源请求request (1,0,2) P2:资源请求request (3,3,0) P3:资源请求request (0,1,0)则系统该如何进行资源分配才能避免死锁?3.设系统中有3种类型的资源(A、B、C)和5个进程P1、P2、P3、P4、P5,A资源的数量为17,B资源的数量为5,C资源的数量为20。
在T0时刻,系统状态见表2-3。
系统采用银行家算法实现死锁避免。
(1)T0时刻是否为安全状态?若是,请给出安全序列(2)在T0时刻,若进程P2请求资源(0,3,4),是否能实施资源分配?为什么?(3)在(2)的基础上,若进程P4请求资源(2,0,1),是否能实施资源分配?(4)在(3)的基础上,若进程P1请求资源(0,2,0),是否能实施资源分配?4.某系统有R1、R2、R3共三种资源,在T0时刻P1、P2、P3、P4这四个进程对资源的占用和需求情况见表2-24,此时系统的可用资源矢量为(2,1,2)。
试问:1)将系统中各种资源总数和此刻各进程对各资源的需求数目用矢量或矩阵表示出来。
银行家算法及流程图
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
Bank();
}
void Init() /*初始化算法*/
{
int i,j;
cout〈〈”请输入进程的数目:";
cin〉>m;பைடு நூலகம்
cout〈<"请输入资源的种类:”;
cin〉〉n;
cout<<"请输入每个进程最多所需的各资源数,按照"〈<m<〈"x”<<n〈〈”矩阵输入"〈〈endl;
for(i=0;i<m;i++)
}
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;
for(k=0;k〈n;k++)
{
Work[k]+=ALLOCATION[i][k];
NEED[cusneed][i]-=REQUEST[cusneed][i];
银行家算法例题详解算法设计题详解
银行家算法例题详解算法设计题详解算法设计的特征:有穷性,确定性,输入和输出,可行性运行算法的时间:硬件的速度。
书写程序的语言。
问题的规模,编译生成程序的代码质量算法复杂度: 时间复杂度和空间复杂度1.迭代法迭代法又称为辗转法,是用计算机解决问题的一种基本方法,为一种不断用变量的旧值递推新值的过程,与直接法相对应,一次性解决问题。
迭代法分为精确迭代和近似迭代,“二分法”和“牛顿迭代法”属于近似迭代法。
迭代法利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:1. 确定迭代变量(在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
)2. 建立迭代关系式(所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。
迭代关系式的建立是解决迭代问题的关键,通常可以顺推或倒推的方法来完成。
)3. 对迭代过程进行控制(在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。
不能让迭代过程无休止地重复执行下去。
迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。
对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
)2.穷举搜索法穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。
即本方法使用可以理解为暴力循环方法,穷举所有可能性,一般这种方法的时间效率太低,不易使用。
但是方法简单,易理解。
3.递推法递推是计算机数值计算中的一个重要算法,思路是通过数学推导,将复杂的运算化解为若干重复的简单运算,以充分发挥计算机长于重复处理的特点。
银行家算法基本步骤
银行家算法基本步骤银行家算法是一种用于避免死锁的算法,它可以判断系统中是否存在安全序列,从而决定是否分配资源。
本文将详细介绍银行家算法的基本步骤。
一、银行家算法概述银行家算法是由荷兰计算机科学家埃德加·迪科斯彻(Edsger Dijkstra)于1965年提出的。
它是一种避免死锁的算法,主要用于操作系统中进程管理和资源分配。
银行家算法通过计算当前系统中可用资源和各进程所需资源,来判断是否存在安全序列,从而决定是否分配资源。
二、银行家算法基本概念1. 资源:指系统中可供进程使用的资源,如内存、CPU等。
2. 进程:指正在运行的程序,在操作系统中被视为一个独立的实体。
3. 最大需求矩阵:指每个进程所需要的最大资源数量矩阵。
4. 分配矩阵:指当前已经分配给每个进程的资源数量矩阵。
5. 需求矩阵:指每个进程还需要的资源数量矩阵。
6. 可利用资源向量:指当前系统中可供使用的各类资源数量。
7. 安全序列:指一组进程的执行顺序,使得每个进程都能够获得它所需要的资源,从而顺利完成任务。
三、银行家算法基本步骤1. 初始化:在系统启动时,需要对各类资源数量进行初始化,并建立最大需求矩阵、分配矩阵和需求矩阵。
2. 请求资源:当一个进程请求资源时,需要判断该请求是否合法。
如果该请求的资源数量小于等于当前系统中可用的相应资源数量,并且加上该进程已经分配到的资源数量不超过该进程所需的最大资源数量,则该请求是合法的。
3. 分配资源:如果一个请求是合法的,则可以将相应的资源分配给该进程,并更新分配矩阵和需求矩阵。
同时,也需要更新可利用资源向量。
4. 判断安全性:在每次分配资源后,都需要判断当前系统是否存在安全序列。
具体做法是通过模拟各个进程对各类资源的请求和释放过程,来判断是否存在一组安全序列。
如果存在安全序列,则说明当前系统是安全的;否则就不能再分配资源了。
5. 回收资源:当一个进程完成任务后,需要释放已经占用的所有资源,并更新可利用资源向量、分配矩阵和需求矩阵。
银行家算法
银行家算法设计思路:为了使进程并发执行,就需要用到避免死锁的方法,在这种方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性,若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,令进程等待。
所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,Pn)(称<P1,P2,…,Pn>序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利的完成。
如果系统取法找到一个这样的安全序列,则成系统处于不安全状态。
虽然并非所有的不安全状态都必然会转为死锁状态,但当系统进入不安全状态后,便有可能进而进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。
因此,避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态。
在避免死锁的方法中,银行家算法是最具有代表性的算法。
算法设计:银行家算法中的数据结构:1.可利用资源Avaliable[ ]。
这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
如果Avaliable[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个。
实验四银行家算法
操作系统实验实验四银行家算法学号 1115102002姓名蔡凤武班级 11电子A华侨大学电子工程系实验目的1、理解银行家算法。
2、掌握进程安全性检查的方法与资源分配的方法。
实验内容与基本要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:1、现在系统是否处于安全状态?2、如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?1、银行家算法和安全性检查算法原理。
操作系统的银行家算法:当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
1、程序流程描述。
银行家算法:(1) 步骤:1如果Request [j]<=Need[i],转向步骤(2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。
(2) 步骤2;如果:Request [i]<=Available[i],转向步骤(3),否则提示尚无足够资源,进程i需等待。
(3) 步骤3:系统试探分配相关资源,并修改下面数据:Available[i]= Available[i]- Request [j];Allocation[i]= Allocat ion[i]+ Request [i];Need[i]= Need[i]- Request [i];(4) 步骤4:执行安全性检查,如安全,则分配成立;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
安全性检查算法:安全性检查算法主要是根据银行家算法进行资源分配后,检查资源分配后的系统状态之中。
具体算法如下:(1) 步骤1:设置两个向量: Work= Available,Finish[i]=false;说明:Finish(它表示系统是否有足够的资源分配给进程)Work(它表示系统可提供给进程继续运行所需的各类资源数目)(2) 步骤2:在进程中查找符合以下条件的进程:Finish[i]=false,need<=Work 若能找到,则执行步骤(3),否则,执行步骤(4)(3) 步骤3:当进程获得资源后,可顺利执行,直至完成,从而释放资源:Work= Work+ Allocation; Finish=true; goto step (2);(4) 步骤4:如果所有进程的Finish=true都满足,则表示系统处于安全状态,否则,系统不安全状态。
实验四 银行家算法
银行家算法的模拟实现一.实验目的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)、系统剩余资源量A[n],其中A[n]表示第I类资源剩余量.2)、各进程最大需求量,B[m][n],其中B[j][i]表示进程j对i类资源最大需求.3)、已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量.4)、剩余需求量.D[m][n],其中D[j][i]对第i资源尚需的数目.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作:1)、判定E[n]是否大于D[j][n],若大于,表示出错.2)、判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待.3)、若以上两步没有问题,尝试分配,即各变量作调整.4)、按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待."安全性检测"算法1)、先定义两个变量,用来表示推算过程的数据.F[n]=A[n],表示推算过程中,系统中剩余资源量的变化.J[n]=False表示推算过程中各进程是否假设"已完成"2)、流程:在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True(假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行.若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.三、实验内容在codeblock编译器下编写代码首先现编写一个库文件‘s.h’,定义一个结构体:typedef struct {int A;int B;int C;}RESOURCE;结构体里面的三个域分别表示三种资源的数量。
银行家算法
银行家算法(进程需求的资源数≤剩余的资源数才是安全序列)例题:系统中有4种类型的资源(A、B、C、D)和5个进程P1、P2、P3、P4和P5, A资源的数量为3, B资源的数量为12, C资源的数量为14, D资源的数量为14,在某时刻系统状态如下表所示,系统采用银行家算法实施死锁避免策略.资源分配表下列进程执行序列中,哪些不是安全序列( )A:P1 P4 P5 P2 P3 B:P1 P4 P2 P5 P3 C:P1 P4 P3 P2 P5 D:P1 P3 P4 P5 P2E:P1 P5 P4 P3 P2 解题步骤:①,我们要根据题干计算出剩余资源数量,(有的题目直接给出了剩余资源数量,我们就不需要计算了.), 剩余资源数量=资源的数量-已分配资源数量,根据题目计算得出, A资源的数量为3减去A已分配资源数量2等于1,B资源的数量为12减去B已分配资源数量6等于6C资源的数量为14减去C已分配资源数量12等于2D资源的数量为14减去D已分配资源数量12等于2求出剩余资源数量( A 1 B 6 C 2 D 2 )②,我们要计算出需求资源数量,(相应进程的ABCD互减, A减A ,B减B, C减C, D减D )③根据剩余资源数量来判断执行序列的安全,进程需求的资源数≤剩余的资源数才是安全序列(也就是说,剩余资源数量≥需求资源数量,才安全)采用银行家算法,每次执行完一个进程需要加上此进程的已分配资源数量,再执行下一个进程,以此类推.④我们来看选项A:P1 P4 P5 P2 P3, 我们之前求出剩余资源数量( A 1 B 6 C 2 D 2 )此刻, 剩余资源数量( A 1 B 6 C 2 D 2 )各个资源都大于,P1进程需求资源数量为(A 0、 B 0、 C 1、 D 2 )(1、6、2、2)>(0、0、1、2),安全,运行完P1进程后,剩余资源数量需要加上P1进程已分配资源数量,即: (1、6、2、2)+(0、0、3、2)=(1、6、5、4),接下来执行P4进程,此时已经运行完P1进程,所以此刻剩余资源数量为(1、6、5、4),(1、6、5、4)各项资源数量≥P4进程需求的资源数量(0、6、5、2),安全运行完P4进程后,剩余资源数量需要加上P4进程已分配资源数量,即:(1、6、5、4) +(0、3、3、2) =(1、9、8、6), 接下来执行P5进程,P5进程需求的资源数量为(0、6、5、6)此时已经运行完P4进程,所以此刻剩余资源数量为(1、9、8、6)(1、9、8、6) 各项资源数量≥P5进程需求的资源数量(0、6、5、6),安全运行完P5进程后,剩余资源数量需要加上P5进程已分配资源数量,即:(1、9、8、6) +(0、0、1、4)=(1、9、9、10), 接下来执行P2进程,P2进程需求的资源数量为(1、7、5、0)此时已经运行完P5进程,所以此刻剩余资源数量为(1、9、9、10),(1、9、9、10), 各项资源数量≥P2进程需求的资源数量(1、7、5、0),安全运行完P2进程后,剩余资源数量需要加上P2进程已分配资源数量,即:(1、9、9、10) +(1、0、0、0) =(2、9、9、10),接下来执行P3进程此时已经运行完P2进程,所以此刻剩余资源数量为(2、9、9、10)(2、9、9、10) 各项资源数量≥P3进程需求的资源数量(2、3、5、6),安全此时5个进程运行完毕所以选项A:P1 P4 P5 P2 P3,执行序列正确.,同理选项B:P1 P4 P2 P5 P3执行序列正确⑤们分析一下选项C为啥不正确,我们来看选项, C:P1 P4 P3 P2 P5 我们之前求出剩余资源数量( A 1 B 6 C 2 D 2 )此刻, 剩余资源数量( A 1 B 6 C 2 D 2 )各个资源都大于,P1进程需求资源数量为(A 0、 B 0、 C 1、 D 2 )(1、6、2、2)>(0、0、1、2),安全,运行完P1进程后,剩余资源数量需要加上P1进程已分配资源数量,即: (1、6、2、2)+(0、0、3、2)=(1、6、5、4),接下来执行P4进程,此时已经运行完P1进程,所以此刻剩余资源数量为(1、6、5、4),(1、6、5、4)各项资源数量≥P4进程需求的资源数量(0、6、5、2),安全运行完P4进程后,剩余资源数量需要加上P4进程已分配资源数量,即:(1、6、5、4) +(0、3、3、2) =(1、9、8、6), 接下来执行P3进程,此时已经运行完P4进程,所以此刻剩余资源数量为(1、9、8、6)(1、9、8、6) )各项资源数量不能≥P3进程需求的资源数量(2、3、5、6),不安全因为,资源A此刻只有1个可用,而进程P3需要2个A资源.运行会发生死锁,然后就不需要运行其它进程了所以选项C:P1 P4 P3 P2 P5错误.同理选项D:P1 P3 P4 P5 P2和E:P1 P5 P4 P3 P2错误.。
银行家算法例题——四步走解题
银行家算法例题系统中原有三类资源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。
银行家算法解题过程
银行家算法解题过程
《银行家算法解题过程》是一种解决系统安全性的算法,它可以有效地解决死锁问题。
银行家算法是一种基于资源分配的算法,它可以帮助系统管理者做出有效的决策,以避免死锁的发生。
银行家算法的解题过程分为四个步骤:首先,系统管理者需要确定当前系统中可用的资源数量。
然后,系统管理者需要检查每个进程是否满足它所需要的资源数量。
如果满足,则可以分配资源;如果不满足,则需要检查系统中是否有其他进程可以提供资源,以满足当前进程的需求。
最后,系统管理者需要检查系统中是否存在安全状态,以确保系统能够正常运行。
银行家算法是一种非常有效的算法,它可以有效地解决系统中安全性问题,从而避免死锁的发生。
它的解题过程简单易懂,可以帮助系统管理者做出有效的决策,以确保系统的正常运行。
银行家算法例题
已经占有资源
最大需求数
进程1
1
4
进程2
4
6
进程3
5
8
空闲资源数
2
试问:1、现在系统是否安全?
2、进程1若申请1个资源,系统分配给该进程,系统是否安全?你如何检测?
2002年系统分析师试题
操作系统分配资源时的一个主要考虑是避免死锁的发生。若系统中有同类资源16个,有4个进程p1、p2、p3、p4共享该资源。已知p1、p2、p3、p4所需的资源总数分别为8、5、9、6。各进程请求资源的次序如表8-1所示,若系统采用银行家算法为他们分配资源,那么____次申请分配会使系统进入不安全状态。
表8-1进程申请资ຫໍສະໝຸດ 的情况序号进程申请量
1
P1
6
2
P2
4
3
P3
5
4
P4
1
5
P1
1
6
P2
1
供选择的答案
A.3、4 B.3、5 C.4、5 D.5、6
计算机操作系统之银行家算法
淮海工学院计算机工程学院实验报告书课程名:《计算机操作系统》题目:实验二银行家算法班级: ^ ^ 姓名: ^ ^实验二银行家算法实验目的和要求应用银行家算法验证进程安全性检查及分配资源编制模拟银行家算法的程序,并以以下例子验证程序的正确性。
实验环境1.PC微机。
2.Windows 操作系统。
3.C/C++/VB开发集成环境。
实验学时2学时,必做实验实验内容和步骤1)依照算法流程图编制可执行程序2)用以下两个例子验证程序的正确性。
3)按照上述两个例子,输出执行的结果。
算法流程图银行家算法:安全性算法:【例1】某系统有A、B、C、D这4类资源供5个进程共享,进程对资源的需求和分配情况如下表所示。
现在系统中A、B、C、D类资源分不还剩1、5、2、0个,请按银行家算法回答下列问题:(1) 现在系统是否处于安全状态?(2) 假如现在进程P2提出需要(0,4,2,0)个资源的请求,系统能否满足它的请求?【例2】用银行家算法考虑下列系统状态:进程分配矩阵最大需求矩阵资源总数矩阵A 3 0 1 1 4 1 1 16 3 4 2B 0 1 0 0 0 2 1 2C 1 1 1 0 4 2 1 0D 1 1 0 1 1 1 1 1E 0 0 0 0 2 1 1 0问系统是否安全?若进程B请求(0,0,1,0),可否立即分配?此后进程E也请求(0,0,1,0),可否分配给它?通过运行程序发觉,例1当中的系统处于不安全状态,进程P2提出的请求无法实现;例2当中的系统处于安全状态,进程B提出的请求能实现,此后进程E的请求也能实现。
源代码#include<iostream>#define N 20#define M 20using namespace std;int f(int a[N][M],int b[N][M],int m,int k) {int j;for(j=0;j<m;j++)if(a[k-1][j]>b[k-1][j])return 0;return 1;}int g(int a[N][M],int b[],int m,int k) {int j;for(j=0;j<m;j++)if(a[k][j]>b[j])return 0;return 1;}int h(int a[],int n){for(int i=0;i<n;i++)if(!a[i])return 0;return 1;}int p(int a[],int b[N][M],int m,int k){int j;for(j=0;j<m;j++)if(a[j]>b[k-1][j])return 0;return 1;}int q(int a[],int b[],int m){int j;for(j=0;j<m;j++)if(a[j]>b[j])return 0;return 1;}int safe(int Finish[N],int Work[M],int Need[N][M],int Allocation[N][M],int n,int m){ int i,j,k;int t[N];for(i=0;i<n;i++)t[i]=1;cout<<"安全性检查!"<<endl;for(i=0;i<n;)// 首先找到一个满足条件的进程 {if((Finish[i]==0)&&g(Need,Work,m,i)){k=i;t[i]=0;cout<<"p("<<k+1<<"):"<<endl;cout<<"Work["<<m<<"]:";for(j=0;j<m;j++){cout<<Work[j]<<" ";Work[j]=Work[j]+Allocation[i][j]; Finish[i]=1;}cout<<endl;cout<<"Need["<<m<<"]:";for(j=0;j<m;j++)cout<<Need[i][j]<<" ";cout<<endl;cout<<"Allocation["<<m<<"]:";for(j=0;j<m;j++)cout<<Allocation[i][j]<<" ";cout<<endl;cout<<"(Work+Allocation)["<<m<<"]:"; for(j=0;j<m;j++)cout<<Work[j]<<" ";cout<<endl;cout<<"Finish["<<k+1<<"]:";cout<<Finish[i]<<" ";cout<<endl;break;}else{i++;}}if(g(Need,Work,m,k))//依次找到满足条件的后面几个进程 {for(i=0;i<n;i++){if(t[i]){if(g(Need,Work,m,i)){cout<<"p("<<i+1<<"):"<<endl;cout<<"Work["<<m<<"]:";for(j=0;j<m;j++){cout<<Work[j]<<" ";Work[j]=Work[j]+Allocation[i][j];Finish[i]=1;cout<<endl;cout<<"Need["<<m<<"]:";for(j=0;j<m;j++)cout<<Need[i][j]<<" ";cout<<endl;cout<<"Allocation["<<m<<"]:";for(j=0;j<m;j++)cout<<Allocation[i][j]<<" ";cout<<endl;cout<<"(Work+Allocation)["<<m<<"]:"; for(j=0;j<m;j++)cout<<Work[j]<<" ";cout<<endl;cout<<"Finish["<<i+1<<"]:";cout<<Finish[i]<<" ";cout<<endl;t[i]=0;}}}else {return 0;}if(h(Finish,n))return 1;//系统处于安全状态else return 0;//系统处于不安全状态}void r(int Finish[N],int Work[M],int Available[M],int Need[N][M],int Allocation[N][M],int Max[N][M],int n,int m) {int Request[M];char b;int i,j,k;cout<<"\n要申请资源,请按'y'或'Y',否则按'n'或'N'"<<endl;//是立即进行安全性检查,依旧进行资源申请cin>>b;if(b!='y'&&b!='Y')if(safe(Finish,Work,Need,Allocation,n,m)){cout<<"现在刻系统安全!\n";}else{cout<<"现在刻系统不安全!\n";}}else{{cout<<"\n请输入申请资源的进程编号(1,2,…,"<<n<<"):"<<endl;cin>>k;while(k>n){cout<<"您输入了错误的进程号,请核查后重新输入:"<<endl;cin>>k;}cout<<"\n请输入进程p("<<k<<")申请各类资源的数量:"<<endl;for (j=0; j<m; j++)cin>>Request[j];if(p(Request,Need,m,k)){if(q(Request,Available,m)){for(j=0;j<m;j++){Available[j]=Available[j]-Request[j];Allocation[k-1][j]=Allocation[k-1][j]+Request[j]; Need[k-1][j]=Need[k-1][j]-Request[j];Work[j]=Available[j];}cout<<"试分配!"<<endl;cout<<"各种资源可利用的数量Available["<<m<<"]: "<<endl;for (j=0; j<m; j++){cout<<Available[j]<<" ";}cout<<endl;cout<<"\n已分配资源Allocation["<<m<<"]: "<<endl;for (i=0; i<n; i++){for (j=0; j<m; j++){cout<<Allocation[i][j]<<" ";}cout<<endl;}cout<<"\n最大需求矩阵Max["<<n<<"]["<<m<<"]: "<<endl; for (i=0; i<n; i++){for (j=0; j<m; j++){cout<<Max[i][j]<<" ";}cout<<endl;}cout<<"\n需求矩阵Need["<<n<<"]["<<m<<"]: "<<endl; for (i=0; i<n; i++){for (j=0; j<m; j++){cout<<Need[i][j]<<" ";}cout<<endl;}if (safe(Finish,Work,Need,Allocation,n,m)){//推断当前状态的安全性cout<<"系统处于安全状态!";cout<<"\n申请资源成功!!!"<<endl;}else{cout<<"\n当前状态不安全!!!!!!";//恢复数据for (j=0; j<m; j++){Available[j]=Available[j]+Request[j];Allocation[k-1][j]=Allocation[k-1][j]-Request[j];Need[k-1][j]=Need[k-1][j]+Request[j];Work[j]=Available[j];}for(i=0; i<n; i++)Finish[i]=0;cout<<"\n恢复数据:"<<endl;//显示输入各数组的值cout<<"各种资源可利用的数量Available["<<m<<"]: "<<endl;for (j=0; j<m; j++){cout<<Available[j]<<" ";}cout<<endl;cout<<"\n已分配资源Allocation["<<m<<"]: "<<endl;for (i=0; i<n; i++){for (j=0; j<m; j++){cout<<Allocation[i][j]<<" ";}cout<<endl;}cout<<"\n最大需求矩阵Max["<<n<<"]["<<m<<"]: "<<endl; for (i=0; i<n; i++){for (j=0; j<m; j++){cout<<Max[i][j]<<" ";}cout<<endl;}cout<<"\n需求矩阵Need["<<n<<"]["<<m<<"]: "<<endl; for (i=0; i<n; i++){for (j=0; j<m; j++){cout<<Need[i][j]<<" ";}cout<<endl;}cout<<"系统中尚无足够的资源满足进程p["<<k<<"]的申请,p["<<k<<"]必须等待!"<<endl;}}else cout<<"系统中尚无足够的资源满足进程p["<<k<<"]的申请,p["<<k<<"]必须等待!"<<endl;}else cout<<"出错,进程所需要的资源数目已超过它所宣布的最大值!"<<endl;}}}void main(){cout<<"---------------------------------------------------------"<<endl;cout<<"------------------模拟银行家算法------------------"<<endl;cout<<"---------------------------------------------------------"<<endl;cout<<"--------------------江之风海之韵-------------------"<<endl;cout<<"------------------------QuQu-------------------------"<<endl;cout<<"---------------------------------------------------------"<<endl;int Available[M];int Max[N][M];int Allocation[N][M];int Need[N][M];int Work[M];int Finish[N];int i,j,n,m;//定义全局变量cout<<"输入进程的数量: ";//从此开始输入有关数据cin>>n;cout<<"输入资源种类数: ";cin>>m;cout<<"输入各种资源可利用的数量Available["<<m<<"]: "<<endl;for (j=0; j<m; j++){cin>>Available[j];Work[j]=Available[j];//初始化Work[j]}cout<<"\n输入各进程对各类资源的最大需求数Max["<<n<<"]["<<m<<"]: "<<endl;cout<<"\n请严格按照("<<n<<"×"<<m<<")的距阵输入:"<<endl;for (i=0; i<n; i++){for (j=0; j<m; j++)cin>>Max[i][j];}cout<<"\n请输入各进程当前已分配的资源数量Allocation["<<n<<"]["<<m<<"]: "<<endl;cout<<"\n请严格按照("<<n<<"×"<<m<<")的距阵输入:"<<endl; for (i=0; i<n; i++){for (j=0; j<m; j++){cin>>Allocation[i][j];Need[i][j] = Max[i][j]-Allocation[i][j];}}r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;i<n;i++)Finish[i]=0;r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;i<n;i++)Finish[i]=0;r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;i<n;i++)Finish[i]=0;r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;i<n;i++)}实验结果实验体会银行家算法在计算机操作系统中是一个特不重要的算法,这次我编制模拟银行家算法的程序,来验证了程序的正确性。
银行家算法实例(转)
银⾏家算法实例(转)例1.设系统中有三种类型的资源(A,B,C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量为19。
在T0时刻系统的状态如下表:最⼤资源需求量已分配资源量A,B,C A,B,CP14,0,114,0,5P25,3,64,0,2P34,2,52,1,4P45,5,92,1,2P54,2,43,1,3系统采⽤银⾏家算法实施死锁避免策略,若当前系统剩余资源(A,B,C)分别为(2,3,3),下列哪⼀个序列是安全序列?A.P3,P1,P4,P2,P5B.P1,P3,P5,P2,P4C.P4,P2,P3,P5,P1D.P2,P3,P1,P4,P5⼏乎所有关于银⾏家算法的单选题的数据都差不多,在解这道题之前先来解释⼀下什么是安全序列。
安全序列是指⼀个进程序列{P1,…,Pn}是安全的,即对于每⼀个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
这句话说得⽐较抽象,在解析过程中我们进⾏理解。
解析:我们⾸先算出各个进程尚需要的资源量,尚需要的资源量=最⼤资源需求量-已分配资源量,由此可得各进程尚需要的资源量为P1P2P3P4P5A,B,C0,0,61,3,42,1,13,4,71,1,1接下来,我们分析选项A,P3需要的资源量为(2,1,1),⽽系统剩余资源为(2,3,3),因此进程P3进程得以完成,并且释放它占有的资源量,即已分配资源量,此时系统剩余资源量为(2+2,3+1,3+4)=(4,4,7),(4,4,7)⼤于(或等于)其它所有进程(即P1,P1,P2,P4,P5)尚需要的资源量(注意,这⾥的“⼤于”指的是A,B,C三类分别⼤于),因此选项A的序列是安全序列。
选项B:P1需要的资源为(0,0,6),显然系统剩余资源不满⾜条件,B为不安全序列。
选项C:P4需要的资源为(3,4,7),显然系统剩余资源不满⾜条件,C为不安全序列。
银行家算法例子+答案
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、设系统中有3种类型的资源(A,B,C)和5个进程P1、P2、P3、P4、P5,A资源的数量为17,B资源的数量为5,C资源的数量为20。
在T0时刻系统状态见下表(T0时刻系统状态表)所示。
系统采用银行家算法实施死锁避免策略。
(12分)T0时刻系统状态表T0时刻系统状态表P2请求资源(0,3,4)(0,1,1)(1)T0时刻是否为安全状态?若是,请给出安全序列。
(2)在T0时刻若进程P2请求资源(0,3,4),是否能实施资源分配?为什么?(3)在(2)的基础上,若进程P4请求资源(2,0,1),是否能实施资源分配?为什么?(4)在(3)的基础上,若进程P1请求资源(0,2,0),是否能实施资源分配?为什么?答:当前的系统状态描述为:⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=4245241104635955C //资源最大需求数量 max ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=413402504204212A //已分配资源数量 alloc⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=-011122600431743A C //还需资源数量 Need()20517=R //资源总量 ()332=V //系统可用资源向量(1)T 0时刻是否为安全状态?若是,请给出安全序列。
在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也能按顺序运行。
计092_陈桂林_09408100228_银行家算法
操作系统设计说明书(题目)银行家算法起止日期:2011 年12月20 日至2011 年12 月26 日学生姓名陈桂林班级计算机092学号09408100228成绩指导教师(签字)计算机与通信学院2011.12.261.银行家算法概论我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;(2) 顾客可以分歧贷款,但贷款的总数不能超过最大需求量;(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
1.1 死锁操作系统课程设计报告死锁是进程死锁的简称,是由Dijkstra于1965年研究银行家算法时首先提出来的。
是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。
很显然,如果没有外力的作用,那麽死锁涉及到的各个进程都将永远处于封锁状态。
它是计算机操作系统乃至并发程序设计中最难处理的问题之一。
实际上,死锁问题不仅在计算机系统中存在,在我们日常生活中它也广泛存在。
在计算机系统中,涉及软件,硬件资源都可能发生死锁。
例如:系统中只有一台CD-ROM驱动器和一台打印机,某一个进程占有了CD-ROM驱动器,又申请打印机;另一进程占有了打印机,还申请CD-ROM。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
银行家算法例题
系统中原有三类资源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-Allocation
AvailableA=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。
(3)T3时刻,P1 Request1=(0,2,0)
//第一步判断条件①满足Request1=(0,2,0)<=Need1(3,4,7)
②满足Request1=(0,2,0)<=Available(2,3,3)
//第二步修改Need、Available、Allocation的值
Available=Available-Request1= (0,1,2) (T2时刻基础上)
Allocation=Allocation1+Request1=(2,3,0)
Need1=Need1-Request1=(3,2,7)
//第三步执行安全算法,找安全序列
对于所有Need i均不小于Work(初值是Available (0,1,2)),找不到安全序列,故系统不能将资源分配给它,P1必须等待。
归纳总结——银行家算法解题总结为四步走:
第一步:判断银行家算法中的条件,看是否满足,如果满足跳转第二步(判断条件)
①Request i<=Need i
②Request i<=Available
第二步:试图分配,修改Need、Available、Allocation的值(修改NAA)Available=Available-Request i
Allocation i=Allocation i+Request i
Need i=Need i-Request i
第三步:执行安全算法,找安全序列(找安全序列)
第四步:找到了安全序列,说明此时系统满足进程P i的请求Request i。
(真分配)系统不会进入不安全状态,可以将Request i分配给进程P
i
修改NAA找安全序列
判断条件真分配。