编程序模拟银行家算法1.docx

上传人:b****7 文档编号:10816330 上传时间:2023-02-23 格式:DOCX 页数:25 大小:391.66KB
下载 相关 举报
编程序模拟银行家算法1.docx_第1页
第1页 / 共25页
编程序模拟银行家算法1.docx_第2页
第2页 / 共25页
编程序模拟银行家算法1.docx_第3页
第3页 / 共25页
编程序模拟银行家算法1.docx_第4页
第4页 / 共25页
编程序模拟银行家算法1.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

编程序模拟银行家算法1.docx

《编程序模拟银行家算法1.docx》由会员分享,可在线阅读,更多相关《编程序模拟银行家算法1.docx(25页珍藏版)》请在冰豆网上搜索。

编程序模拟银行家算法1.docx

编程序模拟银行家算法1

武汉理工大学华夏学院

课程设计报告书

课程名称:

操作系统原理

 

题目:

编程序模拟银行家算法

系名:

信息工程系

专业班级:

计算机1111班

姓名:

学号:

10210411131

指导教师:

苏永红

 

2013年6月28日

课程设计任务书

学生姓名:

专业班级:

计算机1111班

指导教师:

苏永红工作单位:

信息工程系

设计题目:

编程序模拟银行家算法

初始条件:

Linux操作系统,GCC编译环境

要求完成的主要任务:

主要任务:

银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。

加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

思想:

将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。

银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。

用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。

设计报告撰写格式要求:

1设计题目与要求2设计思想

3系统结构4数据结构的说明和模块的算法流程图

5使用说明书(即用户手册):

内容包含如何登录、退出、读、写等操作说明

6运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)

7自我评价与总结8附录:

程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;

时间安排

6月24日布置课程设计任务;分配题目后,查阅资料、准备程序;

6月25~6月27日上机调试程序、书写课程设计报告;

6月28日提交课程设计报告及相关文档。

指导教师签字:

2013年6月28日

系主任签字:

2013年6月28日

 

目录

1设计题目与要求4

1.1设计题目4

1.2要求完成的任务4

1.3主要任务4

1.4提示4

2设计思路5

2.1算法思路5

2.2银行家算法5

3系统结构5

3.1主要用到的数据结构5

3.2程序模块5

3.3各模块间的调用关系6

4数据结构的说明和模块的算法流程图6

4.1数据结构说明6

4.1算法流程图7

5使用说明9

6测试结果截图10

6.1开始界面10

6.2输出界面10

7自我评价与总结14

8参考文献15

9附录:

程序清单16

1设计题目与要求

1.1设计题目

编程序模拟银行家算法

1.2要求完成的任务

银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。

加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

1.3主要任务

银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。

若是,则不满足该请求;否则便满足。

检查状态是否安全的方法是看他是否有足够的资源满足一个距最大需求最近的客户。

如果可以,则这笔投资认为是能够收回的,然后接着检查下一个距最大需求最近的客户,如此反复下去。

如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。

1.4提示

将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。

银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。

用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。

 

2设计思想

2.1算法思路:

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

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

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

2.2银行家算法:

我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。

操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。

若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。

3系统结构

3.1主要用到的数据结构:

(1)最大需求矩阵Max[][]

(2)已分配矩阵Allocation[][]

(3)仍需求矩阵Need[][]=Max[][]-Allocation[][]

(4)可利用资源向量Available[]

(5)申请各类资源向量Request[]

(6)工作向量work[],Finish[]

3.2程序模块:

publicstaticvoidmain(String[]args)//系统的主函数

publicvoidprintFrame()//初始化

publicvoidprint()//打印输出

publicvoidSafty()//利用安全性算法进行安全性检测

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

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

3.3各模块间的调用关系:

主函数voidmain()

要调用:

printFrame(),print(),Safty(),judge()

安全性检测函数Safty()

要调用:

print()

银行家算法函数judge()

要调用print()、Safty()、和judge()本身

4数据结构的说明和模块的算法流程图

4.1数据结构说明

(1)进行初始化输入的函数

(2)打印输出的函数

(3)利用安全性算法进行检测的函数

(4)进行资源分配的函数

(5)利用行家算法进行判定的函数

 

4.2算法流程图

1.系统主要算法流程图

 

 

 

2.银行家算法流程图

 

3.安全性算法流程图

 

5.使用说明

该程序是用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序并在终端中运行。

使用方法是,在终端输入./a.out按下enter键后显示出来,然后在编译执行程序后按照提示输入进程数量和资源数,然后程序会自动判断能否生成安全序列,使得资源得倒合理分配。

结果输出后还可以继续选择其他的例如增加、删除、修改资源种类和数量的功能。

按N数字键可以退出程序。

按Y数字键可以退出程序。

 

6测试结果截图:

6.1开始界面

图1输入./a.out

6.2输出结果

图2输入./a.out后的界面

图3输入进程号和资源数后的界面

图4按Y键后继续执行的界面

图5按N键后的界面

图6申请不合理时的界面

图7分配成功的界面

7自我评价与总结

第一次课程设计的时候,老师要求我们写文档,需求分析啊,系统测试啊,项目管理啊等等,那时候觉得写这么多没用的纸上的东西干什么啊,而且又什么都不明白。

现在又一次的写文档,突然才明白,有些东西,写多了自然就会有经验,有收获的。

在本程序设计中,我深深的感受到一个程序的总体设计是多么的重要了,以前写的小程序都是想到哪写到哪,无论怎样都能搞定,这次因为设计了图形界面,虽然说程序也不是很大,但因为当初考虑的不周全,导致最后,不得不通过删减程序功能,来达到完成任务的目的。

在银行家算法这个系统之中,所采用的数据结构应是最基本的部分。

银行家算法的数据结构我们采用了一维数组与二维数组来存储,比如最大需求量Max[][]、已分配资源数Allocation[][]、仍需求资源数Need[][]、以及系统可利用的资源数、申请各类资源等数组。

数据结构虽然重要但却只是基础,而最主要的用以实现系统功能的应该有两个部分,一是用银行家算法来判断,二是用安全性算法来检测系统的安全性。

在本程序代码中,银行家算法用judge()函数来实现。

首先,输入欲申请资源的进程以及其所申请的资源数,存放在Request数组中。

然后,判断进程请求的资源数是否大于其所需的资源数,若大于则报错并返回,若不大于则继续判断它是否大于系统在此时刻可利用的资源数,同样,如果大于则报错并反回,如果不大于则调用changedata()函数来进行预分配,之后再调用安全型算法safty检查。

最后,无论此次分配是否成功,我们都可以选择继续分配或者退出系统。

安全性检测我们是用safty()函数来实现的。

首先,Finish[]为布尔型,默认是False,即该进程未完成。

而Work——即该系统中可以用来工作的资源数——最开始为系统最初可以用的资源数。

然后,我们从第一个进程开始判断该进程未完成且其所需求的资源量不大于该系统中可以用来工作的资源量这个条件是否成立,即Finish[]=False且Need[][]<=Work[]是否成立。

成立的话则将当前在工作的资源量与该进程已分配的资源量相加,存放于当前可用来工作的资源量当中,即Work[]=Work[]+Allocation,并将Finish[]的值改为True。

否则便将此进程的优先级减一,排在队位,然后开始往后循环。

待所有的进程循环完毕,我们再次判断是否还存在进程的Finish[]=False,如果仍存在,则说明系统没有安全序列,处于不安全状态,不可以进行分配;否则,系统处于安全状态,将预分配变为实际分配,求出安全序列并且将实际分配后的资源分配情况打印输出。

除此之外,在程序当中,我们也得强调一下对输入的合法性的判断。

比如,我们输入的欲申请资源的进程号没有在系统已存在的进程当中,或者进程号定义为整型,但是却错输成字母等情况,我们需要对这些情况进行判断,让程序报错返回而并非因错误而中断。

这样的情况处理起来比较麻烦,相当于对每次输入针对各种不同的情况都得做判断。

我也没有涵盖全部的输入,仅仅只是对输入的进程号不在已存在进程当中、以及输入的操作选择不存在两种情况分别作了判断,并且针对第二种情况设定了五次输入错误的话系统关闭的功能。

而因为对于某些——比如进程号——本来设定就是整型,因此对输入的是字母的判别因比较复杂而未能加上。

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

8.参考文献

[1]汤小丹,梁红兵,哲凤屏,汤子瀛.计算机操作系统.西安:

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

[2]严蔚敏,吴伟民.数据结构.北京:

清华大学出版社,2006.

[3]赵莉,杨国梁,孙喁喁,徐飞.Java程序设计教程.西安:

西安科技大学出版社,2009.

[4](XX文库:

银行家算法报告)

[5](志文工作室:

银行家算法模拟实现)

 

9.附录:

程序清单

#include"string.h"

#include

#include

#defineM7

#defineN5

#defineFALSE0

#defineTRUE1

/*M个进程对N类资源最大资源需求量*/

intMAX[M][N]={{9,7,5},{5,4,4},{11,0,4},{4,4,4},{6,5,5}};

/*系统可用资源数*/

intAVAILABLE[N]={12,7,9};

/*M个进程对N类资源最大资源需求量*/

intALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};

/*M个进程已经得到N类资源的资源量*/

intNEED[M][N]={{9,7,5},{5,4,4},{11,0,4},{4,4,4},{6,5,5}};

/*M个进程还需要N类资源的资源量*/

intRequest[N]={0,0,0};

intmain()

{

inti=0,j=0;

charflag='Y';

voidshowdata();

voidchangdata(int);

voidrstordata(int);

intchkerr(int);

showdata();

while(flag=='Y'||flag=='y')

{

i=-1;

while(i<0||i>=M)

{

printf("请您输入想要申请资源的进程号(从0至");

printf("%d",M-1);

printf(",请您重新输入!

):

");

scanf("%d",&i);

if(i<0||i>=M)printf("不好意思,你所输入的进程号不存在,请重新输入!

\n");

}

printf("请您输入进程号");

printf("%d",i);

printf("申请的资源数\n");

for(j=0;j

{

printf("资源");

printf("%d",j);

printf(":

");

scanf("%d",&Request[j]);

if(Request[j]>NEED[i][j])

{

printf("进程");

printf("%d",i);

printf("申请的资源数大于进程");

printf("%d",i);

printf("如果还需要");

printf("%d",j);

printf("类资源的资源量!

您所提出的申请的不合理,出现错误!

请您重新选择!

\n");

/*printf("您所提出的申请的不合理,出现错误!

请您重新选择!

\n");*/

flag='N';

break;

}

else

{

if(Request[j]>AVAILABLE[j])

{

printf("进程");

printf("%d",i);

printf("申请的资源数大于系统可用");

printf("%d",j);

printf("类资源的资源量!

您所提出的申请不合理,出现错误!

请您重新选择!

\n");

/*printf("您所提出的申请不合理,出现错误!

请您重新选择!

\n");*/

flag='N';

break;

}

}

}

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

{

changdata(i);

if(chkerr(i))

{

rstordata(i);

showdata();

}

else

showdata();

}

else

showdata();

printf("\n");

printf("请问是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:

");

scanf("%c",&flag);

}

}

voidshowdata()

{

inti,j;

printf("注意!

系统可用的资源数为:

\n");

printf("");

for(j=0;j

printf("资源");

printf("%d",j);

printf(":

");

printf("%d",AVAILABLE[j]);

/*printf("\n");*/

/*cout<

//cout<<"各进程资源的最大需求量:

"<

//for(i=0;i

//{

//cout<<"进程"<

";

//for(j=0;j

"<

//cout<

*/}

printf("\n");

printf("各进程还需要的资源量:

\n");

for(i=0;i

{

printf("进程");

printf("%d",i);

printf(":

");

for(j=0;j

printf("资源");

printf("%d",j);

printf(":

");

printf("%d",NEED[i][j]);

/*printf("\n");*/

}

printf("\n");

}

printf("各进程已经得到的资源量:

\n");

for(i=0;i

{

printf("进程");

printf("%d",i);

/*printf(":

\n");*/

for(j=0;j

printf("资源");

printf("%d",j);

printf(":

");

printf("%d",ALLOCATION[i][j]);

/*printf("\n");*/

}

printf("\n");

}

}

voidchangdata(intk)

{

intj;

for(j=0;j

{

AVAILABLE[j]=AVAILABLE[j]-Request[j];

ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

NEED[k][j]=NEED[k][j]-Request[j];

}

};

voidrstordata(intk)

{

intj;

for(j=0;j

{

AVAILABLE[j]=AVAILABLE[j]+Request[j];

ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

NEED[k][j]=NEED[k][j]+Request[j];

}

}

intchkerr(ints)

{

intWORK,FINISH[M],temp[M];

inti,j,k=0;

for(i=0;i

for(j=0;j

{

WORK=AVAILABLE[j];

i=s;

while(i

{

if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)

{

WORK=WORK+ALLOCATION[i][j];

FINISH[i]=TRUE;

temp[k]=i;

k++;

i=0;

}

else

{

i++;

}

}

for(i=0;i

if(FINISH[i]==FALSE)

{

printf("\n");

printf("注意:

系统不安全!

本次资源申请不成功!

\n");

printf("\n");

return1;

}

}

printf("\n");

printf("注意:

经安全性检查,系统安全,本次分配成功。

\n");

printf("\n");

printf("本次安全序列:

");

for(i=0;i

printf("进程");

printf("%d",temp[i]);

printf("->");

}

printf("\n");

return0;

}

设计过程中质疑(或答辩)记载:

1、银行家算法设计的基本思路是什么?

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

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

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

2、什么是安全序列呢?

如果对每一个进程Pi(1

3、进程申请资源,用银行家算法对其进行检测,分为以下哪三种情况?

A.所申请的资源大于其所需资源,提示分配不合理不予分配并返回

B.所申请的资源未大于其所需资源,但大于系统此时的可利用资源,提示分配不合理不予分配并返回。

C.所申请的资源未大于其所需资源,亦未大于系统此时的可利用资源,预分配并进行安全性检查。

4、预分配并进行安全性检查要考虑的情况:

A.预分配后系统是安全的,将该进程所申请的资源予以实际分配并打印后返回。

B.与分配后系统进入不安全状态,提示系统不安全并返回。

指导教师评语:

 

签名:

年月日

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

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

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

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