操作系统银行家算法之欧阳化创编Word文档下载推荐.docx
- 文档编号:19900005
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:7
- 大小:17.30KB
操作系统银行家算法之欧阳化创编Word文档下载推荐.docx
《操作系统银行家算法之欧阳化创编Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统银行家算法之欧阳化创编Word文档下载推荐.docx(7页珍藏版)》请在冰豆网上搜索。
它是最具代表性的死锁算法,具体算法如下表示:
假设进程P提出请求Request[i],则银行家算法按如下步骤进行判断:
1)如果Request[i]<
=Need[i],则转向2);
否则出错。
2)如果Request[i]<
=Available[i],则转向3);
3)系统试探分配相关资源,修改相关数据:
Available[i]=Available[i]-Request[i];
Allocation[i]=Allocation[i]+Request[i];
Need[i]=Need[i]-Request[i];
4)系统执行安全性检查,如安全,则分配成立;
否则试探性分配资源作废,系统恢复原状,进程进入等待状态。
根据以上银行家算法步骤,可得出如下图所示流程图:
2.安全性检查算法
安全性检查算法主要是根据银行家算法进行资源分配后,检查资源分配后的系统状态是否处于安全状态之中。
具体算法如下所示:
1)设置两个工作向量Work=Available,Finish=false;
2)从进程集合中找到一个满足下述条件的进程;
Finish=false;
Need<
=work;
如果能够找到该进程,则执行3),否则,执行4);
3)假设上述找到的进程获得资源,可顺利执行,直至完成,从而释放资源。
Work=Work+Allocation;
Finish=true;
Goto2);
4)如果所有进程的Finish=true,则表示该系统安全,否则系统不安全,请求被拒。
5)根据以上安全检查算法步骤,可得出如下图所示流程图:
主要数据结构
#include<
iostream.h>
//////////////////////////////////////////////////////////////////////////
//全局变量定义
intAvailable[100];
//可利用资源数组
intMax[50][100];
//最大需求矩阵
intAllocation[50][100];
//分配矩阵
intNeed[50][100];
//需求矩阵
intRequest[50][100];
//M个进程还需要N类资源的资源量
intFinish[50];
intp[50];
intm,n;
//M个进程,N类资源
主要代码结构
/////////////////////////////////////////////////////////////////////////
//安全性算法
intSafe()
{
inti,j,l=0;
intWork[100];
for(i=0;
i<
n;
i++)
Work[i]=Available[i];
m;
Finish[i]=0;
{
if(Finish[i]==1)
continue;
else
{
for(j=0;
j<
j++)
{
if(Need[i][j]>
Work[j])
break;
}
if(j==n)
Finish[i]=1;
for(intk=0;
k<
k++)
Work[k]+=Allocation[i][k];
p[l++]=i;
i=-1;
elsecontinue;
}
if(l==m)
cout<
<
"
系统是安全的"
'
\n'
;
系统安全序列是:
\n"
for(i=0;
l;
cout<
p[i];
if(i!
=l-1)
cout<
-->
return1;
}
}
/////////////////////////////////////////////////////////////////////////////////
//银行家算法
intmain()
inti,j,mi;
cout<
输入进程的数目:
cin>
>
输入资源的种类:
输入每个进程最多所需的各类资源数,按照"
m<
x"
n<
矩阵输入\n"
for(j=0;
cin>
Max[i][j];
输入每个进程已经分配的各类资源数,按照"
Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
if(Need[i][j]<
0)
你输入的第"
i+1<
个进程所拥有的第"
j+1<
个资源错误,请重新输入:
j--;
continue;
请输入各个资源现有的数目:
Available[i];
Safe();
while
(1)
cout<
输入要申请的资源的进程号:
(第一个进程号为0,第二个进程号为1,依此类推)\n"
cin>
mi;
输入进程所请求的各个资源的数量\n"
for(i=0;
if(Request[mi][i]>
Need[mi][i])
所请求资源数超过进程的需求量!
return0;
Available[i])
所请求资源数超过系统所有的资源数!
Available[i]-=Request[mi][i];
Allocation[mi][i]+=Request[mi][i];
Need[mi][i]-=Request[mi][i];
if(Safe())
同意分配请求~~~\n"
SORRY╮(╯▽╰)╭……你的请求被拒绝…\n"
Available[i]+=Request[mi][i];
Allocation[mi][i]-=Request[mi][i];
Need[mi][i]+=Request[mi][i];
i++)
Finish[i]=0;
charFlag;
//标志位
是否再次请求分配?
是请按Y/y,否请按N/n"
while
(1)
Flag;
if(Flag=='
Y'
||Flag=='
y'
N'
n'
)
break;
else
请按要求重新输入:
if(Flag=='
elsebreak;
主要代码段分析
1.在开始编写程序时,由于相关参数由用户自己进行输入时,由于运用scanf和printf语句,造成程序长度很长,而且输入子程序复杂度为O(),程序反应速度也比较慢。
后来改用cin和cout函数程序长度大大缩短。
2.由于程序的可重复使用的方便性,采取设立标志位Flag,由用户输入命令(Y/N或y/n)用以作为程序继续运行和结束的标志。
实验心得
本次试验老师要求对固定的资源进行分配,虽然实现起来比较简单,但是其只能算固定的一种情况,所以在此基础上,我进行了改进,即相关参数由用户自己进行输入增加其实用性。
下图为程序运行情况:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 银行家 算法 欧阳 创编