#include"stdio.h"
#include"stdlib.h"
#include "string.h"
#define WAIT 1
#define READY 2
#define FINISH 3
int Available=3;/*剩余资源数量*/
int Max[3]={10,4,9};/*每个进程所需的最大资源量*/
int Allocation[3]={5,2,2};/*已分配的资源数*/
int Need[3]={5,2,7};/*还需要的资源*/
int s[3];/*记录安全队列*/
int state[3]={READY,READY,READY};/*每种资源的初始状态*/
void circle(int total,int Work,int Finish[3])/*循环体*/
{
int i;
for(i=0;i<3;i++)
{
if(Finish[i]==0)
if(Need[i]<=Work)/*察看现有资源能满足那个进程的运行,以产生安全队列*/
{
Work=Work+Allocation[i];/*满足某一个进程执行的要求,可以假设释放此进程所占有的资源,以供判断其他进程能否执行*/
Finish[i]=1;
s[total]=i;/*将安全队列的一项存入数组*/
circle(total+1,Work,Finish);/*将现有的状态作为参数,传入下一个循环*/
}
}
}
int savecheck()/*此函数进行安全性测试*/
{
int i;
FILE *fp;
int flag=1;
int Work=Available;
int Finish[3]={0,0,0};/*用来标记是否能运行*/
circle(0,Work,Finish);/*由初始状态进入循环体*/
for(i=0;i<3;i++)/*察看所有进程再次种资源分配情况下是否能安全结束*/
{
if(Finish[i]==0)
flag=0;
}
if(flag==1)/*如果都能,打印此时的系统是安全的*/
{fp=fopen("lock.txt","a+");
fprintf(fp,"The system is save.\n");
fclose(fp);
for(i=0;i<3;i++)/*打印安全队列*/
{
if(state[i]!=FINISH)
fp=fopen("lock.txt","a+");
fprintf(fp,"p%d ",s[i]);
fclose(fp);
}
fp=fopen("lock.txt","a+");
fprintf(fp,"\n");
fclose(fp);
return 1;
}
else
{fp=fopen("lock.txt","a+");
fprintf(fp,"The system is unsave.\n");/*否则是不安全的*/
fclose(fp);
return 0;
}
}
void yhj(int n,int r)/*此函数为银行家算法*/
{
int savety;
FILE *fp;
if(r<=Need[n])
{
if(r<=Available)
{
Available=Available-r;/*试探着从空闲资源中减去要分配的资源数*/
Allocation[n]=Allocation[n]+r;/*将资源数加到已分配资源中*/
Need[n]=Need[n]-r;/*还需资源数减去分配的资源*/
savety=savecheck();/*对这种分配方案进行安全性测试*/
if(savety==0)
{
Available=Available+r;/*savety变量为零,表明没通过安全性测试,将分配的资源还回去*/
Allocation[n]=Allocation[n]-r;
Need[n]=Need[n]+r;
state[n]=WAIT;/*将此进程挂起*/
fp=fopen("lock.txt","a+");
fprintf(fp,"pcb%d is hanging up.\n",n);
fclose(fp);
}
else {fp=fopen("lock.txt","a+");
fprintf(fp,"Allocate %d resourse.",r);
fprintf(fp,"pcb%d is running.\n",n);/*通过安全性测试,就运行该进程,将资源真正分配出去*/
fclose(fp);
}
}
else
{ fp=fopen("lock.txt","a+");
fprintf(fp,"Resourse is not enough.The progress is waiting...\n");/*分配资源超过剩余资源*/
fclose(fp);
return;
}
}
else
{ fp=fopen("lock.txt","a+");
fprintf(fp,"Error,you apply too much resourse.\n");/*申请太多的资源*/
fclose(fp);
return;
}
}
void control()
{
int i,j,r;
FILE *fp;
for(i=0;i<3;i++)
{
if(state[i]==READY)
{
r=random(Need[i])+1;/*随机产生一个不大于所需资源的数*/
yhj(i,r);/*执行银行家算法,参数为进程号和要分配的资源数*/
if(Need[i]==0)/*不再需要资源*/
{
state[i]=FINISH;/*进程结束*/
Available=Available+Max[i];/*释放所占有的资源*/
fp=fopen("lock.txt","a+");
fprintf(fp,"pcb%d has finished.\n",i);
fclose(fp);
for(j=0;j<3;j++)
if(state[j]==WAIT)/*将挂起的进程唤醒*/
state[j]=READY;
}
break;
}
}
}
main()
{
int sign=1;
int i,num=0;
FILE *fp;
while(sign)/*用sign做循环标记判断是否继续作循环*/
{
for(i=0;i<3;i++)/*此循环用来查看是否所有的进程都已结束*/
{if(state[i]!=FINISH)
control();/*没有结束,就执行control()函数,控制进程的执行*/
else num++;}
if(num==3)/*如果全部结束,打印结束信息*/
{sign=0;
fp=fopen("lock.txt","a+");
fprintf(fp,"All progress are finished.\n");
fclose(fp);
}
}
getch();
}