实验三
【实验题目】:高响应比优先调度和时间片轮转RR进程调度算法
【实验目的】
通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法。
【实验内容及要求】
算法思路:
时间片轮转RR进程调度算法:用于分时系统中的进程调度。每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。
给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
高响应比优先算法:①当等待时间相同时,短进程的优先权高;②当需要运行时间相同时,作业的优先权又取决于等待时间,相当于先到先服务;③长作业的优先级可以随着等待时间的增加而提高,因此长作业等待一段时间后仍能得到调度。
使用的公式:
完成时间 = 开始时间 + 需要运行时间
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 需要运行时间
等待时间 = 当前时间 - 到达时间
优先权 = (等待时间 + 需要运行时间) / 需要运行时间
问题描述:
设计程序模拟进程的高响应比优先调度和时间片轮转RR调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。如果选择RR算法,则需要指定时间片大小q,采用时间片轮转RR进程调度算法进行调度,如果选择高响应比优先调度算法,则可以直接调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:
1)进程个数n;每个进程的到达时间T1, … ,Tn和服务时间S1, … ,Sn;如果选择时间片轮转法,则要输入时间片大小q。
2)要求高响应比优先和时间片轮转法RR调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;
3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;
4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
【流程图】

【实验结果】
核心代码:
时间片轮转RR进程调度:



高响应比优先调度:

可读文本文件:

实验结果截图:
时间片轮转RR进程调度:

高响应比优先调度:





【源代码】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <iomanip>
#include <fstream>
using namespace std;
#define WAIT "Wait"//就绪状态
#define RUN "Run"//运行状态
#define FINISH "Finish"//完成状态
#define JOBNUMBER 5 //设置进程测试数为5
//存放每个进程信息的结构体
typedef struct{
char name;//进程名字
int ArrivalTime;//到达时间
int ServiceTime;//服务时间
int FinishedTime;//完成时间
int WholeTime;//周转时间
double WeightWholeTime;//带权周转时间
}RR;
static queue<RR>RRqueue; //用来模拟进程执行RR调度算法的队列
static double SumWT=0,SumWWT=0,AverageWT =0,AverageWWT=0;//平均周转时间、平均带权周转时间
static int q; //时间片数
static int n; //进程个数
static RR RRarray[100]; //进程结构体
static RR temp; //进程结构
void Enter();//输入时间片、到达时间、服务时间等
void RRfunction();//执行RR调度算法
void display();//显示各时间执行情况,以及各个时间值
//输入时间片、到达时间、服务时间等
void Enter(){
int i,j;
cout<<"Enter n: ";
cin>>n;
cout<<"Enter TimeSlice q: ";
cin>>q;
for (i=0;i<n;i++){
RRarray[i].name=i+65;//自动将进程名字顺序编号为A、B、C、D、E等
}
cout<<"Enter ArrivalTime: ";
for (i=0;i<n;i++){
cin>>RRarray[i].ArrivalTime;
}
cout<<"Enter ServiceTime: ";
for (i=0;i<n;i++){
cin>>RRarray[i].ServiceTime;
}
//根据达时间排序
for(i=0;i<n;i++) {
for(j=i+1;j<n;j++) {
if(RRarray[i].ArrivalTime > RRarray[j].ArrivalTime) {
temp = RRarray[i];
RRarray[i] = RRarray[j];
RRarray[j] = temp;
}
}
}
}
//执行RR调度算法
void RRfunction(){
char Moment[100]; //存储每个时间片p对应的进程名称
RRqueue.push(RRarray[0]); //第一个进程进队列
int MomentPoint = 0;
int CurrentTime=0;
int tempTime; //控制CurrentTime的累加时间,当前进程的服务时间小于时间片q的时候,起到重要作用
int i=1,j; //指向还未处理的进程的下标
int finalNumber = 0; //执行RR算法后,进程的个数
int Time[50];
bool canAdd=false;//用于解决CurrentTime在第一个进程完成计算时多加了一次服务时间的问题
//判断第一个进程的服务时间是否大于时间片,如果大于CurrentTime=q,如果小于CurrentTime=服务时间
if (RRarray[0].ServiceTime>=q)
CurrentTime = q;
else

最低0.47元/天 解锁文章
8196

被折叠的 条评论
为什么被折叠?



