写一个程序描述进程状态迁移过程

来源:互联网 发布:淘宝上的翡翠能买吗 编辑:程序博客网 时间:2024/05/17 08:15
   #include "stdio.h"     
      #include <STDLIB.H>     
      #include <CONIO.H>     
      #define getpch(type) (type*)malloc(sizeof(type))     
      #define NULL 0     
      struct pcb { /* 定义进程控制块PCB */    
        char name[10];    
        char state;    
        int super;    
        int ntime;    
        int rtime;    
         struct pcb* link;    
      }*ready=NULL,*p;    
      typedef struct pcb PCB;    
      sort() /* 建立对进程进行优先级排列函数*/    
      {    
         PCB *first, *second;    
         int insert=0;    
        if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/    
         {    
             p->link=ready;    
             ready=p;    
         }    
        else /* 进程比较优先级,插入适当的位置中*/    
        {    
            first=ready;    
            second=first->link;    
            while(second!=NULL)    
             {    
                if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/    
                 /*插入到当前进程前面*/    
                     p->link=second;    
                     first->link=p;    
                     second=NULL;    
                     insert=1;    
                 }    
               else /* 插入进程优先数最低,则插入到队尾*/    
                {    
                    first=first->link;    
                    second=second->link;    
                 }    
             }    
            if(insert==0) first->link=p;    
        }    
      }    
           
    
      input() /* 建立进程控制块函数*/    
      {    
        int i,num;    
        //clrscr(); /*清屏*/     
        printf("\n 请输入进程号?");    
         scanf("%d",&num);    
        for(i=0;i<NUM;I++) scanf(?%s?,p- 输入进程名:?); printf(?\n p="getpch(PCB);" 进程号No.%d:\n?,i); {>name);    
           printf("\n 输入进程优先数:");    
           scanf("%d",&p->super);    
           printf("\n 输入进程运行时间:");    
           scanf("%d",&p->ntime);    
           printf("\n");    
           p->rtime=0;p->state='w';    
           p->link=NULL;    
           sort(); /* 调用sort函数*/    
         }    
      }    
      int space()    
      {    
         int l=0; PCB* pr=ready;    
         while(pr!=NULL)    
         {    
             l++;    
             pr=pr->link;    
         }    
         return(l);    
      }    
        
  disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/    
      {    
         printf("\n qname \t state \t super \t ndtime \t runtime \n");    
         printf("|%s\t",pr->name);    
         printf("|%c\t",pr->state);    
         printf("|%d\t",pr->super);    
         printf("|%d\t",pr->ntime);    
         printf("|%d\t",pr->rtime);    
         printf("\n");    
      }    
    
      check() /* 建立进程查看函数 */    
      {    
          PCB* pr;    
          printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/    
          disp(p);    
          pr=ready;    
          printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/    
          while(pr!=NULL)    
          {    
              disp(pr);    
              pr=pr->link;    
         }    
      }    
         
destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/    
      {    
         printf("\n 进程 [%s] 已完成.\n",p->name);    
         free(p);    
      }    
      running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/    
      {    
         (p->rtime)++;    
         if(p->rtime==p->ntime)    
             destroy(); /* 调用destroy函数*/    
         else    
         {    
             (p->super)--;    
             p->state='w';    
             sort(); /*调用sort函数*/    
         }    
      }    
          
main() /*主函数*/    
      {    
        int len, h=0;    
        char ch;    
        input();    
        len=space();    
        while((len!=0)&&(ready!=NULL))    
          {    
              ch=getchar();    
              h++;    
              printf("\n The execute number:%d \n",h);    
              p=ready;    
              ready=p->link;    
              p->link=NULL;    
              p->state='R';    
              check();    
              running();    
              printf("\n 按任一键继续......");    
              ch=getchar();    
            }    
        printf("\n\n 进程已经完成.\n");    
        ch=getchar();    
      
0 0