操作系统实验报告三银行家算法.docx

上传人:b****6 文档编号:7525005 上传时间:2023-05-11 格式:DOCX 页数:16 大小:149.14KB
下载 相关 举报
操作系统实验报告三银行家算法.docx_第1页
第1页 / 共16页
操作系统实验报告三银行家算法.docx_第2页
第2页 / 共16页
操作系统实验报告三银行家算法.docx_第3页
第3页 / 共16页
操作系统实验报告三银行家算法.docx_第4页
第4页 / 共16页
操作系统实验报告三银行家算法.docx_第5页
第5页 / 共16页
操作系统实验报告三银行家算法.docx_第6页
第6页 / 共16页
操作系统实验报告三银行家算法.docx_第7页
第7页 / 共16页
操作系统实验报告三银行家算法.docx_第8页
第8页 / 共16页
操作系统实验报告三银行家算法.docx_第9页
第9页 / 共16页
操作系统实验报告三银行家算法.docx_第10页
第10页 / 共16页
操作系统实验报告三银行家算法.docx_第11页
第11页 / 共16页
操作系统实验报告三银行家算法.docx_第12页
第12页 / 共16页
操作系统实验报告三银行家算法.docx_第13页
第13页 / 共16页
操作系统实验报告三银行家算法.docx_第14页
第14页 / 共16页
操作系统实验报告三银行家算法.docx_第15页
第15页 / 共16页
操作系统实验报告三银行家算法.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验报告三银行家算法.docx

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

操作系统实验报告三银行家算法.docx

操作系统实验报告三银行家算法

 

操作系统实验三

银行家算法

 

姓名:

杨益林

学号:

71115215

报告日期:

2017.06.07

一、实验目的

通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用WindowsAPI进行共享数据互斥访问和多线程编程的方法。

二、实验内容

1.在Windows操作系统上,利用Win32API编写多线程应用程序实现银行家算法。

2.创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。

3.通过Win32API提供的信号量机制,实现共享数据的并发访问。

三、实验步骤

(一)设计思路:

银行家算法可分为个主要的功能模块,其描述如下:

1.初始化

由用户输入数据,分别对运行的进程数、总的资源种类数、总资源数、各进程所需要的最大资源数量(Max),已分配的资源数量赋值。

2.安全性检查算法

(1)设置两个工作向量Work=AVAILABLE;FINISH=false;

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

FINISH==false;

NEED<=Work;

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

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

Work+=ALLOCATION;

Finish=true;

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

3.银行家算法

在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。

在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。

它是最具有代表性的避免死锁的算法。

设进程j提出请求REQUEST[i],则银行家算法按如下规则进行判断。

(1).如果REQUEST[j][i]<=NEED[j][i],则转

(2);否则,出错。

(2).如果REQUEST[j][i]<=AVAILABLE[j][i],则转(3);否则,出错。

(3).系统试探分配资源,修改相关数据:

四、运行结果示例

这里以书上的例子为例,初值如下表:

Allocation

Max

Available

ABC

ABC

ABC

P0

010

753

332

P1

200

322

P2

301

900

P3

211

222

P4

002

433

现在让进程P1再申请A:

1B:

0C:

2个资源,首先调用安全算法测试如果分配后系统是否安全,然后给出了分配序列,如下图:

如果再让P4申请A:

0B:

2C:

0个资源,首先调用安全算法测试如果分配后系统是否安全,发现分配后系统不安全,于是报分配错误,不予分配,结果如下图:

七、实验体会

银行家算法的具体实现,我学到了很多课本上没有的知识。

想要完成模拟银行家算法的C++程序,首先就是要彻底熟悉算法,了解算法的基本原理,才能开始着手程序设计在程序设计设计过程中,遇到了一些困难,通过向同学询问,翻阅资料等,问题被一一解决了。

首先就是在知识层面上了解了银行家算法这种进程调度和避免死锁的算法,并用C++程序真正模拟出安全性检查和银行家算法过程,复习了之前所学C++和数据结构的知识;在编程过程中虽然遇到很多困难,解决问题的过程中,同时也锻炼了我不怕困难,勇于迎接挑战的精神,为以后的工作打下了坚实的基础。

八、源程序并附上注释

#include

#include

#include

#include

#defineFalse0

#defineTrue1

usingnamespacestd;

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

intReMax[100][100]={0};

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

intReAvaliable[100]={0};

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

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

intReAllocation[100][100]={0};

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

intReNeed[100][100]={0};

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

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

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

intM=100;//进程的最大数量为100

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

voidshowdata()//显示资源矩阵

{

inti,j;

cout<

cout<<"MaxAllocationNeedAvaliable"<

cout<<"";

for(j=0;j<4;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<

if(i==0){

cout<<"";

for(j=0;j

cout<

}

cout<

}

}

voidsave(){

inti,j;

for(i=0;i

{

ReAvaliable[i]=Avaliable[i];

}

for(i=0;i

for(j=0;j

ReMax[i][j]=Max[i][j];

ReAllocation[i][j]=Allocation[i][j];

ReNeed[i][j]=Need[i][j];

}

}

}

voidrestore(){

inti,j;

for(i=0;i

{

Avaliable[i]=ReAvaliable[i];

}

for(i=0;i

for(j=0;j

Max[i][j]=ReMax[i][j];

Allocation[i][j]=ReAllocation[i][j];

Need[i][j]=ReNeed[i][j];

}

}

}

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;

for(intnum=0;num

Work[num]=Avaliable[num];

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<<"系统不安全,所有状态不改变!

"<

return1;

}

}

cout<<"系统是安全的!

"<

save();//进行保存

cout<<"安全序列:

";

for(i=0;i

cout<

if(i";

}

cout<

return0;

}

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

{

boolch=true;

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=false;

break;

}

else{

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

{//出错

cout<<"进程"<

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

"<

ch=false;

break;

}

}

}

if(ch){

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

if(safe()){

restore();

}//根据进程需求量进行银行家算法判断

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

}

}

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

cout<<"当前的[Avaliable]:

"<

for(inti=0;i

cout<

"<

cout<

"<

for(inti=0;i

cout<

";

cin>>Avaliable[i];

}

cout<<"修改后的[Avaliable]:

"<

for(intk=0;k

cout<

"<

showdata();

safe();

}

intmain()//主函数

{

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

intchoice=1;

charming;

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

";

cin>>n;

N=n;

cout<<"请依次输入系统资源的名称与数量:

"<

for(i=0;i

{

//cout<<"资源"<

";

cin>>ming>>number;

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];

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

}

if(flag)

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

\n";

}while(flag);

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

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

while(choice)

{

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

cout<<"1:

修改现有资源实例数量"<

cout<<"2:

进程请求系统分配资源"<

cout<<"3:

显示各个矩阵内容"<

cout<<"0:

退出程序"<

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

cout<<"请选择操作:

";

cin>>choice;

switch(choice)

{

case1:

changeresources();break;

case2:

share();break;

case3:

showdata();break;

case0:

choice=0;break;

default:

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

"<

}

}

cout<<"您已成功退出程序!

"<

return1;

}

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

当前位置:首页 > 工作范文 > 行政公文

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

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