提示:处理机调度算法之先服务算法(FCFS)、短作业优先算法(SJF)和高响应比优先算法(HRRN)详见C++实现处理机调度算法。

时间片轮转调度算法

  • 一、 实验内容
  • 二、 实验要求
  • 三、 实验过程
    • 1、 设计思想
    • 2、 数据结构
  • 四、 实验代码
  • 五、实验结果

一、 实验内容

使用时间片轮转算法模拟实现进程调度功能。

二、 实验要求

1、模拟时间片轮转调度算法;
2、能输入进程的基本信息,如进程名、到达时间等;
3、能够显示各调度算法的调度顺序;
4、能计算完成调度后进程的周转时间、平均周转时间、带权周转时间、平均带权周转时间。

三、 实验过程

1、 设计思想

(1) 用户输入进程的个数和时间片的大小;
(2) 每个进程用一个pcb表示,包括进程名、到达时间、服务时间、剩余服务时间、完成时间等信息。其中进程名和到达时间由用户输入,服务时间由随机数生成;
(3) 按照所有进程到达的先后顺序进行排序,建立等待队列;
(4) 第一个到达的进程首先进入队列,然后让执行结束时间之前到达的进程进入队列,最后若进程执行完毕则从队列中取出记录结束时间,否则放入队列尾部;
(5) 执行队列首位的进程,让执行结束时间之前到达的进程进入队列,判断队列首位的进程是否能执行完,若进程执行完毕则从队列中取出并记录结束时间,否则放入队列尾部;
(6) 重复(5)步,直到所有进程执行完毕;
(7) 计算周转时间、平均周转时间、带权周转时间、平均带权周转时间。

2、 数据结构

1、定义一个描述PCB的类pcb:

class pcb {friend void sort(std::vector<pcb>&);friend void RR(std::vector<pcb>&, const float&);
public:pcb() = default;pcb(char a, float b, float c) :name(a), arrival_time(b), service_time(c), remaining_time(c) {}
private:char name;float arrival_time;      //到达时间float service_time;      //服务时间float remaining_time;    //剩余服务时间float finish_time;       //结束时间float t1;                //周转时间float t2;                //带权周转时间
public:void display() const;    //显示进程信息char read_name() const;  //读取名称bool crt(float rr);      //计算剩余时间void cft(float time);    //计算结束时间float ct1();             //计算周转时间float ct2();             //计算带权周转时间
};

2、容器vector<pcb> pcbs(n)装入所有进程;
3、容器vector<char> order记录进程执行的顺序;
4、建立双端队列deque<pcb> queue装入到达等待的进程;
5、变量time记录当前的时刻,变量n记录当前还未执行完的进程数量。

四、 实验代码

  1. 头文件 pcb.h
#ifndef PCB_H
#define PCB_H
#include<vector>
class pcb {friend void sort(std::vector<pcb>&);friend void RR(std::vector<pcb>&, const float&);
public:pcb() = default;pcb(char a, float b, float c) :name(a), arrival_time(b), service_time(c), remaining_time(c) {}
private:char name;float arrival_time;      //到达时间float service_time;      //服务时间float remaining_time;    //剩余服务时间float finish_time;       //结束时间float t1;                //周转时间float t2;                //带权周转时间
public:void display() const;    //显示进程信息char read_name() const;  //读取名称bool crt(float rr);      //计算剩余时间void cft(float time);    //计算结束时间float ct1();             //计算周转时间float ct2();             //计算带权周转时间
};
#endif
  1. 文件pcb.cpp
#include"pcb.h"
#include<iostream>using namespace std;//显示进程信息
void pcb::display() const {cout << "名称:" << name << "\t"<< "到达时间:" << arrival_time << "\t"<< "服务时间:" << service_time << endl;
}//计算剩余时间,时间不足一个时间片返回false,否则返回true
bool pcb::crt(float rr) {   if (remaining_time <= rr)return false;else {remaining_time -= rr;return true;}
}//计算结束时间
void pcb::cft(float time) {finish_time = time;
}//计算周转时间
float pcb::ct1() {return finish_time - arrival_time;
}//计算带权周转时间
float pcb::ct2() {return (finish_time - arrival_time) / service_time;
}//读取进程名
char pcb::read_name() const {return name;
}
  1. 文件exp3.cpp
#include"pcb.h"
#include<iostream>
#include<vector>
#include<deque>
#include<random>
#include<ctime>using namespace std;//按到达时间排序
void sort(vector<pcb>& pcbs) {int index;int n = pcbs.size();for (int i = 0; i < n; i++) {index = i;for (int j = i + 1; j < n; j++) {if (pcbs[j].arrival_time < pcbs[i].arrival_time)index = j;}if (index != i){pcb temp;temp = pcbs[i];pcbs[i] = pcbs[index];pcbs[index] = temp;}}
}void RR(vector<pcb>& pcbs, const float& rr) {vector<char> order;  //记录执行顺序deque<pcb> queue;  //双端队列unsigned i = 1;int n = pcbs.size();//按到达时间排序sort(pcbs);//第一个到达的进程进入队列queue.push_back(pcbs[0]);float time = pcbs[0].arrival_time;while (n!=0) {//计算当前时间if (!queue.empty()) {if (queue[0].remaining_time < rr)time += queue[0].remaining_time;elsetime += rr;}else {time = pcbs[i].arrival_time;queue.push_back(pcbs[i]);i++;if (queue[0].remaining_time < rr)time += queue[0].remaining_time;elsetime += rr;}//在进程结束之前到达的新进程进入队列while (i < pcbs.size() && pcbs[i].arrival_time <= time) {queue.push_back(pcbs[i]);i++;}order.push_back(queue[0].name);//未执行完的进程放入队尾,否则从队列中删除if (queue[0].crt(rr)) { pcb t = queue[0];queue.pop_front();queue.push_back(t);}else {for (unsigned j = 0; j < pcbs.size(); j++) {if (pcbs[j].name == queue[0].name) {pcbs[j].cft(time);}}queue.pop_front();n--;}}//打印执行顺序cout << "执行顺序:";for (auto i : order)cout << i << ' ';cout << endl;
}int main() {int n;float rr;//输入进程信息并显示cout << "输入进程数目:";cin >> n;vector<pcb> pcbs(n);cout << "\n输入进程名、到达时间" << endl;char name; float at; float st;uniform_int_distribution<unsigned> u(1, 5);  //生成1-5间(包含)均匀分布的随机数default_random_engine e(time(0));for (int i = 0; i < n; i++) {cin >> name >> at ;st = float(u(e));pcbs[i] = pcb(name, at, st);}for (int i = 0; i < n; i++) {pcbs[i].display();}//输入时间片大小,执行RRcout << "\n输入时间片大小:";cin >> rr;cout << "\n";RR(pcbs, rr);//计算(平均)周转时间、(平均)带权周转时间float sum1 = 0.0, sum2 = 0.0;for (int i = 0; i < n; i++) {cout << "编号:" << pcbs[i].read_name() << "\t"<< "周转时间:" << pcbs[i].ct1() << "\t"<< "带权周转时间:" << pcbs[i].ct2() << endl;sum1 += pcbs[i].ct1();sum2 += pcbs[i].ct2();}cout << "平均周转时间:" << sum1 / float(n) << endl;cout << "平均带权周转时间:" << sum2 / float(n) << endl;return 0;
}

五、实验结果

《操作系统实验》C++实现时间片轮转调度算法相关推荐

  1. linux系统进程调度算法实验,操作系统实验三、进程调度算法实验

    实验三.进程调度算法实验 3.1 实验目的 加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程 调度策略的使用方法.练习进程调度算法的编程和调试技术. 3.2 实验说明 在 ...

  2. 操作系统实验六:作业调度算法模拟

    一.实验目的 (1)掌握周转时间.等待时间.平均周转时间等概念及其计算方法. (2)理解五种常用的进程调度算法(FCFS.SJF.HRRF.HPF.RR),区分算法之间的差异性,并用C语言模拟实现各算 ...

  3. 实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR

    实验内容: 实现时间片轮转算法(模拟),要求如下: 1.用到的数据结构 /* PCB / struct PCB { pid_t pid;//进程 PID int state; //状态信息,1 表示正 ...

  4. 操作系统实验:模拟电梯调度算法,实现对磁盘的驱动调度C++实现

            设计一个以电梯调度思想为主并考虑旋转优化的程序,对磁盘进行移臂和旋转调度,对磁盘进行移臂和旋转调度.         假定某个磁盘组共有 200 个柱面,由外向里顺序编号(0-199) ...

  5. 操作系统实验 作业调度算法 先来先服务FCFS调度算法

    作业调度算法 先来先服务FCFS调度算法 作业调度的原理: 非抢占调度 把作业从外存调入内存 作业调度算法: 先来先服务FCFS 短作业优先SJF 静态优先级调度 高响应比优先调度 实验原理 作业调度 ...

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

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

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

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

  8. c语言链表最高响应比优先,操作系统--最高响应比优先调度算法实验报告..doc

    操作系统--最高响应比优先调度算法实验报告. 进程调度一.实验题目与要求 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法.实现具体包括:首先确定作业控制块的内容和组成方式:然 ...

  9. 操作系统实验报告18:硬盘柱面访问调度算法

    操作系统实验报告18 实验内容 实验内容:硬盘调度. 编写 C 程序模拟实现课件 Lecture25 中的硬盘柱面访问调度算法 包括 FCFS.SSTF.SCAN.C-SCAN.LOOK.C-LOOK ...

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

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

最新文章

  1. oracle实现数据目录共享,为共享文件系统创建特定于节点的文件和目录
  2. 有源RFID与无缘RFID的区别
  3. java 线程的基本概念_Java多线程——多线程的基本概念和使用
  4. 导出Excel表格时,如何把数据库表中的编号转换成配置文件中的汉字
  5. WebGL(四)—— 第一个WEBGL程序
  6. 标准I/O小程序-文件拷贝
  7. Java多线程同步数据库,源码+原理+手写框架
  8. Win32汇编学习笔记(罗云彬)(二)
  9. 如何修改MyEclipse的默认工作路径Workplace
  10. Codeforce 1600Difficulty Graphs 20 questions
  11. 2021年机修钳工(中级)及机修钳工(中级)复审模拟考试
  12. 2019春实习-百度-计算机视觉算法研发工程师真题
  13. 手机java游戏下载网站
  14. 拦截QT关闭窗口的CloseEvent()解析
  15. 关于电脑如何修改c盘user下的用户名
  16. 黑马程序员——集合Collection:体系详述
  17. 手机高速访问an web方法
  18. windows7更换系统时间服务器,win7如何修改系统时间
  19. iPhone 6/6Plus UI界面设计和适配尺寸规范
  20. 中科蓝汛---长按3S进入语音助手功能实现

热门文章

  1. android集成第三方---集成wps实现文档阅读功能
  2. LoadRunner压力测试实例步骤
  3. linux进入根目录的代码,Linux根目录+源代码目录
  4. matlab 模型运行速度,用matlab求解超效率DEA模型运行结果的辨认
  5. Spring Cloud Eureka Server 源码解析(七)处理客户端增量下载请求、读写锁问题
  6. C#读取CAD文件DXF
  7. 三菱伺服驱动器示例_三菱伺服驱动器 mr-j4-b 用户使用手册 中文高清版.pdf
  8. 关于sublime text4 和Google Chrome 的live reload插件
  9. 91.v6p.co index.php,海洋cms V6.61
  10. 三级等级保护之安全管理中心