操作系统课程设计报告银行家算法Word格式文档下载.docx

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

操作系统课程设计报告银行家算法Word格式文档下载.docx

《操作系统课程设计报告银行家算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告银行家算法Word格式文档下载.docx(28页珍藏版)》请在冰点文库上搜索。

操作系统课程设计报告银行家算法Word格式文档下载.docx

3概要设计4

3.1基本思路5

3.2银行家算法步骤5

3.3安全型算法步骤5

3.4数据结构5

3.4.1主要用到的数据结构6

3.4.2程序模块6

3.4.3各模块间的调用关系6

4详细设计4

4.1主要函数的核心代码5

4.1程序流程图5

5测试4

5.1测试用例5

5.1测试结果分析和截图5

6总结4

参考文献4

附录:

原程序清单4

1绪论

1.1前言:

Dijkstra(1965)提出了一种能够避免死锁的调度算法,称为银行家算法。

它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。

这里将客户比作进程,贷款比作设备,银行家比作系统。

客户们各自做自己的生意,在某些时刻需要贷款。

在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。

一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。

如果忽然所有的客户都申请,希望得到最大贷款额,而银行家无法满足其中任何一个的要求,则发生死锁。

不安全状态并不一定导致死锁,因为客户未必需要其最大贷款额度,但银行家不敢抱这种侥幸心理。

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

若是,则不满足该请求;

否则便满足。

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

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

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

1.2研究意义:

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

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

要预防死锁,有摒弃“请求和保持”条件,摒弃“不剥夺”条件,摒弃“环路等待”条件等方法。

但是,在预防死锁的几种方法之中,都施加了较强的限制条件;

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

在该方法中把系统状态分为安全状态和不安全状态,便可避免死锁的发生。

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

利用银行家算法,我们可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。

1.3结构安排:

一、绪论:

介绍了题目背景以及研究意义。

二、需求分析:

介绍了题目描述、银行家算法、以及基本要求和所需达到的目的。

三、概要设计:

介绍了基本的算法思路、步骤,以及数据结构和主要的函数模块及其调用关系。

四、详细设计:

介绍了主要函数及其核心代码,以及程序流程图。

五、测试

六、总结

参考文献

原程序清单

2需求分析

2.1题目描述:

银行家算法是一种最具有代表性的避免死锁的算法。

要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。

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

安全状态一定没有死锁发生。

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

那么,什么是安全序列呢?

如果对每一个进程Pi(1<

i<

n),它以后尚需要的资源量不超过系统当前可利用的资源量与所有的进程Pj(j<

n)所占有的资源量之和,则称此进程序列{P1,P2,…,Pn}是安全的,称作安全序列。

2.2银行家算法:

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

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

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

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

2.3基本要求:

(1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。

(2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。

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

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

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

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

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

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

(4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。

2.4目的:

根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。

明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。

3概要设计

3.1算法思路:

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

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

若安全,则分配;

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

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

(1)设置两个向量

①工作向量Work。

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

②布尔向量Finish。

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

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

①Finish[i]=false

②Need<

or=Work

如找到,执行步骤(3);

否则,执行步骤(4)。

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

Work=Work+Allocation;

Finish[i]=true;

转向步骤

(2)。

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

否则,系统处于不安全状态。

3.4数据结构:

3.4.1主要用到的数据结构:

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

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

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

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

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

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

3.4.2程序模块:

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

publicvoidprintFrame()//初始化

publicvoidprint()//打印输出

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

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

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

3.4.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、安全性算法流程图

注:

程序流程图是根据自己程序的整个流程用photoshop制成,再插入进来。

5测试

5.1测试用例:

测试用例为课本上的例题:

某系统有R1、R2和R3共3种资源,在T0时刻P1、P2、P3和P4这4个进程对资源的占用和需求情况见下表,此刻系统的可用资源为(2,1,2)。

进程最大需求量占有量

R1R2R3R1R2R3

P1322100

P2613411

P3314211

P4422002

取了4种不同的例子,来测试系统的主要功能是否实现:

进程iRequest[i]检测结果

a.1212Request>

Need

b.0222Request>

Available

c.1101可以分配

d.0101系统不安全

5.2测试结果截图:

1.开始界面

2.初始化并打印输出

3.用例测试a:

进程1发出请求Request(2,1,2)——Request>

Need,不予分配。

4.用例测试b:

进程0发出请求Request(2,2,2)——Request>

Available,不予分配。

5.用例测试c:

进程1发出请求Request(1,0,1)——可以分配。

6.用例测试d:

进程0发出请求Request(1,0,1)——系统不安全。

7.输入测试a:

如果所输入的要分配资源的进程号不在存在的进程,则报错请求重新输入。

8.输入测试b:

在选择继续分配还是退出中,如果输入不符合要求,则报错请求重新输入,连续错误5次后系统将自动关闭。

6总结

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

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

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

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

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

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

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

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

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

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

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

=Work[]是否成立。

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

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

待所有的进程循环完毕,我们再次判断是否还存在进程的Finish[]=False,如果仍存在,则说明系统没有安全序列,处于不安全状态,不可以进行分配;

否则,系统处于安全状态,将预分配变为实际分配,求出安全序列并且将实际分配后的资源分配情况打印输出。

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

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

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

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

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

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

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

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

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

清华大学出版社,2006.

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

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

[4](XX文库:

银行家算法报告)

[5](志文工作室:

银行家算法模拟实现)

源程序清单

packagebank;

importjava.util.Scanner;

publicclassTest

{

intno1,no2;

staticintMax[][];

//最大需求

staticintAllocation[][];

//已分配资源数

staticintNeed[][];

//仍需资源数

staticintAvailable[];

//可利用资源数

staticStringname1[];

staticStringname2[];

staticboolean[]Finish;

staticint[]temp={0};

//存放安全序列

staticintwork[];

staticint[]Request;

Scannerinput=newScanner(System.in);

publicstaticvoidmain(String[]args){

Testt=newTest();

t.printFrame();

//t.print();

t.Safty();

t.judge();

}

/*输入初始化数据*/

publicvoidprintFrame()

{

System.out.println("

*****************************************************"

);

**"

*银行家算法设计与实现*"

System.out.println("

System.out.print("

请输入系统中进程的个数:

"

no1=input.nextInt();

System.out.print("

请输入资源的种类数:

no2=input.nextInt();

Max=newint[no1][no2];

Allocation=newint[no1][no2];

Need=newint[no1][no2];

Available=newint[no2];

name1=newString[no1];

name2=newString[no2];

intsum[]=newint[3];

for(inti=0;

i<

no1;

i++)

{

System.out.print("

请输入进程"

+i+"

的名字:

name1[i]=input.next();

}

no2;

请输入资源"

name2[i]=input.next();

for(intj=0;

j<

j++)

{

System.out.print("

+name1[i]+"

的"

+name2[j]

+"

类资源最大需求量:

Max[i][j]=input.nextInt();

}

i++)

j++)

类资源已占有资源量:

Allocation[i][j]=input.nextInt();

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

for(inti=0;

请输入类资源"

+name2[i]+"

的可利用资源数:

Available[i]=input.nextInt();

//for(inti=0;

i++)//算出资源分配后,系统的可利用资源数

//{

//for(intj=0;

//{sum[i]+=Allocation[j][i];

}

//}

{Available[i]=Available[i]-sum[i];

/*打印輸出*/

publicvoidprint()

**************此时刻资源分配情况**************"

NumberNameMaxAllocationNeed"

System.out.print("

"

+i+"

System.out.print(name1[i]+"

for(intj=0;

{System.out.print(Max[i][j]+"

{System.out.print("

+Allocation[i][j]);

+Need[i][j]);

System.out.println();

各个类资源可利用的资源数分别为:

{System.out.print("

+Available[j]);

System.out.println();

/**

*进行安全性检测

*/

publicvoidSafty(){

Finish=newboolean[no1];

temp=newint[no1];

inti,k=0,m,apply,j;

//k为安全序列的序列数

intflag=0;

work=newint[no2];

for(i=0;

{work

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

当前位置:首页 > 小学教育 > 英语

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

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