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