计算机操作系统之银行家算法doc 16页Word文档下载推荐.docx
《计算机操作系统之银行家算法doc 16页Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机操作系统之银行家算法doc 16页Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
算法流程图
银行家算法:
安全性算法:
【例1】某系统有A、B、C、D这4类资源供5个进程共享,进程对资源的需求和分配情况如下表所示。
现在系统中A、B、C、D类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:
进程
已占资源
最大需求数
A
B
C
D
P1
1
2
P2
7
5
P3
3
4
6
P4
P5
(1)
现在系统是否处于安全状态?
(2)如果现在进程P2提出需要(0,4,2,0)个资源的请求,系统能否满足它的请求?
【例2】用银行家算法考虑下列系统状态:
进程
分配矩阵
最大需求矩阵
资源总数矩阵
A
3
0
1
4
6
2
B
2
C
0
D
1
E
2
1
问系统是否安全?
若进程B请求(0,0,1,0),可否立即分配?
此后进程E也请求(0,0,1,0),可否分配给它?
通过运行程序发现,例1当中的系统处于不安全状态,进程P2提出的请求无法实现;
例2当中的系统处于安全状态,进程B提出的请求能实现,此后进程E的请求也能实现。
源代码
#include<
iostream>
#defineN20
#defineM20
usingnamespacestd;
intf(inta[N][M],intb[N][M],intm,intk)
{
intj;
for(j=0;
j<
m;
j++)
if(a[k-1][j]>
b[k-1][j])return0;
return1;
}
intg(inta[N][M],intb[],intm,intk)
if(a[k][j]>
b[j])return0;
inth(inta[],intn)
for(inti=0;
i<
n;
i++)
if(!
a[i])return0;
intp(inta[],intb[N][M],intm,intk)
if(a[j]>
intq(inta[],intb[],intm)
intsafe(intFinish[N],intWork[M],intNeed[N][M],intAllocation[N][M],intn,intm)
{inti,j,k;
intt[N];
for(i=0;
t[i]=1;
cout<
<
"
安全性检查!
endl;
)//首先找到一个满足条件的进程
{
if((Finish[i]==0)&
&
g(Need,Work,m,i))
{
k=i;
t[i]=0;
p("
k+1<
):
Work["
m<
]:
;
Work[j]<
"
Work[j]=Work[j]+Allocation[i][j];
Finish[i]=1;
}
Need["
Need[i][j]<
Allocation["
Allocation[i][j]<
(Work+Allocation)["
Finish["
Finish[i]<
break;
else
i++;
if(g(Need,Work,m,k))//依次找到满足条件的后面几个进程
if(t[i])
if(g(Need,Work,m,i))
i+1<
else{
return0;
if(h(Finish,n))return1;
//系统处于安全状态
elsereturn0;
//系统处于不安全状态
voidr(intFinish[N],intWork[M],intAvailable[M],intNeed[N][M],intAllocation[N][M],intMax[N][M],intn,intm)
{
intRequest[M];
charb;
inti,j,k;
\n要申请资源,请按'
y'
或'
Y'
,否则按'
n'
N'
//是立即进行安全性检查,还是进行资源申请
cin>
>
b;
if(b!
='
b!
)
if(safe(Finish,Work,Need,Allocation,n,m))
此时刻系统安全!
\n"
此时刻系统不安全!
}
\n请输入申请资源的进程编号(1,2,…,"
n<
k;
while(k>
n)
您输入了错误的进程号,请核查后重新输入:
\n请输入进程p("
k<
)申请各类资源的数量:
for(j=0;
j<
j++)
Request[j];
if(p(Request,Need,m,k))
if(q(Request,Available,m))
Available[j]=Available[j]-Request[j];
Allocation[k-1][j]=Allocation[k-1][j]+Request[j];
Need[k-1][j]=Need[k-1][j]-Request[j];
Work[j]=Available[j];
试分配!
各种资源可利用的数量Available["
Available[j]<
\n已分配资源Allocation["
for(i=0;
i<
i++)
\n最大需求矩阵Max["
]["
Max[i][j]<
\n需求矩阵Need["
if(safe(Finish,Work,Need,Allocation,n,m))
{//判断当前状态的安全性
系统处于安全状态!
\n申请资源成功!
!
else{
\n当前状态不安全!
//恢复数据
Available[j]=Available[j]+Request[j];
Allocation[k-1][j]=Allocation[k-1][j]-Request[j];
Need[k-1][j]=Need[k-1][j]+Request[j];
Finish[i]=0;
\n恢复数据:
//显示输入各数组的值
系统中尚无足够的资源满足进程p["
]的申请,p["
]必须等待!
elsecout<
elsecout<
出错,进程所需要的资源数目已超过它所宣布的最大值!
}
voidmain()
---------------------------------------------------------"
------------------模拟银行家算法------------------"
--------------------江之风海之韵-------------------"
------------------------QuQu-------------------------"
intAvailable[M];
intMax[N][M];
intAllocation[N][M];
intNeed[N][M];
intWork[M];
intFinish[N];
inti,j,n,m;
//定义全局变量
输入进程的数量:
//从此开始输入有关数据
输入资源种类数:
输入各种资源可利用的数量Available["
Available[j];
//初始化Work[j]
\n输入各进程对各类资源的最大需求数Max["
\n请严格按照("
×
)的距阵输入:
Max[i][j];
\n请输入各进程当前已分配的资源数量Allocation["
Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
r(Finish,Work,Available,Need,Allocation,Max,n,m);
for(i=0;
实验结果
实验体会
银行家算法在计算机操作系统中是一个非常重要的算法,这次我编制模拟银行家算法的程序,来验证了程序的正确性。
银行家算法可以避免程序死锁,使各进程处于安全状态。