计算机操作系统之银行家算法.docx
《计算机操作系统之银行家算法.docx》由会员分享,可在线阅读,更多相关《计算机操作系统之银行家算法.docx(17页珍藏版)》请在冰豆网上搜索。
计算机操作系统之银行家算法
淮海工学院计算机工程学院
实验报告书
课程名:
《计算机操作系统》
题目:
实验二银行家算法
班级:
^^
姓名:
^^
实验二银行家算法
实验目的和要求
应用银行家算法验证进程安全性检查及分配资源
编制模拟银行家算法的程序,并以以下例子验证程序的正确性。
实验环境
1.PC微机。
2.Windows操作系统。
3.C/C++/VB开发集成环境。
实验学时
2学时,必做实验
实验容和步骤
1)根据算法流程图编制可执行程序
2)用以下两个例子验证程序的正确性。
3)按照上述两个例子,输出执行的结果。
算法流程图
银行家算法:
安全性算法:
【例1】某系统有A、B、C、D这4类资源供5个进程共享,进程对资源的需求和分配情况如下表所示。
现在系统中A、B、C、D类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:
进程
已占资源
最大需求数
A
B
C
D
A
B
C
D
P1
0
0
1
2
0
0
1
2
P2
1
0
0
0
1
7
5
0
P3
1
3
5
4
2
3
5
6
P4
0
6
3
2
0
6
5
2
P5
0
0
1
4
0
6
5
6
(1) 现在系统是否处于安全状态?
(2)如果现在进程P2提出需要(0,4,2,0)个资源的请求,系统能否满足它的请求?
【例2】用银行家算法考虑下列系统状态:
进程 分配矩阵 最大需求矩阵 资源总数矩阵
A 3 0 1 1 4 1 1 1 6 3 4 2
B 0 1 0 0 0 2 1 2
C 1 1 1 0 4 2 1 0
D 1 1 0 1 1 1 1 1
E 0 0 0 0 2 1 1 0
问系统是否安全?
若进程B请求(0,0,1,0),可否立即分配?
此后进程E也请求(0,0,1,0),可否分配给它?
通过运行程序发现,例1当中的系统处于不安全状态,进程P2提出的请求无法实现;例2当中的系统处于安全状态,进程B提出的请求能实现,此后进程E的请求也能实现。
源代码
#include
#defineN20
#defineM20
usingnamespacestd;
intf(inta[N][M],intb[N][M],intm,intk)
{
intj;
for(j=0;jif(a[k-1][j]>b[k-1][j])return0;
return1;
}
intg(inta[N][M],intb[],intm,intk)
{
intj;
for(j=0;jif(a[k][j]>b[j])return0;
return1;
}
inth(inta[],intn)
{
for(inti=0;iif(!
a[i])return0;
return1;
}
intp(inta[],intb[N][M],intm,intk)
{
intj;
for(j=0;jif(a[j]>b[k-1][j])return0;
return1;
}
intq(inta[],intb[],intm)
{
intj;
for(j=0;jif(a[j]>b[j])return0;
return1;
}
intsafe(intFinish[N],intWork[M],intNeed[N][M],intAllocation[N][M],intn,intm)
{inti,j,k;
intt[N];
for(i=0;it[i]=1;
cout<<"安全性检查!
"<for(i=0;i{
if((Finish[i]==0)&&g(Need,Work,m,i))
{
k=i;
t[i]=0;
cout<<"p("<"<cout<<"Work["<";
for(j=0;j{
cout<Work[j]=Work[j]+Allocation[i][j];
Finish[i]=1;
}
cout<cout<<"Need["<";
for(j=0;jcout<cout<cout<<"Allocation["<";
for(j=0;jcout<cout<cout<<"(Work+Allocation)["<";
for(j=0;jcout<cout<cout<<"Finish["<";
cout<cout<break;
}
else
{
i++;
}
}
if(g(Need,Work,m,k))//依次找到满足条件的后面几个进程
{
for(i=0;i{
if(t[i])
{
if(g(Need,Work,m,i))
{
cout<<"p("<
"<cout<<"Work["<";
for(j=0;j{
cout<Work[j]=Work[j]+Allocation[i][j];
Finish[i]=1;
}
cout<cout<<"Need["<";
for(j=0;jcout<cout<cout<<"Allocation["<";
for(j=0;jcout<cout<cout<<"(Work+Allocation)["<";
for(j=0;jcout<cout<cout<<"Finish["<
";
cout<cout<t[i]=0;
}
}
}
}
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;
cout<<"\n要申请资源,请按'y'或'Y',否则按'n'或'N'"<cin>>b;
if(b!
='y'&&b!
='Y')
{
if(safe(Finish,Work,Need,Allocation,n,m))
{
cout<<"此时刻系统安全!
\n";
}
else
{
cout<<"此时刻系统不安全!
\n";
}
}
else
{
{
cout<<"\n请输入申请资源的进程编号(1,2,…,"<"<cin>>k;
while(k>n)
{
cout<<"您输入了错误的进程号,请核查后重新输入:
"<cin>>k;
}
cout<<"\n请输入进程p("<"<for(j=0;jcin>>Request[j];
if(p(Request,Need,m,k))
{
if(q(Request,Available,m))
{
for(j=0;j{
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];
}
cout<<"试分配!
"<cout<<"各种资源可利用的数量Available["<"<for(j=0;j{
cout<}
cout<cout<<"\n已分配资源Allocation["<"<for(i=0;i{
for(j=0;j{
cout<}
cout<}
cout<<"\n最大需求矩阵Max["<"<for(i=0;i{
for(j=0;j{
cout<}
cout<}
cout<<"\n需求矩阵Need["<"<for(i=0;i{
for(j=0;j{
cout<}
cout<}
if(safe(Finish,Work,Need,Allocation,n,m))
{//判断当前状态的安全性
cout<<"系统处于安全状态!
";
cout<<"\n申请资源成功!
!
!
"<}
else{
cout<<"\n当前状态不安全!
!
!
!
!
!
";
//恢复数据
for(j=0;j{
Available[j]=Available[j]+Request[j];
Allocation[k-1][j]=Allocation[k-1][j]-Request[j];
Need[k-1][j]