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

📄 jincheng.c

📁 支持多道进程并发的简单管理模拟系统
💻 C
字号:
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define MAXPRI 100
#define NIL-1
struct
{
 int id;
 char status;
 int nextwr;
 int priority;
} pcb[3];
struct{
      int value;
      int firstwr;
      }sem[2];
   char savearea[3][4],addr;
   int i,s1,s2,seed,exe=NIL;
   init()   /*initialization*/
   {int      j;
     for(j=0;j<3;j++)
	     {
	     pcb[j].id=j;
	     pcb[j].status='r';
	     pcb[j].nextwr=NIL;
	     printf("\n process%d priority?",j+1);
	     scanf("%d",&i);
	     pcb[j].priority=i;
	     }
	     sem[0].value=1;sem[0].firstwr=NIL;
	     sem[1].value=1;sem[1].firstwr=NIL;
	  for(i=1;i<3;i++)
	    for(j=0;j<4;j++)
	      savearea[i][j]=' 0';
	      }
     float random()
     {int m;
	if (seed<0) m=-seed;
	else m=seed;
	seed=(25173*seed+13849)%65536;
	return(m/32767.0);
	}
     timeint(ad)    /*time slice interrupt */
     char ad;
     {float x;
     x=random();
       if((x<0.33)&&(exe==0))return(FALSE);
       if((x<0.66)&&(exe==1))return(FALSE);
       if((x<1.0)&&(exe==2))return(FALSE);
      savearea[exe][0]=i;
      savearea[exe][1]=ad;
      pcb[exe].status='t';
      printf("Time silce interrupt'\nprocess%d enter inro ready.\n",exe+1);
      exe=NIL;
      return(TRUE);
      }
    scheduler()
    {int pd;
	if((pd=find())==NIL&&exe==NIL)
	    return(NIL);   /*quit system*/
	if(pd!=NIL){
	  if(exe==NIL){
	    pcb[pd].status='e';
	    exe=pd;
	    printf("process%d is executing.\n",exe+1);
	    }

	else if(pcb[pd].priority<pcb[exe].priority){
	     pcb[exe].status='r';
	     printf("process%d enter into ready\n",exe+1);
	     pcb[pd].status='e';
	     exe=pd;
	     printf("process%d is executing\n",exe+1);
	     }
	     }
	     i=savearea[exe][0];
	     addr=savearea[exe][1];
	     return(exe);
	     }
	     find()
	     {int j,pd=NIL,w=MAXPRI;
		for (j=0;j<3;j++)
		if(pcb[j].status=='r')
		  if (pcb[j].priority<w){
		  w=pcb[j].priority;pd=j;
		  }
	      if (pd==NIL)
		for (j=0;j<3;j++)
		  if(pcb[j].status=='t')
		  if(pcb[j].priority<w){
		  w=pcb[j].priority;pd=j;
		  }
		  return (pd);
		  }
	      p(se,ad)
	      int se;
	      char ad;
	      {
	       if(--sem[se].value>=0) return(FALSE);
	      block(se);
	      savearea[exe][0]=i;
	      savearea[exe][1]=ad;
	      exe=NIL;
	      return(TRUE);
	      }
	      block(se)
	      int se;
	      {
	      int w;
	      printf("process%d is blocked\n",exe+1);
	      pcb[exe].status='w';
	      pcb[exe].nextwr=NIL;
	      if((w=sem[se].firstwr)==NIL)
		 sem[se].firstwr=exe;
		else{
		while(pcb[w].nextwr!=NIL)
		w=pcb[w].nextwr;
		pcb[w].nextwr=exe;
		}
		}
	v(se,ad)
	int se;
	char ad;
	{
	if(++sem[se].value>0)   return(FALSE);
	wakeup(se);
	savearea[exe][1]=ad;
	savearea[exe][0]=i;
	return (TRUE);    /* scheduler*/
	}
      wakeup(se)
      int se;
      {
      int w;
      w=sem[se].firstwr;
      if(w!=NIL){
	sem[se].firstwr=pcb[w].nextwr;
	pcb[w].status='r';
	printf("process%d is waken up\n",w+1);
	}
	}
process1()
{
     if(addr=='a')goto a1;
     if(addr=='b')goto b1;
     if(addr=='c')goto c1;
     if(addr=='d')goto d1;
     if(addr=='e')goto e1;
     if(addr=='f')goto f1;
     for(i=1;i<6;i++)   {
	printf("process1  calls P on the semaphore 1\n");
	if(p(0,'a'))  break;  /*  process 1 is blocked*/
     a1:  printf("process1 is executing in the cretical section 1\n");
	  if(timeint('b')) break;
     b1:  printf("s1=%d\n",++s1);
	 printf("process1 calls V on semaphore1 and quit cretical section 1.\n");
	 if(v(0,'c')) break;
     c1:  printf("process1 calls P on semaphore1 2.\n");
	 if(p(1,'d')) break;
     d1:   printf("process1 is executing cretical section 2.\n");
	if(timeint ('e')) break;
     e1:  printf("s2=%d\n",++s2);
	 printf("process1 calls V on semephore2 and quit cretical section2.\n");
	 if(v(1,'f')) break;
     f1:   printf("process1 cycle count=%d\n",i);
     }
     if(i<6) return;
     eexit(0);
     }
process2()
{
     if(addr=='a')goto a2;
     if(addr=='b')goto b2;
     if(addr=='c')goto c2;
     if(addr=='d')goto d2;
     if(addr=='e')goto e2;
     if(addr=='f')goto f2;
     for(i=1;i<6;++i){
     printf("process2 calls Pon semephore2\n");
     if(p(1,'a')) break;
a2:   printf("process2 is executing on the cretical section2\n");
      if(timeint('b'))  break;
b2:   printf("s2=%d\n",++s2);
      printf("process2 calls V on semephore2 and quit cretical section2.\n");
      if(v(1,'c')) break;
c2:   printf("process2 calls P on semaphore1.\n");
      if(p(0,'d')) break;
d2:   printf("process2 is executing cretical section1.\n");
      if(timeint('e')) break;
e2:   printf("s1=%d\n",++s1);
      printf("process2 calls V on semephore1 and quit cretical section1.\n");
      if(v(0,'f')) break;
f2:   printf("process2 cycle count=%d\n",i);
      }
      if(i<6) return;
      eexit(1);
}
process3()
{
     if(addr=='a')goto a3;
     if(addr=='b')goto b3;
     if(addr=='c')goto c3;
     for(i=1;i<6;++i)   {
       printf("process3 calls P on semaphore2\n");
       if(p(1,'a')) break;
a3:   printf("process3 is executing on the cretical section \n");
      if(timeint('b')) break;
b3:   printf("s2=%d\n",++s2);
      printf("process3 calls V on semaphore2 and quit cretical section.\n");
      if(v(1,'c')) break;
c3:   printf("process3 cycle count=%d\n");
}
       if(i<6)  return;
       eexit(2);
       }
eexit(n)
int n;
{
	pcb[n].status='c';

	printf("process%d is completed !\n",n+1);
	exe=NIL;
	}
main()
{
    int k;
    printf("****process management*******\n\n");
    init();
    printf("s1=%d,s2=%d\n",s1,s2);
    printf("process1,process2,process3 are all in ready1\n");
    for( ;  ;)
    if((k=scheduler())!=NIL)
    switch(k)   {
       case 0:process1();
	     break;
       case 1:process2();
	     break;
       case 2:process3();
	     break;
       default:printf("process identifer error\n");
	     break;
	     }
       else break;
       printf("s1=%d,s2=%d\n",s1,s2);
       printf("\n ******END*******\n");
       }

⌨️ 快捷键说明

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