银行家算法用C语言编写.全部程序

银行家算法

银行家算法是一种最有代表性的避免死锁的算法。

要解释银行家算法,必须先解释操作系统安全状态和不安全状态。

安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。

不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。

那么什么是安全序列呢?

安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。 算法:

n:系统中进程的总数

m:资源类总数

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

Max: ARRAY[1..n,1..m] of integer;

Allocation: ARRAY[1..n,1..m] of integer;

Need: ARRAY[1..n,1..m] of integer;

Request: ARRAY[1..n,1..m] of integer;

符号说明:

Available 可用剩余资源

Max 最大需求

Allocation 已分配资源

Need 需求资源

Request 请求资源

当进程pi提出资源申请时,系统执行下列

步骤:(“=”为赋值符号,“==”为等号)

step(1)若Request

step(2)若Request

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

Available=Available-Request;

Allocation=Allocation+Request;

Need=Need-Request

若系统新状态是安全的,则分配完成

若系统新状态是不安全的,则恢复原状态,进程等待

为进行安全性检查,定义数据结构:

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

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

安全性检查的步骤:

step (1):

Work=Available;

Finish=false;

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

a.Finish==false;

b.Need

如果不存在,goto step(4)

step(3)

Work=Work+Allocation;

Finish=true;

goto step(2)

step (4) 若对所有i,Finish=true,则系统处于安全状态,否则处于不安全状态 /* 银行家算法,操作系统概念(OS concepts Six Edition)

reedit by Johnny hagen,SCAU,run at vc6.0

*/

#include

#include

#include

#define alloclen sizeof(struct allocation)

#define maxlen sizeof(struct max)

#define avalen sizeof(struct available)

#define needlen sizeof(struct need)

#define finilen sizeof(struct finish)

#define pathlen sizeof(struct path)

struct allocation

{

int value;

struct allocation *next;

};

struct max

{

int value;

struct max *next;

};

struct available /*可用资源数*/

{

int value;

struct available *next;

};

struct need /*需求资源数*/

{

int value;

struct need *next;

};

struct path

{

int value;

struct path *next;

};

struct finish

{

int stat;

struct finish *next;

};

int main()

{

int row,colum,status=0,i,j,t,temp,processtest;

struct allocation *allochead,*alloc1,*alloc2,*alloctemp;

struct max *maxhead,*maxium1,*maxium2,*maxtemp;

struct available

*avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1; struct need *needhead,*need1,*need2,*needtemp;

struct finish *finihead,*finish1,*finish2,*finishtemp;

struct path *pathhead,*path1,*path2;

printf(

scanf(

printf(

scanf(

printf(

for(i=0;i

{

for (j=0;j

{

printf(

if(status==0)

{

allochead=alloc1=alloc2=(struct allocation*)malloc(alloclen);

alloc1->next=alloc2->next=NULL;

scanf(

status++;

}

else

{

alloc2=(struct allocation *)malloc(alloclen);

scanf(

if(status==1)

{

allochead->next=alloc2;

status++;

}

alloc1->next=alloc2;

alloc1=alloc2;

}

}

}

alloc2->next=NULL;

status=0;

printf(

for(i=0;i

{

for (j=0;j

{

printf(

if(status==0)

{

maxhead=maxium1=maxium2=(struct max*)malloc(maxlen);

maxium1->next=maxium2->next=NULL;

scanf(

status++;

}

else

{

maxium2=(struct max *)malloc(maxlen);

scanf(

if(status==1)

{

maxhead->next=maxium2;

status++;

}

maxium1->next=maxium2;

maxium1=maxium2;

}

}

maxium2->next=NULL;

status=0;

printf(

for (j=0;j

{

printf(

if(status==0)

{

avahead=available1=available2=(struct available*)malloc(avalen); workhead=work1=work2=(struct available*)malloc(avalen);

available1->next=available2->next=NULL;

work1->next=work2->next=NULL;

scanf(

work1->value=available1->value;

status++;

}

else

{

available2=(struct available*)malloc(avalen);

work2=(struct available*)malloc(avalen);

scanf(

work2->value=available2->value;

if(status==1)

{

avahead->next=available2;

workhead->next=work2;

status++;

}

available1->next=available2;

available1=available2;

work1->next=work2;

work1=work2;

}

}

available2->next=NULL;

work2->next=NULL;

status=0;

alloctemp=allochead;

maxtemp=maxhead;

for(i=0;i

for (j=0;j

if(status==0)

{

needhead=need1=need2=(struct need*)malloc(needlen);

need1->next=need2->next=NULL;

need1->value=maxtemp->value-alloctemp->value;

status++;

}

else

{

need2=(struct need *)malloc(needlen);

need2->value=(maxtemp->value)-(alloctemp->value);

if(status==1)

{

needhead->next=need2;

status++;

}

need1->next=need2;

need1=need2;

}

maxtemp=maxtemp->next;

alloctemp=alloctemp->next;

}

need2->next=NULL;

status=0;

for(i=0;i

{

if(status==0)

{

finihead=finish1=finish2=(struct finish*)malloc(finilen);

finish1->next=finish2->next=NULL;

finish1->stat=0;

status++;

}

else

{

finish2=(struct finish*)malloc(finilen);

finish2->stat=0;

if(status==1)

{

finihead->next=finish2;

status++;

finish1->next=finish2;

finish1=finish2;

}

}

finish2->next=NULL; /*Initialization compleated*/

status=0;

processtest=0;

for(temp=0;temp

{

alloctemp=allochead;

needtemp=needhead;

finishtemp=finihead;

worktemp=workhead;

for(i=0;i

{

worktemp1=worktemp;

if(finishtemp->stat==0)

{

for(j=0;jnext,worktemp=worktemp->next) if(needtemp->valuevalue)

processtest++;

if(processtest==colum)

{

for(j=0;j

{

worktemp1->value+=alloctemp->value;

worktemp1=worktemp1->next;

alloctemp=alloctemp->next;

}

if(status==0)

{

pathhead=path1=path2=(struct path*)malloc(pathlen);

path1->next=path2->next=NULL;

path1->value=i;

status++;

}

else

{

path2=(struct path*)malloc(pathlen);

path2->value=i;

if(status==1)

pathhead->next=path2; status++;

}

path1->next=path2;

path1=path2;

}

finishtemp->stat=1;

}

else

{

for(t=0;t

alloctemp=alloctemp->next; finishtemp->stat=0;

}

}

else

for(t=0;t

{

needtemp=needtemp->next; alloctemp=alloctemp->next; }

processtest=0;

worktemp=workhead;

finishtemp=finishtemp->next; }

}

path2->next=NULL;

finishtemp=finihead;

for(temp=0;temp

if(finishtemp->stat==0)

{

printf(

}

finishtemp=finishtemp->next; }

printf(

{

printf(

while(pathhead=pathhead->next); printf(

return 0;

}

银行家算法

银行家算法是一种最有代表性的避免死锁的算法。

要解释银行家算法,必须先解释操作系统安全状态和不安全状态。

安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。

不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。

那么什么是安全序列呢?

安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。 算法:

n:系统中进程的总数

m:资源类总数

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

Max: ARRAY[1..n,1..m] of integer;

Allocation: ARRAY[1..n,1..m] of integer;

Need: ARRAY[1..n,1..m] of integer;

Request: ARRAY[1..n,1..m] of integer;

符号说明:

Available 可用剩余资源

Max 最大需求

Allocation 已分配资源

Need 需求资源

Request 请求资源

当进程pi提出资源申请时,系统执行下列

步骤:(“=”为赋值符号,“==”为等号)

step(1)若Request

step(2)若Request

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

Available=Available-Request;

Allocation=Allocation+Request;

Need=Need-Request

若系统新状态是安全的,则分配完成

若系统新状态是不安全的,则恢复原状态,进程等待

为进行安全性检查,定义数据结构:

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

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

安全性检查的步骤:

step (1):

Work=Available;

Finish=false;

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

a.Finish==false;

b.Need

如果不存在,goto step(4)

step(3)

Work=Work+Allocation;

Finish=true;

goto step(2)

step (4) 若对所有i,Finish=true,则系统处于安全状态,否则处于不安全状态 /* 银行家算法,操作系统概念(OS concepts Six Edition)

reedit by Johnny hagen,SCAU,run at vc6.0

*/

#include

#include

#include

#define alloclen sizeof(struct allocation)

#define maxlen sizeof(struct max)

#define avalen sizeof(struct available)

#define needlen sizeof(struct need)

#define finilen sizeof(struct finish)

#define pathlen sizeof(struct path)

struct allocation

{

int value;

struct allocation *next;

};

struct max

{

int value;

struct max *next;

};

struct available /*可用资源数*/

{

int value;

struct available *next;

};

struct need /*需求资源数*/

{

int value;

struct need *next;

};

struct path

{

int value;

struct path *next;

};

struct finish

{

int stat;

struct finish *next;

};

int main()

{

int row,colum,status=0,i,j,t,temp,processtest;

struct allocation *allochead,*alloc1,*alloc2,*alloctemp;

struct max *maxhead,*maxium1,*maxium2,*maxtemp;

struct available

*avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1; struct need *needhead,*need1,*need2,*needtemp;

struct finish *finihead,*finish1,*finish2,*finishtemp;

struct path *pathhead,*path1,*path2;

printf(

scanf(

printf(

scanf(

printf(

for(i=0;i

{

for (j=0;j

{

printf(

if(status==0)

{

allochead=alloc1=alloc2=(struct allocation*)malloc(alloclen);

alloc1->next=alloc2->next=NULL;

scanf(

status++;

}

else

{

alloc2=(struct allocation *)malloc(alloclen);

scanf(

if(status==1)

{

allochead->next=alloc2;

status++;

}

alloc1->next=alloc2;

alloc1=alloc2;

}

}

}

alloc2->next=NULL;

status=0;

printf(

for(i=0;i

{

for (j=0;j

{

printf(

if(status==0)

{

maxhead=maxium1=maxium2=(struct max*)malloc(maxlen);

maxium1->next=maxium2->next=NULL;

scanf(

status++;

}

else

{

maxium2=(struct max *)malloc(maxlen);

scanf(

if(status==1)

{

maxhead->next=maxium2;

status++;

}

maxium1->next=maxium2;

maxium1=maxium2;

}

}

maxium2->next=NULL;

status=0;

printf(

for (j=0;j

{

printf(

if(status==0)

{

avahead=available1=available2=(struct available*)malloc(avalen); workhead=work1=work2=(struct available*)malloc(avalen);

available1->next=available2->next=NULL;

work1->next=work2->next=NULL;

scanf(

work1->value=available1->value;

status++;

}

else

{

available2=(struct available*)malloc(avalen);

work2=(struct available*)malloc(avalen);

scanf(

work2->value=available2->value;

if(status==1)

{

avahead->next=available2;

workhead->next=work2;

status++;

}

available1->next=available2;

available1=available2;

work1->next=work2;

work1=work2;

}

}

available2->next=NULL;

work2->next=NULL;

status=0;

alloctemp=allochead;

maxtemp=maxhead;

for(i=0;i

for (j=0;j

if(status==0)

{

needhead=need1=need2=(struct need*)malloc(needlen);

need1->next=need2->next=NULL;

need1->value=maxtemp->value-alloctemp->value;

status++;

}

else

{

need2=(struct need *)malloc(needlen);

need2->value=(maxtemp->value)-(alloctemp->value);

if(status==1)

{

needhead->next=need2;

status++;

}

need1->next=need2;

need1=need2;

}

maxtemp=maxtemp->next;

alloctemp=alloctemp->next;

}

need2->next=NULL;

status=0;

for(i=0;i

{

if(status==0)

{

finihead=finish1=finish2=(struct finish*)malloc(finilen);

finish1->next=finish2->next=NULL;

finish1->stat=0;

status++;

}

else

{

finish2=(struct finish*)malloc(finilen);

finish2->stat=0;

if(status==1)

{

finihead->next=finish2;

status++;

finish1->next=finish2;

finish1=finish2;

}

}

finish2->next=NULL; /*Initialization compleated*/

status=0;

processtest=0;

for(temp=0;temp

{

alloctemp=allochead;

needtemp=needhead;

finishtemp=finihead;

worktemp=workhead;

for(i=0;i

{

worktemp1=worktemp;

if(finishtemp->stat==0)

{

for(j=0;jnext,worktemp=worktemp->next) if(needtemp->valuevalue)

processtest++;

if(processtest==colum)

{

for(j=0;j

{

worktemp1->value+=alloctemp->value;

worktemp1=worktemp1->next;

alloctemp=alloctemp->next;

}

if(status==0)

{

pathhead=path1=path2=(struct path*)malloc(pathlen);

path1->next=path2->next=NULL;

path1->value=i;

status++;

}

else

{

path2=(struct path*)malloc(pathlen);

path2->value=i;

if(status==1)

pathhead->next=path2; status++;

}

path1->next=path2;

path1=path2;

}

finishtemp->stat=1;

}

else

{

for(t=0;t

alloctemp=alloctemp->next; finishtemp->stat=0;

}

}

else

for(t=0;t

{

needtemp=needtemp->next; alloctemp=alloctemp->next; }

processtest=0;

worktemp=workhead;

finishtemp=finishtemp->next; }

}

path2->next=NULL;

finishtemp=finihead;

for(temp=0;temp

if(finishtemp->stat==0)

{

printf(

}

finishtemp=finishtemp->next; }

printf(

{

printf(

while(pathhead=pathhead->next); printf(

return 0;

}


相关内容

  • 设计题目要求举例
  • 数据结构课程设计题目 地图着色 马踏棋盘 栈的实现 八皇后算法 车厢调度 公园导游图 通讯录实现 同学录实现 导游系统实现 最小生成树实现 统计成绩系统 利用学到的编程知识和编程技巧,通过布置具有一定难度的程序设计题目,让学生自己到图书馆查阅资料或网上咨询独立完成程序的编写,并能运用学过的技巧独立上 ...

  • 银行家算法模拟
  • 实验四 银行家算法模拟 [开发语言及实现平台或实验环境] C++/C# Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET 2003 [实验目的] (1)进一步理解利用银行家算法避免死锁的问题: (2)在了解和掌握银行家算法. (3)理 ...

  • 高中信息技术必修[习题答案]
  • 高一信息技术必修模块考试复习提纲 第一章 信息与信息技术 [考点]理解信息的基本概念描述信息的基本特征,了解信息技术的历史和发展趋势 [涉及教材章节]<信息技术基础>第一章 第一.二节 1. 信息的基本概念p3:利用文字.符号.声音.图形.图像等形式作为载体,通过各种渠道传播的内容称之为 ...

  • 银行家算法
  • 实验三银行家算法 1. 实验目的 根据银行家算法的思想,编写程序,解决并发进程的死锁问题. 背景知识: 本实验要求设计并实现银行家算法.银行家算法是死锁避免的经典算法,其核心思想是:进程动态地申请资源,每次申请资源时系统都执行安全状态检查算法判断本次申请是否会造成系统处于不安全状态,如果不安全则阻塞 ...

  • 获取信息的步骤是
  • 获取信息的步骤是( ) ①采集信息②确定信息来源③保存信息④确定信息需求 A. ④②①③ B. ②④①③ C. ①③②④ D. ①③④② Excel工作表中的某个区域由A2.A3.A4.B2.B3.B4六个单元格组成,不能表示该区域 的是( ) A. A2:B2 B. B4:A2 C. A2:B4 ...

  • 030Java编程如何描述算法
  • Java 编程如何描述算法 算法的描述方法有很多,有自然语言.传统流程图.N-S 结构化流程图和伪代码.自然语言就是4.1.1节中使用的表述方法,使用自然语言描述算法虽然通俗易懂,但容易出现歧义,而且在表示分支和循环时很不方便.因此,下面将对其他三种描述方式进行介绍. 知识点: 1.算法,实际上就是 ...

  • 程序与程序设计语言
  • 程序与程序设计语言 一.教学目标 1.知识与技能 (1)理解程序的概念.特征和三种基本结构. (2)理解程序的编辑和翻译的意义. 2.方法与过程 掌握程序的编辑技能和方法 3. 情感态度和价值观 关注程序设计的意义.关注程序设计语言的发展. 二.重点难点 理解程序的概念.特征和三种基本结构.掌握程序 ...

  • 程序设计基础(知识点)
  • 第三部分 程序设计基础 3.1 程序.程序设计.程序设计语言的定义 ⑴程序:计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列. ⑵程序设计:程序设计是给出解决特定问题程序的过程,是软件构造 ...

  • 软件开发详细设计说明书
  • 编号:_________________ 版本:_________________ 详细设计说明书 委托单位承办单位  编写签名_________________ 复查签名_________________ 批准签名_________________ 年 月 ...