银行家算法实验报告.docx

上传人:b****4 文档编号:3591033 上传时间:2022-11-24 格式:DOCX 页数:14 大小:54.01KB
下载 相关 举报
银行家算法实验报告.docx_第1页
第1页 / 共14页
银行家算法实验报告.docx_第2页
第2页 / 共14页
银行家算法实验报告.docx_第3页
第3页 / 共14页
银行家算法实验报告.docx_第4页
第4页 / 共14页
银行家算法实验报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

银行家算法实验报告.docx

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

银行家算法实验报告.docx

银行家算法实验报告

设计题目

银行家算法的实现

设计形式

独立完成

设计目的

1.加深了解有关资源申请、避免死锁等概念。

2.体会和了解死锁和避免死锁的具体实施方法。

设计预备知识

1.死锁的相关知识。

2.银行家算法。

3.系统安全性检查。

设计内容

1.设计进程对各类资源最大申请表示及初值的确定。

2.设定系统提供资源的初始状况。

3.设定每次某个进程对各类资源的申请表示。

4.编制程序,依据银行家算法,决定其资源申请是否得到满足。

5.显示资源申请和分配时的变化情况。

小组成员分工

银行家算法分析、设计与实现

一、设计理论描述

本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。

要求如下:

(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

Allocation=Allocation+Request

Need=Need-Request

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

2.安全性检查

(1)设置两个工作向量Work=Available;Finish[M]=False

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

Finish[i]=False

Need<=Work

如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work=Work+Allocation

Finish=True

GOTO2

(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

3.数据结构

#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()//显示资源矩阵

三、源代码

#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

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

apply++;

if(apply==N){

for(m=0;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==name[i]){

flag=0;

break;

}

if(i==N)

cout<<"该资源名称不存在,请重新输入:

";

}

while(flag);

for(intj=i;j

{

name[j]=name[j+1];

Avaliable[j]=Avaliable[j+1];

}

N=N-1;

showdata();

safe();

}

voidchangeresources(){//修改资源函数

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

"<

for(inti=0;i

cout<

"<

cout<<"输入系统可用资源[Avaliable]:

"<

cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2];

cout<<"经修改后的系统可用资源为"<

for(intk=0;k

cout<

"<

showdata();

safe();

}

voidaddprocess(){//添加作业

intflag=M;

M=M+1;

cout<<"请输入该作业的最打需求量[Max]"<

for(inti=0;i

cout<

";

cin>>Max[flag][i];

Need[flag][i]=Max[flag][i]-Allocation[flag][i];

}

showdata();

safe();

}

intmain()//主函数

{

inti,j,number,choice,m,n,flag;

charming;

cout<<"*****************单处理机系统进程调度实现*****************"<

cout<<"请首先输入系统可供资源种类的数量:

";

cin>>n;

N=n;

for(i=0;i

{

cout<<"资源"<

";

cin>>ming;

name[i]=ming;

cout<<"资源的数量:

";

cin>>number;

Avaliable[i]=number;

}

cout<

cout<<"请输入作业的数量:

";

cin>>m;

M=m;

cout<<"请输入各进程的最大需求量("<

"<

for(i=0;i

for(j=0;j

cin>>Max[i][j];

do{

flag=0;

cout<<"请输入各进程已经申请的资源量("<

"<

for(i=0;i

for(j=0;j

cin>>Allocation[i][j];

if(Allocation[i][j]>Max[i][j])

flag=1;

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

}

if(flag)

cout<<"申请的资源大于最大需求量,请重新输入!

\n";

}

while(flag);

showdata();//显示各种资源

safe();//用银行家算法判定系统是否安全

while(choice)

{

cout<<"**************银行家算法演示***************"<

cout<<"1:

增加资源"<

cout<<"2:

删除资源"<

cout<<"3:

修改资源"<

cout<<"4:

分配资源"<

cout<<"5:

增加作业"<

cout<<"0:

离开"<

cout<<"*******************************************"<

cout<<"请选择功能号:

";

cin>>choice;

switch(choice)

{

case1:

addresources();break;

case2:

delresources();break;

case3:

changeresources();break;

case4:

share();break;

case5:

addprocess();break;

case0:

choice=0;break;

default:

cout<<"请正确选择功能号(0-5)!

"<

}

}

return1;

}

 

四、程序运行结果及分析

T0时刻的资源分配表(各种资源的数量分别为:

10、5、7)

资源情况

进程

Max

ABC

Allocation

ABC

Need

ABC

Available

ABC

P0

753

010

743

332

P1

322

200

122

P2

902

302

600

P3

222

211

011

P4

433

002

431

运行结果

 

五、课程设计心得与体会

银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。

 

六.参考文献:

[1]《计算机操作系统》汤子瀛等:

西安电子科技大学出版社

[2]《高级语言c++程序设计》刘璟等:

高等教育出版社

出师表

两汉:

诸葛亮

  先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。

诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。

  宫中府中,俱为一体;陟罚臧否,不宜异同。

若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。

  侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:

愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

  将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:

愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。

  亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。

先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。

侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也

  臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。

先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。

后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

  先帝知臣谨慎,故临崩寄臣以大事也。

受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。

今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。

此臣所以报先帝而忠陛下之职分也。

至于斟酌损益,进尽忠言,则攸之、祎、允之任也。

  愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。

若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。

臣不胜受恩感激。

  今当远离,临表涕零,不知所言。

 

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

当前位置:首页 > 求职职场 > 简历

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

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