《操作系统专题实训》Word文档格式.docx
《《操作系统专题实训》Word文档格式.docx》由会员分享,可在线阅读,更多相关《《操作系统专题实训》Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
5.初始化进程需求量的矩阵。
6.输入进程的资源请求量。
7.调用银行家算法完成分配。
(四)算法描述
银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;
若是,才分配。
它是最具有代表性的避免死锁的算法。
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
设进程cusneed提出请求REQUEST[i],则银行家算法按如下规则进行判断。
(1)如果REQUEST[cusneed][i]<
=NEED[cusneed][i],则转
(2);
否则,出错。
(2)如果REQUEST[cusneed][i]<
=AVAILABLE[cusneed][i],则转(3);
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
(4)系统执行安全性检查,如安全,则分配成立;
否则试探险性分配作废,系统恢复原状,进程等待。
(五)程序设计
#include<
string.h>
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];
{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为:
AVAILABLE[j];
各进程还需要的资源数量,即矩阵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;
(六)执行结果
(七)实验心得
为期一周的操作系统实训到这结束了,这次实训我选择的题目是银行家算法的实现,银行家算法在书里是比较重要的内容,通过这次成功的完成银行家算法的实现使我更加深刻的理解和掌握了银行家算法,也清楚了银行家算法避免死锁的基本思路。
理论上的知识固然重要,但毕竟只是概念上的理解,而这次实训很好的弥补了这点,不仅让我们的基础理论知识更加牢靠,同时也锻炼了我们动手解决问题的能力。
在实现银行家算法编程时,遇到了很多困难,编译老是出错,通过网上搜寻资料参考和同学们一起讨论,请教老师,最终还是很好的解决了这些问题,最终很好的完成了这次实训,在这里我要谢谢老师和同学们的帮助。
这次实训让我收获很大,体会也很深,但成功的喜悦让我对今后操作系统的学习更有信心了,相信这次实训给我们所有的同学带来的帮助都是不菲的。