程序排程演算法 —— 時間片輪轉排程
阿新 • • 發佈:2018-11-03
/*時間片輪轉排程演算法*/ #include<stdio.h> #define MAX 50 struct a_struct { char name[10]; //程序名字 int number; //程序編號 float dt; //到達時間 float begin_time; //開始執行時間 float st; //服務時間 float end_time; //完成時間 int priority; //優先順序 int flag; //排程標誌 int start_flag; //是否為第一次開始排程 float zt; //週轉時間 float dczt; //帶權週轉時間 }a[MAX]; int n,rr=0; //n:程序個數 rr:時間片大小 float sum1,sum2; //週轉時間之和、帶權週轉時間之和 int Input(); int Output(); //排程結果輸出 int Run(); int charge(); //判斷是否所有的程序都被執行過 void main(){ printf("\n**************時間片輪轉排程演算法***************\n"); Input(); Run(); Output(); } /*資料輸入*/ int Input() { int i; printf("\n\t請輸入有n個程序(0<n<=50): "); scanf("%d",&n); while(n>50||n<=0) { printf("n\t請重新輸入: "); scanf("%d",&n); } printf("\t請輸入時間片大小(0<rr): "); scanf("%d",&rr); while(rr<=0) { printf("n\t請重新輸入: "); scanf("%d",&rr); } for(i=0;i<n;i++) { printf("\n\t*******************"); printf("輸入第%d個程序資訊:\n",i+1); printf("\t程序名字: "); scanf("%s",a[i].name); printf("\t程序編號: "); scanf("%d",&a[i].number); printf("\t到達時間: "); scanf("%f",&a[i].dt); printf("\t服務時間: "); scanf("%f",&a[i].st); printf("\t優先順序: "); scanf("%d",&a[i].priority); a[i].begin_time=0; a[i].end_time=0; a[i].flag=0; //執行是否結束 a[i].start_flag=0; //是否首次被執行 } return 0; } /*演算法執行*/ int Run(){ float time_temp=0; int i,j=0; struct a_struct copy_a[MAX];//備份 for(i=0; i<n; i++) { copy_a[j++]=a[i]; //對程序的初始化資訊備份 } time_temp=a[0].dt; while(charge()) { for(i=0; i<n; i++) { if(a[i].dt>time_temp) { time_temp=a[i].dt; } if(a[i].flag==0) //該程序還未結束 { if(a[i].start_flag==0) //該條件成立則說明,該程序是第一次執行,記錄開始執行時間 { a[i].begin_time=time_temp; a[i].start_flag=1; } if(a[i].st/rr>1) //至少有兩倍的時間片未執行 { a[i].st=a[i].st-rr; time_temp=time_temp+rr; } else if(a[i].st-rr==0) //剛好執行一個時間片 { time_temp=time_temp+rr; a[i].end_time=time_temp; a[i].flag=1; a[i].st=copy_a[i].st; } else //僅剩下不足一倍的時間片 { time_temp=time_temp+a[i].st; a[i].end_time=time_temp; a[i].flag=1; a[i].st=copy_a[i].st; } } } } return 0; } /*判斷是否全部程序都執行完畢*/ int charge() { int super_flag=0; //判斷是否全部的程序都執行完畢 for(int k=0; k<n; k++) { if(a[k].flag==0) { super_flag=1; return super_flag; break; } else { super_flag=0; } } return super_flag; } /*排程結果輸出*/ int Output() { printf("\n程序編號 程序名字 到達時間 服務時間 優先順序 開始時間 完成時間 週轉時間 帶權週轉時間\n"); for(int i=0; i<n; i++) { a[i].zt = a[i].end_time - a[i].dt; //週轉時間=完成時間-到達時間 a[i].dczt=a[i].zt/a[i].st; //帶權週轉時間=週轉時間/服務時間 sum1+=a[i].zt; sum2+=a[i].dczt; printf("%-d\t %-s\t %-.0f\t %-.0f\t %d\t\t%-.0f\t%-.0f\t %-.2f\t %-.2f\n",a[i].number,a[i].name,a[i].dt,a[i].st,a[i].priority,a[i].begin_time,a[i].end_time,a[i].zt,a[i].dczt); } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); return 0; }