1、学号 专业 计算机科学与技术 姓名 实验日期 2017.11.2 教师签字 成绩实验报告【实验名称】 轮转调度算法【实验目的】1、 掌握轮转调度算法。2、 进一步认识如何实现处理器调度。3、 通过对进程调度算法的设计,深入理解进程调度的原理【实验原理】在分时系统中,最常用的是基于时间片的轮转算法调度算法。该算法采用了非常公平的处理机分配方式,即让就绪队列上的每个进程每次运行一个时间片。【实验内容】程序流程图:输入进程信息开始按照到达时间对进程进行排序插入第一个到达进程计数器 i = 1 , 当前时间为 0i 当前时间 + 时间片 插入 i 进程是否当前队列是否为空当前时间加上时间片是队列首元素
2、是否执行完P o p 队列 , 结束时间等于当前时间 +服务时间否是将队头移动到队尾否队列是否为空否整理信息 , 输出结束队头元素是否执行完P o p 队列 , 结束时间等于当前时间 +剩余服务时间将队头移动到队尾否否是通过分配时间片的方式让进程获得处理机,若一个时间片未用完,正在运行的程序就已经完成,便将其从就绪队列删除,再调用队首进程,并分配时间片;在一个时间片未用完时,中断程序就会启动,将进程送至就绪队列的尾部。程序:#include#include#define MAX 100using namespace std;struct PCD /定义结构体char name;/进程名int
3、a_time;/到达时间int s_time;/服务时间int s_time2;int f_time;/完成时间float t_time;/周转时间float wt_time;/带权周转时间int state;/当前进程的状态;int Currenttime=0;int turnover(PCD float wturnover(PCD int main()int t;queue q;q=queue();PCD s5;s0.name=A;/初始化结构体数组s1.name=B;s2.name=C;s3.name=D;s4.name=E;coutsi.a_time;si.state=i;coutsi
4、.s_time;si .s_time2=si.s_time;coutt;for(int i=0; isj+1.a_time)swap(sj,sj+1);q.push(s0);/将第一个进程入队列for(int i=1; iCurrenttime+t)/当进程到达时间大于当前时间,执行队列中的进程if(q.empty()=true) /到当前时间Currenttime+;/队列中无进程if(q.empty()!=true) /队列前面有进程if(q.front().s_time-t=0)Currenttime=Currenttime+q.front().s_time;for(int j=0; j
5、5; j+)if(sj.state=q.front().state)sj.f_time= Currenttime;q.pop(); /队列中删除elseCurrenttime=Currenttime+t;q.front().s_time-=t;q.push(q.front();/队头放入队尾q.pop();q.push(si);if(q.front().s_time=t) /如果有进程提前结束Currenttime=Currenttime+q.front().s_time;/结束进程for(int j=0; j5; j+)if(sj.state=q.front().state) /设置进程的序
6、号,如果在队列中与进程控制块中匹配sj.f_time= Currenttime; /终止时间q.pop();elseCurrenttime=Currenttime+t; /继续执行q.front().s_time-=t;q.push(q.front(); /入队后队头放入队尾q.pop();while(q.empty()!=true) /所有进程全部入队if(q.front().s_time=t)Currenttime=Currenttime+q.front().s_time;for(int i=0; i5; i+)if(si.state=q.front().state) /去进程控制块中寻找
7、,改变结束时间si.f_time= Currenttime;q.pop();elseCurrenttime=Currenttime+t;q.front().s_time-=t;q.push(q.front();q.pop();cout“ “到达时间 “服务时间 “完成时间 “周转时间 “带权周转时间“endl;for(int i=0; i=4; i+)coutsi.name“ “si.a_time“ “si.s_time2“ “si.f_time“ “turnover(si)“ “;coutwturnover(si)endlendl;/cout 是从后往前计算的double sum = 0;for(int i = 0; i5; i+)sum+=si.wt_time;cout“此算法平均带权周转时间为“sum/5endl;return 0;【小结或讨论】1、 当时间片的过大的时候,轮转调度算法便会退化为先来先服务算法。2、 就绪队列是先插入到来的队列,再将未完成的队列送至队尾。3、 一开始在写程序是,为考虑到进程到达时间与当前时间的关系,即进程到达时间大于当前时间时,要继续执行队列中的进程,最终加上了。