A-A+

银行家算法-计算机操作系统

2013年01月07日 其他 暂无评论 阅读 63 次

银行家算法是用来避免死锁的,该方法将系统的状态分为安全和不安全,只要系统处于安全状态,便可避免死锁的发生。之所以成为银行家算法,是由于该算法能用于银行系统现金贷款的发放而得名。
[cpp]

#include "string.h"
#include <iostream>
using namespace std;
#define False 0
#define True 1
#define W 10 //资源数目 ...
#define R 20

int M ; //总进程数
int N ; //资源种类
int All_Resource[W]; //各种资源的数目
int Max[W][R]; //M个进程对N类资源最大资源需求量
int Available[R]; //系统可用资源数
int Allocation[W][R]; //M个进程已经得到N类资源的资源量
int Need[W][R]; //M个进程还需要N类资源的资源量
int Request[R]; //请求资源个数

void showdata() //输出资源分配情况
{
int i,j;
cout<<"各种资源的总数量(all):"<<endl;
cout<<" ";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<All_Resource[j];
cout<<endl<<endl;
cout<<"系统目前各种资源可用的数为(Available):"<<endl;
cout<<" ";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<Available[j];
cout<<endl<<endl;
cout<<" 各进程还需要的资源量(Need):"<<endl<<endl;
cout<<" 资源0"<<" 资源1"<<" 资源2"<<endl;
for (i=0;i<M;i++)
for (i=0;i<M;i++)
{
cout<<"进程p"<<i<<": ";
for (j=0;j<N;j++)cout<<Need[i][j]<<" ";;
cout<<endl;
}
cout<<endl;
cout<<" 各进程已经得到的资源量(Allocation): "<<endl<<endl;
cout<<" 资源0"<<" 资源1"<<" 资源2"<<endl;
for (i=0;i<M;i++)
{
cout<<"进程p"<<i<<": ";
for (j=0;j<N;j++)cout<<Allocation[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}

void changdata(int k) //函数changdata,改变可用资源和已经拿到资源和还需要的资源的值
{
int j;
for (j=0;j<N;j++)
{
Available[j]=Available[j]-Request[j];
Allocation[k][j]=Allocation[k][j]+Request[j];
Need[k][j]=Need[k][j]-Request[j];
}
}

void restore(int k) //函数restore,恢复可用资源和已经拿到资源和还需要的资源的值
{
int j;
for (j=0;j<N;j++)
{ Available[j]=Available[j]+Request[j];
Allocation[k][j]=Allocation[k][j]-Request[j];
Need[k][j]=Need[k][j]+Request[j];
}
}

int safe(int s) //安全检查
{ int WORK,FINISH[W];
int i,j,k=0;
for(i=0;i<M;i++)FINISH[i]=False;
for(j=0;j<N;j++)
{
WORK=Available[j];
i=s;
do
{
if(FINISH[i]==False&&Need[i][j]<=WORK)
{
WORK=WORK+Allocation[i][j];
FINISH[i]=True;
i=0;
}
else
{ i++;
}
}while(i<M);
for(i=0;i<M;i++)
if(FINISH[i]==False)
{
cout<<endl;
cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
cout<<endl;
return 1;
}
}
cout<<endl;
cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
cout<<endl;
return 0;
}

void bank() //银行家算法
{
int i=0,j=0;
char flag='Y';

while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<" 请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重输入!):";
cout<<"p";cin>>i;
if(i<0||i>=M)cout<<" 输入的进程号不存在,重新输入!"<<endl;
}
cout<<" 请输入进程P"<<i<<"申请的资源数:"<<endl;
for (j=0;j<N;j++)
{
cout<<" 资源"<<j<<": ";
cin>>Request[j];
if(Request[j]>Need[i][j]) //若请求的资源数大于进程还需要i类资源的资源量j
{
cout<<" 进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}
else
{
if(Request[j]>Available[j]) //若请求的资源数大于可用资源数
{
cout<<" 进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i); //调用changdata(i)函数,改变资源数
if(safe(i)) //若系统安全
{
restore(i); //调用restore(i)函数,恢复资源数
showdata(); //输出资源分配情况
}
else //若系统不安全
showdata(); //输出资源分配情况
}
else //若flag=N||flag=n
showdata();
cout<<endl;
cout<<" 是否继续银行家算法演示,按'y'键继续,按'n'键退出: ";
cin>>flag;
}
}

int main()
{
int i=0,j=0,p;
cout<<"请输入总进程数:"<<endl;
cin>>M;
cout<<"请输入总资源种类:"<<endl;
cin>>N;
cout<<"请分别输入各类资源数:"<<endl;
for(i=0;i<N;i++)
cin>>All_Resource[i];
cout<<"请依次输入各进程所需要的资源数:"<<endl;
for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
{
do
{
cin>>Max[i][j];
if (Max[i][j]>All_Resource[j])
cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
}while (Max[i][j]>All_Resource[j]);
}
}
cout<<"依次输入各进程已经占据的资源数量(Allocation):"<<endl;
for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
{
do
{
cin>>Allocation[i][j];
if (Allocation[i][j]>Max[i][j])
cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
}while (Allocation[i][j]>Max[i][j]);
}
}
//初始化
for (j=0;j<N;j++)
{ p=All_Resource[j];
for (i=0;i<M;i++)
{
p=p-Allocation[i][j];//减去已经被占据的资源
Available[j]=p;
if(Available[j]<0)
Available[j]=0;
}
}
for (i=0;i<M;i++)
for(j=0;j<N;j++)
Need[i][j]=Max[i][j]-Allocation[i][j];
showdata();
bank();
return 0;
}

[/cpp]

标签:

给我留言

Copyright © C/C++程序员之家 保留所有权利.   Theme  Ality 浙ICP备15011757号-3

用户登录