银行家算法

实验目的:

 

本实验的目的是,是学生熟悉设备管理系统的设计方法,加深对所学各种设备管理原理的理解。

实验要求:

 

编制银行家算法通用程序,并检测所给状态的系统安全性。

实验内容:

 

1)银行家算法中的数据结构:

可利用资源向量Available。这是一个含有m个 元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。Available[j]=K,则表示系统中现有Rj 类资源K个。

最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资源 当前已分配给没一进程的资源数。如果Allocation[i,j]=K,则表示 进程i当前已分得Rj类资源的数目为K。

需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

上述三个矩阵存在如下关系:

 Need[i,j]= Max[i,j]- Allocation[i,j]

2)银行家算法

设Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

如果Request[i,j]<= Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

#include<stdio.h>
#define N 5//进程个数
#define M 3//资源种类数
int max[N][M] ={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int allocation[N][M] ={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int Need[N][M] ={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int available[M]={3,3,2};
int request[M]={0,0,0};

int Safety(){
int finish[N]={0,0,0,0,0};
int wk[N][M];
int work[N][M];
int i=0,flagone=0,z=0,count=0,flagtwo=0,j,k1,k1_flag;

for(i=0;i<N;i++){
k1_flag=0;
for(k1=0;k1<M;k1++){
if(available[k1]>=Need[i][k1]){
k1_flag=1;
}else{
k1_flag=0;
break;
}
}

if(k1_flag==1){
finish[i]=1;
flagone=i;
if(z==0){
for(int j=0;j<M;j++){
work[i][j]=available[j];
}
z++;
}
for(j=0;j<M;j++){
wk[i][j]=work[i][j]+allocation[i][j];
}
flagtwo=i;
printf("进程:%d ",flagone);
break;
}
}

k1_flag=0;

while(true){
for(i=0;i<N;i++){
k1_flag=0;
for(k1=0;k1<M;k1++){
if(wk[flagtwo][k1]>=Need[i][k1]){
k1_flag=1;
}else{
k1_flag=0;
break;
}
}

if(k1_flag==1&&finish[i]==0){
finish[i]=1;

for(j=0;j<M;j++){
work[flagone][j]=wk[flagone][j];

}

for(j=0;j<M;j++){
wk[i][j]=work[flagone][j]+allocation[i][j];
}
flagone=i;
flagtwo=i;
printf("进程:%d ",flagone);
break;
}
}
count++;

if(count==N+1){
for(int k=0;k<N;k++){
if(finish[k]==0){
return 0;
}
}

return 1;
}
}

}

int enable(){
int t=0;
t=Safety();
return t;
}
int main(){

int s1,count,s2,k1,k1_flag;
int p[M];
s1=Safety();
if(s1==1){
printf(" 安全 ");
}else{
printf(" 不安全 ");
}
scanf("%d",&count);

for(int i=0;i<M;i++){
scanf("%d",&p[i]);
}
k1_flag=0;
for(k1=0;k1<M;k1++){
if(p[k1]<=Need[count][k1]){
k1_flag=1;
}else{
k1_flag=0;
break;
}
}
if(k1_flag==1){
printf("小于该线程所需,合法需求 ");
}else{
printf("大于该线程所需,不合法需求 ");
return 0;
}

k1_flag=0;
for(k1=0;k1<M;k1++){
if(p[k1]<=available[k1]){
k1_flag=1;
}else{
k1_flag=0;
break;
}
}
if(k1_flag==1){
printf("小于该系统所有,合法需求 ");
}else{
printf("大于该系统所有,不合法需求 ");
return 0;
}
for(i=0;i<M;i++){
Need[count][i]-=p[i];
allocation[count][i]+=p[i];
available[i]-=p[i];
}

s2=enable();
if(s2==1){
printf(" 安全 ");
}else{
printf(" 不安全 ");
}
printf("%d%d%d",Need[count][0],Need[count][1],Need[count][2]);


}

原文地址:https://www.cnblogs.com/huifeidezhuzai/p/9278978.html