作業系統之先來先服務(FCFS)實現程式碼
阿新 • • 發佈:2018-12-26
完成與:2013.12.11
實驗步驟:
1. 演算法的思想
先來先服務(FCFS)排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。採用FCFS演算法,每次從後備佇列中選擇一個或多個最先進入該佇列的作業,將他們調入記憶體,為他們分配資源,建立程序,然後放入就緒佇列。在程序排程中採用FCFS演算法時,則每次排程是從就緒佇列中選擇一個最先進入該佇列的程序,為之分配處理機,使之投入執行。該程序一直執行到完成或發生某事件而阻塞後才放棄處理機。
2. 程式程式碼
#include <stdio.h> #include <string.h> double avg_TurnaroundTime;//平均週轉時間 double AQTT;//平均帶權週轉時間 struct progress{ char proName[80]; int arriveTime;//到達時間 int serviceTime;//服務時間 //int flag; //訪問標誌,未訪問1,訪問0 int finishTime;//完成時間 int cyclingTime;//週轉時間 double float_Wi;//帶權週轉時間 }; struct progress course[80]; //struct progress course[80]={{0,4},{1,3},{2,5},{3,2},{4,4}}; void health_Examine(int *courseNum)//輸入合法性檢查 {return; } void progressNum(int *courseNum)//程序數目 {int i=0; for(i=0; i<*courseNum;i++){ printf("請輸入第%d個程序的相應資訊。\n", i+1); printf("請輸入程序名:"); scanf("%s", course[i].proName); printf("請輸入到達時間:"); scanf("%d", &course[i].arriveTime); printf("請輸入服務時間:"); scanf("%d", &course[i].serviceTime); } return; } /*void sort_course(int *courseNum)//對程序按照到達時間進行排序 {int i=0,j=0; int temp=0; for(i=0;i<*courseNum-1; i++) for(j=i; j<*courseNum; j++){ if(course[j].arriveTime > course[j+1].arriveTime) { temp=course[j].arriveTime; course[j].arriveTime=course[j+1].arriveTime; course[j+1].arriveTime=temp; }} return; }*/ void finish_Time(int *courseNum)//程序的完成時間 {int i=0; if(course[0].arriveTime != 0)//第一個程序的時間 {course[0].finishTime=course[0].arriveTime + course[0].serviceTime; } course[0].finishTime=course[0].serviceTime; for(i=1; i<*courseNum; i++){ if(course[i-1].finishTime >= course[i].arriveTime) { course[i].finishTime=course[i-1].finishTime + course[i].serviceTime; }else{ course[i].finishTime=course[i].arriveTime + course[i].serviceTime; } } return; } void cyclingTime(int *courseNum)//週轉時間 {int i=0; for(i=0; i<*courseNum; i++) { course[i].cyclingTime=course[i].finishTime - course[i].arriveTime; } return; } void float_Wi(int *courseNum)//帶權週轉時間 {int i=0; for(i=0; i<*courseNum; i++){ course[i].float_Wi=(double)course[i].cyclingTime/course[i].serviceTime; } return; } void avgTurnaroundTime(int *courseNum)//平均週轉時間 { int i=0,sum_TurnaroundTime=0; for(i=0; i<*courseNum; i++){ sum_TurnaroundTime += course[i].cyclingTime; } avg_TurnaroundTime=sum_TurnaroundTime/(*courseNum); return; } void _AQTT(int *courseNum)//平均帶權週轉時間 {int i=0; double sum_float_Wi=0; for(i=0; i<*courseNum; i++){ sum_float_Wi += course[i].float_Wi; } AQTT=sum_float_Wi/(*courseNum); return; } void print_FIFO(int *courseNum)//輸出程序相關的資訊 {int i=0; printf("程序的相應資訊。\n"); printf("程序\t到達時間\t服務時間\t完成時間\t週轉時間\t帶權週轉\n");// for(i=0; i<*courseNum;i++) { //printf("第%個程序的相應資訊。\n", i+1); printf("%s\t %d\t\t %d\t\t %d\t\t %d\t\t %.002lf\t\t\n", course[i].proName,course[i].arriveTime, course[i].serviceTime,course[i].finishTime,course[i].cyclingTime,course[i].float_Wi); //putchar('\n'); } printf("平均週轉時間\t平均帶權週轉時間\n"); printf(" %.002lf\t\t %.002lf\n",avg_TurnaroundTime,AQTT); return; } int main(){ int courseNum=5; printf("請輸入程序數:"); scanf("%d", &courseNum); progressNum(&courseNum);// //sort_course(&courseNum);//對程序按照到達時間進行排序 finish_Time(&courseNum);//程序的完成時間 cyclingTime(&courseNum);//週轉時間 float_Wi(&courseNum);//帶權週轉時間 avgTurnaroundTime(&courseNum);//平均週轉時間 _AQTT(&courseNum);//平均帶權週轉時間 print_FIFO(&courseNum);// return 0; }
3. 執行結果