资源管理系统实现银行家算法.docx

上传人:b****7 文档编号:9297079 上传时间:2023-02-04 格式:DOCX 页数:28 大小:209.25KB
下载 相关 举报
资源管理系统实现银行家算法.docx_第1页
第1页 / 共28页
资源管理系统实现银行家算法.docx_第2页
第2页 / 共28页
资源管理系统实现银行家算法.docx_第3页
第3页 / 共28页
资源管理系统实现银行家算法.docx_第4页
第4页 / 共28页
资源管理系统实现银行家算法.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

资源管理系统实现银行家算法.docx

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

资源管理系统实现银行家算法.docx

资源管理系统实现银行家算法

目录

绪论-1-

一、功能描述-2-

二、设计思路-3-

三、具体实现-5-

四、运行调试及结果分析-9-

五、设计体会与小结-17-

六、参考文献-18-

七、附录(核心代码)-19-

绪论

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

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

产生死锁的原因归纳为两点:

竞争资源,当系统中供多个进程共享的资源,但其数目不能满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁;进程间推进顺序非法,进程在运行的过程中,请求和释放资源的顺序不当,也能导致产生进程死锁。

虽然进程在运行过程中,可能发生死锁,但死锁的发生必须具备四个必要条件:

互斥条件、请求和保持条件、不剥夺条件、环路等待条件;防止死锁的机构只须确保上述四个条件之一不出现,则系统不会发生死锁。

系统的状态分为安全状态和不安全状态,只要能使系统都处于安全状态,便可避免死锁。

所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,Pn),来为每个进程Pi分配其所需分配,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。

如果系统无法找到一个这样地安全系列,则称系统处于不安全状态。

在操作系统中研究资源分配策略时也有类似的问题,系统中有限的资源要供多个进程使用,必须保证得到资源的进程能在有限的时间内归还资源,以供它进程使用资源。

如果资源分配不得当就会发生进程循环等待资源,各进程都无法继续执行下去的死锁现象。

而最有代表性的避免死锁的算法,是Dijkstra的银行家算法。

银行家算法是避免死锁的一种重要方法,在本次课程设计中用C++语言编写一个资源管理系统,并要用银行家算法和安全性算法检查是否允许分配资源给进程,避免死锁。

通过课程设计,加深了我对有关资源申请、避免死锁等概念的了解,并且对银行家算法和安全性算法有了更深一步的认识,进而提高了我的分析、解决问题的能力。

 

一、功能描述

资源管理系统的设计与实现——银行家算法实现

用VC编程实现一个资源管理系统,该系统必须包括资源的添加、删除和修改等功能,并且允许其它进程来申请这里的资源,任何一个进程来申请资源时,必须先登记该进程对资源的申请要求,然后由系统检查当前资源的状况,并用银行家算法和安全性算法来检查是否允许分配资源给进程。

每个进程申请资源的情况必须进行记录,并作为课程设计报告的一部分数据。

该系统的功能主要包含6个模块,分别为添加资源,删除资源,修改资源,分配资源,添加作业和离开。

1.添加资源:

当系统有新的资源时,添加资源种类的数目,然后输入各种资源的名称及其相应的数量;

2.删除资源:

当系统需要删除某些不要用的资源时,根据提示输入需要删除的资源名称;

3.修改资源:

当系统资源的数目有变化时,可以根据需要重新设置系统的可用资源;

4.分配资源:

当有新的作业到来或则正在执行的进程申请资源时,系统可以根据系统资源的情况适当的分配;

5.添加作业:

当有新的作业到来时,必须按照要求输入该作业对系统资源的最打需求量。

6.离开:

退出系统.

 

二、设计思路

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

银行家算法是避免死锁的一种重要方法,为实现银行家算法,系统必须设置若干数据结构。

2.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.2银行家算法

设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.3安全性算法

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;

4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

 

三、具体实现

在程序中设计五个进程,分别为0,1,2,3,4。

共享三类资源A,B,C。

在这个资源管理系统中对进程的所需最大资源(Max)、已分配给当前进程资源(Allocation)和系统可用资源(Available)分别进行了初始化了值。

进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。

要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列,若分配不安全,则释放分配的资源,防止使系统进入不安全状态。

显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。

程序还可以实现对系统资源的增加,修改,删除;

在程序设计当中,涉及到8个子函数,分别为showdata(),changedata(),share(),safe(),changeresources(),addresources(),delresouces(),addprocess();各个函数的具体功能如下:

●Showdata()函数:

此函数用来显示目前系统可用资源的数量Avaiable,和各个进程对系统资源的最大需求量Max,已经申请的资源量Allocation及还需要的资源良Need.

●Changedata()函数:

此函数主要是用来改变系统可供资源Available向量和进程的分配向量Allocation及需求向量Need.

●Share()函数:

此函数的功能是用来实现银行家算法,当某个进程Pi发出资源请求向量时,首先检查Request[i]是否小于等于Need[i][j],正确的话再判断Request[i]是否小于等于Available[j],否则提示所申请的值大于它所求的资源数量或则申请的值大于系统可提供资源的数量.

●Safe()函数:

此函数是用来实现安全性算法,用来对资源的分配进行安全性检测。

首先设置两个向量:

工作向量Work和Finish,Work表示系统可提供给进程继续运行所需的各类资源数目,初始值为Available;Finish表示系统是否有足够的资源分配给进程,使之运行完成。

然后从进程集合中找到一个满足条件为Finish[i]=false和Need[i][j]<=Work[j]的进程,如找到了,当进程Pi获得资源后,可顺利完成,并释放出分配给它的资源;如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态.

●Changeresources()函数:

此函数是用来修改系统可利用资源的数量,开始输出目前系统可用资源的数量,然后要求输入新的.

●Addresources()函数:

此函数是用来增加系统新资源,按照要求输入需要添加资源的数量,然后按照其提示一一输入资源的名称和数量.

●Delresources()函数:

此函数是用来删除系统某些不需要的资源.

●Addprocess()函数:

此函数是用来添加新的作业,添加时,要求输入该作业的最大资源需求良Max.

资源管理系统总的流程图:

银行家算法流程图:

 

安全性算法流程图

四、运行调试及结果分析

(1)为了检验程序的正确性,这里用了课本上的数据进行初始化,Max为各个进程对系统资源的最大需求量,Allocation为各个进程已经申请的资源量,Need为各个进程还需要的系统资源量;初始化时,系统可以提供3类资源,分别为A,B,C,其数量分别为3,3,2;作业的数量为5个,各个进程的最大需求量及已经申请的资源数量如图1所示;利用安全性算法对该时刻的资源情况进行分析,存在一个安全序列{1,3,0,2,4},所以系统是安全的;

图1

(2)系统初始化后,进入功能选择画面,该系统包含5个功能,分别为增加资源,删除资源,修改资源,分配资源,增加作业,退出系统;各个功能的具体作用将在下面一一讲述;首先选择功能1,添加新的系统资源,此时系统会调用addresources()函数来进行资源的添加,添加新资源的数量为2,然后按照所提示的输入资源的名称和数量,添加完后利用shoudata()函数显示当前系统资源和进程运行的情况,再根据safe()函数来判断此时系统的安全性,因为存在一个安全序列{1,3,0,2,4},所以系统是安全的,具体如下图2所示:

图2

(3)选择功能2,删除系统的某些资源,此时系统会调用delresources()来将需要删除的资源进行删掉,首先按照界面所提示的删除资源名称为E的资源,当输入F时,系统会提示不存在该资源,要求重新输入过,正确输入后,利用shoudata()函数来查看系统资源的情况,可以看到资源名称为E的资源已经被删除掉了,如下图3所示:

 

图3

 

(4)选择功能3,修改系统的可用资源。

当某资源的数量需要进行修改时,选择3号功能,此时系统会调用changeresources()函数输出当前各个系统资源的数量,然后要求你重新输入过,修改后的系统资源ABC数量分别为3,3,3,可利用shoudata()函数来查看系统资源的情况,然后再调用safe()函数来检查此刻系统的安全性,因为存在一个安全序列{1,3,0,2,4},故此刻系统是安全的,具体如下图4所示:

图4

(5)选择功能4,进行资源的分配。

此时系统会调用share()函数来进行进程资源申请的检查及分配,此刻,进程1发出请求向量Request1(1,0,2),系统按银行家算法进行检查,因为Request1(1,0,2)<=Need1(1,2,2),Request1(1,0,2)<=Availabe(3,3,3);所以系统先假定可为进程1分配资源,并修改Availabe1,Allocation1,Need1向量,再利用安全性算法检查系统是否安全,因为存在一个安全序列{1,3,0,2,4},故此刻系统是安全的,具体的如下图5所示:

图5

(6)继续选择功能4,进程4发出请求向量Request4(3,3,0),系统调用safe()函数,利用银行家算法进行检查:

因为Request4(3,3,0)不小于等于Availabe(2,3,0),即申请的资源大于系统可提供的资源,分配出错,不予分配,具体情况如下图6所示:

图6

(7)继续选择功能4,此时进程0发出请求向量Request0(0,2,0),首先系统按照银行算法进行检查,Request0(0,2,0)<=Need0(7,4,3),Request0(0,2,0)<=Available(2,3,0);此时系统暂时先假定为进程0分配资源,并修改Available,Allocation0,Need0向量;再调用safe()函数对系统进行安全性检查,可用资源Availabel(2,1,0)已经不能满足任何进程的需要,即找不到一个合适的安全序列,系统将会进入不安全状态,此时系统不分配资源,具体情况如下图7所示:

图7

 

(8)选择功能5,增加新的作业,系统调用addprocess()函数进行作业的添加,按照页面所提示的输入该作业对各类资源的最大需求量Max,系统会根据该最打需求量自动的计算出进程还需要的量,再利用showdata()函数可以查看系统当前各资源的利用情况,如下图8所示:

图8

 

五、设计体会与小结

通过一周来的查阅,分析,设计,实验,调试,最终算是完成了本次课程设计。

在设计的过程中,通过查阅大量的书籍和网络资源,对产生死锁的原因,必要条件,银行家算法以及安全性算法有了更加深入的了解。

虽然在做本次课程设计的过程中花费了大量时间,但是真正学到的远超过了对这们课程的理解。

由于计算机操作系统的课程讲述计算机的理论性较强,抽象性较大,故通过本次课程设计能够理论联系实际,结合所学的有关其他课程知识,让我更加完整的了解了操作系统的基本原理。

但是也发现了许多以前自己对某些方面的误解,同时自己还有好多方面有欠缺,在今后的其他课程学习的过程中努力增加有关的专业知识,增强自己的动手能力。

这次课程设计不仅锻炼了我动手的实践能力,而且提高了我攥写论文的能力,这为我以后对操作系统的进一步学习作了一个铺垫。

现在粗劣的分析一下自己的设计思想,设计主要由两部分组成:

一、银行家算法(扫描)

1.如果Request<=Need,则转向2;否则,出错

2.如果Request<=Available,则转向3,否则等待

3.系统试探分配请求的资源给进程

4.系统执行安全性算法

二、安全性算法

1.设置两个向量

(1).工作向量:

Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)

(2).Finish:

表示系统是否有足够资源分配给进程,初始化为False

2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)

3.进程P获得第i类资源,则顺利执行直至完成!

并释放资源:

Work=Work+Allocation;Finish[i]=true;转2

4.若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!

在这次课程设计中有碰到了许多的问题,后经过老师,同学帮忙,网络求助等途径得已解决,在这里曾经给予我帮助的辅导老师,同学表示感谢。

 

六、参考文献

[1]汤子赢,哲凤屏,汤小丹.计算机操作系统[M].西安:

西安电子科技大学出版社,2001.

[2]任满杰,刘树刚,李军红.操作系统原理实用教程[M].北京:

电子工业出版社,2006.

[3]潭浩强.C++程序设计[M].北京:

清华大学出版社,1999.

[4]张铭刘晓丹.数据结构与算法分析.电子工业出版社

[5]郁红英冯庚豹.计算机操作系统.人民邮电出版社

 

七、

附录(核心代码)

#include

#include

#include

#defineFalse0

#defineTrue1

intMax[100][100]={0};//各进程所需各类资源的最大需求

intAvaliable[100]={0};//系统可用资源

charname[100]={0};//资源的名称

intAllocation[100][100]={0};//系统已分配资源

intNeed[100][100]={0};//还需要资源

intRequest[100]={0};//请求资源向量

inttemp[100]={0};//存放安全序列

intWork[100]={0};//存放系统可提供资源

intM=100;//作业的最大数为100

intN=100;//资源的最大数为100

voidshowdata()//显示资源矩阵

{

inti,j;

cout<<"系统目前可用的资源[Avaliable]:

"<

for(i=0;i

cout<

cout<

for(j=0;j

cout<

cout<

cout<<"MaxAllocationNeed"<

cout<<"进程名";

for(j=0;j<3;j++){

for(i=0;i

cout<

cout<<"";

}

cout<

for(i=0;i

cout<<""<

for(j=0;j

cout<

cout<<"";

for(j=0;j

cout<

cout<<"";

for(j=0;j

cout<

cout<

}

}

intchangdata(inti)//进行资源分配

{

intj;

for(j=0;j

Avaliable[j]=Avaliable[j]-Request[j];

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

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

}

return1;

}

intsafe()//安全性算法

{

inti,k=0,m,apply,Finish[100]={0};

intj;

intflag=0;

Work[0]=Avaliable[0];

Work[1]=Avaliable[1];

Work[2]=Avaliable[2];

for(i=0;i

apply=0;

for(j=0;j<3;j++){

if(Finish[i]==False&&Need[i][j]<=Work[j]){

apply++;

if(apply==3){

for(m=0;m<3;m++)

Work[m]=Work[m]+Allocation[i][m];//变分配数

Finish[i]=True;

temp[k]=i;

i=-1;

k++;

flag++;

}

}

}

}

for(i=0;i

if(Finish[i]==False){

cout<<"系统不安全"<

return-1;

}

}

cout<<"系统是安全的!

"<

cout<<"分配的序列:

";

for(i=0;i

cout<

if(i";

}

cout<

return0;

}

voidshare()//利用银行家算法对申请资源对进行判定

{

charch;

inti=0,j=0;

ch='y';

cout<<"请输入要求分配的资源进程号(0-"<

";

cin>>i;//输入须申请的资源号

cout<<"请输入进程"<

"<

for(j=0;j

{

cout<

";

cin>>Request[j];//输入需要申请的资源

}

for(j=0;j

if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错

{

cout<<"进程"<

cout<<"分配不合理,不予分配!

"<

ch='n';

break;

}

else{

if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则

{//出错

cout<<"进程"<

cout<<"分配出错,不予分配!

"<

ch='n';

break;

}

}

}

if(ch=='y'){

changdata(i);//根据进程需求量变换资源

showdata();//根据进程需求量显示变换后的资源

safe();//根据进程需求量进行银行家算法判断

}

}

voidaddresources(){//添加资源

intn,flag;

cout<<"请输入需要添加资源种类的数量:

";

cin>>n;

flag=N;

N=N+n;

for(inti=0;i

cout<<"名称:

";

cin>>name[flag];

cout<<"数量:

";

cin>>Avaliable[flag++];

}

showdata();

safe();

}

voiddelresources(){//删除资源

charming;

inti,flag=1;

cout<<"请输入需要删除的资源名称:

";

do{

cin>>ming;

for(i=0;i

if(ming==nam

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

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

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

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