时间片轮转调度算法的模拟时间片轮转调度算法(RR算法)(队尾C++实现)
实验步骤:在书上或网上找到相关算法,进行修改,上机检验,纠错
设计思路:
(1)系统将所有就绪进程按照FCFS的原则,排成一个队列依次调度。
(2)把CPU分配给队首进程,执行一个时间片(10-100ms)。
(3)时间片用完后,系统计时器发出时钟中断,该进程将被剥夺CPU并插入就绪队列末尾。
代码:新进程放在队列的队尾。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
struct PCB {int id; //进程编号 char name; //进程名字int arrive; //到达时间int serve; //服务时间int finish; //完成时刻//排序优先参考到达时间,其次是服务时间 bool operator< (const PCB &t) const{if(arrive != t.arrive) return arrive < t.arrive;return serve < t.serve;};
};
const int N = 10; //最多10个进程
const int M = 100; //最长100个时间单位
PCB pcb_list[N]; //进程列表
vector<PCB> table[M]; //进程时刻表
queue<PCB> que; //进程队列
int n,t,q,sjp; //进程数,总计时,固定时间片,运转时间片
int max_time; //最大时间
void query() { //查询当前是否有进程到达,有则入队//将当前时刻的所有进程入队for(int i = 0; i < table[t].size(); i++)que.push(table[t][i]);
}
void run() {cout << "当前时刻\t" << "运行进程\t" << "剩余服务时间" << endl;PCB cur = pcb_list[0]; //初始化当前进程sjp = q; //初始化时间片 for(t = 0; t <= max_time; t++) { //跑时间 query(); //当前是否有进程到达,有则入队if(que.empty()) continue; //如果队列空,跳过if(!sjp || !cur.serve) { //时间片用完了 或 当前进程运行完了,则调度 sjp = q; //恢复时间片que.pop(); //队首出队if(cur.serve) que.push(cur); //如果当前进程没有运行完,则移到队尾else pcb_list[cur.id].finish = t; //运行完了,设置完成时刻 if(!que.empty()) cur = que.front(); //取新的队首else continue; //已经空了,跳过 }cout << t << "\t\t" << cur.name << "\t\t" << cur.serve << endl; //输出当前时刻状态 sjp--,cur.serve--; //时间片-1,当前进程服务时间-1 }
}
void set_max_time() {for(int i = 0; i < n; i++)max_time += pcb_list[i].serve;max_time+=5;//多加一点避免边界问题(删掉也没关系,程序已经很完备了)
}
int main() {printf("时间片轮转调度算法\n\n");printf("请输入进程数 时间片\n");cin >> n >> q; //输入进程数和时间片时长printf("请输入每个进程的进程名 到达时间 服务时间\n");for(int i = 0; i < n; i++)cin >> pcb_list[i].name >> pcb_list[i].arrive >> pcb_list[i].serve;sort(pcb_list,pcb_list+n); //对进程按到达时间排序for(int i = 0; i < n; i++) {pcb_list[i].id = i; //给进程编号 table[pcb_list[i].arrive].push_back(pcb_list[i]); //将进程送到时刻表 }set_max_time(); //设置最大运行时间run(); //开始运行cout << "进程名字\t" << "完成时间\t" << "周转时间\t" << "带权周转时间" << endl;for(int i = 0; i < n; i++) {int zzsj = pcb_list[i].finish-pcb_list[i].arrive;double dqzzsj = (double)zzsj / pcb_list[i].serve;printf("%c\t\t%d\t\t%d\t\t%.2lf\n",pcb_list[i].name,pcb_list[i].finish,zzsj,dqzzsj);}return 0;
}
时间片轮转调度算法的模拟时间片轮转调度算法(RR算法)(队尾C++实现)相关推荐
- 操作系统中的调度算法FCFS、SJF、RR算法(Java实现)
Proce类: package five; public class Process { public String name;// 进程名称 public int arrivalTime;// 到达 ...
- 模拟进程调度算法(时间片轮转、优先权调度 —— 静、动态优先权)—— C/C++
1.优先权调度算法 在模拟优先权调度算法实验中,实现了 非抢占式静态优先权进程调度算法 和 非抢占式动态优先权进程调度算法.如下: (1)非抢占式静态优先权进程调度算法 #include <io ...
- 操作系统--时间片轮转调度算法(RR算法)
操作系统–时间片轮转调度算法(RR算法) 实验内容: 模拟实现时间片轮转调度算法,具体如下: 设置进程体:进程名,进程的到达时间,服务时间,,进程状态(W--等待,R--运行,F--完成),进程间的链 ...
- Java操作系统进程调度算法——时间片轮转(RR)算法
Java操作系统进程调度算法--时间片轮转(RR)算法 文章目录 Java操作系统进程调度算法--时间片轮转(RR)算法 前言 一.算法思想 二.数据结构 1.定义PCB进程控制块 2.实现思路 三. ...
- java实现操作系统时间片轮转进程调度算法(RR算法)
Time类 package RR算法; public class time {private int hour;private int min;public int getHour() {return ...
- 时间片轮转(RR)、优先级调度算法以及多级反馈队列调度算法
一.调度算法 (一)时间片轮转(RR, Round-Robin) 例题:各进程到达就绪队列的时间.需要的运行时间如下表所示.使用时间片轮转调度算法,分析时间片大小分别是2.5时的进程运行情况. 常用于 ...
- Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)
前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...
- 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)
文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...
- CPU调度算法——FCFS算法/SJF算法/优先级调度算法/RR算法
文章目录 一.先来先服务(FCFS)调度算法 二.最短作业优先(SJF)算法 1. 非抢占式SJF 2. 抢占式SJF 三.优先级调度算法 1. 非抢占式优先级调度算法 2. 抢占式优先级调度算法 四 ...
- C语言实现操作系统的进程调度算法--RR算法
c语言实现调度算法--RR算法 测试输入为4个进程,时间片q=3,进程为A.B.C.D,序列号为都为0,运行时间分别为6/7/9/12 测试输入为4个进程,时间片q=3,进程为A.B.C.D,序列号为 ...
最新文章
- ASP.NET 获取IIS应用程序池的托管管道模式
- hdoj 2544 最短路
- Android开发之播放量点赞量打赏量收藏量单位格式化工具类
- python学完面向对象之后_Python学完基础语法后,再往后应该学什么?
- 分享丨对医学图像分割中的置信度进行量化
- 【Spark】Spark cache 报错 Exception thrown in awaitResult
- Python在数字前方补0
- Mac电脑上的Safari运行缓慢,卡的要死,该怎么解决?
- Java cmd常用命令_java cmd常用命令
- RandomAccessFile发生java.io.FileNotFoundException
- 40家央企数字化转型路线图公布(2022最新版)
- 一人有限责任公司章程范本
- 【竖排日语OCR识别】如何识别图片上竖排的日语 ?如何识别图片上横排的日语?如何将竖排日语转横排日语,下面说清楚方法
- 医院网络安全管理方案
- linux安装红警教程,红警2任务安装教程_红色警戒2任务安装方法一览
- 使用系统文件检查器工具修复丢失或损坏的系统文件
- 德州大学奥斯汀分校计算机专业排名,德州大学奥斯汀分校专业排名一览及最强专业推荐(USNEWS美国大学排名)...
- rgb 接口lcd 驱动调试
- Markdown的常用语法(个人总结)
- (六)R语言生物序列比对——Needleman-Wunsch全局比对算法
热门文章
- xmpp 即时通讯
- 挂机宝是服务器还是虚拟主机,挂机宝属于虚拟主机吗
- 〖Python 数据库开发实战 - MySQL篇⑤〗- 为大家推荐几款经典的数据库可视化工具
- TiDB错误码与故障排除
- lintcode-微软笔试
- 贴片电阻丝印看阻值大全,附高精度贴片电阻代码表
- 适合matlab的编程字体“YAHEI CONSOLAS HYBRID”-下载+安装
- 个人微信api接口调用-转账发红包
- java对人脸打马赛克,如何给视频中的人脸进行马赛克 视频人脸打马赛克软件|人脸跟踪马赛克...
- 计算机408学什么区别,考研计算机408考什么