操作系统-银行家算法

实验四 银行家算法

银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待。


2.算法描述

1)如果 Request[i] 是进程 Pi 的请求向量,如果 Request[i,j]=K,表示进程Pi 需要 K 个 Rj 类型的资源。当 Pi 发出资源请求后,系统按下述步骤进行检查:如果 Requesti[j]<= Need[i,j],便转向步骤 2;否则认为出错,因为它所需要

的资源数已超过它所宣布的最大值。

2)如果 Requesti[j]<=Available[j],便转向步骤 3,否则,表示尚无足够资

源,进程 Pi 须等待。

3)系统试探着把资源分配给进程 Pi,并修改下面数据结构中的数值:
Available[j]:=Available[j]-Requesti[j];
Allocation[i,j]:=Allocation[i,j]+Requesti[j];

Need[i,j]:=Need[i,j]-Requesti[j];

4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安
全,才正式将资源分配给进程 Pi,以完成本次分配;否则,将本次的试探分配

作废,恢复原来的资源分配状态,让进程 pi 等待。


3.数据结构

1.可利用资源向量AVAILABLE。这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改变。

2.最大需求矩阵MAX。这是一个M*N的矩阵,它定义了系统中N个进程中的每一个进程对M类资源的最大需求。

3.分配矩阵ALLOCATION。这也是一个M*N的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。

4.需求矩阵NEED。这也是一个M*N的矩阵,用以表示每一个进程尚需的各类资源数。

5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]

4.  参考程序

#include <iostream.h>
//
//全局变量定义
int Available[100]; //可利用资源数组
int Max[50][100]; //最大需求矩阵
int Allocation[50][100]; //分配矩阵
int Need[50][100]; //需求矩阵
int Request[50][100]; //M 个进程还需要 N 类资源的资源量
int Finish[50];
int p[50];
int m,n; //M 个进程,N 类资源
/
//安全性算法
int Safe()
{
int i,j,l=0;
int Work[100]; //可利用资源数组
for (i=0;i<n;i++)
Work[i]=Available[i];
for (i=0;i<m;i++)
Finish[i]=0;
for (i=0;i<m;i++)
{
if (Finish[i]==1)
continue;
else
{
for (j=0;j<n;j++)
{
if (Need[i][j]>Work[j])
break;
}
if (j==n)
{
Finish[i]=1;
for(int k=0;k<n;k++)
Work[k]+=Allocation[i][k];
p[l++]=i;
i=-1;
}
else continue;
}
if (l==m)
{
cout<<"系统是安全的"<<'\n';
cout<<"系统安全序列是:\n";
for (i=0;i<l;i++)
{
cout<<p[i];
if (i!=l-1)
cout<<"-->";
}
cout<<'\n';
return 1;
}
}
}
/
//银行家算法
int main()
{
int i,j,mi;
cout<<"输入进程的数目:\n";
cin>>m;
cout<<"输入资源的种类:\n";
cin>>n;
cout<<"输入每个进程最多所需的各类资源数,按照"<<m<<"x"<<n<<"矩阵输
入\n";
for (i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>Max[i][j];
cout<<"输入每个进程已经分配的各类资源数,按照"<<m<<"x"<<n<<"矩阵输
入\n";
for (i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
if (Need[i][j]<0)
{
cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个
资源错误,请重新输入:\n";
j--;
continue;
}
}
}
cout<<"请输入各个资源现有的数目:\n";
for (i=0;i<n;i++)
cin>>Available[i];
Safe();
while (1)
{
cout<<"输入要申请的资源的进程号:(第一个进程号为 0,第二个进程
号为 1,依此类推)\n";
cin>>mi;
cout<<"输入进程所请求的各个资源的数量\n";
for (i=0;i<n;i++)
cin>>Request[mi][i];
for (i=0;i<n;i++)
{
if (Request[mi][i]>Need[mi][i])
{
cout<<"所请求资源数超过进程的需求量!\n";
return 0;
}
if (Request[mi][i]>Available[i])
{
cout<<"所请求资源数超过系统所有的资源数!\n";
return 0;
}
}
for (i=0;i<n;i++)
{
Available[i]-=Request[mi][i];
Allocation[mi][i]+=Request[mi][i];
Need[mi][i]-=Request[mi][i];
}
if (Safe())
cout<<"同意分配请求\n";
else
{
cout<<"SORRY╮(╯▽╰)╭„„你的请求被拒绝„\n";
for (i=0;i<n;i++)
{
Available[i]+=Request[mi][i];
Allocation[mi][i]-=Request[mi][i];
Need[mi][i]+=Request[mi][i];
}
}
for (i=0;i<m;i++)
Finish[i]=0;
char Flag; //标志位
cout<<"是否再次请求分配?是请按 Y/y,否请按 N/n";
while (1)
{
cin>>Flag;
if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n')
break;
else
{
cout<<"请按要求重新输入:\n";
continue;
}
}
if (Flag=='Y'||Flag=='y')
continue;
else break;
}
}


  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值