算法思想:

按时间片轮转调度算法:

(1)假设系统中有5个进程,每个进程有一个进程控制块(PCB)来标识。进程控制块内容包括:进程名,链接指针,到达时间,估计运行时间,进程状态。

进程名即进程标识。

链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达进程的进程控制块地址。最后一个进程的链接指针为NULL。

(2)为每个进程任意确定一个到达时间和要求运行时间。

(3)设置一个队首指针head,用来指出最先进入系统的进程。各就绪进程通过链接指针连在一起构成一个循环队列。

(4)处理机调度时开始选择队首指针指向的进程投入运行。由于本实验是模拟试验,所以对被选中进程并不实际启动运行,而只是执行:估计运行时间减1。用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。

(5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程。同时还应判断该进程的剩余的运行时间是否为0,若不为0,则等待下一轮的运行;若该进程的剩余时间为0,则把它的状态改为完成态(C),并撤出就绪队列。

(6)若就绪队列非空,则重复上述的(4)和(5),直到所有进程为完成态。

(7)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名、已运行时间、还剩时间、就绪队列中的进程等。

代码:

#include<iostream>
#include<string>
using namespace std;
typedef struct pcb {string pName;//进程名struct pcb *next;//指向下一个进程float arriveTime;//到达时间float serviceTime;//服务时间float estimatedRunningtime;//估计运行时间float startTime;//开始时间float finishTime;//完成时间float turnaroundTime;//周转时间float weightedTuraroundTime;//带权周转时间char state;//进程的状态
}PCB;void createProcess(PCB *p, int n) {//创建n个进程,带头结点cout << endl << endl << "创建进程" << endl;PCB *q = p;//工作指针的前一个结点指针PCB *r = new PCB;//工作指针for (int i = 0; i<n; i++) {cout << "请输入第" << i + 1 << "个进程的名字、到达时间、服务时间(例如:A 12 8):";cin >> r->pName;cin >> r->arriveTime;cin >> r->serviceTime;r->startTime = 0;r->finishTime = 0;r->estimatedRunningtime = r->serviceTime;r->turnaroundTime = 0;r->weightedTuraroundTime = 0;r->state = 'R';q->next = r;q = r;r->next = new PCB;r = r->next;}r->next = NULL;q->next = NULL;q = NULL;delete q;delete r;cout << endl << endl;
}void sortOfArriveTime(PCB *p, int n) {//按到达时间对进程排序PCB *t = new PCB;PCB *q = new PCB;PCB *m = new PCB;for (int i = 0; i<n - 1; i++) {//冒泡循环q = p->next;//q指向链表中的第一个进程for (int j = 0; j<n - i - 1; j++) {m = q->next;if (q->arriveTime>m->arriveTime) {//结点信息进行交换t->pName = q->pName;t->arriveTime = q->arriveTime;t->serviceTime = q->serviceTime;t->estimatedRunningtime = q->estimatedRunningtime;q->pName = m->pName;q->arriveTime = m->arriveTime;q->serviceTime = m->serviceTime;q->estimatedRunningtime = m->estimatedRunningtime;m->pName = t->pName;m->arriveTime = t->arriveTime;m->serviceTime = t->serviceTime;m->estimatedRunningtime = t->estimatedRunningtime;}q = q->next;}}t = NULL;m = NULL;q = NULL;delete t;delete m;delete q;
}void runProcess(PCB *p, int n) {//运行进程PCB *q = new PCB;PCB *m = new PCB;PCB *s = new PCB;int a = n;sortOfArriveTime(p, n);q = p;m = p->next;int currentTime = 0;//当前时间int i = 0;int number = 0;while (true) {currentTime++;if (i == 0 && m->arriveTime>currentTime)//首次运行进程continue;number = 0;while (m&&m->state == 'C' || m&&m->arriveTime>currentTime) {//寻找应该访问的进程number++;q = m;m = m->next;if (m == NULL) {q = p;m = p->next;}if (number>n)break;}if (number>n)//所有进程都不能进行访问continue;cout << "正在运行的进程" << endl;cout << "当前时间:" << currentTime << endl;cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl;//输出当前正在运行的进程cout << m->pName << "\t" << m->arriveTime << "\t " << m->serviceTime << "\t  ";cout << m->serviceTime - m->estimatedRunningtime << "\t     " << m->estimatedRunningtime << endl;m->estimatedRunningtime--;m->finishTime = currentTime + 1;if (m->estimatedRunningtime == 0)m->state = 'C';cout << "进程" << m->pName << "执行一次之后就绪队列中的进程" << endl;cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl;s = p->next;while (s) {//输出就绪队列if (s->estimatedRunningtime != 0) {cout << s->pName << "\t" << s->arriveTime << "\t " << s->serviceTime << "\t  ";cout << s->serviceTime - s->estimatedRunningtime << "\t     " << s->estimatedRunningtime << endl;}s = s->next;}cout << endl << endl << endl;q = m;m = m->next;//q、m指针后移if (m == NULL) {//回到链表头部q = p;m = p->next;}s = p->next;while (s&&s->state == 'C')s = s->next;if (s == NULL)//若所有进程已完成,则退出循环break;i++;}q = p;m = p->next;for (int i = 0; i<n; i++) {//计算开始时间、周转时间、带权周转时间if (i == 0) {m->startTime = m->arriveTime;m->turnaroundTime = m->finishTime - m->arriveTime;m->weightedTuraroundTime = m->turnaroundTime*1.0 / m->serviceTime;}else {m->startTime = q->startTime + 1>m->arriveTime ? q->startTime + 1 : m->arriveTime;m->turnaroundTime = m->finishTime - m->arriveTime;m->weightedTuraroundTime = m->turnaroundTime*1.0 / m->serviceTime;}m = m->next;}q = NULL;m = NULL;s = NULL;delete q;delete m;delete s;cout << endl;
}void printProcess(PCB *p) {//输出所有进程的信息PCB *q = p->next;cout << endl << "所有进程运行完成后进程的相关信息" << endl;cout << "进程名\t到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间" << endl;while (q) {cout << q->pName << "\t" << q->arriveTime << "\t " << q->serviceTime << "\t  ";cout << q->startTime << "\t   " << q->finishTime << "\t    " << q->turnaroundTime << "\t     " << q->weightedTuraroundTime << endl;q = q->next;}cout << endl << endl;
}int main() {PCB *p = new PCB;int n;cout << "请输入进程的个数:";cin >> n;createProcess(p, n);runProcess(p, n);printProcess(p);getchar();getchar();return 0;
}

实验结果:

按时间片轮转调度算法(C++实现)相关推荐

  1. 操作系统实验二——时间片轮转调度算法(RR算法)(新进程放队首和队尾两种C++实现)

    情况介绍 基本原理 系统将所有就绪进程按照FCFS的原则,排成一个队列依次调度. 把CPU分配给队首进程,执行一个时间片(10-100ms). 时间片用完后,系统计时器发出时钟中断,该进程将被剥夺CP ...

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

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

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

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

  4. c语言实现作业调度算法实验报告,时间片轮转调度算法的实验报告.doc

    时间片轮转调度算法的实验报告 实验概述:[实验目的及要求] 用C语言编程实现时间片轮转调度算法 [实验原理] 基于调度算法思想用C语言编程实现Visual C++6.0实验内容: 本实验模拟在单处理机 ...

  5. 进程调度之时间片轮转调度算法(实验三)

    在分时系统中,最简单最常用的就是基于时间片轮转调度算法,时间片轮转调度算法是非常公平的处理机分配方式,让就绪队列的每个进程每次仅运行一个时间片. 1.时间片轮转调度算法的基本原理 在时间片轮转调度算法 ...

  6. c语言实现进程调度优先权调度算法和时间片轮转调度算法

    ** 1.算法原理 ** 时间片轮转调度算法 a.在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处 ...

  7. java语言实现的时间片轮转调度算法和动态优先级调度算法

    java语言实现的时间片轮转调度算法和动态优先级调度算法 一.代码: 二.程序运行演示 总结 贪方便用java实现老师的作业,虽然写的乱七八糟的,但是也想发出来给人看看,评论喷我吧!. 一.代码: 作 ...

  8. 时间片轮转调度算法的计算

    在分时系统中,最简单最常用的就是基于时间片轮转调度算法,时间片轮转调度算法是非常公平的处理机分配方式,让就绪队列的每个进程每次仅运行一个时间片. 1.时间片轮转调度算法的基本原理 在时间片轮转调度算法 ...

  9. C++ 银行家算法与时间片轮转调度算法结合

    一.实验目的 (1) 掌握 RR(时间片调度) 算法,了解 RR 进程调度 (2) 了解死锁概念,理解安全状态,并且理解银行家算法 (3) 利用 RR 进程调度与银行家算法结合,写出一个简单的项目 二 ...

最新文章

  1. javascript/dom:原生的JS写选项卡方法
  2. Python 写了一个网页版的「P图软件」,惊呆了!
  3. Pycharm解决中文字体大小不一致问题
  4. 日期年月日的比较以及判断
  5. 为什么要使用路由重分发?
  6. [03] 为什么要使用异常机制
  7. Dotnet创建Linux下的Service应用
  8. SQL语言的事务机制_转摘
  9. react native text换行_基于React+Koa实现React SSR服务端渲染
  10. [Angular2 Animation] Control Undefined Angular 2 States with void State
  11. pvs、pvdisplay、pvscan 查看物理卷信息
  12. 基于matlab的高等数学实验,《基于MATLAB高等数学实验》出版发行
  13. 工厂管理口诀,请转给每一个员工背下来!
  14. HBase(2):HBase数据模型
  15. 微软WIN7系统瘦身全攻略
  16. Framebuffer子系统【转】
  17. my ReadBook_love
  18. 用Python破解WiFi密码,太刺激了
  19. 探戈 - 维基百科,自由的百科全书
  20. 群晖文件服务器ds918,群晖ds918+评测 安全而又强大

热门文章

  1. 数学建模——K-means聚类模型Python代码
  2. (64)句柄表,遍历所有进程的句柄表实现反调试
  3. C语言的结构使用和结构对齐
  4. IDEA是否会嫌导jar包麻烦吗???赶快来学习maven吧,冲冲冲
  5. 渗透新手福利---xss到获取cookie入门级
  6. 软件调试学习笔记(四)—— 异常的处理流程
  7. 6、mysqldump备份数据库(附带实例)
  8. 13、设置默认字符集和校对规则
  9. 1.16 快速排序法(Quicksort)
  10. 【PAT乙级】1093 字符串A+B (20 分)