操作系统管理银行家算法程序 实验报告Word文档格式.docx
《操作系统管理银行家算法程序 实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统管理银行家算法程序 实验报告Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
iostream.h>
#defineFALSE0
#defineTRUE1
#defineW10//最大进程数W=10
#defineR20//最大资源总数R=20
intM;
//总进程数
intN;
//资源种类数
intALL_RESOURCE[W];
intAVAILABLE[R];
//可利用资源向量
intMAX[W][R];
//最大需求矩阵
intALLOCATION[W][R];
//分配矩阵
intNEED[W][R];
//需求矩阵
intRequest[R];
//进程请求向量
voidinputdata();
//数据输入
voidshowdata();
//数据显示
voidchangdata(intk);
//进程请求资源数据改变
voidrestoredata(intk);
//数据恢复
intchksec(ints);
//系统安全性的检测
intchkmax(ints);
//检测最大需求
voidbank();
//检测分配的资源是否合理
voidmain()
{inti,j;
inputdata();
for(i=0;
i<
M;
i++)
{j=chksec(i);
if(j==0)break;
}
if(i>
=M)
cout<
<
"
错误提示:
经安全性检查发现,系统的初始状态不安全!
!
\n"
endl;
else
{cout<
提示:
经安全性检查发现,系统的初始状态安全!
bank();
}
}
voidinputdata()
{inti=0,j=0,p;
cout<
请输入总进程数:
do{
cin>
>
if(M>
W)cout<
endl<
总进程数超过了程序允许的最大进程数,请重新输入:
}while(M>
W);
请输入资源的种类数:
do{cin>
N;
if(N>
R)
资源的种类数超过了程序允许的最大资源种类数,请重新输入:
}while(N>
R);
请依次输入各类资源的总数量,即设置向量all_resource:
i++)cin>
ALL_RESOURCE[i];
请依次输入各进程所需要的最大资源数量,即设置矩阵max:
for(i=0;
{
for(j=0;
j<
j++)
do{cin>
MAX[i][j];
if(MAX[i][j]>
ALL_RESOURCE[j])
该最大资源数量超过了声明的该资源总数,请重新输入:
}while(MAX[i][j]>
ALL_RESOURCE[j]);
请依次输入各进程已经占据的各类资源数量,即设置矩阵allocation:
do{cin>
ALLOCATION[i][j];
if(ALLOCATION[i][j]>
MAX[i][j])
cout<
已占有的资源数量超过了声明的最大资源数量,请重新输入:
}while(ALLOCATION[i][j]>
MAX[i][j]);
for(j=0;
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
//cout<
请输入系统中还可利用得各资源数量,即设置向量available:
//for(j=0;
//{
//cin>
AVAILABLE[j];
//}
{p=ALL_RESOURCE[j];
{p=p-ALLOCATION[i][j];
AVAILABLE[j]=p;
if(AVAILABLE[j]<
0)
AVAILABLE[j]=0;
voidshowdata()
各种资源的总数量,即向量all_resource为:
"
;
资源"
:
ALL_RESOURCE[j];
当前系统中各类资源的可用数量,即向量available为:
各进程还需要的资源数量,即矩阵need为:
i++)
进程P"
cout<
NEED[i][j]<
各进程已经得到的资源量,即矩阵allocation为:
ALLOCATION[i][j]<
}cout<
}
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];
voidrestoredata(intk)
{
intj;
{AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
intchksec(ints)//安全性检查
intWORK,FINISH[W];
inti,j,k=0;
FINISH[i]=FALSE;
{WORK=AVAILABLE[j];
i=s;
do
{if(FINISH[i]==FALSE&
&
=WORK)
{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
i=0;
}else
{i++;
}
}while(i<
M);
if(FINISH[i]==FALSE)
{return1;
}return0;
intchkmax(ints)
{intj,flag=0;
if(MAX[s][j]==ALLOCATION[s][j])
{flag=1;
AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];
MAX[s][j]=0;
}
}returnflag;
voidbank()
inti=0,j=0;
charflag='
Y'
while(flag=='
||flag=='
y'
)
i=-1;
while(i<
0||i>
请输入需申请资源的进程号(从P0到P"
M-1<
,否则重新输入!
):
p"
cin>
i;
if(i<
=M)
cout<
输入的进程号不存在,重新输入!
请输入进程P"
申请的资源数:
{cout<
Request[j];
if(Request[j]>
NEED[i][j])
{cout<
申请的资源数大于进程P"
还需要"
类资源的资源量!
申请不合理,出错!
请重新选择!
flag='
N'
break;
}
else
{if(Request[j]>
AVAILABLE[j])
{cout<
申请的资源数大于系统可用"
flag='
break;
}
if(flag=='
{changdata(i);
if(chksec(i))
该分配会导致系统不安全!
!
本次资源申请不成功,不予分配!
restoredata(i);
else
经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示:
showdata();
if(chkmax(i))
{cout<
在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,"
因此在进程结束后系统将回收这些资源!
在资源收回之后,各进程的资源需求和分配情况如下所示:
showdata();
}
}
是否继续银行家算法演示,按'
或'
键继续,按'
n'
键退出演示:
flag;
5、结果分析
图1.输入进程数、资源种类、资源数目、并进行安全性检查
图2.输入请求资源的进程号,进行资源分配
图3..P1请求资源的分配情况
六、实验体会
银行家算法是一种能有效避免死锁的算法,虽然原理自己很明白,但是用编程算法来解释自己却无重下手,自己的编程能力太差,本程序有一大部分是参考的网上的讲解,这几次的操作系统实验自己完成的都不好,看来以后得加强自己的编程能力。