/*时间片轮转调度算法*/
#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;
}