《银行家算法的模拟实现》实验报告Word下载.docx
《《银行家算法的模拟实现》实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《《银行家算法的模拟实现》实验报告Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<
=AVALIABLE[I,J]。
如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)
(5)、进行资源的预分配,语句如下:
AVALIBLE[I][J]=AVALIBLE[I][J]-K;
ALLOCATION[I][J]=ALLOCATION[I][J]+K;
NEED[I][J]=NEED[I][J]-K;
(6)、系统调用安全性检查算法(checksafe()函数)进行检查,如果检查通过,则不用回收,否则进行回收,进程资源申请失败进入等待。
4、安全性检查算法(checksafe()子函数)
(1)、设置两个临时变量。
FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1,也可设为其它非零值以表示执行的先后次序。
WORK[M]记录模拟执行中资源的回收情况,初值为AVAILABLE[M]的值。
(2)、在进程中查找符合以下条件的进程。
条件1:
FINISH[I]=0
条件2:
NEED[I][J]〈=WORK[J]
(3)、如果查找成功则进行资源的模拟回收,语句如下:
WORK[J]=WORK[J]+ALLOCATION[I][J];
FINISH[I]=1或查找到的顺序号
(4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成功标志。
否则返回成功标志。
四、系统流程图
开始
输入资源数m,及各类资源总数,初始化Available向量
输入进程数n,i=1
输入进程i的最大需求向量max。
i≤n
max≤资源总数
提示错误重新输入
i加1
任选一个进程作为当前进程
输入该进程的资源请求量Request
调用银行家算法,及安全性算法,完成分配,或并给出提示
该进程的Need向量为0
该进程已运行结束
Need矩阵为0
所有进程运行都结束
结束
N
Y
初始化need矩阵
五、程序源代码
#include<
iostream.h>
#include<
stdio.h>
stdlib.h>
constunsignedshortc=3;
//资源类数
constunsignedshortt=5;
//进程数
voidprint();
//用于打印输出表格的函数
voidinput();
//用于输入的函数
voidtryfenpei(inti);
//试分配函数;
voidrefenpei(inti);
//恢复数据函数
voidchecksafe(ints);
//安全检测函数
inttemp[t];
intwork[c];
//定义初始化数组
intneed[t][c],request[c],available[c];
intmax[t][c]={3,5,7,9,11,6,8,2,9,5,6,3,5,7,4};
intallocation[t][c]={1,2,5,4,8,5,4,1,8,3,3,2,4,3,1};
inttotal[c]={17,21,25};
intin;
//用户选择的进程号
/*------------------main函数-----------------------------*/
intmain(intargc,char*argv[])
{
inti;
charch='
Y'
;
intl=0,m=0,a;
for(i=0;
i<
t;
i++)
{
for(intj=0;
j<
c;
j++)
need[i][j]=max[i][j]-allocation[i][j];
}
for(m=0;
m<
m++)
a=0;
for(intl=0;
l<
l++)
a+=allocation[l][m];
available[m]=total[m]-a;
do{
if(ch=='
||ch=='
y'
)
cout<
<
"
ok,现在开始进入实验……"
endl;
cout<
请输入需要请求的进程号(0-4):
while(cin>
>
in)
{
if(!
(0<
=in&
&
in<
=4))
{
cout<
这里没有该进程,请重新输入~"
}
elsebreak;
}
您输入的是"
p["
]"
进程"
该进程需求量为:
"
for(i=0;
need[in][i]=max[in][i]-allocation[in][i];
cout<
need[in][i]<
}
请输入请求资源向量:
//输入格式为x
while(cin>
request[i])
if(request[i]<
0)cout<
sorry,输入的数字无效~"
elseif(request[i]>
need[in][i])
cout<
超出进程需求量~"
endl<
if(request[i]>
available[i])
系统没有足够多的可用资源量满足进程需要~"
elsebreak;
cout<
输入成功~,您输入的是:
request[0]<
<
request[1]<
request[2];
等待已久的银行家算法开始执行~"
tryfenpei(in);
//分配函数
试分配完成~"
现在进入安全性检测……"
checksafe(in);
//安全性检测函数
您还想继续银行家算法的实验吗~?
(y-继续n终止)"
elseif(ch=='
N'
n'
{
感谢您的使用,Bye~"
退出ing……"
break;
}
else
输出无效!
请重新输入"
while(cin>
ch);
return0;
/*-------输出函数-------*/
voidprint()
inti,j;
更新数据中..."
|-------|------------|-----------|----------|-----------|"
|-------|最大需求矩阵|已分配矩阵-|-需求矩阵-|可利用资源-|"
|资源|Max|Allocation|Need|available|"
||ABC|ABC|ABC|ABC|"
|进程|||||"
for(i=0;
5;
|p"
|"
for(j=0;
3;
j++){
max[i][j]<
allocation[i][j];
need[i][j];
|"
if(i==0){
for(j=0;
available[j];
if(i>
0)
{cout<
cout<
/*--------试分配函数-------*/
voidtryfenpei(inti)
for(intf=0;
f<
f++)
available[f]=available[f]-request[f];
allocation[i][f]=allocation[i][f]+request[f];
need[i][f]=need[i][f]-request[f];
/*--------恢复数据函数-------*/
voidrefenpei(inti)
available[f]=available[f]+request[f];
allocation[i][f]=allocation[i][f]-request[f];
need[i][f]=need[i][f]+request[f];
intcom(int*p,int*q)
if(p[i]>
q[i])
return0;
return1;
/*--------安全检测函数---------*/
voidchecksafe(ints)
intflag,temp[t],i,j,l,k=0;
boolfinish[t];
finish[i]=false;
work[j]=available[j];
|-------|-----------------|----------|"
|resource|-Work+Allocation-|--Finish--|"
||ABC|T/F|"
|programme|||"
l=0;
if(need[i][j]>
work[j])
l=1;
break;
if(finish[i]==false&
l==0)
for(j=0;
work[j]=work[j]+allocation[i][j];
if(work[j]>
9)
work[j]<
else
|"
finish[i]=true;
true"
temp[k]=i;
//cout<
'
temp="
temp[k]<
k++;
i=-1;
//从用户选择的进程开始对每个进程都要检测
for(i=0;
if(finish[i]==false)
flag=1;
if(flag==1)
系统不安全!
本次资源申请不成功感!
正在恢复原来的数据..."
refenpei(in);
恢复数据成功!
正在打印输出..."
print();
else
找到一个安全系列:
P"
temp[i]<
--->
已通过安全性测试!
开始给第"
p]"
进程分配资源..."
分配完成!
打印输出..."
五、程序运行结果及分析
1、运行结果
输入初值,进行安全性测试,结果安全序列,依次为P4-P0-P1-P2-P3分配资源:
资源不足,无法继续实验:
2、出现问题及解决方案
本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设计,尽可能使程序设计的更加完美。
在长期的设计调试过程中遇到过许多问题,通过网上搜索、查询资料、调试试验等方法一一解决。
下面大致罗列一些主要问题:
(1)、关于某些判断算法优劣问题:
在程序中很多地方都会用到循环判断是否符合条件的算法,在设计这些算法时有很多方法,而有的算法可以更节省时间。
如下安全性算法中寻找寻找符合Finish[i]==0条件的进程的例子:
/*算法一:
for(j=0;
j<
m;
j++)
if(Work[j]>
=Need[i][j])counter=counter+1;
//记数
if(counter==m){…
*///算法二:
=Need[i][j]);
//可用大于等于需求
else{
counter=1;
break;
if(counter!
=1){…
显然算法二要优于算法一。
本程序中还有很多类似的地方。
这里主要考虑的是一个程序的优化设计问题。
(2)、关于某些系统函数调用时的执行顺序:
在调用一些系统函数如getch()、system("
pause"
)等时发现其执行顺序的一些问题。
如类似:
=================================="
\n\n\n"
system("
);
//暂停
调试时发现此时:
在MicrosoftVisualC++6.0中先执行system("
)再输出显示,而在调试器BloodshedDev-C++中则顺序执行;
但当把cout<
改为cout<
其他不变时,则在两中调试器中均为顺序执行,即先显示后暂停。
查找了一下相关帮助:
在OSTREAM.H中有这样的一个inline函数:
inline_CRTIMPostream&
__cdeclendl(ostream&
_outs){return_outs<
'
\n'
<
flush;
}。
也就是说
endl=return_outs<
endl除了写'
进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕。
如果考虑效率就用'
(3)、关于设置暂停的方法:
在有些地方需要暂停一下以便于用户查看信息等,总结了下大致可用以下几中方法:
方法一:
//暂停一下并显示“输入任意键继续…”
方法二:
getchar();
//须按回车键结束,不是任意键
方法三:
conio.h>
getch();
//等待键盘输入,不返回任何值,无任何显示
方法四:
使用char*tt=newchar;
cin>
tt;
方式,要求键盘输入一个与程序无关的变量
六、心得体会
“银行家算法的模拟实现”是本学期操作系统课程唯一的课程设计。
在设计此程序的过程中,我们遇到过许多问题,也学到了很多东西。
本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。
程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。
在算法的数据结构设计上考虑了很长时间。
在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。
此外考虑最多的就是异常错误处理的设计。
一个好的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。
比如一般的要求输入为数字时,如果输入了一个非数字字符,程序就会立即出错无法继续运行,本程序针对这个问题设计了一个shuzi();
函数进行处理,处理方式为:
接受键盘输入的字符为字符串,然后对字符串的每个字符进行判断是否为数字,如果有非数字字符出现则提示出错并要求重新输入。
又如在判断是否继续时要求输入Y/N时,按一般的方式,如果输入为多个字符,则多余的字符会保存在缓冲区,到下次要求输入时输入而导致出错,对此问题设计处理方式为接受输入字符保存为串然后只取其首字符进行判断。
还有很多类似的错误处理。
还有在设置程序的显示优化时,发现暂停函数在不同的情况下执行顺序不同,如此等等。