《操作系统实验》C++实现时间片轮转调度算法
提示:处理机调度算法之先服务算法(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记录当前还未执行完的进程数量。
四、 实验代码
- 头文件 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
- 文件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;
}
- 文件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++实现时间片轮转调度算法相关推荐
- linux系统进程调度算法实验,操作系统实验三、进程调度算法实验
实验三.进程调度算法实验 3.1 实验目的 加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程 调度策略的使用方法.练习进程调度算法的编程和调试技术. 3.2 实验说明 在 ...
- 操作系统实验六:作业调度算法模拟
一.实验目的 (1)掌握周转时间.等待时间.平均周转时间等概念及其计算方法. (2)理解五种常用的进程调度算法(FCFS.SJF.HRRF.HPF.RR),区分算法之间的差异性,并用C语言模拟实现各算 ...
- 实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR
实验内容: 实现时间片轮转算法(模拟),要求如下: 1.用到的数据结构 /* PCB / struct PCB { pid_t pid;//进程 PID int state; //状态信息,1 表示正 ...
- 操作系统实验:模拟电梯调度算法,实现对磁盘的驱动调度C++实现
设计一个以电梯调度思想为主并考虑旋转优化的程序,对磁盘进行移臂和旋转调度,对磁盘进行移臂和旋转调度. 假定某个磁盘组共有 200 个柱面,由外向里顺序编号(0-199) ...
- 操作系统实验 作业调度算法 先来先服务FCFS调度算法
作业调度算法 先来先服务FCFS调度算法 作业调度的原理: 非抢占调度 把作业从外存调入内存 作业调度算法: 先来先服务FCFS 短作业优先SJF 静态优先级调度 高响应比优先调度 实验原理 作业调度 ...
- 操作系统实验二——时间片轮转调度算法(RR算法)(新进程放队首和队尾两种C++实现)
情况介绍 基本原理 系统将所有就绪进程按照FCFS的原则,排成一个队列依次调度. 把CPU分配给队首进程,执行一个时间片(10-100ms). 时间片用完后,系统计时器发出时钟中断,该进程将被剥夺CP ...
- 操作系统--时间片轮转调度算法(RR算法)
操作系统–时间片轮转调度算法(RR算法) 实验内容: 模拟实现时间片轮转调度算法,具体如下: 设置进程体:进程名,进程的到达时间,服务时间,,进程状态(W--等待,R--运行,F--完成),进程间的链 ...
- c语言链表最高响应比优先,操作系统--最高响应比优先调度算法实验报告..doc
操作系统--最高响应比优先调度算法实验报告. 进程调度一.实验题目与要求 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法.实现具体包括:首先确定作业控制块的内容和组成方式:然 ...
- 操作系统实验报告18:硬盘柱面访问调度算法
操作系统实验报告18 实验内容 实验内容:硬盘调度. 编写 C 程序模拟实现课件 Lecture25 中的硬盘柱面访问调度算法 包括 FCFS.SSTF.SCAN.C-SCAN.LOOK.C-LOOK ...
- c语言实现作业调度算法实验报告,时间片轮转调度算法的实验报告.doc
时间片轮转调度算法的实验报告 实验概述:[实验目的及要求] 用C语言编程实现时间片轮转调度算法 [实验原理] 基于调度算法思想用C语言编程实现Visual C++6.0实验内容: 本实验模拟在单处理机 ...
最新文章
- oracle实现数据目录共享,为共享文件系统创建特定于节点的文件和目录
- 有源RFID与无缘RFID的区别
- java 线程的基本概念_Java多线程——多线程的基本概念和使用
- 导出Excel表格时,如何把数据库表中的编号转换成配置文件中的汉字
- WebGL(四)—— 第一个WEBGL程序
- 标准I/O小程序-文件拷贝
- Java多线程同步数据库,源码+原理+手写框架
- Win32汇编学习笔记(罗云彬)(二)
- 如何修改MyEclipse的默认工作路径Workplace
- Codeforce 1600Difficulty Graphs 20 questions
- 2021年机修钳工(中级)及机修钳工(中级)复审模拟考试
- 2019春实习-百度-计算机视觉算法研发工程师真题
- 手机java游戏下载网站
- 拦截QT关闭窗口的CloseEvent()解析
- 关于电脑如何修改c盘user下的用户名
- 黑马程序员——集合Collection:体系详述
- 手机高速访问an web方法
- windows7更换系统时间服务器,win7如何修改系统时间
- iPhone 6/6Plus UI界面设计和适配尺寸规范
- 中科蓝汛---长按3S进入语音助手功能实现
热门文章
- android集成第三方---集成wps实现文档阅读功能
- LoadRunner压力测试实例步骤
- linux进入根目录的代码,Linux根目录+源代码目录
- matlab 模型运行速度,用matlab求解超效率DEA模型运行结果的辨认
- Spring Cloud Eureka Server 源码解析(七)处理客户端增量下载请求、读写锁问题
- C#读取CAD文件DXF
- 三菱伺服驱动器示例_三菱伺服驱动器 mr-j4-b 用户使用手册 中文高清版.pdf
- 关于sublime text4 和Google Chrome 的live reload插件
- 91.v6p.co index.php,海洋cms V6.61
- 三级等级保护之安全管理中心