/*時間片輪轉調度算法*/ #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; }