RR算法 调度
RR算法是使用非常广泛的一种调度算法。
首先将所有就绪的队列按FCFS策略排成一个就绪队列,然后系统设置一定的时间片,每次给队首作业分配时间片。如果此作业运行结束,即使时间片没用完,立刻从队列中去除此作业,并给下一个作业分配新的时间片;如果作业时间片用完没有运行结束,则将此作业重新加入就绪队列尾部等待调度。
- //main.cpp
- #include "RR.h"
- int main()
- {
- std::vector<PCB> PCBList;
- int timeslice;
- //输入时间片大小,作业信息
- InputPCB(PCBList, timeslice);
- //RR算法
- RR(PCBList, timeslice);
- //显示结果
- show(PCBList);
- return 0;
- }
- //RR.h
- #ifndef RR_H_
- #define RR_H_
- #include <iostream>
- #include <algorithm>
- #include <iomanip>
- #include <vector>
- #include <queue>
- //作业结构体
- typedef struct PCB
- {
- int ID; //标识符
- int ComeTime; //到达时间
- int ServerTime; //服务时间
- int FinishTime; //完成时间
- int TurnoverTime; //周转时间
- double WeightedTurnoverTime; //带权周转时间
- }PCB;
- /*
- 函数功能:输入作业信息
- 参数说明:
- PCBList std::vector<PCB>& PCB链
- timeslice int 时间片
- */
- void InputPCB(std::vector<PCB> &PCBList, int ×lice);
- /*
- 函数功能:RR算法
- 参数说明:
- PCBList std::vector<PCB>& PCB链
- */
- void RR(std::vector<PCB> &PCBList, int timeslice);
- /*
- 函数功能:显示结果
- 参数说明:
- PCBList std::vector<PCB>& PCB链
- */
- void show(std::vector<PCB> &PCBList);
- /*
- 函数功能:比较函数,用于sort(),按ComeTime升序排列
- 参数说明:
- p1 const PCB& PCB
- p2 const PCB& PCB
- */
- bool CmpByComeTime(const PCB &p1, const PCB &p2);
- #endif
- //RR.cpp
- #include "RR.h"
- //输入作业信息
- void InputPCB(std::vector<PCB> &PCBList,int ×lice)
- {
- std::cout << "输入时间片大小: ";
- std::cin >> timeslice;
- do {
- PCB temp;
- std::cout << "输入标识符: ";
- std::cin >> temp.ID;
- std::cout << "输入到达时间: ";
- std::cin >> temp.ComeTime;
- std::cout << "输入服务时间: ";
- std::cin >> temp.ServerTime;
- temp.FinishTime = 0; //暂时存放运行了多少时间,来判断此作业是否运行结束
- PCBList.push_back(temp);
- std::cout << "继续输入?Y/N: ";
- char ans;
- std::cin >> ans;
- if ('Y' == ans || 'y' == ans)
- continue;
- else
- break;
- } while (true);
- }
- //RR算法
- void RR(std::vector<PCB> &PCBList, int timeslice)
- {
- std::sort(PCBList.begin(), PCBList.end(), CmpByComeTime); //按到达时间排序
- std::vector<PCB> result; //保存结果
- std::queue<PCB> Ready; //就绪队列
- int BeginTime = (*PCBList.begin()).ComeTime; //第一个作业开始时间
- Ready.push(*PCBList.begin());
- PCBList.erase(PCBList.begin());
- while (!PCBList.empty() || !Ready.empty())
- {
- if (!PCBList.empty() && BeginTime >= (*PCBList.begin()).ComeTime) //有新作业到达,加入就绪队列
- {
- Ready.push(*PCBList.begin());
- PCBList.erase(PCBList.begin());
- }
- if (Ready.front().FinishTime + timeslice < Ready.front().ServerTime) //时间片用完没运行完,加入队尾
- {
- Ready.front().FinishTime += timeslice;
- Ready.push(Ready.front());
- Ready.pop();
- BeginTime += timeslice;
- }
- else //此作业运行完
- {
- BeginTime += Ready.front().ServerTime - Ready.front().FinishTime;
- Ready.front().FinishTime = BeginTime;
- Ready.front().TurnoverTime = Ready.front().FinishTime - Ready.front().ComeTime;
- Ready.front().WeightedTurnoverTime = (double)Ready.front().TurnoverTime / Ready.front().ServerTime;
- //从就绪队列中移除作业
- result.push_back(Ready.front());
- Ready.pop();
- }
- }
- //按ComeTime升序排序,便于显示结果
- PCBList = result;
- std::sort(PCBList.begin(), PCBList.end(), CmpByComeTime);
- }
- //显示结果
- void show(std::vector<PCB> &PCBList)
- {
- int SumTurnoverTime = 0;
- double SumWeightedTurnoverTime = 0;
- std::cout.setf(std::ios::left);
- std::cout << std::setw(20) << "标识符";
- for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
- std::cout << std::setw(5) << (*it).ID;
- std::cout << std::endl;
- std::cout << std::setw(20) << "到达时间";
- for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
- std::cout << std::setw(5) << (*it).ComeTime;
- std::cout << std::endl;
- std::cout << std::setw(20) << "服务时间";
- for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
- std::cout << std::setw(5) << (*it).ServerTime;
- std::cout << std::endl;
- std::cout << std::setw(20) << "完成时间";
- for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
- std::cout << std::setw(5) << (*it).FinishTime;
- std::cout << std::endl;
- std::cout << std::setw(20) << "周转时间";
- for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
- {
- std::cout << std::setw(5) << (*it).TurnoverTime;
- SumTurnoverTime += (*it).TurnoverTime;;
- }
- std::cout << std::endl;
- std::cout << std::setw(20) << "带权周转时间";
- for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
- {
- std::cout << std::setw(5) << (*it).WeightedTurnoverTime;
- SumWeightedTurnoverTime += (*it).WeightedTurnoverTime;;
- }
- std::cout << std::endl;
- std::cout << "平均周转时间: " << (double)SumTurnoverTime / PCBList.size() << std::endl;
- std::cout << "平均带权周转时间: " << SumWeightedTurnoverTime / PCBList.size() << std::endl;
- }
- //比较函数,按ComeTime升序排列
- bool CmpByComeTime(const PCB &p1, const PCB &p2)
- {
- return p1.ComeTime < p2.ComeTime;
- }
RR算法 调度的更多相关文章
- 操作系统概念学习笔记 10 CPU调度
操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU.操作系统能够提高计算机的吞吐率. 对于单处理器系统.每次仅仅同意一个进程执行:不论什么其它进程必须等待,直到C ...
- [Linux]Linux系统调用列表
本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...
- LVS负载均衡集群服务搭建详解(二)
lvs-nat模型构建 1.lvs-nat模型示意图 本次构建的lvs-nat模型的示意图如下,其中所有的服务器和测试客户端均使用VMware虚拟机模拟,所使用的CentOS 7 VS内核都支持ipv ...
- 常用的Linux系统调用命令
常用的Linux系统调用命令 下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别. 一.进程控制 ...
- Linux系统调用(转载)
目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...
- Linux系统调用列表
转自Linux系统调用列表 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtabl ...
- Linux常用系统调用
转载 http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#icomments 按照惯例,这个列表 ...
- 【转】Linux系统调用列表
一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最 ...
- Linux系统常见调用及其分类
Linux系统调用主要可以分为以下几类: 进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 get ...
随机推荐
- 树上统计treecnt(dsu on tree 并查集 正难则反)
题目链接 dalao们怎么都写的线段树合并啊.. dsu跑的好慢. \(Description\) 给定一棵\(n(n\leq 10^5)\)个点的树. 定义\(Tree[L,R]\)表示为了使得\( ...
- UIProgressView进度条
//非原创 UIProgressView顾名思义用来显示进度的,如音乐,视频的播放进度,和文件的上传下载进度等. 下面以一个简单的实例来介绍UIprogressView的使用. @interface ...
- SourceTree + Beynod Compare解决Git冲突的方法
https://www.cnblogs.com/yufeng218/p/6523422.html
- sql ,内连接,外连接,自然连接等各种连接
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和c ...
- C#中流的读写器BinaryReader、BinaryWriter,StreamReader、StreamWriter详解【转】
https://blog.csdn.net/ymnl_gsh/article/details/80723050 C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操 ...
- 使用Python登录Github网站
在下面的代码中, 展示了使用Python脚本登录Github的方法. 如果需要登录别的网站,那么请使用Chrome的Inspect的功能寻找到目标的object,对代码进行替换. 代码先登录了gith ...
- array2json() - Convert PHP arrays to JSON
array2json is a PHP function that will convert the array given as its argument into a JSON string. T ...
- windows10多桌面创建 切换 和分屏
windows键+Tab 可以创建和切换新的桌面 win+ctrl+左右箭头 可以切换桌面 Aero Snap是Win7时代增加的一项窗口排列功能,俗称“分屏”.一个最简单例子,就是当你把窗口拖至屏幕 ...
- Emacs 设置C++代码风格
;; C++代码风格设置 (defconst cobbcpp '("linux" ; this is inheritance from the linux style (c-bas ...
- React Native 设置RGBA背景色
React Native 设置RGBA背景色: 可以先用Mac自带吸色工具,获取RGB值,然后设置背景如下: backgroundColor: 'rgba(52, 52, 52, 0.8)', 透明度 ...