实验步骤:在书上或网上找到相关算法,进行修改,上机检验,纠错

设计思路:

(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++实现)相关推荐

  1. 操作系统中的调度算法FCFS、SJF、RR算法(Java实现)

    Proce类: package five; public class Process { public String name;// 进程名称 public int arrivalTime;// 到达 ...

  2. 模拟进程调度算法(时间片轮转、优先权调度 —— 静、动态优先权)—— C/C++

    1.优先权调度算法 在模拟优先权调度算法实验中,实现了 非抢占式静态优先权进程调度算法 和 非抢占式动态优先权进程调度算法.如下: (1)非抢占式静态优先权进程调度算法 #include <io ...

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

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

  4. Java操作系统进程调度算法——时间片轮转(RR)算法

    Java操作系统进程调度算法--时间片轮转(RR)算法 文章目录 Java操作系统进程调度算法--时间片轮转(RR)算法 前言 一.算法思想 二.数据结构 1.定义PCB进程控制块 2.实现思路 三. ...

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

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

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

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

  7. Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)

    前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...

  8. 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)

    文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...

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

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

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

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

最新文章

  1. ASP.NET 获取IIS应用程序池的托管管道模式
  2. hdoj 2544 最短路
  3. Android开发之播放量点赞量打赏量收藏量单位格式化工具类
  4. python学完面向对象之后_Python学完基础语法后,再往后应该学什么?
  5. 分享丨对医学图像分割中的置信度进行量化
  6. 【Spark】Spark cache 报错 Exception thrown in awaitResult
  7. Python在数字前方补0
  8. Mac电脑上的Safari运行缓慢,卡的要死,该怎么解决?
  9. Java cmd常用命令_java cmd常用命令
  10. RandomAccessFile发生java.io.FileNotFoundException
  11. 40家央企数字化转型路线图公布(2022最新版)
  12. 一人有限责任公司章程范本
  13. 【竖排日语OCR识别】如何识别图片上竖排的日语 ?如何识别图片上横排的日语?如何将竖排日语转横排日语,下面说清楚方法
  14. 医院网络安全管理方案
  15. linux安装红警教程,红警2任务安装教程_红色警戒2任务安装方法一览
  16. 使用系统文件检查器工具修复丢失或损坏的系统文件
  17. 德州大学奥斯汀分校计算机专业排名,德州大学奥斯汀分校专业排名一览及最强专业推荐(USNEWS美国大学排名)...
  18. rgb 接口lcd 驱动调试
  19. Markdown的常用语法(个人总结)
  20. (六)R语言生物序列比对——Needleman-Wunsch全局比对算法

热门文章

  1. xmpp 即时通讯
  2. 挂机宝是服务器还是虚拟主机,挂机宝属于虚拟主机吗
  3. 〖Python 数据库开发实战 - MySQL篇⑤〗- 为大家推荐几款经典的数据库可视化工具
  4. TiDB错误码与故障排除
  5. lintcode-微软笔试
  6. 贴片电阻丝印看阻值大全,附高精度贴片电阻代码表
  7. 适合matlab的编程字体“YAHEI CONSOLAS HYBRID”-下载+安装
  8. 个人微信api接口调用-转账发红包
  9. java对人脸打马赛克,如何给视频中的人脸进行马赛克 视频人脸打马赛克软件|人脸跟踪马赛克...
  10. 计算机408学什么区别,考研计算机408考什么