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

📄 jcss.c

📁 进程死锁实验
💻 C
字号:
#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();
}

⌨️ 快捷键说明

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