1. 程式人生 > >作業排程之先來先服務演算法C語言實現

作業排程之先來先服務演算法C語言實現

程式碼如下

  1. /*
  2.     @author WellsLiu
  3.     @url liuyanzhao.com
  4. */
  5. #include"stdio.h"
  6. #include"stdlib.h"
  7. typedef struct PCB      //定義程序控制塊
  8. {   char name[10];   //程序名
  9.     char state;   //執行狀態
  10.     int  ArriveTime;  //到達時間
  11.     int  StartTime;  //程序開始時間
  12.     int  FinishTime;  //程序結束時間
  13.     int  ServiceTime;   //服務時間
  14.     float WholeTime;//週轉時間
  15.     float
     WeightWholeTime;//帶權週轉時間
  16.     double AverageWT_FCFS; //平均週轉時間
  17.     double AverageWWT_FCFS;//帶權平均週轉時間
  18.     struct PCB *next;  //指向下個程序
  19. }pcb;
  20.     double x=0,y=0;
  21.     int i;
  22.         int time;   //計時器
  23.         int n;    //程序個數
  24.     pcb *head=NULL,*p,*q; //程序連結串列指標
  25. void run_FCFS(pcb *p1) //執行未完成的程序
  26. {
  27.     time = p1->ArriveTime > time? p1->ArriveTime:time;
  28.     p1->StartTime=time;
  29. //  printf("\n時刻:%d,  當前開始執行作業%s\n\n",time,p1->name);
  30.     time+=p1->ServiceTime;
  31.     p1->state='T';
  32.     p1->FinishTime=time;
  33.     p1->WholeTime=p1->FinishTime-p1->ArriveTime;
  34.     p1->WeightWholeTime=p1->WholeTime/p1->ServiceTime;
  35.         x+=p1->WholeTime;
  36.         y+=p1->WeightWholeTime;
  37.         p1->AverageWT_FCFS=p1->WholeTime/n;
  38.     p1->AverageWWT_FCFS=p1->WeightWholeTime/n;
  39.     printf("%4s  %6d  %10d  %10d  %8d  %10.1f  %10.2f   %12.2f %14.2f\n",p1->name,p1->ArriveTime,p1->StartTime,p1->ServiceTime,p1->FinishTime,p1->WholeTime,p1->WeightWholeTime,p1->AverageWT_FCFS,p1->AverageWWT_FCFS);
  40. }
  41. void FCFS() //找到當前未完成的程序
  42. {
  43.       int i;
  44.       p=head;
  45.       printf("\n============================================================================================================\n");
  46.       printf("作業名   到達時間  開始時間    服務時間  完成時間   週轉時間   帶權週轉時間   平均週轉時間   平均帶權週轉時間 \n");
  47.       printf("------------------------------------------------------------------------------------------------------------\n");
  48.       for(i=0;i<n;i++)
  49.       {
  50.            if(p->state=='F')
  51.            {
  52.                 q=p;    //標記當前未完成的程序
  53.                 run_FCFS(q);
  54.            }
  55.            p=p->next;
  56.       }
  57.       printf("\n============================================================================================================\n");
  58. }
  59. void getInfo()          //獲得程序資訊並建立程序
  60. {
  61.     int num;
  62.     printf("\n程序個數:");
  63.     scanf("%d",&n);
  64.     for(num=0;num<n;num++)
  65.     {
  66.         p=(pcb *)malloc(sizeof(pcb));
  67.         printf("依次輸入:程序名 到達時間 服務時間\n");
  68.         scanf("%s\t%d\t%d",&p->name,&p->ArriveTime,&p->ServiceTime);
  69.         if(head==NULL)
  70.         {head=p;q=p;time=p->ArriveTime;}
  71.         if(p->ArriveTime < time) time=p->ArriveTime;
  72.         q->next=p;
  73.         p->StartTime=0;
  74.         p->FinishTime=0;
  75.         p->WholeTime=0;
  76.         p->WeightWholeTime=0;
  77.         p->next=NULL;
  78.         p->state='F';
  79.         q=p;
  80.     }
  81. }
  82. void main()
  83. {   printf("先來先服務FCFS演算法模擬\n");
  84.     getInfo();
  85.     p=head;
  86.     FCFS();
  87. }

執行如圖