RR算法总体思路流程图

主要数据结构及参数

typedef struct PCB
{char name;//进程名int arrive_time;//到达时间float cpu_burst;//服务时间float surplus;//剩余服务时间int start_time;//开始执行时间int finish_time;//完成时间int wait_time;//等待时间float turn_time;//周转时间float weighted_ttime;//带权周转时间bool over;//标记进程是否执行完毕float response;//响应比
}PCB;//定义进程数据结构int pcb_num;//进程个数int time_p;//时间片大小

主要函数

//将进程按照到达先后顺序排序
void sort_arrival(PCB pcb[],int pcb_num){}//计算周转时间和带权周转时间
void calculator_rr(PCB pcb[],int pcb_num){}//RR调度算法
void rr(PCB pcb[],int pcb_num,float time_p){}//计算平均周转时间、平均带权周转时间、平均等待时间
void cal_avg(PCB pcb[],int pcb_num){}//输出各进程
void show(PCB pcb[],int pcb_num){}//主函数测试RR调度算法
int main(){}

①sort_arrival()函数:输入进程顺序表pcb[]和进程个数pcb_num作为函数参数,然后将顺序表pcb[]按照到达的先后顺序排序。

②calculator_rr()函数:输入进程顺序表pcb[]和进程个数pcb_num作为函数参数,用于在rr()函数中反复调用,根据顺序表pcb[]中已知的到达时间、完成时间、服务时间,计算周转时间和带权周转时间

③rr()函数:输入进程顺序表pcb[]和进程个数pcb_num作为函数参数,主要是实现RR调度算法,将经RR调度算法计算后的开始执行时间、完成时间、等待时间、周转时间、带权周转时间存入进程顺序表中。

④cal_avg()函数:输入进程顺序表pcb[]和进程个数pcb_num作为函数参数,通过进程顺序表中的等待时间、周转时间、带权周转时间计算出平均等待时间、平均周转时间、平均带权周转时间,然后输出。

⑤show()函数:输入进程顺序表pcb[]和进程个数pcb_num作为函数参数,以表格的形式输出进程顺序表中的各参数信息。

⑥main()函数:主函数中输入进程顺序表,测试FCFS调度函数和SJF调度函数,输出测试结果。

代码

#include<iostream>
#include<iomanip>
#include<queue>
#include<algorithm>using namespace std;typedef struct PCB
{char name;//进程名int arrive_time;//到达时间float cpu_burst;//服务时间float surplus;//剩余服务时间int start_time;//开始执行时间int finish_time;//完成时间int wait_time;//等待时间float turn_time;//周转时间float weighted_ttime;//带权周转时间bool over;//标记进程是否执行
}PCB;//定义进程数据结构//将进程按照到达先后顺序排序
void sort_arrival(PCB pcb[],int pcb_num)
{PCB temp;for(int i=0;i<pcb_num-1;i++){for(int j=i+1;j<pcb_num;j++){if(pcb[i].arrive_time>pcb[j].arrive_time){temp = pcb[i];pcb[i] = pcb[j];pcb[j] = temp;}}}
}//计算周转时间和带权周转时间
void calculator_rr(PCB pcb[],int pcb_num)
{for(int i=0;i<pcb_num;i++){pcb[i].turn_time = pcb[i].finish_time-pcb[i].arrive_time;//周转时间 = 完成时间-到达时间pcb[i].weighted_ttime = pcb[i].turn_time/pcb[i].cpu_burst;//带权周转时间 = 周转时间/服务时间}
}//RR调度算法
void rr(PCB pcb[],int pcb_num,float time_p)
{for(int i=0;i<pcb_num;i++){pcb[i].surplus = pcb[i].cpu_burst;pcb[i].finish_time = 0;pcb[i].start_time = 0;pcb[i].turn_time = 0;pcb[i].wait_time = 0;pcb[i].weighted_ttime = 0;}//初始化进程信息queue<int> wait_q;//定义进程等待队列sort_arrival(pcb,pcb_num);//将所有进程按照到达的先后顺序排列int t = pcb[0].arrive_time;//时间从第一个进程到达开始wait_q.push(0);//将第一个进程加入等待队列while(wait_q.empty() == false){int t0 =t;//记录需要进行进程切换的时刻int run;run = wait_q.front();wait_q.pop();if(pcb[run].over == false)//进程第一次执行时{pcb[run].start_time = t;//记录第一次开始执行的时间pcb[run].wait_time = pcb[run].wait_time+t-pcb[run].arrive_time;//累加计算等待时间pcb[run].over = true;}else//进程非第一次执行时{pcb[run].wait_time = pcb[run].wait_time+t-pcb[run].finish_time;//累加计算等待时间}t = t+min(pcb[run].surplus,time_p);//将时间切换到下个时间片,或进程执行完毕pcb[run].finish_time = t;//更新每次进程执行结束的时间pcb[run].surplus = pcb[run].surplus-min(pcb[run].surplus,time_p);//更新进程剩余服务时间if(t0<pcb[pcb_num-1].arrive_time){for(int i=0;i<pcb_num;i++){if(pcb[i].arrive_time>t0 && pcb[i].arrive_time<=t){wait_q.push(i);}}//将所有在t0-t时间内到达的进程按照到达的先后顺序加入等待队列}if(pcb[run].surplus != 0){wait_q.push(run);//若进程执行完毕则不再加入等待队列}}calculator_rr(pcb,pcb_num);//计算进程周转时间、带权周转时间
}//计算平均周转时间、平均带权周转时间、平均等待时间
void cal_avg(PCB pcb[],int pcb_num)
{float sum1 = 0,sum2 = 0, sum3 = 0;float avg_turn, avg_weight, avg_wait;for(int i=0;i<pcb_num;i++){sum1 = sum1+pcb[i].turn_time;sum2 = sum2+pcb[i].weighted_ttime;sum3 = sum3+pcb[i].wait_time;}avg_turn = sum1/pcb_num;avg_weight = sum2/pcb_num;avg_wait = sum3/pcb_num;cout<<"平均周转时间为:"<<avg_turn<<endl;cout<<"平均带权周转时间为:"<<avg_weight<<endl;cout<<"平均等待时间为:"<<avg_wait<<endl;
}//输出各进程
void show(PCB pcb[],int pcb_num)
{cout<<"-----------------------------------------------------------------------------"<<endl;cout<<"进程名|到达时间|服务时间|开始执行时间|完成时间|周转时间|带权周转时间|等待时间"<<endl;cout<<"-----------------------------------------------------------------------------"<<endl;for(int i=0;i<pcb_num;i++){cout<<pcb[i].name;cout<<"\t"<<pcb[i].arrive_time;cout<<"\t"<<pcb[i].cpu_burst;cout<<"\t"<<"\t"<<pcb[i].start_time;cout<<"\t"<<pcb[i].finish_time;cout<<"\t"<<pcb[i].turn_time;cout<<"\t"<<setprecision(3)<<pcb[i].weighted_ttime;cout<<"\t"<<pcb[i].wait_time<<endl;}
}//主函数测试RR调度算法
int main()
{int pcb_num;//进程个数cout<<"请输入进程总个数:"<<endl;cin>>pcb_num;PCB pcb[pcb_num];for(int i=0;i<pcb_num;i++){cout<<"请输入进程名:";cin>>pcb[i].name;//输入各进程名cout<<"请输入进程到达时间:";cin>>pcb[i].arrive_time; //输入各进程的到达时间cout<<"请输入进程需要服务的时间:";cin>>pcb[i].cpu_burst; //输入各进程需要服务的时间pcb[i].over = false;//初始时,所有进程执行状态都为falsepcb[i].surplus = pcb[i].cpu_burst;//初始时,所有进程剩余服务时间都为服务时间pcb[i].finish_time = 0;pcb[i].start_time = 0;pcb[i].turn_time = 0;pcb[i].wait_time = 0;pcb[i].weighted_ttime = 0;}cout<<"--------------------------------"<<endl;cout<<"          RR调度结果           "<<endl;cout<<"--------------------------------"<<endl;int time_p;//时间片大小bool goon = true;while(goon == true){cout<<"请输入时间片大小:";cin>>time_p;rr(pcb,pcb_num,time_p);show(pcb,pcb_num);cout<<endl;cal_avg(pcb,pcb_num);cout<<"是否继续测试RR调度结果(是则输入1,否则输入0):";cin>>goon;}return 0;
}

结果

结果分析

时间片轮转RR调度算法很大程度上取决于时间片大小的选取,时间片的大小直接决定了时间片轮转RR调度算法的效率,时间片选取过小,会频繁发生终端,需要不断进行上下文的切换,严重增加了系统的开销;时间片选取过大则时间片轮转RR调度算法直接退化为先来先服务FCFS调度算法。从表格可以看出,时间片轮转RR调度算法的各参数值都较高,效率较其他算法不算高,而且明显时间片轮转RR调度算法对时间片的选取要求较高,需要实现知道各进程的参数情况才能够选取合适的时间片大小。

操作系统——时间片轮转调度算法(RR)相关推荐

  1. 操作系统|时间片轮转调度算法(RR)

    模拟实现非抢占式 将进程信息表的信息根据进入时间排序,判断当前时间线下有哪些进程到达,将其插入到等待队列中,等待分配一个时间片,若进程未全部执行结束,将其插入队尾,等待下次分配. 在进行插入队尾前判断 ...

  2. 操作系统--时间片轮转调度算法(RR算法)

    操作系统–时间片轮转调度算法(RR算法) 实验内容: 模拟实现时间片轮转调度算法,具体如下: 设置进程体:进程名,进程的到达时间,服务时间,,进程状态(W--等待,R--运行,F--完成),进程间的链 ...

  3. 操作系统时间片轮转调度算法 进程 到达时间 服务时间 p1 p2 p3 p4

    时间片轮转调度算法详细判断流程: 例题: 进程 到达时间 服务时间 P1 0.0 7 P2 2.0 4 P3 4.0 1 P4 5.0 4 时间片为1 先放出来最终的结果 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ...

  4. 操作系统-时间片轮转调度算法

    基本概念 时间片轮转法(Round-Robin,RR)主要用于分时系统中的进程调度.为了实现轮转调度,系统把所有就绪进程按先入先出的原则排成一个队列.新来的进程加到就绪队列末尾.每当执行进程调度时,进 ...

  5. 操作系统 时间片轮转调度算法

    转自https://blog.csdn.net/u013630349/article/details/47732731 时间片轮转法(RR) 算法描述:用于分时系统中的进程调度.每次调度时,总是选择就 ...

  6. 操作系统实验二——时间片轮转调度算法(RR算法)(新进程放队首和队尾两种C++实现)

    情况介绍 基本原理 系统将所有就绪进程按照FCFS的原则,排成一个队列依次调度. 把CPU分配给队首进程,执行一个时间片(10-100ms). 时间片用完后,系统计时器发出时钟中断,该进程将被剥夺CP ...

  7. 【操作系统】调度算法(FCFS、SJF、HRRN、RR、优先级调度、多级反馈队列)

    目录 1. 批处理.分时.实时系统 1. 批处理系统 2. 分时系统 3. 实时系统 2. 处理机调度级别 2.1 高级调度(作业调度) 2.2 中级调度 2.3 低级调度(进程调度) 3. 调度算法 ...

  8. 时间片轮转(RR)、优先级调度算法以及多级反馈队列调度算法

    一.调度算法 (一)时间片轮转(RR, Round-Robin) 例题:各进程到达就绪队列的时间.需要的运行时间如下表所示.使用时间片轮转调度算法,分析时间片大小分别是2.5时的进程运行情况. 常用于 ...

  9. 《操作系统》一个优美的时间片轮转调度算法模拟Python实现

    节选自本人博客:https://www.blog.zeeland.cn/archives/time-slice-rotation-scheduling-algorithm Introduction 先 ...

最新文章

  1. 函数的作用域(嵌套函数的运行)
  2. 1、cocos2dx开发学习第一篇-项目工程的创建
  3. smartdraw 2008 成功安装
  4. Minimal安装CentOS 7使用yum报This system is not registered to Red Hat Subscription Management.
  5. struts2 mysql 分页代码_Struts2 + MySQL 实现分页
  6. postforobject 设置代理_OAuth2RestTemplate中的代理配置
  7. 【2016年第6期】SKA数据中心云平台方案的概念性研究
  8. OSTaskDelReq()--请求删除任务函数
  9. 微信小程序|开发实战篇之十-一些细节处理
  10. 95-140-140-源码-transform-双流操作的实现
  11. linux--history命令
  12. Java入门 第一季第六章 数组
  13. NSCT(Nonsubsampled Contourlet变换)
  14. WEP密码破解BT3-spoonwep2教程及下…
  15. MuJoCO仿真(1) MuJoCo210 Win10安装
  16. 基础练习 回文数 C语言
  17. 彻底解决web调试时,修改css样式后刷新网页无改变
  18. Html和css算是编程语言吗,不被承认的编程语言
  19. 第四届中国金融风云榜9月在深圳盛大揭晓
  20. CocosCreator开发笔记(4)-Windows搭建幼麟麻将运行环境

热门文章

  1. Android 以图找图功能
  2. 关于Pytorch中dim使用的一点记录
  3. 微信小程序订阅消息失败
  4. php药膳 源码,-道家药膳
  5. 计算机科学与导论论文样例,计算机科学导论论文684413422
  6. thinksns java_php-java登录thinksns时的加密解密操作
  7. Python openpyxl 蔬菜价格明细表变动
  8. ***自称只用六成功力就黑掉百度
  9. 肖申克的救赎主题简介
  10. 百度地图 地址查询经纬度 插件vue-baidu-map