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