银行家算法参考

银行家算法参考
银行家算法参考

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()函数:完成对系统运行环境的初始化,定义了简单的选择菜单,调用各功能函数。

●initial()函数:对银行家结构体(银行家所拥有的资源种类和资源数目)初始化,

对进程结构体(进程所需要的资源数目)进行初始化。

●add()函数:创建进程,定义进程运行所需的资源,检查系统提供的资源是否满足

进程所需要的资源,如果满足则分配成功;不满足则分配失败。

●bid()函数:给进程分配资源,检查系统提供的资源是否满足分配进程的资源,如

果满足则分配成功;不满足则分配失败。

●finished()函数:撤销进程,释放进程所占有的全部资源。

●view()函数:查看当前系统进程占用的资源情况和系统中空闲的资源情况。

5 参考源代码

#include

#include

#include

#include

#include

#include

const int MAX_p=20;

const int MAXA=10;//定义A类资源的数量

const int MAXB=5;

const int MAXC=7;

typedef struct node{

int a;

int b;

int c;

int remain_a;

int remain_b;

int remain_c;

}bank;

typedef struct node1{

char name[20];

int a;

int b;

int c;

int need_a;

int need_b;

int need_c;

}process;

bank banker;

process processes[MAX_p];

int quantity;

//初始化函数

void initial()

{

int I;

banker.a=MAXA;

banker.b=MAXB;

banker.c=MAXC;

for(i=0;i

strcpy(processes[i].name,””);

processes[i].a=0;

processes[i].b=0;

processes[i].c=0;

processes[i].need_a=0;

processes[i].need_b=0;

processes[i].need_c=0;

}

}

//新加作业

void add()

{

char name[20];

int flag=0;

int t;

int need_a,need_b,need_c;

int I;

cout<

cout<<“新加作业”<

cout<<“----------------------------------------------”<

cin>>name;

for(i=0;i

if(!strcmp(processes[i].name,name)){

flag=1;

break;

}

}

if(flag){

cout<<“错误,作业已存在”<

}

else{

cout<<“本作业所需A类资源:”;

cin>>need_a;

cout<<“本作业所需B类资源:”;

cin>>need_b;

cout<<“本作业所需C类资源:”;

cin>>need_c;

t=1;

cout<

if(need_a>banker.remain_a){

cout<<“错误,所需A类资源大于银行家所剩A类资源”<

}

if(need_b>banker.remain_b){

cout<<“错误,所需B类资源大于银行家所剩B类资源”<

}

if(need_c>banker.remain_c){

cout<<“错误,所需C类资源大于银行家所剩C类资源”<

}

if(t){

strcpy(processes[quantity].name,name);

processes[quantity].need_a=need_a;

processes[quantity].need.b=need.b;

processes[quantity].need_c=need_c;

quantity++;

cout<<“新加作业成功”<

}

else{

cout<<“新加作业失败”<

}

}

}

//为作业申请资源

void bid()

{

char name[20];

int I,p;

int a,b,c;

int flag;

cout<

cout<<“----------------------------------------------------”<

cout<<“要申请资源的作业名:”;

cin>>name;

p=-1;

for(i=0;i

if(!strcmp(processes[i].name,name)){

p=I;

break;

}

}

if(p!=-1){

cout<<“该作业要申请A类资源数量:”;

cout<<“该作业要申请B类资源数量:”;

cin>>b;

cout<<“该作业要申请C类资源数量:”;

cin>>c;

flag=1;

if((a>banker.remain_a||(a>processes[p].need_a-processes[p].a)){

cout<<“错误,所申请A类资源大于银行家所剩A类资源或该进程还需数量”<

}

if((b>banker.remain_b||(b>processes[p].need_b-processes[p].b)){

cout<<“错误,所申请B类资源大于银行家所剩B类资源或该进程还需数量”<

}

if((c>banker.remain_c||(c>processes[p].need_c-processes[p].c)){

cout<<“错误,所申请C类资源大于银行家所剩C类资源或该进程还需数量”<

}

if(flag){

banker.remain_a-=a;

banker.remain_b-=b;

banker.remain_c-=c;

processes[p].a+=a;

processes[p].b+=b;

processes[p].c+=c;

cout<<“为作业申请资源成功”<

}

else{

cout<<“为作业申请资源失败”<

}

}

else{

cout<<“该作业不存在”<

}

}

// 撤销作业

void finished()

{

char name[20];

int I,p;

cout<

cout<<“---------------------------------------------”<

cout<<“要撤销作业名:”;

cin>>name;

for(i=0;i

if(!strcmp(processes[i].name,name)){

p=I;

break;

}

}

if(p!=-1){

banker.remain_a+=processes[p].a;

banker.remain_b+=processes[p].b;

banker.remain_c+=processes[p].c;

for(i=p;i

processes[i]=processes[i+1];

}

strcpy(processes[quantity-1].name,””);

processes[quantity-1].a=0;

processes[quantity-1].b=0;

processes[quantity-1].c=0;

processes[quantity-1].need_a=0;

processes[quantity-1].need_b=0;

processes[quantity-1].need_c=0;

quantity--;

cout<<“撤销作业成功”<

}

else{

cout<<“撤销作业失败”<

}

}

//查看资源情况

void view()

{

int I;

cout<

cout<<“--------------------------------------------”<

cout<<“银行家所剩资源(剩余资源/总共资源)”<

cout<<“A类:”<

cout<<“B类:”<

cout<<“C类:”<

cout<0){

cout<<“作业名:”<

cout<<“A类:”<

cout<<“B类:”<

cout<<“C类:”<

cout<

}

}

else{

cout<<“当前没有作业”<

}

}

void main()

{

int chioce;

int flag=1;

initial();

while(flag){

cout<<“--------------------------------------------”<

cout<<“1.新加作业2.为作业申请资源3.撤销作业”<

cout<<“请选择:”;

cin>>chioce;

switch(chioce){

case 1:

add();

break;

case 2:

bid();

break;

case 3:

finished();

break;

case 4:

view();

break;

case 0:

flag=0;

break;

default:

cout<<“选择错误”<

}

}

}

课程设计2 银行家算法(参考2)

一、背景知识

在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。

在分配资源时判断是否会出现死锁,如不会死锁,则分配资源。

死锁检测算法保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。主要是检查是否有循环等待.

1 系统安全状态

1)安全状态

所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{ P1 ,P2 …Pn}就是安全序列。如果存在这样一个安全序列,则系统是安全的。

2)安全状态之例

安全序列:P2 →P1→ P3

不安全序列:P1→…

P3→…

P2→P3→P1

3)由安全状态向不安全状态的转换

2 利用银行家算法避免死锁

1)银行家算法中的数据结构

①可利用资源向量Available。

②最大需求矩阵Max。

③分配矩阵Allocation

④需求矩阵Need

2)银行家算法

①一个银行家拥有一定数量的资金,有若干个客户要贷款,每个客户须在一开始就声明他所需贷款的总额,若该客户贷款总额不超过银行家的资金总额,银行家可以接受客户的要求。客户贷款是以每次一个资金单位(如1万RMB等)的方式进行的,客户在借满所需的全部单位款额之前可能会等待,但银行家须保证这种等待是有限的,可完成的。

②安全性算法

利用安全性算法进行检查,如果分配是安全的,则执行分配;否则,分配不安全,不予分配。

具体地,

1)当进程pi提出资源申请时,按照银行家算法分配资源,系统执行下列步骤:(1)若Request≤Need,转(2);否则错误返回

(2)若Request≤Available,转(3);否则进程等待

(3)假设系统分配了资源,则有:

Available:=Available-Request;

Allocation:=Allocation+Request;

Need:=Need-Request

2)若系统新状态是安全的,则分配完成,若系统新状态是不安全的,则恢复原状态,进程等待为进行安全性检查,定义数据结构:

Work:ARRAY[1..m] of integer;

Finish:ARRAY[1..n] of Boolean;

安全性检查的步骤:

(1)Work:=Available;

Finish:=false;

(2)寻找满足条件的i:

a.Finish=false;

b.Need≤Work;

如果不存在,则转(4)

(3) Work:=Work+Allocation;

Finish:=true;转(2)

(4) 若对所有i,Finish=true,则系统处于安全状态,否则处于不安全状态。

二、实验目的

通过模拟实现银行家算法,深入理解死锁避免的意义。

三、实验要求

1 充分理解死锁避免的意义。

2 理解银行家算法和安全性检查算法的实质

3 编写银行家算法模拟程序,实现银行家算法原理。

四、实验步骤

1 编写程序,模拟银行家算法。

2 在上机环境中输入程序,调试,编译。

3 运行程序,得出结果。

2.算法描述

设Request[i] 是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源,当Pi发出资源请求后,系统按下面步骤进行检查:

(1)如果Requesti[j]<=Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Requesti[j]<=Available[j],便转向步骤3;否则,表示尚无足够资源,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)可利用资源向量Available。这是一个含有n个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,

其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中

现有Rj类资源K个。

(2)最大需求矩阵Max。这是一个m*n的矩阵,它定义了系统中n个进程中每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目

为K。

(3)分配矩阵Allocation。这也是一个m*n的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。

(4)需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。

如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

(5) 工作数组Work.。这是一个含有n个元素的数组,它代表可以提供分配的资源数,初

始值是Available中的数值,随着资源的回收,它的值也会改变,公式是

Work[i]=Work[i]+Allocation[i]。

五、附录:参考源程序#include

#include

#include

#include

#define null 0

#define M 3

#define N 5

int mem[3]={10,5,7}; typedef struct proc {

int max[M];

int Need[M];

int All[M];

int WA[M];

int finish;

}proc;

int Ava[3];

proc p[N];

void creat()

{ int i,j,sum;

int args1[5][3]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3}; int args2[5][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2}; int args3[5][3]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int args4[5]={0,0,0,0,0};

for(i=0;i

{p[i].finish=args4[i];

for(j=0;j

p[i].max[j]=args1[i][j];

p[i].WA[j]=args3[i][j];

}

for(i=0;i

for(j=0;j

{p[i].All[j]=args2[i][j];

p[i].Need[j]=p[i].max[j]-p[i].All[j];

}

for(i=0;i

{sum=0;

for(j=0;j

sum+=p[j].All[i];

Ava[i]=mem[i]-sum;

}

}

void print(int i)

{ int j;

printf("\nP[%d] ",i);

for(j=0;j

printf("%2d",p[i].max[j]); printf(" ");

for(j=0;j

printf("%2d",p[i].Need[j]); printf(" ");

for(j=0;j

printf("%2d",p[i].All[j]);

printf(" ");

for(j=0;j

printf("%2d",p[i].WA[j]);

printf(" ");

printf("%d",p[i].finish);

printf("\n");

}

void bank(int t)

{

int i,j,flag,k=0,m=0;

int a[5];

printf("Available=");

for(i=0;i

printf(" %d ",Ava[i]);

printf("\n Max Need Allocation word+Allocation finish\n");

for(j=0;j

p[t].WA[j]=Ava[j];

i=t;

while(k<5&&m<5)

{ flag=1;

for(j=0;j

if(p[i].Need[j]>p[t].WA[j])

flag=0;

if(flag==1)

{for(j=0;j

{p[i].max[j]=p[t].WA[j];

p[i].WA[j]=p[i].max[j]+p[i].All[j];

p[i].finish=1;

}

t=i;

a[k]=i;

k++;

print(i);

}

i++;

if(p[i].finish==1) i++;

if(i>=5) {i=0;m++;}

}

/*flag=1;

for(i=0;i<5;i++)

if(!p[i].finish) {flag=0; break;}

if(flag)*/

if(k==5)

{printf("\nIt can be allocation\n ");

printf("\nthis safe quene is: ");

for(i=0;i<5;i++)

printf("P[%d] ",a[i]);

printf("\n");

}

else printf("\ncan't be allocation!\n"); }

void safe(int t,int req[M])

{ int i,j,flag=1;

for(i=0;i

{if(req[i]>p[t].Need[i])

{flag=0;printf("Error!");break;}

else if(req[i]>Ava[i])

{flag=0;printf("P[%d] waitting!\n",t);break;} }

if(flag)

{for(i=0;i

{p[t].All[i]=p[t].All[i]+req[i];

p[t].Need[i]-=req[i];

Ava[i]=Ava[i]-req[i];

}

bank(t);

}

}

银行家算法习题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)将系统中各种资源总数和此刻各进程对各资源的需求数目用矢量或矩阵表示出来。2)如果此时进程P1和进程P2均发出资源请求矢量Request(1,0,1),为了保证系统的安全性,应如何分配资源给这两个进程?说明所采用策略的原因。 3)如果2)中两个请求立即得到满足后,系统此刻是否处于死锁状态? 5.考虑某个系统在表2-25时刻的状态

银行家算法例题——四步走解题

银行家算法例题 系统中原有三类资源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,以此类推)

用银行家算法实现资源分配

南通大学 杏林学院 操作系统实验(用银行家算法实现资源分配)班级:计121 小组成员:方筱雯1213023008 周徐莲1213023014 指导老师:丁卫平

一:实验目的 为了了解系统的资源分配情况,假定系统的任何一种资源在任一时刻只能被一个进程使用。任何资源已经占用的资源只能由自己释放,而不能由其他进程抢占。当进程申请的资源不能满足时,必须等待。因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。 编写模拟系统进行资源调度的程序,采用银行家算法,有效的避免死锁的产生。模拟进程的分配算法,了解死锁的产生和避免的办法。二:实验要求 (1):为了观察死锁产生和避免的情况,要求设计3到4个并发进程,共享系统的10个同类不可抢占的资源。各进程是动态进行资源的申请和释放。 (2):用银行家算法设计一个资源分配程序,运行这个程序,观察系统运行情况,并对系统运行的每一步进行显示。三:实验流程图

四:源程序 #include #include #include #include #define MaxNumber 100 //定义进程控制块 struct Process_struct{ int Available[MaxNumber]; //可利用资源数组 int Max[MaxNumber][MaxNumber]; //最大需求矩陈 int Allocation[MaxNumber][MaxNumber]; //分配矩陈 int Need[MaxNumber][MaxNumber]; //需求矩陈 int Request[MaxNumber][MaxNumber]; //M个进程还需要N类资源的资源量 int Finish[MaxNumber]; int p[MaxNumber]; }Process; int M,N; //M个进程,N类资源 int i,j,k,l=0; int Work[MaxNumber]; //可利用资源 int Pinput(); int Safe(); int Peques(); //进程输入 int Pinput() { int i,j; cout<<"输入进程的数目:\n"; cin>>M; cout<<"输入资源的种类:\n"; cin>>N; cout<<"输入每个进程最多所需的各类资源数,按照"<>Process.Max[i][j]; cout<<"输入每个进程已经分配的各类资源数,按照"<

银行家算法课程设计

操作系统课程设计报告 题目:银行家算法 安全性算法 院(系):计算机科学与工程 专业:软件工程 班级:130608班 学生:姚骏川 学号:130608118 指导教师:姜虹 2015年12月28

目录 摘要 .............................................................................................................. 错误!未定义书签。 1 绪论 (1) 1.1前言 (1) 1.2研究意义 (1) 2 需求分析 (3) 2.1题目描述 (3) 2.2银行家算法 (3) 2.3基本要求 (3) 2.4目的 (3) 3 概要设计 (5) 3.1算法思路: (5) 3.2银行家算法步骤 (5) 3.3安全性算法步骤 (5) 3.4数据结构: (6) 4 详细设计 (8) 4.1主要函数的核心代码: (8) 4.2系统主要过程流程图 (8) 4.3银行家算法流程图 (9) 5 测试与分析 (10) 5.1测试数据 (10) 5.2银行家算法的演示 (10) 5.3分配资源由于大于可利用资源则失败。 (11) 5.4 增加一个作业得到不安全序列。 (11) 5.5分配资源由于大于最大资源则失败。 (12) 附录源程序清单 (15)

1 绪论 1.1前言 Dijkstra (1965)提出了一种能够避免死锁的调度算法,称为银行家算法。 它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。 这里将客户比作进程,贷款比作设备,银行家比作系统。 客户们各自做自己的生意,在某些时刻需要贷款。在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。如果忽然所有的客户都申请,希望得到最大贷款额,而银行家无法满足其中任何一个的要求,则发生死锁。不安全状态并不一定导致死锁,因为客户未必需要其最大贷款额度,但银行家不敢抱这种侥幸心理。 银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。若是,则不满足该请求;否则便满足。 检查状态是否安全的方法是看他是否有足够的资源满足一个距最大需求最近的客户。如果可以,则这笔投资认为是能够收回的,然后接着检查下一个距最大需求最近的客户,如此反复下去。 如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。1.2研究意义 在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进。 要预防死锁,有摒弃“请求和保持”条件,摒弃“不剥夺”条件,摒弃“环

银行家算法例题

银行家算法例题 假定系统中有五个进程{P0,P1,P2,P3,P4} 和三类资源{A ,B,C},各种资源的数量分别为10、5、7,在T0 时刻的资源分配情况 (1)T0时刻的安全性 利用安全性算法对T0时刻的资源分配情况进行分析 (2)P1请求资源:P1发出请求向量Request1(1,0,2),系统按银行家算法进行检查 ①Request1(1,0,2)≤Need1(1,2,2) ②Request1(1,0,2)≤Available1(3,3,2) ③系统先假定可为P1分配资源,并修改Available ,Allocation1和Need1向量,由此形成 资源情况 进程 Max Allocation Need Available A B C A B C A B C A B C P0 7 5 3 0 1 0 7 4 3 3 3 2 P1 3 2 2 2 0 0 1 2 2 P2 9 0 2 3 0 2 6 0 0 P3 2 2 2 2 1 1 0 1 1 P4 4 3 3 0 0 2 4 3 1 资源情况 进程 Work A B C Need A B C Allocation A B C Work+Allocatio n A B C Finish P1 3 3 2 1 2 2 2 0 0 5 3 2 TRUE P3 5 3 2 0 1 1 2 1 1 7 4 3 TRUE P4 7 4 3 4 3 1 0 0 2 7 4 5 TRUE P2 7 4 5 6 0 0 3 0 2 10 4 7 TRUE P0 10 4 7 7 4 3 0 1 0 10 5 7 TRUE

银行家算法详解

一、课程设计目的和意义 本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。集体要求如下: (1)模拟一个银行家算法; (2)初始化时让系统拥有一定的资源; (3)用键盘输入的方式申请资源; (4)如果预分配后,系统处于安全状态,则修改系统的资源分配情况; (5)如果预分配后,系统处于不安全状态,则提示不能满足请求, 此次课程设计的主要内容时模拟实现动态资源分配。同时要求编写和调试一个系统动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。 银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程张勇;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。通过这个算法可以用来解决生活中的实际问题,如银行贷款等。 二、方案设计及开发过程 (一)银行家算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。 把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁. (二).算法描述 1.银行家算法: 设进程i提出请求Request[n],则银行家算法按如下规则进行判断。 (1)如果Request[n]>Need[i,n],则报错返回。 (2)如果Request[n]>Available,则进程i进入等待资源状态,返回。 (3)假设进程i的申请已获批准,于是修改系统状态: Available=Available-Request

银行家算法报告和代码

1
课程设计(论文)
题 目: 银行家算法 院 (系): 信息与控制工程系 专业班级: 姓 名: 学 号: 指导教师:
2016 年 1 月 15 日
页脚内容 16

1
西安建筑科技大学华清学院课程设计(论文)任务书
专业班级: 学生姓名:
指导教师(签名):
一、课程设计(论文)题目
银行家算法:设计一个 n 个并发进程共享 m 个系统资源的程序以实现银行家算法。
二、本次课程设计(论文)应达到的目的
操作系统课程实践性比较强。课程设计是加强学生实践能力的一个强有力手段。课程设计要求学 生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本 程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
本题目要达到目的:了解多道程序系统中,多个进程并发执行的资源分配。掌握银行家算法,了 解资源在进程并发执行中的资源分配情况。掌握预防死锁的方法,系统安全状态的基本概念。
三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参 数、设计要求等)
要求: 1)能显示当前系统资源的占用和剩余情况。 2)为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 3)撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法, 有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时, 系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量 时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后 归还它所占有的全部资源供其它进程使用。
四、应收集的资料及主要参考文献:
操作系统经典算法的编程实现资料非常丰富,可以在图书馆找书籍或在因特网上找资料,都很容 易找到,但是大部分代码是不全的,不能直接运行,希望大家只是把它当参考,编码还是自己做。
参考文献: 【1】汤小丹、梁红兵、哲凤屏、汤子瀛 编著.计算机操作系统(第三版).西安:西 安电子科技大学出版社,2007.5 【2】史美林编.计算机操作系统教程.北京:清华大学出版社,1999.11 【3】徐甲同编著.操作系统教程.西安:西安电子科技大学出版社,1996.8 【4】Clifford,A.Shaffer 编著.数决结构与算法分析(C++版).北京:电子工业出版 社,2005.7 【5】蒋立翔编著.C++程序设计技能百练.北京:中国铁道出版社,2004.1
五、审核批准意见
教研室主任(签字)
1 页脚内容

实验二 银行家算法

实验四银行家算法 一、实验目的 1.理解死锁避免相关内容; 2.掌握银行家算法主要流程; 3.掌握安全性检查流程。 操作系统中的死锁避免部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。 二、实验设备 PC机、windows 操作系统、VC++6.0 三、实验要求 本实验要求3学时完成。 1.设计多个资源(≥3); 2.设计多个进程(≥3); 3.设计银行家算法相关的数据结构; 4.动态进行资源申请、分配、安全性检测并给出分配结果。 5.撰写实验报告,并在实验报告中画出银行家算法和和安全性检查算法流程图。 四、预备知识 死锁避免定义:在系统运行过程中,对进程发出的每一个资源申请进行动态检查,并根据检查结果决定是否分配资源:若分配后系统可能发生死锁,则不予分配,否则予以分配。 由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。 1 系统安全状态 1)安全状态 所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{ P1 ,P2 …Pn}就是安全序列。如果存在

这样一个安全序列,则系统是安全的。 并非所有的不安全状态都会转为死锁状态,但当系统进入不安全状态后,便有可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。所以避免死锁的实质:系统在进行资源分配时,如何使系统不进入不安全状态。 2)安全状态之例 假设系统有三个进程,共有12台磁带机。各进程的最大需求和T0时刻已分配情况如下表: 答:T0时刻是安全的,因为存在安全序列:P2 →P1→ P3 不安全序列:P1→… P3→… P2→P3→P1 3)由安全状态向不安全状态的转换 如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。例如,在T0时刻以后,P3又请求1台磁带机,若此时系统把剩余3台中的1台分配给P3,则系统便进入不安全状态。因为,此时也无法再找到一个安全序列,例如,把其余的2台分配给P2,这样,在P2完成后只能释放出4台,既不能满足P1尚需5台的要求,也不能满足P3尚需6台的要求,致使它们都无法推进到完成,彼此都在等待对方释放资源,即陷入僵局,结果导致死锁。 2 利用银行家算法避免死锁 1)银行家算法中的数据结构 ①可利用资源向量Available。 这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该

《银行家算法的模拟实现》—实验报告

《银行家算法的模拟实现》 --实验报告 题目: 银行家算法的模拟实现 专业: 班级: 组员: 指导老师:

一、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 二、实验内容 模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。 三、实验分析过程 1、整个银行家算法的思路。 先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。 1)进程一开始向系统提出最大需求量. 2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量. 3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待 2、算法用到的主要数据结构和C语言说明。 (1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。 (2)、最大需求矩阵INT MAX[N][M] N为进程的数量。 (3)、已分配矩阵INT ALLOCA TION[N][M] (4)、还需求矩阵INT NEED[N][N] (5)、申请各类资源数量int Request[x]; // (6)、工作向量int Work[x]; (7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是 3、银行家算法(主程序) (1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等 (2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。 (3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量 (4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=A V ALIABLE[I,J]。 如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句) (5)、进行资源的预分配,语句如下: A V ALIBLE[I][J]= A V ALIBLE[I][J]-K; ALLOCATION[I][J]= ALLOCATION[I][J]+K; NEED[I][J]=NEED[I][J]-K;

银行家算法安全性序列分析

银行家算法安全性序列分析 摘要:在操作系统的处理机调度的过程中,由于竞争资源或者进程间推进顺序非法,都会导致死锁的发生。本文主要研究如何利用银行家算法可以避免死锁,并分析银行家算法安全性序列。 关键词:银行家算法;安全性序列;避免死锁 引言 处理死锁的方法主要包括预防死锁、避免死锁、检测死锁和解除死锁。而利用银行家算法可以避免死锁,在这一避免死锁的过程中,银行家算法安全性序列分析是尤为重要的。 1. 银行家算法中的数据结构 (1)空闲资源向量Available。这是一个数组,它里面包括m个元素,这些元素都可以分别用来表示一种空闲的资源的数量的多少,系统中存储的这种全部空闲的资源的数量的多少为它的初始值,随该类资源的分配和回收,其数值发生动态地改变。如果Available[j]=K,那么,系统中当前存在K个Rj类资源。 (2)最大需求矩阵Max。Max矩阵是n×m维的,该矩阵定义了系统中n 个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,那么,进程i需要Rj类资源的最大数量的多少为K。 (3)分配矩阵Allocation。Allocation矩阵是n×m维的,该矩阵定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,那么,进程i当前已分得Rj类资源的数量的多少为K。 (4)需求矩阵Need。Need矩阵是n×m维的,该矩阵定义了所有进程仍然需求的各类资源数。如果Need[i,j]=K,那么,为了能够完成其任务,进程i还需要Rj类资源K个。 Need[i,j]=Max[i,j]-Allocation[i,j] 2. 银行家算法 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要 K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:(1)如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数大于它仍然需要的最大值。

操作系统课程设计(银行家算法的模拟实现)

操作系统课程设计 (银行家算法的模拟实现) 一、设计目的 1、进一步了解进程的并发执行。 2、加强对进程死锁的理解。 3、用银行家算法完成死锁检测。 二、设计内容 给出进程需求矩阵C、资源向量R以及一个进程的申请序列。使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况。 三、设计要求 1、初始状态没有进程启动。 2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。 3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。 4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请。 四、算法原理 1、银行家算法中的数据结构

(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] 2、银行家算法应用 模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。 (1)银行家算法(扫描) 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Ri类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: ①如果Requesti[j]<=Need[i,j],便转向步骤②;否则认为出错,

操作系统实验四-银行家算法

银行家算法 xxx 711103xx 2012年5月21日一、实验目的 通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。 二、实验内容 1. 在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。 2. 创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。 3. 通过Win32 API提供的信号量机制,实现共享数据的并发访问。 三、实验步骤(设计思路和流程图) 最主要的用以实现系统功能的应该有两个部分,一是用银行家算法来判断,二是用安全性算法来检测系统的安全性。 1、银行家算法 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi 需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

(1) 如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。 (2) 如果Requesti[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,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等待。 2、安全性算法 (1) 设置两个向量:①Work∶=Available; ②Finish (2) 从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false; ②Need[i,j]≤Work[j];若找到,执行步骤(3),否则,执行步骤(4)。(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]∶=Work[i]+Allocation[i,j]; Finish[i]∶=true; go to step 2; (4) 如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

银行家算法

操作系统原理 课程设计 课程名称:死锁的避免;模拟银行家算法 专业班级:14级信管2班 组长:赵贤杰 成员:云靖宿熙隆 指导教师:付维娜 2016 / 2017 学年第 2 学期 【设计题目】

死锁的避免;银行家算法 【设计目标】 (1)进一步理解利用银行家算法避免死锁的问题; (2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。 (3)理解和掌握安全序列、安全性算法 (4)了解和理解死锁; (5)理解利用银行家算法避免死锁的原理; (6)会使用某种编程语言。 【设计原理】 一、安全状态 指系统能按照某种顺序如(称为序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。 二、银行家算法 假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。系统按下述步骤进行安全检查: 如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。 如果Requesti≤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 等待。 三、安全性算法 设置两个向量: ①工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work∶=Available; ② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]∶=false; 当有足够资源分配给进程时,再令Finish[i]∶=true。 从进程集合中找到一个能满足下述条件的进程: ① Finish[i]=false; ② Need[i,j]≤Work[j];若找到,执行步骤(3),否则,执行步骤(4)。(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j]∶=Work[i]+Allocation[i,j];

编程序模拟银行家算法

武汉理工大学华夏学院课程设计报告书 课程名称:操作系统原理 题目:编程序模拟银行家算法 系名:信息工程系 专业班级:软件1121 姓名:钟伟 学号:10212812120 指导教师:苏永红 2014年 6 月13 日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:操作系统原理课程设计指导教师:苏永红 班级名称:软件1121 开课系、教研室:软件与信息安全 一、课程设计目的与任务 操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题 和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。 学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。 二、课程设计的内容与基本要求 1、课程设计题目 编程序模拟银行家算法 2、课程设计内容 本课程设计要求在Linux操作系统,GCC编译环境下开发。 银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统 环境下编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存 资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家 对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借 款后能在有限的时间内归还。用银行家算法分配资源时,测试进程对资源的最大需求量,若 现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个 进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限 的时间内得到所需资源则称系统处于安全状态。 3、设计报告撰写格式要求: 1设计题目与要求 2 设计思想 3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明 6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况) 7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;

银行家算法例子+答案

1、设系统中有3种类型的资源(A , B , C )和5个进程P1、P 2、P3 P4 P5, A 资源的数量为 17, B 资源的数量为5, C 资源的数量为20。在T o 时刻系统状 态见下表(T o 时刻系统状态表)所示。系统米用银行家算法实施死锁避免策 略。(12分) T o 时刻系统状态表 T0时刻系统状态表 (1) T o 时刻是否为安全状态?若是,请给出安全序列。 (2) 在T o 时刻若进程P2请求资源(0, 3, 4),是否能实施资源分配?为 什么? 满足P5的运行,在P5运行后,系统的状态为: 2 1 2 3 4 7 4 o 2 1 3 4 A 4 o 5 C A o o 6 V' 5 4 7 2 o 4 2 2 1 o o o o o o 同样的, 在 P5运行后,V ' (5, 4, 7)也大于等于 C-A 中P4所在的行(2, 2, 1),则能满 足P4的运行。P4运行后,系统的状态为: ⑷ 在(3) 的基; 础上, 若进程 P1 请求资源(o , 2, o ),是否能实施资源 分配?为什么 ,? 答: 当前 的系 统状态描述为: 5 5 9 2 1 2 3 4 7 5 3 6 4 o 2 1 3 4 C 4 o 11 A 4 o 5 C A o o 6 4 2 5 2 o 4 2 2 1 4 2 4 3 1 4 1 1 o R 17 5 2o V 2 3 3 (3)在(2)的基础上,若进程 分配?为什么? P4请求资源(2, o , 1),是否能实施资源 (1) 在To 时刻,由于V (2, 3, 3)大于等于(C-A )中P5所在行的向量(1 , 1 ,。),因此V 能

银行家算法的实现

实验四银行家算法的实现 1、实验目的 通过编写和调试银行家算法的模拟程序以加深对避免死锁方案的理解。熟悉银行家算法的分配思想。 2、实验要求 设计一个银行家方案。并编写模拟程序实现之。已知系统总共的资源数、进程名、进程已分配的资源、进程运行完毕最大最资源的需求量,以书上例题为例,分析某一时刻系统的安全状态,如果安全,输出安全序列。 3、算法描述 银行家算法中数据结构如下: n :系统中的进程个数; m :系统中的资源类数。 1)Available(m):现有资源向量。 Available(j)=k表示k个未分配的j类资源 2)Max(n,m):资源最大申请量矩阵。 Max(i,j)=k表示第i个进程在运行过程中对第j类资源的最大申请量为k。 3)Allocation(n,m):资源分配矩阵。 Allocation(i,j)=k表示进程i已占有k个j类资源。 4)Need(n,m):进程以后还需要的资源矩阵。 Need(i,j)=k表示进程i以后还需要k个第j类资源。 显然有Need[i,j]=Max[i,j]-Allocation[i,j]。 5)Request(n,m):进程申请资源矩阵。 Request(i,j)=k表示进程i申请k个第j类资源。 银行家算法思想如下: 若进程i申请资源,申请资源向量为Request(i),则有如下资源分配过程: 1)如果Request(i)〉Need(i),则报错返回。 2)如果Request(i)〉Avaliable,则进程i进入等待资源状态,返回。 3)假设进程进程i的申请已获批准,于是修改系统状态: Avaliable=Avaliable-Request(i) Allocation(i)=Allocation(i)+Request(i) Need(i)=Need(i)-Request(i) 4)调用安全状态检查算法。 设Work(m)为临时工作向量。初始时Work=Available。令N={1,2,……n}。 寻求j∈N 使其满足:Need(j)<=Work,若不存在这样的j则转至3)。 Work=Work+Allocation(j)N=N-{j} 转至1)。 如果N=空集则返回(系统安全)。如果N≠空集则返回(系统不安全)。 5)若系统处于安全状态,则将进程i申请的资源分配给进程i,返回。 6)若系统处于不安全状态,则不将进程i申请的资源分配给进程i,恢复原来的资源分配状态,让进程i等待。 Avaliable = Avaliable + Request(i) Allocation(i)=Allocation(i)-Request(i) Need(i)=Need(i)+ Request(i) 4、源程序代码

银行家算法C++代码

#include #include #include #define False 0 #define True 1 int 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;//作业的最大数 int N;//资源的最大数 int Sum[50]={0}; void init() { int i,j,flag; char ming; cout<<"请首先输入系统可供资源种类的数量:"; cin>>N; for(i=0;i>ming; name[i]=ming; cout<<"资源的数量:"; cin>>Sum[i]; } cout<>M; cout<<"请输入各进程的最大需求量("<>Max[i][j]; do{ flag=0; cout<<"请输入各进程已经申请的资源量("<>Allocation[i][j];

银行家算法的java编程实现

/*死锁避免和死锁检测模拟程序【银行家算 法】网络工程06-3班学号:310609040308*/ import java.util.*; public class TestTheBanker { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); TheBanker tb = new TheBanker(); tb.deadlockAvoidance();//死锁避免 int gate = 1; while(gate!=0){ tb.deadlockDetection();//死锁检测 System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\""); System.out.print("您输入的值为:"); gate = scanner.nextInt(); System.out.println(); } System.out.println("使用愉快!期待您下次使用!"); } } class TheBanker{ int m; int n; int[][] max; int[][] maxbak;//备份用 int[][] allocation; int[][] allocationbak;//备份用 int[][] need; int[][] needbak;//备份用 int[] available; int[] availablebak;//备份用 public TheBanker(){ Scanner s = new Scanner(System.in); System.out.println("初始化=============="); System.out.print("请依次输入系统中的【进程数】和【资源类型数】:"); m = s.nextInt(); n = s.nextInt(); max =new int[m][n];

相关文档
最新文档