⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deadlock.c

📁 死锁模拟 模拟windows下进程申请资源产生死锁的过程
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
struct process
{ int max[10];
  int allocation[7];
  int need[10];
  int done;                  /*判断进程是否完成*/
  int finish;                /*银行家算法中判断是否完成*/
};
struct process pro[5];       /*五个进程*/
int source[7]={0};           /*资源的总数*/
int available[7]={0};        /*可利用的资源*/
int request[5][7]={0};       /*产生的请求*/
void main()
{ int i,j,flag,sum;
  char ch;
  time_t t;
  void out();
  int bank();
  int fun();
  int fun2();
  srand((unsigned) time(&t));
  for(i=0;i<5;i++)                                             /*初始化数据*/
	 { for(j=0;j<7;j++)
         { pro[i].max[j]=rand()%5;
	       pro[i].allocation[j]=0;
           pro[i].need[j]=pro[i].max[j];
         }
       pro[i].done=0;
	   pro[i].finish=0;
      }
  for(i=0;i<7;i++)
  {source[i]=rand()%5+5;
   available[i]=source[i];
  }
  out();
  while(!fun())                                      /*进程是否执行完*/
  {  do
	 { i=rand()%5;
	 }while(pro[i].done==1);
	 
	 do
	 {for(j=0;j<7;j++)                               /*产生进程资源需求向量*/
	    { do
	       {request[i][j]=rand()%5;
		   }while(request[i][j]>pro[i].need[j]);
	    }
	 }while(fun2(i));

	 for(j=0;j<7;j++)       
		if(request[i][j]>available[j]) flag=2;
	 while(flag==2)                                 /*没有可利用的资源,换其它进程*/
	   { flag=0;
		 out();
	     printf("request[%d]: ",i+1);
		for(j=0;j<7;j++)
			printf("%d  ",request[i][j]);
		printf("\n");
		printf("资源缺乏,请等待!\n");
	    do
		{i=rand()%5;
		}while(pro[i].done==1);
		do
		{for(j=0;j<7;j++)                               /*产生资源需求*/
		  { do
		    {request[i][j]=rand()%5;
			}while(request[i][j]>pro[i].need[j]);   /*fun2()判断产生的资源需求是否全0*/
		  }
		}while(fun2(i));
	    for(j=0;j<7;j++)      
	     	if(request[i][j]>available[j]) flag=2;
	   }
	 /*请求符合要求,用银行家算法判断是否安全*/	 
     if(bank(i))
     {   sum=0;
	     for(j=0;j<7;j++)
		 {  available[j]-=request[i][j];
	        pro[i].allocation[j]+=request[i][j];
	     	pro[i].need[j]-=request[i][j];
	    	sum+=pro[i].max[j]-pro[i].allocation[j];
		 }
	     if(sum==0) 
		 { pro[i].done=1;
		   pro[i].finish=1;
		   for(j=0;j<7;j++)
		      { available[j]+=pro[i].allocation[j];
		        pro[i].allocation[j]=0;
				pro[i].need[j]=0;
		      }
         }
    	 out();
		 printf("request[%d]: ",i+1);
		for(j=0;j<7;j++)
			printf("%d  ",request[i][j]);
		printf("\n");
		printf("请求不会导致死锁,资源请求已满足!\n");
	}
	else
	{   out();
	    printf("request[%d]: ",i+1);
		for(j=0;j<7;j++)
			printf("%d  ",request[i][j]);
		printf("\n");
		printf("资源请求会引起死锁,不允许!\n");
	}
  }
  //printf("程序已经执行完毕,按回车退出!\n");
  ch=getch();
}
void out()
{ int i,j;
  printf("                allocation               max                 need\n");
  printf("            ");
  printf("A  B  C  D  E  F  G    ");
  printf("A  B  C  D  E  F  G    ");
  printf("A  B  C  D  E  F  G \n"); 
    for(i=0;i<5;i++) 
	 { if(1) 
       { printf(" Process %d: ",i+1);
     	 for(j=0;j<7;j++)
	        printf("%d  ",pro[i].allocation[j]);
	     printf("  ");
         for(j=0;j<7;j++)
	         printf("%d  ",pro[i].max[j]);
	     printf("  ");
         for(j=0;j<7;j++)
	        printf("%d  ",pro[i].need[j]); 
	     printf("\n");
       }
  } 
   printf("资源总数:   ");
   for(j=0;j<7;j++)
		   printf("%d  ",source[j]);
   printf("\n");
   printf("available:  ");
   for(j=0;j<7;j++)
		   printf("%d  ",available[j]);
   printf("\n");     
}
int fun()
{ int sum=1,i;
  for(i=0;i<5;i++)
	  sum*=pro[i].finish;
  return sum;
}
int bank(int x)
{ int work[7]={0},i,j,g,all,sign=0,ret,count=0,sum=0;
  for(i=0;i<7;i++)              /*假设已经分配了*/
  { pro[x].allocation[i]+=request[x][i];
    available[i]-=request[x][i];
    sum+=pro[x].max[i]-pro[x].allocation[i];
	work[i]=available[i];	
  }
   /* 判断是否已经满足了所有的需求*/ 
   if(sum==0)
	  { for(i=0;i<7;i++)
              {
	               pro[x].allocation[i]-=request[x][i];
                   available[i]+=request[x][i];
               }
	 
            return 1;
       }
   else
   {
     while(!fun()&&count<6)
	 {   for(i=0;i<5;i++)
	    {   all=0;
        	  if(pro[i].finish==0)
			  {  for(j=0;j<7;j++)
		            if(pro[i].need[j]<=work[j])
			        	all++;                       /*统计是否7个资源的请求都能满足*/
		         if(all==7)
			   { for(g=0;g<7;g++)
		         work[g]+=pro[i].allocation[g];
		         pro[i].finish=1; 
		   
			   }
        
			  }
        }
      count++;
  }
  for(j=0;j<5;j++)
    if(pro[j].finish==1)
        sign++;

  for(j=0;j<5;j++)
	  if(pro[j].done==0)
		  pro[j].finish=0;
   for(i=0;i<7;i++)
	{ pro[x].allocation[i]-=request[x][i];
      available[i]+=request[x][i];
	}
  if(sign==5) return 1;
  else return 0;  
}
}
int fun2(int x)
{ int j,n=0;
  for(j=0;j<7;j++)
	  if(request[x][j]==0) n++;
  if(n==7) return 1;
    else return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -