银行家算法Word格式文档下载.docx
《银行家算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《银行家算法Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
5.1.实验原理分析
5.1.1.算法的来源及基本思想
银行家算法,顾名思义是来源于银行的借贷业务,通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
5.1.2.死锁产生的条件
银行家算法是用来避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件:
A、即一个资源每次只能由一个进程使用;
B、第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;
C、第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;
D、第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
银行家算法是避免死锁的方法中,施加的限制条件较弱的,有利于获得令人满意的系统性能的方法。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
5.1.3模拟进程申请资源
把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,,每个进程的资源需求总量不能超过系统拥有的资源总数,银行算法进行资源分配可以避免死锁.
5.2.程序结构分析:
5.2.1.程序流程图
程序流程图是人们对解决问题的方法、思路或算法的一种描述。
流程图的优点:
(a)采用简单规范的符号,画法简单;
(b)结构清晰,逻辑性强;
(c)便于描述,容易理解。
流程图采用规范的符号
(1)起始框
(2)终止框
(3)执行框(4)判别框
图1银行家算法流程图
6程序及说明
算法用到的主要数据结构和C语言说明。
(1)可利用资源向量INTAVAILABLE[M]M为资源的类型。
(2)最大需求矩阵INTMAX[N][M]N为进程的数量。
(3)已分配矩阵INTALLOCATION[N][M]
(4)还需求矩阵INTNEED[N]
假设有M个进程N类资源,则有如下数据结构:
#defineW10
#defineR20
intM;
intN;
intALL_RESOURCE[W];
intMAX[W][R];
intAVAILABLE[R];
intALLOCATION[W][R];
intNEED[W][R];
intRequest[R];
(5)各子模块相关函数代码已经在附录中一一列出。
6.1示例数据
进程数:
2
资源数:
资源0:
10
资源1:
20
资源0(最大需求)
资源1(最大需求)
进程0
1
进程1
资源0(已占有)
资源1(已占用)
6
8
7设计结果与分析
图2输入数据完成初始化
注:
初始化时,如果输入数据不符合要求,程序能给出错误提示并要求使用者重新输入数据。
为简便期间,省去此功能的截屏图像。
演示者可以自行上机体会。
计算机自动检测水所有进程能否构成一个安全序列。
图3手动为进程申请资源
如果能够构成安全序列,就显示出是否进行手动申请资源。
输入k开始手动申请资源。
图4申请资源的进程号
申请资源并进行安全性检查。
图5选择是否继续演示
用户根据根据该界面选择是否继续演示操作。
图6配置资源数
用户根据此界面进行配置相应的资源数目。
图7选择退出演示运行界面
用户输入输入N结束演示。
7.3出现问题及解决方案
源程序中未考虑进程状态会随着程序运行发生变化,为了完善程序专门编写了状态函数voidset()来显示进程状态。
如图6-2-2与图6-2-4倒数2、3行中均显示了进程状态。
源程序中指定资源数必须是三种,经过改进后资源数可以为1到10中的任意数。
源程序资源矩阵的输出界面不能自动适应数据长度的变化,修改后资源的矩阵输出界面中的数据显示获得了改善。
8.设计心得体会
这次课程设计没有将程序初始化代码段分离出来,以至于程序的结构不清晰,由于初始化代码不是一个独立的函数致使程序的可读性较差。
作课程设计时应尽量把功能模块设计好考虑好,使程序易于理解。
设计中得到了老师和广大同学的帮助,并参考了网络上的优秀论文和纸质文件,使我的课程设计能够较为顺利的进行下去。
9.附录(关键源代码)
#include"
string.h"
iostream"
iomanip"
usingnamespacestd;
#defineFALSE0
#defineTRUE1
intFINISH[W];
intWORK[100];
intQ[100];
intL=0;
voidshowdata()
{
inti,j;
cout<
<
"
————————————————————————"
endl;
各种资源的总数量(all):
"
;
for(j=0;
j<
N;
j++)cout<
资源"
:
ALL_RESOURCE[j];
endl<
系统目前各种资源可用的数为(available):
AVAILABLE[j];
—————————————————————"
各进程还需要的资源量(need):
setw(8)<
资源"
j;
for(i=0;
i<
M;
i++)
{
进程p"
NEED[i][j];
//<
//;
}
各进程已经得到的资源量(allocation):
i++)
ALLOCATION[i][j];
voidchangdata(intk)
intj;
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;
{AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
intchkerr(ints)
{intWORKrest;
//FINISH[W]
inti,j,k=0;
for(i=0;
i++)FINISH[i]=FALSE;
for(j=0;
{
WORKrest=AVAILABLE[j];
i=s;
do
if(FINISH[i]==FALSE&
&
NEED[i][j]<
=WORKrest)
WORKrest=WORKrest+ALLOCATION[i][j];
FINISH[i]=TRUE;
i=0;
else
i++;
}while(i<
M);
if(FINISH[i]==FALSE)
系统不安全!
!
本次资源申请不成功!
return1;
cout<
状态:
阻塞"
经安全性检查,系统安全,本次分配成功。
return0;
voidset()
intt[10];
for(inti=0;
i++){
t[i]=0;
for(intj=0;
j++){if(NEED[i][j]==0)t[i]+=1;
if(t[i]==N)
{cout<
运行结束"
for(intk=0;
k<
k++)
AVAILABLE[k]=AVAILABLE[k]+ALLOCATION[i][k];
ALLOCATION[i][k]=0;
}
else
等待调用"
voidsafe()
{cout<
·
现在计算机自动检测是否存在安全序列·
j++)
WORK[j]=AVAILABLE[j];
intflag=0;
i<
FINISH[i]=FALSE;
if(FINISH[i]==FALSE)
{
flag=0;
for(j=0;
j<
j++)
{
if(WORK[j]>
=NEED[i][j])
flag=flag+1;
else
break;
}
if(flag==N)
{
Q[L]=i;
FINISH[i]=TRUE;
for(j=0;
{
WORK[j]=WORK[j]+ALLOCATION[i][j];
//cout<
b"
WORK[j];
}
L=L+1;
//cout<
L<
cout<
资源释放后系统目前各种资源可用的数为(available):
//cout<
*********************"
cout<
l"
cout<
for(j=0;
cout<
i=0;
}
else;
inttest()
{
if(L<
M)
\n当前状态不安全!
不存在安全序列"
^^^您不能向系统申请资源^^^"
………计算机检测结束………"
else
inti;
//l=0;
\n此时处于安全的状态!
安全序列是:
i++)
进程"
p"
Q[i]<
-->
voidbank()
inti=0,j=0;
//i=0;
intj=0;
charflag='
Y'
while(flag=='
||flag=='
y'
)
i=-1;
while(i<
0||i>
=M)
{cout<
请输入需申请资源的进程号(从P0到P"
M-1<
,否则重输入!
):
cin>
>
i;
if(i<
=M)cout<
输入的进程号不存在,重新输入!
请输入进程P"
申请的资源数:
{
cin>
Request[j];
if(Request[j]>
NEED[i][j])
进程P"
申请的资源数大于进程P"
还需要"
类资源的资源量!
申请不合理,出错!
请重新选择!
flag='
N'
break;
AVAILABLE[j])//若请求的资源数大于可用资源数
{
申请的资源数大于系统可用"
}
}
}
if(flag=='
changdata(i);
if(chkerr(i))
rstordata(i);
showdata();
else{
set();
是否继续银行家算法演示,按'
或'
键继续,按'
n'
键退出演示:
flag;
voidmain()
********************************"
欢迎使用银行家安全性算法模拟程序"
本程序由C++编制完成"
inti=0,j=0,p;
do{cout<
请输入总进程数:
}while(M<
0);
请输入总资源种类:
}while(N<
请输入总资源数(all_resource):
{cout<
ALL_RESOURCE[i];
依次输入各进程所需要的最大资源数量(max):
i++
所需"
类资源的数目:
cin>
MAX[i][j];
if(MAX[i][j]>
ALL_RESOURCE[j])
所需资源超过了声明的该资源总数,请重新输入"
}while(MAX[i][j]>
ALL_RESOURCE[j]);
cout<
依次输入各进程已经占据的资源数量(allocation):
for(i=0;
已占有"
if(ALLOCATION[i][j]>
MAX[i][j])
占有资源超过了所需的最大资源,请重新输入"
}while(ALLOCATION[i][j]>
MAX[i][j]);
{p=ALL_RESOURCE[j];
p=p-ALLOCATION[i][j];
AVAILABLE[j]=p;
if(AVAILABLE[j]<
0)
AVAILABLE[j]=0;
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
safe();
if(test()==0);
{}
else{
charletter;
如果需要手动为进程申请资源,\n请输入字母k:
letter;
if(letter=='
k'
)
{showdata();
bank();
};
};
10.参考文献
[1]汤子赢《计算机操作系统(修订版)》[M].西安:
电子科技大学出版社2006:
20-100
[2]屠立德《操作系统基础(第三版)》[M].北京:
清华大学出版社2000:
34-50
[3]庞丽萍《操作系统原理》[M].武汉:
华中科技大学出版社2000:
55-120
[4]曹聪,范廉明.《操作系统原理与分析》[M].北京:
科学出版社2003:
1-100