时间片轮转进程调度

1.实验目的

(1)掌握时间片轮转进程调度的概念和算法。
(2)加深对处理机的分配的理解。

2.实验内容

时间片轮转进程调度

3.源程序代码

#include “stdafx.h”
#include<stdio.h>
#define MAX 10
struct task_struct
{
char name[10]; /进程名称/
float arrivetime; /到达时间/
float starttime; /开始运行时间/
float runtime; /运行时间/
float finishtime; /运行结束时间/
int runflag; /调度标志/
int startflag; //是否为第一次开始调度
} tasks[MAX];
int counter; /实际进程个数/
int pinput();
int timecounter=0;
int poutput(); /调度结果输出/
int time();
int charge();//判断是否所有的进程都被执行过
int time()
{
float temp=0;//用来记录时间片已用长度
int i;
int j=0;
int k=0;
struct task_struct copy_task[MAX];//备份
for(i=0; i<counter; i++)
{
copy_task[j++]=tasks[i];//对进程的初始化信息备份
}
temp=tasks[0].arrivetime;//temp=第一个进程的到达时间
while(charge())//while条件,charge为0跳出(说明进程都已经全部执行完毕),为1进入(进程还未执行完毕,继续执行)
{
for(i=0; i<counter; i++)
{
if(tasks[i].arrivetime>temp)//如果第i个的到达时间大于第一个的到达时间,则将第i个的到达时间与temp交换,更新temp的记录,但是第一次运行的时候不走这一步
{
temp=tasks[i].arrivetime;
}
if(tasks[i].runflag0)//第i个进程还未结束
{
if(tasks[i].startflag
0) //该条件成立则说明,该进程是第一次执行,记录开始执行时间
{
tasks[i].starttime=temp;//第一个进程的到达时间为temp
tasks[i].startflag=1;//运行完上一步后记录该进程已经不是第一次运行了
}
if(tasks[i].runtime/timecounter>1)//,运行时间除以时间片长度,说明至少有两倍的时间片未执行
{
tasks[i].runtime=tasks[i].runtime-timecounter;//剩余运行时间就等于原来运行时间减去一个时间片长度
temp=temp+timecounter;//temp继续记录已用的时间片长度
}
else if(tasks[i].runtime-timecounter0)//即运行时间除以时间片长度为1,该进程剩下的刚好是一个时间片长度,说明该进程只需在运行一一步就可以运行完毕
{
temp=temp+timecounter;//temp加上最后一个时间片长度就为该进程的结束时间
tasks[i].finishtime=temp;
tasks[i].runflag=1;//标记该进程已经执行完毕
tasks[i].runtime=copy_task[i].runtime;//为了计算周转时间,运行时间从备份里面还原到最开始的运行时间
}
else//仅剩下不足一倍的时间片,则剩余运行时间除以时间片长度<1
{
temp=temp+tasks[i].runtime;//剩余运行时间不够一个时间片长度,则结束时间等于temp加上该进程的运行时间
tasks[i].finishtime=temp;
tasks[i].runflag=1;//标记该进程已经运行完毕
tasks[i].runtime=copy_task[i].runtime;
}
}
}
}
return 0;
}
int charge()//判断是否全部进程都执行完毕
{
int k;
int superflag=0;//判断是否全部的进程都执行完毕
for(k=0; k<counter; k++)
{
if(tasks[k].runflag
0)//
{
superflag=1;
return superflag;
break;
}
else
{
superflag=0;
}
}
return superflag;
}
int pinput() /进程参数输入/
{
int i;
printf(“请输入进程个数:\n”);
scanf("%d",&counter);
printf(“请输入时间片长度:\n”);
scanf("%d",&timecounter);
for(i=0; i<counter; i++)
{
printf("******************************************\n");
printf(“请输入进程名称、到达时间、运行时间:(中间用空格隔开)\n”);
scanf("%s%f%f",tasks[i].name,&tasks[i].arrivetime,&tasks[i].runtime);
tasks[i].starttime=0;
tasks[i].finishtime=0;
tasks[i].runflag=0; //运行是否结束
tasks[i].startflag=0;//是否首次被执行
}
return 0;
}
int poutput() /调度结果输出/
{
int i;
float zztime=0,f1,w=0;
printf(“进程名 到达时间 运行时间 开始时间 结束时间 周转时间\n”);
for(i=0; i<counter; i++)
{
f1=tasks[i].finishtime-tasks[i].arrivetime;
zztime+=f1;
printf("%s\t%5.3f\t%5.3f\t%5.3f\t %5.3f\t%5.3f\n",tasks[i].name,tasks[i].arrivetime,tasks[i].runtime,tasks[i].starttime,tasks[i].finishtime,f1);
}
printf(“平均周转时间=%5.2f\n”,zztime/counter);
return 0;
}
void main()
{
pinput();
printf(“时间片轮转算法。\n\n”);
time();
poutput();
}

4.程序运行结果

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒羊羊夸夸~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值