首页 > 编程知识 正文

操作系统实验C 实现时间片轮转调度算法

时间:2023-05-06 17:46:44 阅读:182194 作者:793

提示:处理器调度算法的先行服务算法(FCFS )、短作业优先算法(SJF )、快速响应比优先算法(HRRN )。具体地说,c

时间片循环调度算法一、实验内容二、实验要求三、实验过程一、设计思想二、数据结构四、实验代码五、实验结果

一.实验内容

使用时间片循环算法仿真实现过程调度功能。

二、实验要求1、模拟时间片轮换调度算法;

2、可以输入流程的基本信息,如流程名称、到达时间等;

3、能够显示各调度算法的调度顺序;

4、可以计算出调度完成后的流程周转时间、平均周转时间、赋权周转时间、平均赋权周转时间。

三、实验过程1、设计思想(1)用户输入流程个数和时间片大小;

)用一个pcb表示包括进程名、到达时间、服务时间、剩馀服务时间、完成时间等信息在内的各个进程。 这里,由用户输入进程名和到达时间,服务时间由随机数生成;

)3)按照所有进程到达的优先级进行排序,形成队列;

)4)最先到达的进程首先排队,其次对运行结束时间之前到达的进程进行排队,最后进程运行完成后从队列中取出记录结束时间,否则进入队列末尾。

)运行队列前端的进程,对运行结束时间之前到达的进程进行排队,判断队列前端的进程是否可以运行,如果进程已经运行,则从队列中取出并记录结束时间,否则进入队列末尾;

(6)重复步骤5 )直到所有进程都已经运行;

(7)计算周转时间、平均周转时间、权利周转时间、平均权利周转时间。

2、数据结构1、定义描述PCB的类PCB :

class PCB { friendvoidsort (STD :3360 vector PCB; friendvoidrr (STD :3360 vector PCB,const float ); 公共: PCB (=default; PCB(chara,float b,float c ) :name(a )、arrival_time(b ) b、service_time(c )、remaining_time(c ) //到达时间float service_time; //服务时间float remaining_time; //剩余服务时间float finish_time; //结束时间float t1; //周转时间float t2 : //选民周转时间public:void display () const; //进程信息char read_name ) ) const; //读取名称boolcrt(floatrr ); //用于计算剩余时间的浮点时间(void CFT ); //计算结束时间float ct1 (; //计算周转时间的float ct2 (; //计算所有权周转时间; 2、容器VectorPCBPCBs(n )加载所有进程;

3、容器vectorchar order记录流程的执行顺序;

4、建立双端队列dequepcb queue负载等待到达的进程;

5、变量time记录当前的时间,变量n记录当前未运行的进程数。

四.实验代码头文件PCB.h # ifndef PCB _ h # define PCB _ h # includevectorclasspcb { friendvoidsort (STD 33603360 vector PCB ); friendvoidrr (STD :3360 vector PCB,const float ); 公共: PCB (=default; PCB(chara,float b,float c ) :name(a )、arrival_time(b ) b、service_time(c )、remaining_time(c ) //到达时间float service_time; //服务时间float remaining_time; //剩余服务时间float finish_time; //结束时间float t1; //周转时间float t2 : //选民周转时间public:void display () const; //进程信息char read_name ) ) const; //读取名称boolcrt(floatrr ); //用于计算剩余时间的浮点时间(void CFT ); //计算结束时间float ct1 (; //计算周转时间的float ct2 (; //计算所有权周转时间; #endif文件pc

b.cpp #include"pcb.h"#include<iostream>using namespace std;//显示进程信息void pcb::display() const {cout << "名称:" << name << "t"<< "到达时间:" << arrival_time << "t"<< "服务时间:" << service_time << endl;}//计算剩余时间,时间不足一个时间片返回false,否则返回truebool 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;} 五、实验结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。