银行家算法实现报告.docx

上传人:b****6 文档编号:7927455 上传时间:2023-01-27 格式:DOCX 页数:26 大小:247.84KB
下载 相关 举报
银行家算法实现报告.docx_第1页
第1页 / 共26页
银行家算法实现报告.docx_第2页
第2页 / 共26页
银行家算法实现报告.docx_第3页
第3页 / 共26页
银行家算法实现报告.docx_第4页
第4页 / 共26页
银行家算法实现报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

银行家算法实现报告.docx

《银行家算法实现报告.docx》由会员分享,可在线阅读,更多相关《银行家算法实现报告.docx(26页珍藏版)》请在冰豆网上搜索。

银行家算法实现报告.docx

银行家算法实现报告

淮阴工学院

操作系统课程设计报告

选题名称:

银行家算法的模拟实现

系(院):

经济管理学院

专业:

班级:

姓名:

学号:

姓名:

学号:

姓名:

学号:

指导教师:

学年学期:

2013~2014学年第一学期

2013年12月24日

设计任务书

课题

名称

银行家算法的模拟实现

设计

目的

1.理解死锁避免相关内容。

2.掌握银行家算法主要流程。

3.掌握安全性检查流程。

实验

环境

 

1.硬件:

PC机,奔腾IV以上CPU,512MB以上内存,80G以上硬盘。

2.软件:

Windows2000/XP、MicrosoftVisualC++6.0。

任务

要求

1.搜集银行家算法的模拟实现可能涉及到的知识和相关资料。

2.应用MicrosoftVisualC++6.0集成开发环境,设计并实现一个银行家算法的模拟程序。

3.确保银行家算法的模拟程序能正确运行。

4.参加答辩,撰写课程设计报告。

工作进度计划

序号

起止日期

工作内容

1

2013.12.14

课题任务下达,查阅文献资料

2

2013.12.15~2013.12.17

课题总体设计、素材搜集与处理

3

2013.12.18~2013.12.20

课题详细设计、调试、完善设计

4

2013.12.21

答辩,撰写报告

指导教师(签章):

年月日

 

摘要:

通常情况下,计算机的资源有限,比如,只有一台打印机或者只有有限的内存,并且有很多资源是独占性的资源,在任意时刻这些资源只能被一个程序占用,一旦这些资源被多个程序同时访问,就会引发程序对资源的竞争,容易引起“死锁”现象。

银行家算法便是针对死锁而诞生的。

银行家算法是操作系统中采用避免死锁策略来解决死锁问题的一种算法。

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

在避免死锁方法中允许进程动态地申请资源,但系统在资源分配之前,应先计算此次分配资源的安全性,若系统资源分配不会导致系统进入不安全状态,则分配,否则等待。

所以,只要使系统始终处于安全状态下,便可以避免死锁的发生。

死锁有产生的必要条件,根据避免死锁的策略,再根据银行家算法流程,结合安全性算法,在诸进程中找到一个顺利执行完毕的安全序列,然后解决操作系统中由于资源分配不当而产生的死锁问题以及深入解析了银行家算法的根本原理【2】。

在该文简介绍了死锁的原理,对解决多个资源下死锁问题的银行家算法进行了讨论,并用C语言对其进行了简单的模拟【1】。

 

关键词:

银行家算法,死锁策略,多资源竞争,安全性算法

 

课程目的1

需求分析2

课程设计题目2.1

课程设计任务及要求2.2

课程设计思想2.3

软硬件运行环境及开发工具2.4

概要设计3

银行家算法的系统模块3.1

程序结构分析3.2

程序流程图3.2.1

原理3.3

死锁3.3.1

整个银行家算法的思路3.3.2

银行家算法的数据结构3.3.3

银行家算法3.3.4

安全性算法的描述3.3.5

详细设计4

调试与操作说明5

数据结构说明原理5.1

程序代码原理5.2

调试原理5.3

 

 

1课程目的

1)理解死锁避免相关内容

2)掌握银行家算法主要流程

3)掌握安全性检查流程

2需求分析

2.1课程设计题目:

银行家算法的模拟实现

2.2课程设计任务及要求:

了解进程产生死锁原因,了解为什么要进行死锁的避免。

掌握银行家算法的数结构,了解算法的执行过程,加深对银行家算法的理解。

2.3课程设计思想:

当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。

若能,则让进程等待,否则,让进程的假分配变为真分配【11】。

2.4软硬件运行环境及开发工具:

硬件:

PC机,奔腾IV以上CPU,512MB以上内存,80G以上硬盘。

软件:

Windows2000/XP、MicrosoftVisualC++6.0。

3概要设计

3.1银行家算法的系统模块

 

3.2程序结构分析

3.2.1程序流程图

1)系统主要过程流程图

2)银行家算法流程图

 

3)安全性算法流程图

3.3原理

3.3.1死锁

1)死锁概念

在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。

所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程【6】。

2)关于死锁的一些结论:

参与死锁的进程最少是两个:

(两个以上进程才会出现死锁)

参与死锁的进程至少有两个已经占有资源

参与死锁的所有进程都在等待资源

参与死锁的进程是当前系统中所有进程的子集

注:

如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。

1)产生死锁的四个必要条件:

①互斥使用(资源独占)

一个资源每次只能给一个进程使用。

②不可强占(不可剥夺)

资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放。

③请求和保持(部分分配,占有申请)

一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)。

④循环等待

存在一个进程等待队列:

{P1,P2,…,Pn}

其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路。

4)死锁预防:

定义:

在系统设计时确定资源分配算法,保证不发生死锁。

具体的做法是破坏产生死锁的四个必要条件之一。

①破坏“不可剥夺”条件

在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请

②破坏“请求和保持”条件。

要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配。

③破坏“循环等待”条件

采用资源有序分配法:

把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配。

5)安全状态与不安全状态

安全状态:

如果存在一个由系统中所有进程构成的安全序列P1,…Pn,则系统处于安全状态。

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

不安全状态:

不存在一个安全序列,不安全状态一定导致死锁,但是并非是死锁状态导致了不安全状态【8】。

3.3.2整个银行家算法的思路

先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。

3.3.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。

4)需求矩阵Need

它是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数,如果Need[i,j]=K,则表示进程i还需要Rj类资源k个,方能完成其任务。

上述三个矩阵间存在下述关系:

Need[i,j]=Max[i,j]-Allocation[i,j]

3.3.4银行家算法

设Requesti是进程Pi的请求向量。

如果Requesti[j]=k,表示进程只需要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.3.5安全性算法的描述

1)设置两个向量

①、工作向量Work:

它表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,执行安全算法开始时,Work=Available。

②、Finish:

它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]:

=false;当有足够资源分配给进程时,令Finish[i]:

=true。

2)从进程集合中找到一个能满足下述条件的进程:

①、Finish[i]=false;

②、Need[i,j]<=Work[j];如找到,执行步骤(3);否则,执行步骤(4)。

3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work[j]:

=Work[i]+Allocation[i,j];

Finish[i]:

=true;

gotostep2;

2)如果所有进程的Finish[i]:

=true,则表示系统处于安全状态;否则,系统处于不安全状态【7】【10】。

4详细设计

银行家算法示例:

假定系统中有五个进程:

{P0,P1,P2,P3,P4}和三种类型的资源{A,B,C},每一种资源的数量分别为10、5、7,在T0时刻的资源分配情况如图1所示。

资源情况

进程

Max

Allocation

Need

Available

ABC

ABC

ABC

ABC

P0

753

010

743

332

(230)

P1

322

200

(302)

122

(020)

P2

902

302

600

P3

222

211

011

P4

433

002

431

图1.T0时刻的资源分配表

(1)T0时刻的安全性:

利用安全性算法对T0时刻的资源分配情况进行分析(如图2)可知,在T0时刻存在着一个安全序列{P1,P3,P0,P2,P4},故系统是安全的。

资源情况

进程

Work

Need

Allocation

Work+Allocation

Finish

ABC

ABC

ABC

ABC

P1

332

122

200

532

true

true

true

true

true

P3

532

011

211

743

P0

743

743

010

753

P2

753

600

302

1055

P4

1055

431

002

1057

图2.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向量,由此形成资源变化情况如图1中的圆括号所示。

④再利用安全性算法检查此时系统是否安全,如图3所示。

资源情况

进程

Work

Need

Allocation

Work+Allocation

Finish

ABC

ABC

ABC

ABC

P1

230

020

302

532

true

true

true

true

true

P3

532

011

211

743

P0

743

743

010

753.

P2

753

600

302

1055

P4

1055

431

002

1057

图3.P1申请资源时的安全性检查

由所进行的安全性检查得知,可以找到一个安全序列{P1,P3,P4,P2,P0},因此系统是安全的,可以立即将P1所申请的资源分配给它。

(3)P4请求资源:

P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:

①Request4(3,3,0)≤Need4(4,3,1);

②Request4(3,3,0)不小于等于Available(2,3,0),让P4等待。

(4)P0请求资源:

P0发出请求向量Request0(0,2,0),系统按银行家算法进行检查。

①Request0(0,2,0)≤Need0(7,4,3);

②Request0(0,2,0)≤Available(2,3,0);

③系统暂时先假定可为P0分配资源,并修改有关数据,如图4所示。

资源情况

进程

Allocation

Need

Available

ABC

ABC

ABC

P0

030

732

210

P1

302

020

P2

302

600

P3

211

011

P4

002

431

图4.为P0分配资源后的有关资源数据

④进行安全性检查:

可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源[3]。

5调试与操作说明

5.1数据结构说明

#definem3;//定义数组m

#definen5;//定义数组n

intMax[n][m];//n个进程最大资源需求量

intAvailable[m];//系统可利用资源数m

intAllocation[n][m];//n个进程当前已经分配资源的资源量m

intNeed[n][m];//n个进程还需要资源的资源量m

intWork[m];//工作向量,表示系统可提供给进程继续运行所需的各类资源数量

intFinish[n]={0,0,0,0,0};//n个进程完成情况,表示系统是否有足够的资源分配给进程,1为是

intOrder[n]={0,0,0,0,0};//n个进程请求情况

intWork_Rec[n+1][m];//

intWork_Allocation[n][m];//

intRequest[m];//请求资源个数m

inti,j;//i表示进程,j表示资源

5.2程序代码

#include

#definem3

#definen5

intAvailable[m]={3,3,2};

intMax[n][m]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

intAllocation[n][m]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};

intNeed[n][m]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};

intWork[m];

intFinish[n]={0,0,0,0,0};

intOrder[n]={0,0,0,0,0};

intWork_Rec[n+1][m];

intWork_Allocation[n][m];

voidInit_Finish()

{

inti=0,j=0;

for(i=0;i

Finish[i]=0;

}

/*显示资源分配表*/

voidDis_Res_Table()

{

inti,j;

printf("\n*******目前资源分配表*******\n");

printf("资源情况MaxAllocationNeedAvailable\n");

printf("进程ABCABCABCABC\n");

for(i=0;i

{

printf("P%-4d",i);

for(j=0;j

printf("%-4d",Max[i][j]);

for(j=0;j

printf("%-4d",Allocation[i][j]);

for(j=0;j

printf("%-4d",Need[i][j]);

for(j=0;i==0&&j<3;j++)

printf("%-4d",Available[j]);

printf("\n");

}

}

/*显示安全序列分析表*/

voidDis_Safe_Sequence_Table()

{

inti,j,k;

printf("*******安全序列分析表*******\n");

printf("资源情况WorkNeedAllocationWork+AllocationFinish\n");

printf("进程ABCABCABCABC\n");

for(i=0;i

{

k=Order[i];

printf("P%-4d",k);

for(j=0;j

if(i==0)

printf("%-4d",Available[j]);

else

printf("%-4d",Work_Rec[i][j]);

for(j=0;j

printf("%-4d",Need[k][j]);

for(j=0;j

printf("%-4d",Allocation[k][j]);

printf("");

for(j=0;j

printf("%-6d",Work_Allocation[k][j]);

printf("%-4d",Finish[j]);

printf("\n");

}

}

/*修改数据结构中的数值*/

/*改变可用资源和已经拿到资源和还需要的资源的值*/

voidTry_Allocation(inti,int*Request)

{

intj;

for(j=0;j

{

Available[j]=Available[j]-Request[j];

Allocation[i][j]=Allocation[i][j]+Request[j];

Need[i][j]=Need[i][j]-Request[j];

}

}

/*如果分配失败,则恢复原来的资源分配状态*/

/*恢复可用资源和已经拿到资源和还需要的资源的值*/

voidUndo(inti,int*Request)

{

intj;

for(j=0;j

{

Available[j]=Available[j]+Request[j];

Allocation[i][j]=Allocation[i][j]-Request[j];

Need[i][j]=Need[i][j]+Request[j];

}

}

voidDis_Safe_Order()

{

inti;

printf("安全序列:

");

for(i=0;i

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

printf("\n");

}

intSmall(int*pre,int*last)

{

inti;

for(i=0;i

if(pre[i]>last[i])

return0;

return1;

}

voidAdd(int*pre,int*last)

{

inti;

for(i=0;i

pre[i]+=last[i];

}

voidAssign(int*pre,int*last)

{

inti;

for(i=0;i

pre[i]=last[i];

}

/*安全性算法*/

intSafer()

{

inti,modified=0,k=0;

Init_Finish();

Assign(Work,Available);

while(Finish[0]!

=1||Finish[1]!

=1||Finish[2]!

=1||Finish[3]!

=1||Finish[4]!

=1)

{

for(i=0;i

if(Finish[i]==0&&Small(Need[i],Work))

{

Add(Work,Allocation[i]);

Finish[i]=1;

Order[k++]=i;

Assign(Work_Allocation[i],Work);

Assign(Work_Rec[k],Work);

modified=1;

break;

}

if(modified==0)return0;

modified=0;

}

if(Finish[0]==1&&Finish[1]==1&&Finish[2]==1&&Finish[3]==1&&Finish[4]==1)

Dis_Safe_Order();

return1;

}

/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1