(1)按先来先服务算法将进程排成就绪队列。
(2)执行一个时间片后,系统时间加上时间片长度。
(3)按照队列进行时间片相加,当有进程完成结束时此进程跳出不参与接下来的时间片分配。
(5)当到了所有运行进程完成后进行输出。
(6)主要的判断函数。
char name[10]; /*进程名称*/
int number; /*进程编号*/
float arrivetime; /*到达时间*/
float starttime; /*开始运行时间*/
float servicetime; /*运行时间*/
float finishtime; /*运行结束时间*/
int run_flag; /*调度标志*/
int start_flag; //是否为第一次开始调度
#include<stdio.h> #define MAX 10 struct task_struct { char name[10]; /*进程名称*/ int number; /*进程编号*/ float arrivetime; /*到达时间*/ float starttime; /*开始运行时间*/ float servicetime; /*运行时间*/ float finishtime; /*运行结束时间*/ int run_flag; /*调度标志*/ int start_flag; //是否为第一次开始调度 float x ; //剩余时间 char state ; //进程状态 } tasks[MAX]; int counter; /*实际进程个数*/ int time_counter=0; int poutput(); /*调度结果输出*/ int time(); int charge();//判断是否所有的进程都被执行过 int pput(); int time() { float time_temp=0; int i; int j=0; int k=0; struct task_struct copy_task[MAX];//备份 for(i=0; i<counter; i++) { tasks[i].state='w';//初始化为wait copy_task[j++]=tasks[i];//对进程的初始化信息备份 } time_temp=tasks[0].arrivetime; while(charge()) { for(i=0; i<counter; i++) { if(tasks[i].arrivetime>time_temp) { time_temp=tasks[i].arrivetime; } if(tasks[i].run_flag==0)//该进程还未结束 { if(tasks[i].start_flag==0) //该条件成立则说明,该进程是第一次执行,记录开始执行时间 { tasks[i].starttime=time_temp; tasks[i].start_flag=1; tasks[i].state='w'; } if(tasks[i].servicetime/time_counter>1)//至少有两倍的时间片未执行 { tasks[i].servicetime=tasks[i].servicetime-time_counter; time_temp=time_temp+time_counter; tasks[i].x=tasks[i].servicetime; tasks[i].state='R'; pput(); tasks[i].state='w'; } else if(tasks[i].servicetime-time_counter==0) { tasks[i].x=0; time_temp=time_temp+time_counter; tasks[i].finishtime=time_temp; tasks[i].run_flag=1; tasks[i].servicetime=copy_task[i].servicetime; tasks[i].state='E'; pput(); } else//仅剩下不足一倍的时间片 { tasks[i].x=0; time_temp=time_temp+tasks[i].servicetime; tasks[i].finishtime=time_temp; tasks[i].run_flag=1; tasks[i].servicetime=copy_task[i].servicetime; tasks[i].state='E'; pput(); } } } } return 0; } int charge()//判断是否全部进程都执行完毕 { int k; int super_flag=0;//判断是否全部的进程都执行完毕 for(k=0; k<counter; k++) { if(tasks[k].run_flag==0) { super_flag=1; return super_flag; break; } else { super_flag=0; } } return super_flag; } int pinput() /*进程参数输入*/ { int i; printf("请输入进程数:\n"); scanf("%d",&counter); printf("请输入时间片:\n"); scanf("%d",&time_counter); for(i=0; i<counter; i++) { printf("******************************************\n"); printf("请输入第 %d 个进程 :\n",i+1); printf("请输入进程名称,到达时间,服务时间:\n"); scanf("%s%f%f",tasks[i].name,&tasks[i].arrivetime,&tasks[i].servicetime); tasks[i].starttime=0; tasks[i].finishtime=0; tasks[i].run_flag=0; //运行是否结束 tasks[i].start_flag=0;//是否首次被执行 } return 0; } int pput() { int i; printf("进程名 剩余时间 运行状态 \n"); for(i=0; i<counter; i++) { printf("%s\t %5.3f\t %c\n", tasks[i].name,tasks[i].x,tasks[i].state); } return 0; } int poutput() /*调度结果输出*/ { int i; printf("进程名 到达时间 运行时间 开始时间 结束时间 \n"); for(i=0; i<counter; i++) { printf("%s\t %5.3f\t %5.3f\t %5.3f\t %5.3f\n ", tasks[i].name,tasks[i].arrivetime,tasks[i].servicetime,tasks[i].starttime,tasks[i].finishtime); } return 0; } void main() { pinput(); printf("时间片轮转算法。\n\n"); time(); poutput(); }