时间片轮换算法并输出周转时间(C语言)
时间片轮换算法
给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。
优点是兼顾长短作业;
缺点是平均等待时间较长,上下文切换较费时。
适用于分时系统
周转时间
周转时间=完成时间-到达时间
平均周转时间=周转时间和除以进程数
带权周转时间=周转时间除以完成时间
带权平均周转时间=带权周转时间和除以进程数
代码如下
#include <stdio.h>
#define N 10 //最大进程数
struct PCB
{
int p; //进程名称
int arrt; //到达时间
int sert; //运行时间
int state; //完成状态
int ot; //剩余运行时间
int isarr; //是否在就绪队列
}process[N];
int main()
{
int i=0,a=0,b=0,c=1,d; //循环变量
int zt=0,zt1=0; //周转时间变量
int no = 1; //调度次数
int num; //未完成进程数
int time; //调度时间
int n; //进程数
int T; //时间片长度
int arr[N]; //就绪队列
int len; //就绪队列长度
printf("输入时间片长度:");
scanf("%d",&T);
printf("请输入进程数:"); //确定进程数量
scanf("%d",&n);
num = n;
for(i;i<n;i++) //输入进程信息
{
printf("请输入进程:");
scanf("%d",&process[i].p); // 进程名称
printf("请输入进程到达时间:");
scanf("%d",&process[i].arrt); //进程到达时间
printf("请输入进程服务时间:");
scanf("%d",&process[i].sert); //进程服务时间
process[i].ot = process[i].sert; //剩余服务时间
process[i].state = 0; //完成状态
process[i].isarr = 0; //是否在就绪队列
}
for(b;b<n;b++) //依据进程的到达时间对进程进行排序 升序
{
for(c=b+1;c<n;c++)
{
if(process[b].arrt>process[c].arrt)
{
process[n] = process[c];
process[c] = process[b];
process[b] = process[n];
}
}
}
arr[0] = 0; //第一个进程已在就绪队列
len = 1; //此时就绪队列长度为1
time = process[0].arrt;
process[0].isarr = 1; //第一个进程已在就绪队列
printf("进程\t到达时间\t运行时间\n"); //输出进程信息
for(a;a<n;a++)
{
printf("%d\t%d\t%d\n",process[a].p,process[a].arrt,process[a].sert);
}
while(num>0)
{
for(i=1;i<n;i++) //判断是否进入就绪队列
{
if(process[i].state == 1)//已完成的进程 不进入就绪队列
continue;
if((process[i].arrt <= time + T) && (process[i].isarr == 0)) //判断到达时间和是否已进入就绪队列
{
arr[len]=i; //放入就绪队列
len ++; //就绪队列长度加一
process[i].isarr = 1; //修改存在就绪队列的标志
}
}
if(process[arr[0]].ot<=T && process[arr[0]].state == 0) //表示剩余时间小于等于一个时间片 可以完成
{
time = time + process[arr[0]].ot;
zt = time-process[arr[0]].arrt; //周转时间
zt1 = zt1 + zt; //总的周转时间
process[arr[0]].ot = 0; //剩余运行时间为0
process[arr[0]].state = 1; //已完成的状态
process[arr[0]].isarr = 0 ; //踢出就绪队列
printf("第%d次调度%d进程,剩余服务时长%d,周转时间%d\n",no,process[arr[0]].p,0,zt);
no ++; //调度次数
num --; //未调度的进程数
len --; //就绪队列长度
for( a=0;a<n;a++) //就绪队列中的进行向前走一步
arr[a]=arr[a+1];
}else if(process[arr[0]].ot > T && process[arr[0]].state == 0) //表示时间大于一个时间片 不能完成
{
time = time + T;
process[arr[0]].ot = process[arr[0]].ot - T; //剩余时间减去时间片
printf("第%d次调度%d进程,剩余服务时长%d\n",no,process[arr[0]].p,process[arr[0]].ot);
no ++; //调度次数
d = arr[0]; //调换就绪队列的顺序
for(a=0;a<len;a++)
{
arr[a] = arr[a+1];
}
arr[len-1] = d;
}
}
printf("平均周转时间%d\n",zt1/n);
return 0;
}