模拟银行家算法,本程序只求出安全序列,并且没有验证输入正确性,所以需要保证数据正确
其中运用的递归-全排序思想,参考点击打开链接
#include <stdio.h>
#include<stdlib.h>
#define N 3//定义有三种资源
#define P struct Process
struct Process
{
int max[N];
int allocation[N];
int id;
};
void switch_p(P *p1,P *p2);//交换p1 p2位置
void scan_p(P* p,int n);//输入第n个进程位置p+n,
int get_secure(P *p, int length, int fast, int ava[N], int *p_id);//银行家算法,进程
//链表p,长度为length,从第fast开始看fast到结束是不是有安全的,ava是available,p_id是存放求出的安全序列的数组
int p_secure(P p1,int a[N]);//看available=a[n],是否满足p1进程,满足返回1,不满足返回2
int main()
{
int n,i,*p_id;//pid 用来存放求出的安全序列,n是序列长度
P *p;//p是进程序列
int ava[N];//available
printf("avalible:");
scanf("%d%d%d",&ava[0],&ava[1],&ava[2]);
printf("the nember of process:");
scanf("%d",&n);
p=(P*)malloc(sizeof(P)*n);
p_id=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
{
scan_p(p,i);
}
if(get_secure(p,n,0,ava,p_id))//如果是安全的,打印安全序列
{
for(i=0;i<n;i++)
{
printf("pid:%d\n",*(p_id+i));
}
}
else
{
printf("do not secure\n");
}
free(p_id);
free(p);
return 0;
}
void scan_p(P* p,int n)//银行家每个进程输入,n第n个进程,p是第一个进程
{
p=p+n;
printf("process %d Max:",n);
scanf("%d%d%d",&p->max[0],&p->max[1],&p->max[2]);
printf("process %d Allocation:",n);
scanf("%d%d%d",&p->allocation[0],&p->allocation[1],&p->allocation[2]);
p->id=n;
}
int get_secure(P *p,int length,int fast,int ava[N],int *p_id)
{
int i,j;
int ava2[N];
if(fast==length-1)
{
if(p_secure(*(p+fast),ava))
{
*(p_id+fast)=(p+fast)->id;
return 1;
}
else
return 0;
}
for(i=fast;i<length;i++)
{
for(j=0;j<N;j++)
{
ava2[j]=ava[j];
}
switch_p(p+fast,p+i);
if(p_secure(*(p+fast),ava))//如果p+fast是安全的
{
if(get_secure(p,length,fast+1,ava,p_id)==1)
{
*(p_id+fast)=(p+fast)->id;
//printf("fast:%d id:%d \n",fast,(p+fast)->id);输出本次函数结果,验证程序正确
return 1;
}
}
//进行回溯
switch_p(p+fast,p+i);
for(j=0;j<N;j++)
{
ava[j]=ava2[j];
}
}
return 0;
}
int p_secure(P p1,int a[N])//a[n]是available ,判断一个进程是否满足
{
int i,k=1;
for(i=0;i<N;i++)
{
if(p1.allocation[i]+a[i]<p1.max[i])//判断,不符合就将标志位k置0并跳出循环
{
k=0;
break;
}
}
if(k==0)
return 0;
else
{
for(i=0;i<N;i++)
{
a[i]=a[i]+p1.allocation[i];//如果安全改变available
}
return 1;
}
}
void switch_p(P *p1,P *p2)
{
P p3;
p3=*p1;
*p1=*p2;
*p2=p3;
}