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

实验内容:

模拟实现时间片轮转调度算法,具体如下:
设置进程体:进程名,进程的到达时间,服务时间,,进程状态(W——等待,R——运行,F——完成),进程间的链接指针
进程初始化:由用户输入进程名、服务时间进行初始化,同时,初始化进程的状态为W。
显示函数:在进程调度前、调度中和调度后进行显示。
排序函数:对就绪状态的进程按照进入就绪队列的时间排序,新到达的进行应优先于刚刚执行过的进程进入就绪队列的队尾。注意考虑到达时间
调度函数:每次从就绪队列队首调度优一个进程执行,状态变化。并在执行一个时间片后化,服务时间变化,状态变化。当服务时间为0时,状态变为F。
删除函数:撤销状态为F的进行。

只写了时间片为1的情况大致的思想有点像模拟一个队列。
代码:

#include <bits/stdc++.h>using namespace std;
const int MAX = 109;#define W "waitting"
#define R "running"
#define F "finish"class WORK
{public:string work_name; // 作业名int serve_time; // 剩余服务时间int r_serve_time; // 服务时间int arrive_time; // 到达时间string work_state; // 作业状态int end_time; // 结束时间int turnover_time; // 周转时间WORK & operator=(const WORK &wo) // 重载赋值运算符{work_name = wo.work_name;serve_time = wo.serve_time;r_serve_time = wo.r_serve_time;arrive_time = wo.arrive_time;work_state = wo.work_state;end_time = wo.end_time;turnover_time = wo.turnover_time;return *this;}
};WORK work[MAX]; // 作业
int n; // 作业数量
int q; // 时间片bool cmp_SJF(WORK x, WORK y) // 排序函数
{if(x.serve_time != y.serve_time) // 服务时间不同时短作业优先return x.serve_time < y.serve_time;else // 服务时间相同时先来先服务return x.arrive_time < y.arrive_time;
}bool cmp_arr_time(WORK x, WORK y) // 按到达时间从小到大排序
{return x.arrive_time < y.arrive_time;
}int count_work(int t) // 计算某一时间有多少个作业进入
{int cnt = 0;for(int i = 1; i <= n; i++){if(work[i].arrive_time <= t)cnt++;}return cnt;
}void insert_work(int num) // 插入新作业
{if(num > 2){int t_num = num - 1;WORK t_work[MAX];t_work[1] = work[t_num];t_work[2] = work[num];for(int i = 1; i <= num - 2; i++){t_work[i + 2] = work[i];}for(int i = 1; i <= num; i++)work[i] = t_work[i];}
}void cir_work(int num) // 循环
{WORK t_work;t_work = work[num];for(int i = num - 1; i >= 1; i --)work[i + 1] = work[i];work[1] = t_work;
}void update_work(int num, int c_time, bool is_new) // 更新当前要调度的作业
{if(is_new) // 新来了作业, 插入新来的作业insert_work(num);else  // 没有新作业进入, 对原作业循环cir_work(num);int t = 0;bool is_ok = false;int cnt = 0;while(!is_ok){if(work[num].serve_time > 0) // 作业还没结束{work[num].serve_time --;work[num].work_state = R;t = num;is_ok = true;break;}if(work[num].serve_time <= 0) // 作业已经结束{work[num].serve_time = 0;work[num].work_state = F;cir_work(num);cnt++;}if(cnt == n)break;}for(int i = 1; i <= n; i++) // 更新状态{if(i != t){if(work[i].work_state != F)work[i].work_state = W;if(work[i].serve_time <= 0)work[i].work_state = F;}if(work[i].work_state == F && work[i].end_time == -1)work[i].end_time = c_time;}
}bool judge_over() // 判断作业是否全部完成
{for(int i = 1; i <= n; i++)if(work[i].work_state != F)return false;return true;
}int main()
{cout << "请输入要调度的作业:" << endl;cout << "要调度的作业的数量:" ;cin >> n;for(int i = 1; i <= n; i++){cout << "作业名: " << endl;cin >> work[i].work_name;cout << "作业服务时间: " << endl;cin >> work[i].serve_time;cout << "作业到达时间: " << endl;cin >> work[i].arrive_time;work[i].work_state = W;work[i].end_time = -1;work[i].r_serve_time = work[i].serve_time;}sort(work + 1, work + 1 + n, cmp_arr_time); // 先按到达时间排序cout << "作业初始状态:" << endl;cout << "    作业名    " << "    到达时间    "  << "    服务时间    " << "    当前状态    " << endl;for(int i = 1; i <= n; i++){cout  << setw(8) << work[i].work_name << setw(16) << work[i].arrive_time << setw(13)<< work[i].serve_time<< setw(21)  << work[i].work_state << endl;}cout << endl;int arrive_num = 0; // 已到达的作业数量int current_time = 0; // 当前时间cout << "作业调度情况如下:" << endl;bool is_over = false;int current_work_num = 0;while(!is_over){cout << "    时刻    " << "    作业名    " << "    到达时间    "  << "    剩余服务时间    " << "    当前状态    " << endl;arrive_num = count_work(current_time);update_work(arrive_num, current_time, current_work_num < arrive_num);current_work_num = arrive_num;int cou = 0;for(int i = 1; i <= arrive_num; i++){if(work[i].work_state != F){cou ++;cout  << setw(6) << current_time << setw(13) << work[i].work_name << setw(15) << work[i].arrive_time << setw(15)<< work[i].serve_time  << setw(24)  << work[i].work_state << endl;}}if(cou == 0)cout  << setw(6) << current_time << setw(30) << "所有作业均执行完毕!" << endl << endl;current_time ++;is_over = judge_over();if(current_time == 14)break;cout << endl;}cout << "各作业的周转时间和带权周转时间如下:" << endl;cout << "    作业名    " << "    周转时间    " << "    带权周转时间    " << endl;for(int i = 1; i <= n; i++){work[i].turnover_time = work[i].end_time - work[i].arrive_time; // 周转时间double wight_time = 1.0 * work[i].turnover_time / work[i].r_serve_time; // 带权周转时间cout << setw(6) << work[i].work_name << setw(15) << work[i].turnover_time << setw(18);cout.precision(4);cout << wight_time << endl;}return 0;
}

运行结果:
根据提示输入数据如图:



显示各个作业的初始状态:

各个时刻作业的调度情况如下:




各个作业的周转时间和带权周转时间如下:

根据输入样例手动画出时间片轮转算法的调度时间图如下:

与运行结果相比,发现运行正确(我只测试了这一个样例,是我们慕课作业上面的),如有问题,欢迎指正~~

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

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

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

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

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

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

    RR算法总体思路流程图 主要数据结构及参数 typedef struct PCB {char name;//进程名int arrive_time;//到达时间float cpu_burst;//服务时 ...

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

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

  5. 操作系统:磁盘调度算法FCFS算法(c语言)

    实验题目: 磁盘调度算法FCFS算法 实验内容: 磁盘访问序列和磁头起始位置(自己输入数据),采用SSTF磁盘调度算法,求平均寻道长度. 实验目的: 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度 ...

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

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

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

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

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

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

  9. java实现操作系统时间片轮转进程调度算法(RR算法)

    Time类 package RR算法; public class time {private int hour;private int min;public int getHour() {return ...

最新文章

  1. 在腾讯待了 9 年,还是离了职
  2. linux服务器安全文档,CentOS Linux服务器安全设置
  3. mybatis plug 只查id_mybatis-plugin的几种常用的方法
  4. java中map可以为空吗_检查NavigableMap是否在Java中为空
  5. Swift 2.0初探:值得注意的新特性
  6. stm32 web get 参数_BlackHat2020议题之Web缓存投毒
  7. 华为云严选上新啦!高效准确的数据同步方案来了
  8. java实现学生财务管理_基于jsp的学生社团财务管理-JavaEE实现学生社团财务管理 - java项目源码...
  9. 高德地图车机版缩放版_主图操作-开发指南-高德地图车机版 | 高德地图API
  10. 计算机术语 gc 是什么意思,gc是什么意思(女生网络用语gc的含义)
  11. android 镜像投屏开发,Android 投屏实现纪要
  12. 百度网盘Mac客户端无法上传和下载问题解决办法
  13. D3 二维图表的绘制系列(十六)矩形树状图
  14. conda 包安装位置 虚拟环境_conda指定位置配置虚拟环境
  15. go语言google pay支付验证订单
  16. 安卓虚拟键盘_逍遥安卓模拟器对电脑配置有什么要求
  17. 《我心归处是敦煌》读后感
  18. centos7安装squid代理
  19. c++大数据量压缩方法——基于zlib的gzip解压缩方法
  20. 燃爆!连Elon Musk都激动到语无伦次:7年后火星殖民计划,坐火箭1小时穿梭地球!

热门文章

  1. 我终于有了GMAIL帐号了
  2. uva1471 Defense Lines
  3. UVa 1471 Defense Lines (解释紫书思路)
  4. 新网域名如何绑定dnspod解析服务并添加相关记录?
  5. 读《Python Algorithms: Mastering Basic Algorithms in the Python Language》
  6. 计算机专业世界排名,2021计算机科学专业世界排名重磅出炉!CMU登顶,清华挺进前五...
  7. 洛谷P1875 佳佳的魔法药水
  8. 【数据结构】图-图的遍历_深度优先遍历(动态图解、c++、java)
  9. 全球区块链农业技术平台Dimitra与 Morpheus AMA回顾
  10. 【PSO三维路径规划】粒子群算法融合鸡群算法多无人机三维路径规划【含Matlab源码 1792期】