银行家算法课程设计报告文档格式.docx
《银行家算法课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《银行家算法课程设计报告文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
2、课题任务描述..................................2
3、课题研发相关知识..............................2
4、课题设计......................................2
5、源程序........................................7
6、运行与测试....................................12
7、收获及改进意见................................14
一、课程设计目的
进行该课程设计主要是在掌握了采用银行家算法避免死锁的基础上,设计一个程序来模拟操作系统在避免死锁时采用的银行家算法策略,加深对银行家算法的理解,掌握银行家算法避免死锁的全过程及其原理。
同时提高运用操作系统理论知识解决实际问题的能力,并锻炼实际的编程能力、创新能力,以及提高调查研究、查阅技术文档、编写软件设计文档的实践动手能力。
二、课题任务
三、课题研发相关知识
3.1.1银行家算法原理
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2)顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
3.1.2死锁产生的条件
银行家算法是用来避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件:
A、即一个资源每次只能由一个进程使用;
B、第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;
C、第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;
D、第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
银行家算法是避免死锁的方法中,施加的限制条件较弱的,有利于获得令人满意的系统性能的方法。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
3.1.3基本要求
(1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。
(2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。
(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况:
A.所申请的资源大于其所需资源,提示分配不合理不予分配并返回
B.所申请的资源未大于其所需资源,但大于系统此时的可利用资源,提示分配不合理不予分配并返回。
C.所申请的资源未大于其所需资源,亦未大于系统此时的可利用资源,预分配并进行安全性检查:
a.预分配后系统是安全的,将该进程所申请的资源予以实际分配并打印后返回。
b.与分配后系统进入不安全状态,提示系统不安全并返回。
4、课题设计
1.总体结构
2.所用数据结构
(1)最大需求矩阵Max[][]
(2)已分配矩阵Allocation[][]
(3)仍需求矩阵Need[][]=Max[][]-Allocation[][]
(4)可利用资源向量Available[]
(5)申请各类资源向量Request[]
(6)工作向量work[],Finish[]
3.主要功能流程图
图5-1初始化算法
图5-2安全性判断算法
5、源程序
importjava.util.Scanner;
publicclassBanker{
intProcessNum;
//进程数
intSourceNum;
//资源类型数
int[]Available;
//可利用资源向量
int[][]Max;
//最大需求矩阵
int[][]Allocation;
//分配矩阵
int[][]Need;
//需求矩阵
publicBanker(intpN,intsN)//构造函数初始化
{
ProcessNum=pN;
SourceNum=sN;
Available=newint[SourceNum];
Max=newint[ProcessNum][SourceNum];
Allocation=newint[ProcessNum][SourceNum];
Need=newint[ProcessNum][SourceNum];
}
publicvoidInitilize()
{//初始化方法
Scanners=newScanner(System.in);
System.out.println("
==========初始化=========="
);
for(inti=0;
i<
Max.length;
i++)
System.out.print("
请依次输入第"
+i+"
进程需要的最大资源数:
"
for(intj=0;
j<
Max[i].length;
j++)
Max[i][j]=s.nextInt();
for(inti=0;
i<
Allocation.length;
i++)
进程中已分配资源的数量:
for(intj=0;
j<
Allocation[i].length;
j++)
Allocation[i][j]=s.nextInt();
Need[i][j]=Max[i][j]-Allocation[i][j];
}
Available.length;
请输入系统中第"
种资源的可利用数量:
Available[i]=s.nextInt();
==========初始化结果=========="
MAXALLOCATIONNEEDAVAILABLE"
ProcessNum;
P"
:
"
SourceNum;
j++){
if(Max[i][j]>
9)
{//如果是两位数,控制格式,在数字前少输出一个"
。
System.out.print(Max[i][j]+"
else
+Max[i][j]+"
if(Allocation[i][j]>
System.out.print(Allocation[i][j]+"
+Allocation[i][j]+"
if(Need[i][j]>
9){
System.out.print(Need[i][j]+"
+Need[i][j]+"
if(i==0)
SourceNum;
if(Available[j]>
System.out.print(Available[j]+"
+Available[j]+"
System.out.println();
=====完成初始化====="
publicvoidBakerAlgorithm()
{//银行家算法具体实现
int[]Request=newint[SourceNum];
intnumber;
//进程号
Scanners=newScanner(System.in);
inti;
//循环计数器
请输入要申请资源的进程号:
number=s.nextInt();
请输入请求资源数:
for(i=0;
i<
Request[i]=s.nextInt();
if(Request[i]>
Need[number][i])
{//所需资源数大于需求量
进程所要求分配的资源数已超过其宣布的最大值,系统不予分配!
return;
Available[i])
{//所需资源大于可利用资源
系统中无足够的资源满足进程的申请,系统不予分配!
{//假设系统将申请资源数分配给该进程,对数据进行相关修改
Available[i]-=Request[i];
Need