作業排程之先來先服務演算法C語言實現
阿新 • • 發佈:2018-12-26
程式碼如下
- /*
- @author WellsLiu
- @url liuyanzhao.com
- */
- #include"stdio.h"
- #include"stdlib.h"
- typedef struct PCB //定義程序控制塊
- { char name[10]; //程序名
- char state; //執行狀態
- int ArriveTime; //到達時間
- int StartTime; //程序開始時間
- int FinishTime; //程序結束時間
- int ServiceTime; //服務時間
- float WholeTime;//週轉時間
- float
- double AverageWT_FCFS; //平均週轉時間
- double AverageWWT_FCFS;//帶權平均週轉時間
- struct PCB *next; //指向下個程序
- }pcb;
- double x=0,y=0;
- int i;
- int time; //計時器
- int n; //程序個數
- pcb *head=NULL,*p,*q; //程序連結串列指標
- void run_FCFS(pcb *p1) //執行未完成的程序
- {
- time = p1->ArriveTime > time? p1->ArriveTime:time;
- p1->StartTime=time;
- // printf("\n時刻:%d, 當前開始執行作業%s\n\n",time,p1->name);
- time+=p1->ServiceTime;
- p1->state='T';
- p1->FinishTime=time;
- p1->WholeTime=p1->FinishTime-p1->ArriveTime;
- p1->WeightWholeTime=p1->WholeTime/p1->ServiceTime;
- x+=p1->WholeTime;
- y+=p1->WeightWholeTime;
- p1->AverageWT_FCFS=p1->WholeTime/n;
- p1->AverageWWT_FCFS=p1->WeightWholeTime/n;
- 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);
- }
- void FCFS() //找到當前未完成的程序
- {
- int i;
- p=head;
- printf("\n============================================================================================================\n");
- printf("作業名 到達時間 開始時間 服務時間 完成時間 週轉時間 帶權週轉時間 平均週轉時間 平均帶權週轉時間 \n");
- printf("------------------------------------------------------------------------------------------------------------\n");
- for(i=0;i<n;i++)
- {
- if(p->state=='F')
- {
- q=p; //標記當前未完成的程序
- run_FCFS(q);
- }
- p=p->next;
- }
- printf("\n============================================================================================================\n");
- }
- void getInfo() //獲得程序資訊並建立程序
- {
- int num;
- printf("\n程序個數:");
- scanf("%d",&n);
- for(num=0;num<n;num++)
- {
- p=(pcb *)malloc(sizeof(pcb));
- printf("依次輸入:程序名 到達時間 服務時間\n");
- scanf("%s\t%d\t%d",&p->name,&p->ArriveTime,&p->ServiceTime);
- if(head==NULL)
- {head=p;q=p;time=p->ArriveTime;}
- if(p->ArriveTime < time) time=p->ArriveTime;
- q->next=p;
- p->StartTime=0;
- p->FinishTime=0;
- p->WholeTime=0;
- p->WeightWholeTime=0;
- p->next=NULL;
- p->state='F';
- q=p;
- }
- }
- void main()
- { printf("先來先服務FCFS演算法模擬\n");
- getInfo();
- p=head;
- FCFS();
- }
執行如圖