银行家算法实验报告.docx

上传人:b****3 文档编号:10265075 上传时间:2023-05-24 格式:DOCX 页数:21 大小:319.88KB
下载 相关 举报
银行家算法实验报告.docx_第1页
第1页 / 共21页
银行家算法实验报告.docx_第2页
第2页 / 共21页
银行家算法实验报告.docx_第3页
第3页 / 共21页
银行家算法实验报告.docx_第4页
第4页 / 共21页
银行家算法实验报告.docx_第5页
第5页 / 共21页
银行家算法实验报告.docx_第6页
第6页 / 共21页
银行家算法实验报告.docx_第7页
第7页 / 共21页
银行家算法实验报告.docx_第8页
第8页 / 共21页
银行家算法实验报告.docx_第9页
第9页 / 共21页
银行家算法实验报告.docx_第10页
第10页 / 共21页
银行家算法实验报告.docx_第11页
第11页 / 共21页
银行家算法实验报告.docx_第12页
第12页 / 共21页
银行家算法实验报告.docx_第13页
第13页 / 共21页
银行家算法实验报告.docx_第14页
第14页 / 共21页
银行家算法实验报告.docx_第15页
第15页 / 共21页
银行家算法实验报告.docx_第16页
第16页 / 共21页
银行家算法实验报告.docx_第17页
第17页 / 共21页
银行家算法实验报告.docx_第18页
第18页 / 共21页
银行家算法实验报告.docx_第19页
第19页 / 共21页
银行家算法实验报告.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

银行家算法实验报告.docx

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

银行家算法实验报告.docx

银行家算法实验报告

操作系统课程设计报告

 

题目:

银行家算法

 

院系

班级

姓名

学号

指导教师

 

银行家算法实验报告

一、概述

编写算法,实现银行家算法、安全性算法、死锁检测算法判断系统安全状态、判断进程的资源请求是否可以被满足、判定系统是否为死锁状态。

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

二、设计的基本概念和原理

1、算法思路:

先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。

若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。

若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。

2、银行家算法步骤:

(1)如果Requesti<or=Need,则转向步骤

(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。

(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:

    Available=Available-Request[i];

    Allocation=Allocation+Request;

Need=Need-Request;

(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

3、安全性算法步骤:

(1)设置两个向量

①工作向量Work。

它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;

②布尔向量Finish。

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

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

①Finish[i]=false

②Need

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

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

Work=Work+Allocation;

Finish[i]=true;

转向步骤

(2)。

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

4、死锁检测和解除

编程实现死锁检测算法、死锁解除算法,数据动态输入,解锁采用释放最大死锁进程资源的方法实现。

三、总体设计

运用c++实现对这三个算法的进行实现,通过自定义进程数和进程资源的各项数据情况对其进行分配,将其用函数分开,在实现每一步时进行调用。

数据结构:

intAvailable[20];

intMax[10][20];

intAllocation[10][20];

intNeed[10][20];

intRequest[10][20];

boolFinish[10];

intp[10];

intWork[20];

intm,n;

stringshowdata1[4]={"Max","Allo","Need","Aval"};

stringshowdata2[5]={"Work","Need","Allo","W+al","Finish"};

流程图:

系统主要过程流程图

银行家算法流程图

安全性算法流程图

四、详细设计

#include

#include

#include

#include

usingnamespacestd;

 

intAvailable[20];

intMax[10][20];

intAllocation[10][20];

intNeed[10][20];

intRequest[10][20];

boolFinish[10];

intp[10];

intWork[20];

intm,n;

stringshowdata1[4]={"Max","Allo","Need","Aval"};

stringshowdata2[5]={"Work","Need","Allo","W+al","Finish"};

voidiShow()

{

intsize,size2;

cout<<"系统";

for(intk=0;k<4;k++)

{

size=showdata1[k].length();

size2=(n*3+5-size)/2;

cout<

}

cout<

cout<<"资源";

for(intk=0;k<4;k++)

{

charsourcename='A';

cout<<"";

for(intkk=0;kk

{

cout<<""<

sourcename++;

}

cout<<"";

}

cout<

for(intii=0;ii

{

cout<<"P"<

for(intjj=0;jj

cout<

cout<<"";

for(intjj=0;jj

cout<

cout<<"";

for(intjj=0;jj

cout<

cout<<"";

if(ii==0)

{

for(intiii=0;iii

cout<

}

cout<<""<

}

}

voidfShow()

{

cout<<"系统";

for(intk=0;k<5;k++)

{

intsize=showdata2[k].length();

intsize2=(n*3+5-size)/2;

cout<

}

cout<

cout<<"资源";

for(intk=0;k<4;k++)

{

charsourcename='A';

cout<<"";

for(intkk=0;kk

{

cout<

sourcename++;

}

cout<<"";

}

cout<

}

voidInit()/*初始化算法*/

{

inti,j;

ifstreammyfile("a.txt");

if(!

myfile){

cout<<"Unabletoopenmyfile";

}

cout<<"请输入进程的数目:

";

myfile>>m;

cout<<"请输入资源的种类:

";

myfile>>n;

cout<<"请输入每个进程最多Max所需的各资源数,按照"<

for(i=0;i

{

for(j=0;j

{

myfile>>Max[i][j];

}

}

 

cout<<"请输入每个进程已分配Allocation的各资源数,按照"<

for(i=0;i

{

 

for(j=0;j

{

myfile>>Allocation[i][j];

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

}

}

cout<<"请输入各个资源现有的Available数目:

"<

for(i=0;i

{

myfile>>Available[i];

}

iShow();

}

boolSafe()

{

fShow();

inti,j,k,l=0;

for(i=0;i

Work[i]=Available[i];

for(i=0;i

{

Finish[i]=false;

}

for(i=0;i

{

if(Finish[i]==true)

{

continue;

}

else

{

for(j=0;j

{

if(Need[i][j]>Work[j])

{

break;

}

}

if(j==n)

{

Finish[i]=true;

cout<<"P"<

for(k=0;k

cout<

cout<<"";

for(k=0;k

cout<

cout<<"";

for(k=0;k

cout<

cout<<"";

for(k=0;k

cout<

cout<<"";

cout<

for(k=0;k

{

Work[k]+=Allocation[i][k];

}

p[l++]=i;

i=-1;/*再次由进程从小到大遍历*/

}

else

{

continue;

}

}

if(l==m)/*进程记录p的数量等于资源总量,全部进程均已经满足*/

{

cout<<"系统是安全的"<

cout<<"安全序列:

"<

for(i=0;i

{

cout<

if(i!

=l-1)

{

cout<<"-->";

}

}

cout<<""<

returntrue;

}

}

cout<<"\n无法继续找到可满足的进程!

"<

cout<<"系统是不安全的"<

returnfalse;

}

voidBank()

{

inti,cusneed;

charagain;

while

(1)

{

cout<<"请输入要申请资源的进程号(注:

第个进程号为,依次类推):

P";

cin>>cusneed;

cout<<"\n请输入进程所请求的各资源的数量"<

for(i=0;i

{

cin>>Request[cusneed][i];

}

for(i=0;i

{

if(Request[cusneed][i]>Need[cusneed][i])

{

cout<<"您输入的请求数超过进程的需求量!

请重新输入!

"<

continue;

}

if(Request[cusneed][i]>Available[i])

{

cout<<"您输入的请求数超过系统有的资源数!

请重新输入!

"<

continue;

}

}

for(i=0;i

{

Available[i]-=Request[cusneed][i];

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

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

}

if(Safe())

{

cout<<"同意分配请求!

"<

}

else

{

cout<<"您的请求被拒绝!

"<

for(i=0;i

{

Available[i]+=Request[cusneed][i];

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

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

}

}

for(i=0;i

{

Finish[i]=false;

}

cout<<"您还想再次请求分配吗?

是请按y/Y,否请按其它键"<

cin>>again;

if(again=='y'||again=='Y')

{

continue;

}

break;

}

}

 

intmain()

{

while(true)

{

Init();

if(Safe())break;

cout<<"当前系统不安全,请重新初始化系统";

}

Bank();

return0;

}

 

5、测试与数据分析

假设系统中有三个进程{p,q,r}和三类资源{a,b,c},各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如图

资源情况

进程

Max

 

abc

Allocation

abc

Need

abc

Available

abc

P

753

010

743

332

Q

322

200

122

R

902

302

600

运行程序后输入数据如图

使用银行家算法所分配的情况和安全检查情况为

死锁检测与排除的运行结果为

六、完成的情况、简要的使用说明

这两个程序已经完成了对进程以资源之间检测与分配功能,并且能够在给出资源的分配情况后检测需求是否会发生死锁状况并给出解除方案。

运行程序后只需按照提示操作即可观察到进程对资源的调用情况。

七、结果分析

程序运行稳定,安全,充分展示了银行家算法、安全性算法、死锁检测与解除算法的实现情况。

八、总结

多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。

银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。

通过对算法的编写让我了解到计算机在调度进程时的具体过程,也明白了解决死锁的原理。

九、参考文献

[1]汤子瀛梁红兵哲凤屏汤子灜.《计算机操作系统(第三版)》.

西安:

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

[2]谭浩强.《C++面向对象程序设计》.北京:

清华大学出版社,2006.01.

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2