在分时系统中,最简单也是较常见的是基于时间片的轮转(round robin,RR)调度算法。该算法采取了非常公平的处理机分配方式,即让就绪队列中的每个进程仅运行一个时间片,如果就绪队列上有n个进程,则每个进程每次大约可获得1/n的处理机时间

时间片的大小对系统性能有很大的影响,时间片太小,有利于短作业,但上下文切换频繁,增加系统开销;时间片太长,则退化为FCFS算法,无法满足短作业和交互式用户的需求。

一个较为可取的时间片大小是略大于一次典型的交互所需要的时间,使大多数交互式进程能在一个时间片内完成,从而可以获得很小的响应时间。 ——出自《计算机操作系统》,西电出版的那本,但是好像还是没有说明时间片具体应该怎么取0.0

源代码如下:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXSIZE 5
int ID[MAXSIZE], COME_TIME[MAXSIZE], RUN_TIME[MAXSIZE];
struct processing
{int pid;       //作业号int sequence;  //顺序号double come_time;  //到达时double run_time;   //运行时double last_run_time;  //剩余运行时间double over_time;   //完成时double round_time; //周转时double avg_time;   //带权周转时
}pc[MAXSIZE];       //作业数
queue<processing > q;
bool CmpByComeTime(processing p1, processing p2) {return p1.come_time<p2.come_time;
}
void push_in_queue() {      //进程入队列for (int i = 0; i < MAXSIZE; ++i){q.push(pc[i]);}
}
void info_to_process() {for (int i = 0; i<MAXSIZE; ++i) {pc[i].sequence = i;pc[i].pid = ID[i];pc[i].come_time = COME_TIME[i];pc[i].run_time = RUN_TIME[i];pc[i].last_run_time = pc[i].run_time;}sort(pc, pc + MAXSIZE, CmpByComeTime);push_in_queue();
}
void get_info() {       //输入进程信息for (int i = 0; i<MAXSIZE; i++) {cin >> ID[i] >> COME_TIME[i] >> RUN_TIME[i];}info_to_process();}
void print(double avg_sum_round_time, double avg_sum_avg_time) {cout << "执行顺序:" << endl;for (int i = 0; i < MAXSIZE; ++i){/* code */cout << pc[i].pid << " ";}cout << endl;cout << "作业号" << '\t' << "到达时" << '\t' << "运行时" << '\t' << "完成时" << '\t' << "周转时" << '\t' << "带权周转时" << '\t' << endl;for (int i = 0; i < MAXSIZE; ++i){cout << pc[i].pid << '\t' << pc[i].come_time << '\t'<< pc[i].run_time << '\t' << pc[i].over_time << '\t'<< pc[i].round_time << '\t'<< pc[i].avg_time << endl;}cout << "平均周转时: " << avg_sum_round_time << endl<< "平均带权周转时: " << avg_sum_avg_time << endl << endl;
}
void get_RoundAndAvgTime() {double sum_round_time = 0;double avg_sum_round_time = 0.0;double sum_avg_time = 0.0;double avg_sum_avg_time = 0.0;for (int i = 0; i<MAXSIZE; i++) {sum_round_time += pc[i].round_time;sum_avg_time += pc[i].avg_time;}avg_sum_round_time = sum_round_time * 1.0 / MAXSIZE;avg_sum_avg_time = sum_avg_time * 1.0 / MAXSIZE;print(avg_sum_round_time, avg_sum_avg_time);
}
void calculate(int TimePeace) {int NowTime = 0;while (!q.empty()) {int NowPcNum = q.front().sequence;if (TimePeace >= pc[NowPcNum].last_run_time) {pc[NowPcNum].over_time = NowTime + pc[NowPcNum].last_run_time;       //完成时间pc[NowPcNum].round_time = pc[NowPcNum].over_time - pc[NowPcNum].come_time;       //周转时 = 完成时 - 到达时pc[NowPcNum].avg_time = pc[NowPcNum].round_time / pc[NowPcNum].run_time;         //带权周转时 = 周转时 / 运行时NowTime += pc[NowPcNum].last_run_time;q.pop();}else {pc[NowPcNum].last_run_time -= TimePeace;        //该进程剩余需要运行的时间NowTime += TimePeace;q.push(pc[NowPcNum]);q.pop();}}get_RoundAndAvgTime();
}int main(int argc, char const *argv[])
{get_info();int TimePeace;char ch;while (true) {cout << "时间片大小" << endl;cin >> TimePeace;calculate(TimePeace);cout << "continue? [y/n]" << endl;cin >> ch;if (ch == 'y') {info_to_process();continue;}else {break;}}system("pause");return 0;}

运行结果如下:

OS轮转调度算法RR的C++实现相关推荐

  1. 操作系统笔记(6):RR轮转调度算法

    这比起说是操作系统实验,不如说是一个模拟算法而已, 当然目标是为了让大家更清楚地了解RR轮转调度算法原理 原理上,书上课上都讲过,实现方式上推荐直接模拟一个队列(本来就应该是这样实现的)http:// ...

  2. 基于时间片延长的轮转调度算法

    课程:操作系统 原算法:轮转调度算法 改进后算法:基于时间片延长的轮转调度算法 一.算法原理 1.1算法介绍 轮转Round Robin调度算法(RR,时间片调度):每次给就绪队列队首进程分配一定额度 ...

  3. C语言实现操作系统的进程调度算法--RR算法

    c语言实现调度算法--RR算法 测试输入为4个进程,时间片q=3,进程为A.B.C.D,序列号为都为0,运行时间分别为6/7/9/12 测试输入为4个进程,时间片q=3,进程为A.B.C.D,序列号为 ...

  4. CPU调度算法——FCFS算法/SJF算法/优先级调度算法/RR算法

    文章目录 一.先来先服务(FCFS)调度算法 二.最短作业优先(SJF)算法 1. 非抢占式SJF 2. 抢占式SJF 三.优先级调度算法 1. 非抢占式优先级调度算法 2. 抢占式优先级调度算法 四 ...

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

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

  6. 关于CLOS架构的举例 网络级 设备级 FATTREE网络 网络级CLOS 以及CLOS涉及的调度算法RR...

    1.概述 CLOS来自于传统电路交换概念,这个概念年代太久远,在当前数据通信网络中,内涵有所变化.本文主要谈的是实际上赋予的与原来略微有所差异的内涵. CLOS架构本身概念比较宽泛,有设备级的CLOS ...

  7. 基于时间片的轮转调度算法

    在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU 分配给队首进程,并令其执行一个时间片.时间片的大小从几ms 到几百ms.当执行的时间片用完时,由一个计 ...

  8. 操作系统之进程管理相关总结

    第三章 进程管理 1.1进程的概念 1.1.1为什么要引入进程 程序并发执行具有如下特征 间断性 失去封闭性 不可再现性 程序的并发可以总结为:一组在逻辑上相互独立的程序或程序段在执行过程中,其执行时 ...

  9. 计算机操作系统第四版汤小丹主编课后习题答案(更新至第七章)

    第一章 1. 设计现代OS的主要目标是什么? (1)方便性使得计算机更易于使用 (2)有效性提高资源利用效率,使系统的吞吐量更大 (3)可扩充性方便增加新的功能和模块,以适应计算机硬件.体系结构和应用 ...

最新文章

  1. 聊聊Oracle 11g的Snapshot Standby Database(上)
  2. reg类型变量综合电路_verilog中reg和wire类型的区别
  3. PHP安装swoole扩展
  4. 170828、Eclipse Java注释模板设置详解以及版权声明
  5. 113. Path Sum II
  6. 41款非常有创意的卡通图标大全可爱
  7. 吃不惯的川味麻辣×××
  8. 连接局域网打印机用计算机名,如何连接局域网内共享的打印机
  9. filter 无效不起作用
  10. mysql重启报without updating PID file错
  11. webAppRootKey
  12. 解决AppBarLayout嵌套WebView滑动冲突的问题
  13. 2021小迪网络安全渗透培训—学习笔记打卡
  14. 当动作捕捉遇上圣诞节,原来如此有趣
  15. html文档是哪个版本,HTML 简介, 版本和文档类型声明
  16. java学习四个月以来的想法
  17. QQ出现大规模盗号,为什么会这样?就没有解决方法了吗?
  18. java-net-php-python-11jspm健身管理网站计算机毕业设计程序
  19. 20220316_Scanner、匿名对象、Random、ArrayList
  20. Python3.6实现12306火车票自动抢票(内含源码)

热门文章

  1. 北大计算机科学系王腾蛟,本系简介
  2. android开发笔记之高德地图使用
  3. 技术分享 | EdgeX应用落地——零售、能源行业创新业务
  4. ORA-01000: 超出打开游标的最大数
  5. java饲养员喂动物_做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处...
  6. 趣图:新手 vs 老鸟
  7. 航天信息多个税盘一台电脑上一键迁移恢复免重复安装工具
  8. 分享2019年陆陆续续读过的书-附书单
  9. Phononpy的简单使用
  10. GAMES101 作业0 环境配置 PC下简单配置i