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. luogu P2934 [USACO09JAN]安全出行Safe Travel

    题目链接 luogu P2934 [USACO09JAN]安全出行Safe Travel 题解 对于不在最短路树上的边(x, y) 1 | | t / \ / \ x-----y 考虑这样一种形态的图 ...

  2. PCB编译时出现的错误 ( Duplicate Net Names Wire N000-1 (Inferred)意思就是端口名字没有定义)

    再运行这个错误Duplicate Net Names Wire N000-1 (Inferred)的就没有了, 不过还有其他的 错误,有错误不用怕,关我的博客解决.

  3. 转:甲骨文发布大数据解决方案 含最新版NoSQL数据库

    原文出处: http://www.searchdatabase.com.cn/showcontent_88247.htm 以下是部分节选: 最新发布的大数据创新成果包括: Oracle Big Dat ...

  4. pt-query-digest简介使用

    简介        pt-query-digest 是用于分析mysql慢查询的一个工具,与mysqldumpshow工具相比,py-query_digest 工具的分析结果更具体,更完善. 有时因为 ...

  5. react-native布局篇

    原文链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native%E5%B8%83%E5%B1%80/ 一.宽度和 ...

  6. poj--1088--DFS(记忆化搜索之经典)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 68057   Accepted: 25039 Description ...

  7. Android的Databinding-自定义生成类名字

    1. 在xml中,添加class的属性并设置为自定义名字<data class="com.example.CustomBinding"></data>2. ...

  8. SpringMVC+Thymeleaf +HTML的简单框架

    一.问题 项目中需要公众号开发,移动端使用的是H5,但是如果不用前端框架的话,只能考虑JS前端用ajax解析JSON字符串了.今天我们就简单的说下前端框架Thymeleaf如何解决这个问题的: 二.开 ...

  9. 微信小程序的同步操作

    小程序里,大多数操作都是异步操作,一些重要的操作,如从网上获取重要变量值,必须要保证有值,后续操作才有意义.但异步操作,又必须把处理放到回调中,代码可读性降低,而且和大多数正常逻辑相背. 折腾了两天, ...

  10. 【转】JavaScript 的装载和执行

    承接前面一篇文章<浏览器的渲染原理简介> ,本文来说下JavaScript的装载和执行. 通常来说,浏览器对于 JavaScript 的运行有两大特性: 1) 载入后马上执行 2) 执行时 ...