时间片轮换算法(C语言)

时间片轮换算法并输出周转时间(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;
}
  • 7
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值