**RR算法主要体现在两个时机的调度:
1.进程的服务时间用完时,无论时间片到没到,时间片都需要置0。
2.进程的服务时间没用完,而且时间片到了,需要把此进程添加到队尾,时间片置0。
进程都运行结束时,调出循环的条件需要注意。
具体可以看注释:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;typedef struct PCB
{char name;int arrivaltime; //到达时间int Servicetime; //服务时间int Finishtime; //完成时间int Wholetime; //周转时间double WeightWholetime; //带权周转时间}RR;
struct QueueNode { //链表结构RR node;struct QueueNode* next;
};typedef struct {  //队列结构QueueNode* front; //队头QueueNode* rear;  //队尾
}LinkQueue;void start_state(RR* ResultPCB,int n); //读入假设的数据,设置系统初始状态
void dispath(LinkQueue* q_ready,RR* ResultPCB,int n);    // 模拟调度
void frontNodeTorear(LinkQueue* q); //队首进程添到队尾
bool IsEmptyQueue(LinkQueue* q); //队列判空
void InitQueue(LinkQueue* q);    //分配内存
void InsertQueueNode(LinkQueue* q, RR TempPCB); //入队
bool DeleteQueueNode(LinkQueue* q); //出队
bool cmp(RR a,RR b); //排序辅助函数int main()
{LinkQueue* q_ready = (LinkQueue*)malloc(sizeof(LinkQueue));   //为就绪队列分配内存空间InitQueue(q_ready);int n; //进程个数printf("Enter n:");scanf("%d", &n);RR* ResultPCB = (RR*)malloc(sizeof(RR)); //存储进程信息的结构体数组start_state(ResultPCB, n);   //进程初始化dispath(q_ready, ResultPCB, n); //调度//RR算法基本实现,下面进行数据汇总处理int SumWT = 0;double SumWWT = 0;printf("\nID\tArrivalTime\tServiceTime\tFinishTime\tWholeTime\tWeightWholeTime\n");for (int i = 0;i < n;i++) {ResultPCB[i].Wholetime = ResultPCB[i].Finishtime - ResultPCB[i].arrivaltime;ResultPCB[i].WeightWholetime = (1.0)*ResultPCB[i].Wholetime /ResultPCB[i].Servicetime;SumWT += ResultPCB[i].Wholetime;    //累计总周转时间SumWWT += ResultPCB[i].WeightWholetime; //累计总带权周转时间printf("%c\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",ResultPCB[i].name, ResultPCB[i].arrivaltime, ResultPCB[i].Servicetime, ResultPCB[i].Finishtime, ResultPCB[i].Wholetime, ResultPCB[i].WeightWholetime);}double AverageWT = (1.0*SumWT) / n;   //平均周转时间double AverageWWT= (1.0 * SumWWT) / n;//平均带权周转时间printf("SumWT=%d\n", SumWT);printf("SumWWT=%.2lf\n", SumWWT);printf("AverageWT=%.2lf\n", AverageWT);printf("AverageWWT=%.2lf\n", AverageWWT);return 0;
}void start_state(RR* ResultPCB, int n)  //初始化
{ for (int i = 0;i < n;i++){ResultPCB[i].name = 'A' + i;}printf("Enter ArrivalTime:");for (int i = 0;i < n;i++) {scanf("%d", &ResultPCB[i].arrivaltime);}printf("Enter ServiceTime:");for (int i = 0;i < n;i++) {scanf("%d", &ResultPCB[i].Servicetime);}sort(ResultPCB, ResultPCB + n, cmp); //排序
}
void dispath(LinkQueue* q_ready, RR* ResultPCB, int n) //主要轮转算法实现
{int j = 0;  //累计入队的进程个数int SumoperateTime = 0; //总时间int x = 0; //累计时间片int t;     //时间片大小printf("Enter TimeSlice:");scanf("%d", &t);while(1){if (j >= n && !q_ready->front->next) {//当进入队列的进程个数为总进程数n时且队列为空时退出循环//表示所有进程全部运行结束break;  }printf("Time%d:", SumoperateTime); for (int i = 0;i < n;i++){if (ResultPCB[i].arrivaltime == SumoperateTime) {//每次需要遍历所有进程到达时间,可能有些进程到达时间一样,依次入队printf(" %c arrived ", ResultPCB[i].name);InsertQueueNode(q_ready, ResultPCB[i]);   //添加新进程进入队列++j; //入队的进程个数}}if (0==q_ready->front->next->node.Servicetime) //队首进程服务时间用完时{printf(" %c finished.", q_ready->front->next->node.name); //finish表示此进程运行结束for (int i = 0;i < n;i++) {if (q_ready->front->next->node.name == ResultPCB[i].name) //遍历数组,找到与队首进程对应的项{ResultPCB[i].Finishtime = SumoperateTime;  //把总时间作为完成时间赋值给对应的进程}}DeleteQueueNode(q_ready); //注销队首进程x = 0;    //此时进程切换,时间片需要置0}else if (0<q_ready->front->next->node.Servicetime) //若队首进程还有服务时间{if (x < t) //如果不到时间片,则什么也不做,下次还是执行此队首进程{;}else  //如果到达时间片,此时需要进行进程切换{x = 0;  //无疑时间片需要置0if (!q_ready->front->next->next) //如果队里只有一个进程,没必要放到队尾{;}else   frontNodeTorear(q_ready); //如果有多个进程,则把队首进程移到队尾}}if (!IsEmptyQueue(q_ready)) //队列不空{printf(" %c executing.\n",q_ready->front->next->node.name); //执行队首进程--q_ready->front->next->node.Servicetime; //执行一次后服务时间减一}else  //队列为空{printf("***没有进程运行\n");}++x; //累计时间片++SumoperateTime; //累计总时间,用于明确各个进程完成时间}}void InitQueue(LinkQueue* q) { //初始化头结点q->front = q->rear = (QueueNode*)malloc(sizeof(QueueNode));q->front->next = NULL;
}bool IsEmptyQueue(LinkQueue* q) { //判空if (q->front == q->rear)return true;return false;
}void InsertQueueNode(LinkQueue* q, RR TempPCB) { //插入结点QueueNode* P = (QueueNode*)malloc(sizeof(QueueNode));P->node = TempPCB;P->next = NULL;q->rear->next = P;q->rear = P;
}bool DeleteQueueNode(LinkQueue* q) {QueueNode* P = q->front->next;if (IsEmptyQueue(q))  //为空无法删除return false;q->front->next = P->next; //使头结点指向第一个结点的下一个结点if (P == q->rear)     //如果P是尾指针,直接使队头等于队尾q->rear = q->front;free(P);return true;
}void frontNodeTorear(LinkQueue* q) {  //用作把队首结点移到队尾QueueNode* P = q->front->next;q->front->next = P->next;P->next = NULL;    //首进程摘下来q->rear->next = P; //尾部指针下一个指向摘下来的首进程q->rear = P;
}bool cmp(RR a, RR b) //排序辅助函数
{return a.arrivaltime < b.arrivaltime;
}

运行实例如下:
时间片为4的情况:

时间片为1的情况:

经典时间片轮转RR算法C语言实现相关推荐

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

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

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

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

  3. 时间片轮转RR进程调度算法(操作系统实验 C+)

    时间片轮转RR进程调度算法 1.实验目的 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变.进程调度的策略及对系统性能的评价方法. 2.实验内容 问题描述: 设计程序模拟进程的时间片轮转R ...

  4. 实验名称:时间片轮转RR进程调度算法

    实验目的 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变.进程调度的策略及对系统性能的评价方法. 实验内容 问题描述: 设计程序模拟进程的时间片轮转RR调度过程.假设有n个进程分别在T1 ...

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

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

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

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

  7. 优先级结合时间片轮转算法c语言,先来先服务/段作业优先/时间片轮转/优先级调度算法详解...

    先来先服务调度算法 先来先服务(First Come First Served,FCFS),是一种简单的调度算法,它既适用于作业调度,也适用于进程调度.先来先服务算法是按照作业或进程到达的先后次序来进 ...

  8. 【操作系统】RR算法(时间片轮转,假设时间片q=1)

    假定在一个处理机上执行的操作如下: 作业 估计服务时间 各作业到达时间 A 2 0 B 3 3 C 1 4 D 5 6 E 4 5 请用RR算法(时间片轮转,假设时间片 q =1)来完成这些作业的调度 ...

  9. 经典的十种排序算法 C语言版

    经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 ​ 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...

最新文章

  1. 我的微软最有价值专家(Microsoft MVP)之路
  2. ASP.NET MVC 4 (三) 过滤器
  3. DPDK报文转发(四)
  4. 历史上线程的3种实现模型
  5. jinfo命令 Java Configuration Info
  6. Linux嵌入式_详解从原理图到数据手册解析PWM蜂鸣器实现
  7. linux中彻底卸载mysql_Linux下彻底卸载mysql详解
  8. Java华氏度与摄氏度之间的转换
  9. 手串 如何挑选手串 什么是小叶紫檀?小叶紫檀怎么保养 小叶紫檀怎么盘法
  10. 个人计算机架构和相关的设备组件
  11. debouncing 与 throttling
  12. 2017.12.5 八周第二次课
  13. AI上推荐 之 AFM与DIN模型(当推荐系统遇上了注意力机制)
  14. 数据库和databus
  15. “慎思笃行,臻于至善”蚂蚁森林合种未来可期
  16. 2020年4月TIOBE语言排行榜-你知道少儿编程语言Scratch吗
  17. 开始使用计算机教案,计算机基础教案_朱新峰.pdf
  18. Android自定义控件之美观的实用型统计表的制作
  19. 全角,半角 和 中文标点,英文标点
  20. 编译报错file format not recognized和collect2: error: ld returned 1 exit status记录

热门文章

  1. 关于Arduino Esp8266深度睡眠(deepsleep)无法唤醒的解决办法
  2. 日期加减天数计算,时间戳日期相互转换
  3. html盒子模型包含哪些部分,CSS盒子模型由哪四部分组成?
  4. 把扫描文件转变为word文档的最实用的四款OCR识别软件
  5. SSL数字证书下载流程是怎么样的
  6. 哪些道理是过了40岁之后才明白的?
  7. 计算机语言VLOOKUP,R下如何实现VLOOKUP函数功能
  8. 通达信程序化交易接口的设计方案
  9. Spring Boot+Vue(一)node.js环境搭建
  10. 计算机网络:验证性试验