进程调度模拟(优先级调度和时间片调度)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct node{
   char name[10];//进程名字
   int  first;   //优先数
   int  round;   //
   int  arrive_time;
   int  need_run_time;
   int  use_time;//已用cpu时间
   char state;   //状态
   int  count; 
   struct node *next;
}PCB;
    void print_pro(int algo);
    void print_robin(void);
    int algo;
    PCB *finish,*ready,*tail,*run;//队列指针
    int progress;//进程数
 void firstin(){
  run=ready;
  run->state='R';
  ready=ready->next;
 }
 //标题输出
 void printtile(int algo){
  switch(algo){
  
  case 1://时间片轮转
   printf("名字      进程完成需要时间  计数器  时间片 使用cpu时间 状态\n");
   printf("###################################################\n");
   break;
  case 2://优先级
   printf("名字    进程优先级   进程完成需要时间 使用cpu时间  状态\n");
   printf("###################################################\n");
   break;
  default:
   break;
  
  }
 }
 //PCB输出
 void printPCB(int a,PCB *p){
  switch(a){
  case 1:
   printf("%s               %d            %d       %d         %d        %c\n",p->name,p->need_run_time,p->count,p->round,p->use_time,p->state);
   break;
  case 2:
   printf("%s         %d                 %d           %d          %c\n",p->name,p->first,p->need_run_time,p->use_time,p->state);
   break;
  default:
   break;
  }
 }
 void print(int algo){
  PCB *p;
  printtile(algo);
  if(run!=NULL)
   printPCB(algo,run);
   p=ready;
   while(p!=NULL){
    printPCB(algo,p);
    p=p->next;
   }
   p=finish;
   while(p!=NULL){
    printPCB(algo,p);
    p=p->next;
   }
   getch();
 }
 void robin(PCB *p){
  tail->next=p;
  tail=p;
  p->next=NULL;
 }
 //创建时间片轮转
 void create_robin(int tile){
  PCB *p;
  int i,time;
  char name1[10];
  ready=NULL;
  finish=NULL;
  run=NULL;
  printf("\n\t   输入每个进程名字和运行需要时间\n");
  printf("\n\t   例如一个进程(progress1 5回车)\n");
  printf("##################################################\n\n\n");
  for(i=0;i<progress;i++){
   p=(PCB*)malloc(sizeof(PCB));
   scanf("%s",&name1);
   scanf("%d",&time);
   strcpy(p->name,name1);
   p->need_run_time=time;
   p->use_time=0;
   p->count=0;
   p->state='W';
   p->round=1;
   if(ready!=NULL){
    robin(p);
   }else{
    p->next=ready;
    ready=p;
    tail=p;
   }
  }
  print_robin();
 }
 //时间轮转法输出
 void print_robin(void){
  printf("\n\t   时间片轮转模拟输出结果:\n");
  printf("#################################################\n");
  print(algo);
  run=ready;
  ready=ready->next;
  run->state='R';
 }
  //时间片算法
 void robin_run(int num){
  while(run!=NULL){
   run->need_run_time-=1;
   run->count+=1;
   run->use_time+=1;
   if(run->need_run_time==0){
    run->next=finish;
    run->state='F';
    run=NULL;
    if(ready!=NULL)
     firstin();
   }
   else
     if(run->count==run->round){
      run->count=0;
      if(ready!=NULL){
       run->state='W';
       robin(run);
       firstin();
      
     }
   }
    print(algo);
  }
 }
 //优先级插入
 void pro_insert(PCB *p){
 PCB *p1;
 PCB *s;
 PCB *r;
 int num;
 s=p;
 p1=ready;
 r=p1;
 num=1;
 while((p1!=NULL)&&num){
  if(p1->first>=s->first){
   r=p1;
   p1=p1->next;
  }else
   num=0;
  if(r!=p1){
   r->next=s;
   s->next=p1;
  }else{
   s->next=p1;
   ready=s;
  }
 }
 }
//创建优先级PCB
 void pro_create(int algo){
 PCB *p;
 int i,time;
 char name[10];
 ready=NULL;
 finish=NULL;
 run=NULL;
 printf("\n\t   请输入每个进程名字和它的运行时间\n");
 printf("\n\t   例如1个进程(progress1 5回车)\n");
 printf("################################################\n\n\n");
 for(i=1;i<=progress;i++){
  p=(PCB *)malloc(sizeof(PCB));
  scanf("%s",&name);
  scanf("%d",&time);
  strcpy(p->name,name);
  p->need_run_time=time;
  p->use_time=0;
  p->state='W';
  p->first=50-time;
  if(ready!=NULL){
   pro_insert(p);
  }else{
   p->next=ready;
   ready=p;
  }
 }
 print_pro(algo);
 }
 void print_pro(int algo){
  printf("\n\t   优先级调度算法模拟输出\n");
  printf("###############################################\n");
  print(algo);
  run=ready;
  ready=ready->next;
  run->state='R';
 }
 //优先级进程调度算法
 void pro_change(int algo){
  while(run!=NULL){
   run->need_run_time-=1;
   run->use_time+=1;
   run->first-=3;
   if(run->need_run_time==0){
    run->next=finish;
    finish=run;
    run->state='F';
    run=NULL;
    if(ready!=NULL)
     firstin();
   }else
    if((ready!=NULL)&&(run->first<ready->first)){
     run->state='W';
     pro_insert(run);
     firstin();
    }
    print(algo);
  }
 }
 int main(){
  char mainmenu;
  do{
   system("cls");
   printf("\n\t   进程调度模拟系统\n");
   printf("##############################################\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#           1、时间片轮转算法模拟            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#           2、优先级算法模拟                #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#           3、退出系统                      #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("#                                            #\n");
   printf("##############################################\n");
   scanf("%d",&algo);
   switch(algo){
   case 1:
 system("cls");
    printf("\n\t   请输入需要模拟进程个数\n");
    scanf("%d",&progress);
    create_robin(algo);
    robin_run(algo);
    break;
   case 2:
 system("cls");
    printf("\n\t   请输入需要模拟进程个数\n");
    scanf("%d",&progress);
 pro_create(algo);
 pro_change(algo);
    break;
   case 3:
    break;
   default:
    printf("\n\t   你的输入有错误!!\n");
    break;
   }
   mainmenu=getchar();
  }while(mainmenu=='y'||mainmenu=='Y');
  return 0;
 }

猜你喜欢

转载自blog.csdn.net/qq_40955914/article/details/80273301