RR算法是使用非常广泛的一种调度算法。

首先将所有就绪的队列按FCFS策略排成一个就绪队列,然后系统设置一定的时间片,每次给队首作业分配时间片。如果此作业运行结束,即使时间片没用完,立刻从队列中去除此作业,并给下一个作业分配新的时间片;如果作业时间片用完没有运行结束,则将此作业重新加入就绪队列尾部等待调度。

  1.  
    //main.cpp
  2.  
    #include "RR.h"
  3.  
     
  4.  
    int main()
  5.  
    {
  6.  
    std::vector<PCB> PCBList;
  7.  
    int timeslice;
  8.  
     
  9.  
    //输入时间片大小,作业信息
  10.  
    InputPCB(PCBList, timeslice);
  11.  
     
  12.  
    //RR算法
  13.  
    RR(PCBList, timeslice);
  14.  
     
  15.  
    //显示结果
  16.  
    show(PCBList);
  17.  
     
  18.  
    return 0;
  19.  
    }
  20.  
     
  21.  
    //RR.h
  22.  
    #ifndef RR_H_
  23.  
    #define RR_H_
  24.  
     
  25.  
    #include <iostream>
  26.  
    #include <algorithm>
  27.  
    #include <iomanip>
  28.  
    #include <vector>
  29.  
    #include <queue>
  30.  
     
  31.  
    //作业结构体
  32.  
    typedef struct PCB
  33.  
    {
  34.  
    int ID; //标识符
  35.  
    int ComeTime; //到达时间
  36.  
    int ServerTime; //服务时间
  37.  
    int FinishTime; //完成时间
  38.  
    int TurnoverTime; //周转时间
  39.  
    double WeightedTurnoverTime; //带权周转时间
  40.  
    }PCB;
  41.  
     
  42.  
    /*
  43.  
    函数功能:输入作业信息
  44.  
    参数说明:
  45.  
    PCBList std::vector<PCB>& PCB链
  46.  
    timeslice int 时间片
  47.  
    */
  48.  
    void InputPCB(std::vector<PCB> &PCBList, int ×lice);
  49.  
     
  50.  
    /*
  51.  
    函数功能:RR算法
  52.  
    参数说明:
  53.  
    PCBList std::vector<PCB>& PCB链
  54.  
    */
  55.  
    void RR(std::vector<PCB> &PCBList, int timeslice);
  56.  
     
  57.  
    /*
  58.  
    函数功能:显示结果
  59.  
    参数说明:
  60.  
    PCBList std::vector<PCB>& PCB链
  61.  
    */
  62.  
    void show(std::vector<PCB> &PCBList);
  63.  
     
  64.  
    /*
  65.  
    函数功能:比较函数,用于sort(),按ComeTime升序排列
  66.  
    参数说明:
  67.  
    p1 const PCB& PCB
  68.  
    p2 const PCB& PCB
  69.  
    */
  70.  
    bool CmpByComeTime(const PCB &p1, const PCB &p2);
  71.  
     
  72.  
    #endif
  73.  
     
  74.  
    //RR.cpp
  75.  
    #include "RR.h"
  76.  
     
  77.  
    //输入作业信息
  78.  
    void InputPCB(std::vector<PCB> &PCBList,int ×lice)
  79.  
    {
  80.  
    std::cout << "输入时间片大小: ";
  81.  
    std::cin >> timeslice;
  82.  
    do {
  83.  
    PCB temp;
  84.  
    std::cout << "输入标识符: ";
  85.  
    std::cin >> temp.ID;
  86.  
    std::cout << "输入到达时间: ";
  87.  
    std::cin >> temp.ComeTime;
  88.  
    std::cout << "输入服务时间: ";
  89.  
    std::cin >> temp.ServerTime;
  90.  
    temp.FinishTime = 0; //暂时存放运行了多少时间,来判断此作业是否运行结束
  91.  
    PCBList.push_back(temp);
  92.  
     
  93.  
    std::cout << "继续输入?Y/N: ";
  94.  
    char ans;
  95.  
    std::cin >> ans;
  96.  
    if ('Y' == ans || 'y' == ans)
  97.  
    continue;
  98.  
    else
  99.  
    break;
  100.  
    } while (true);
  101.  
    }
  102.  
     
  103.  
    //RR算法
  104.  
    void RR(std::vector<PCB> &PCBList, int timeslice)
  105.  
    {
  106.  
    std::sort(PCBList.begin(), PCBList.end(), CmpByComeTime); //按到达时间排序
  107.  
    std::vector<PCB> result; //保存结果
  108.  
    std::queue<PCB> Ready; //就绪队列
  109.  
    int BeginTime = (*PCBList.begin()).ComeTime; //第一个作业开始时间
  110.  
    Ready.push(*PCBList.begin());
  111.  
    PCBList.erase(PCBList.begin());
  112.  
     
  113.  
    while (!PCBList.empty() || !Ready.empty())
  114.  
    {
  115.  
    if (!PCBList.empty() && BeginTime >= (*PCBList.begin()).ComeTime) //有新作业到达,加入就绪队列
  116.  
    {
  117.  
    Ready.push(*PCBList.begin());
  118.  
    PCBList.erase(PCBList.begin());
  119.  
    }
  120.  
    if (Ready.front().FinishTime + timeslice < Ready.front().ServerTime) //时间片用完没运行完,加入队尾
  121.  
    {
  122.  
    Ready.front().FinishTime += timeslice;
  123.  
    Ready.push(Ready.front());
  124.  
    Ready.pop();
  125.  
    BeginTime += timeslice;
  126.  
    }
  127.  
    else //此作业运行完
  128.  
    {
  129.  
    BeginTime += Ready.front().ServerTime - Ready.front().FinishTime;
  130.  
    Ready.front().FinishTime = BeginTime;
  131.  
    Ready.front().TurnoverTime = Ready.front().FinishTime - Ready.front().ComeTime;
  132.  
    Ready.front().WeightedTurnoverTime = (double)Ready.front().TurnoverTime / Ready.front().ServerTime;
  133.  
     
  134.  
    //从就绪队列中移除作业
  135.  
    result.push_back(Ready.front());
  136.  
    Ready.pop();
  137.  
    }
  138.  
     
  139.  
    }
  140.  
     
  141.  
    //按ComeTime升序排序,便于显示结果
  142.  
    PCBList = result;
  143.  
    std::sort(PCBList.begin(), PCBList.end(), CmpByComeTime);
  144.  
    }
  145.  
     
  146.  
    //显示结果
  147.  
    void show(std::vector<PCB> &PCBList)
  148.  
    {
  149.  
    int SumTurnoverTime = 0;
  150.  
    double SumWeightedTurnoverTime = 0;
  151.  
     
  152.  
    std::cout.setf(std::ios::left);
  153.  
     
  154.  
    std::cout << std::setw(20) << "标识符";
  155.  
    for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
  156.  
    std::cout << std::setw(5) << (*it).ID;
  157.  
    std::cout << std::endl;
  158.  
     
  159.  
    std::cout << std::setw(20) << "到达时间";
  160.  
    for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
  161.  
    std::cout << std::setw(5) << (*it).ComeTime;
  162.  
    std::cout << std::endl;
  163.  
     
  164.  
    std::cout << std::setw(20) << "服务时间";
  165.  
    for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
  166.  
    std::cout << std::setw(5) << (*it).ServerTime;
  167.  
    std::cout << std::endl;
  168.  
     
  169.  
    std::cout << std::setw(20) << "完成时间";
  170.  
    for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
  171.  
    std::cout << std::setw(5) << (*it).FinishTime;
  172.  
    std::cout << std::endl;
  173.  
     
  174.  
    std::cout << std::setw(20) << "周转时间";
  175.  
    for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
  176.  
    {
  177.  
    std::cout << std::setw(5) << (*it).TurnoverTime;
  178.  
    SumTurnoverTime += (*it).TurnoverTime;;
  179.  
    }
  180.  
    std::cout << std::endl;
  181.  
     
  182.  
    std::cout << std::setw(20) << "带权周转时间";
  183.  
    for (std::vector<PCB>::iterator it = PCBList.begin(); it < PCBList.end(); ++it)
  184.  
    {
  185.  
    std::cout << std::setw(5) << (*it).WeightedTurnoverTime;
  186.  
    SumWeightedTurnoverTime += (*it).WeightedTurnoverTime;;
  187.  
    }
  188.  
    std::cout << std::endl;
  189.  
     
  190.  
    std::cout << "平均周转时间: " << (double)SumTurnoverTime / PCBList.size() << std::endl;
  191.  
    std::cout << "平均带权周转时间: " << SumWeightedTurnoverTime / PCBList.size() << std::endl;
  192.  
    }
  193.  
     
  194.  
    //比较函数,按ComeTime升序排列
  195.  
    bool CmpByComeTime(const PCB &p1, const PCB &p2)
  196.  
    {
  197.  
    return p1.ComeTime < p2.ComeTime;
  198.  
    }

RR算法 调度的更多相关文章

  1. 操作系统概念学习笔记 10 CPU调度

    操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU.操作系统能够提高计算机的吞吐率. 对于单处理器系统.每次仅仅同意一个进程执行:不论什么其它进程必须等待,直到C ...

  2. [Linux]Linux系统调用列表

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  3. LVS负载均衡集群服务搭建详解(二)

    lvs-nat模型构建 1.lvs-nat模型示意图 本次构建的lvs-nat模型的示意图如下,其中所有的服务器和测试客户端均使用VMware虚拟机模拟,所使用的CentOS 7 VS内核都支持ipv ...

  4. 常用的Linux系统调用命令

    常用的Linux系统调用命令   下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别.   一.进程控制 ...

  5. Linux系统调用(转载)

    目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...

  6. Linux系统调用列表

    转自Linux系统调用列表 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtabl ...

  7. Linux常用系统调用

    转载 http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#icomments 按照惯例,这个列表 ...

  8. 【转】Linux系统调用列表

    一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最 ...

  9. Linux系统常见调用及其分类

    Linux系统调用主要可以分为以下几类: 进程控制  fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 get ...

随机推荐

  1. jQueryPrint 的简单使用

    jQueryPrint 的简单使用 一.为什么要使用 jQueryPrint?  1.当然是方便的要死尼,相比于其他的方法. 2.打印整个页面或者局部页面都是非常的可以的,使用很方便. 3.如果要导出 ...

  2. POJ.1830.开关问题(高斯消元 异或方程组)

    题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...

  3. * -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]’

    错误描述: * -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object fr ...

  4. ecshop jquery 冲突

    遇到冲突在脚本前面加上这句 $(function() { window.__Object_toJSONString = Object.prototype.toJSONString; delete Ob ...

  5. mongodb.副本集配置方法(使用keyfile认证部署)

    前提条件: - 已安装MongoDB, 版本以3.6为例 - 系统: Debian9 - 建议做副本集的话, 以3台以上为宜, 本文以1台主机2个服务为例 1.创建数据存放的目录, 并授权 sudo ...

  6. java:@SuppressWarnings注解

    简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告, ...

  7. SSH框架搭建详细图文教程(转)

    这篇文章看的我醍醐灌顶的感觉,比之前本科时候学习的SSH架构 要清晰数倍  非常感觉这篇博主的文章 文章链接为:http://blog.sina.com.cn/s/blog_a6a6b3cd01017 ...

  8. Python机器学习(1):KMeans聚类

    Python进行KMeans聚类是比较简单的,首先需要import numpy,从sklearn.cluster中import KMeans模块: import numpy as np from sk ...

  9. Windows下libjpeg-trubo-1.5.3编译(VS2015)

    简述 https://libjpeg-turbo.org/的网站上是有已经编译好的版本下载的,但是VC下是使用的VC10.0编译的.虽然在VC14.0下也能用,但是我还是需要编译一个VC14.0版本的 ...

  10. java.util.WeakHashMap

    http://mikewang.blog.51cto.com/3826268/880775 http://mzlly999.iteye.com/blog/1126049 java.util.WeakH ...