1. 问题描述及需求分析
设计程序模拟进程的高响应比 HRRN 和时间片轮转 RR 调度过程。假设有
n 个进程分别在 T1, … ,Tn 时刻到达系统,它们需要的服务时间分别为
S1, … ,Sn。如果选择 RR 算法,还需要指定时间片大小 q。分别采用高响应
比 HRRN 和时间片 RR 进程调度算法进行调度,计算每个进程的完成时间,周
转时间、带权周转时间和等待时间,并且统计 n 个进程的平均周转时间、平
均带权周转时间和平均等待时间。最后,对两个算法做出比较评价。
2. 实验设计
HRRN(hignest response ratio next),该算法既考虑了作业的等待时
间过长,又考虑了作业的运行时间,既照顾了短作业,又不致使长作业等待
时间过长,从而改善了处理机调度的性能。我们引入一个动态优先级,即优
先级是可以改变的,令他随等待时间延长而增加,这将使长作业的优先级在
等待期间不断的增加,等到足够的时间后,必然有机会获得处理机。该优先
级的变化规律可以描述为:
优先权 =(等待时间+要求服务时间)/要求服务时间
=1+等待时间/要求服务时间
1、如果作业的等待时间相同,则要求服务的时间越短,其优先级越高,
类似于 SJF 算法。
2、当要求服务的时间相同时,作业的优先权又可以决定于其等待时间,
类似于 FCFS 算法。
3、对于长作业的优先级,可以随等待时间的增加而提高,当其等待时间
足够长时,也可以获得处理机。
在 RR 中,系统根据 FCFS 策略,将所有的就绪进程排成一个就绪队列,
并可设置每个一定时间间隔(20ms)即产生一次中断,激活系统中的进程调
度程序,完成一次调度,将 CPU 分配给队首进程,令其执行。当该进程的时
间片耗尽或者运行完毕后,系统再次将 CPU 分配给新的队首进程(或新到达
的紧迫进程)。由此,可保证就绪队列中的所有进程在一个确定的时间段内,
都能够获得一次 CPU 执行。
在 RR 调度算法中,应在何时进行进程的切换,可分为两种情况:①若一
个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将
他从就绪队列删除,再调度就绪队列中队首的其他进程运行,并启动一个新
的时间片。②在一个时间片用完时,计时器阻断处理程序被激活。如果进程
尚未运行完毕,调度程序把他送往就绪队列的末尾。
{
if (1 == flag)
{
}
return arrivaltime;
else if (2 == flag)
{
}
return servicetime;
else if(3==flag)
{
}
return prior;
else if (4 == flag)
return waittime;
{
}
}
//构造函数,初始化进程
PCBNode() = default;
PCBNode(char nameP, float arrivaltimeP, float servicetimeP)
:name(nameP),
arrivaltime(arrivaltimeP),
servicetime(servicetimeP),
remainingtime(servicetimeP)
rrtime(servicetimeP),
waittime = 0;
{
}
};
//按到达时间排序
void sort(vector
& 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].arrivaltime < pcbs[i].arrivaltime)
index = j;
}
if (index != i){
PCBNode temp;
temp = pcbs[i];
pcbs[i] = pcbs[index];
pcbs[index] = temp;
}
}
}
void PCBNode::display() const {
cout << setw(2) << name
<
}
//计算周转时间
float PCBNode::ct1() {
return finishtime - arrivaltime;
}
//计算带权周转时间
float PCBNode::ct2() {
return (finishtime - arrivaltime) / servicetime;
}
class Manage
{
public:
vector
ProcessList;
//初始进程列表
vector RRProcess;
//作为中间桥梁
vector RunProcess;
//用来存放运行的进程
vector FinallProcess; //存放最终结果
float allroundtime;
float allweightroundtime;
float averroundtime;
float averweighttime;
void add(PCBNode &val)
{
}
ProcessList.push_back(val);
//取得平均带权时间和平均带权周转时间
void AverageTime(vector ProcessList)
{
allroundtime = 0, allweightroundtime = 0;
for (size_t i = 0; i < ProcessList.size(); i++)
{
allroundtime
=
allroundtime
ProcessList[i].roundtime;
allweightroundtime
=
allweightroundtime
+
+
ProcessList[i].weighttime;
}
averroundtime = allroundtime / ProcessList.size();
averweighttime = allweightroundtime / ProcessList.size();
cout << "平均带权时间:" << averroundtime << endl;
cout << "平均带权周转时间:" << averweighttime << endl;
}
void Prior_HRRN(int i, const int tag)
{
for (; i < ProcessList.size(); i++)
{
if
(ProcessList[i].arrivaltime
ProcessList[tag].finishtime)
{
ProcessList[i].waittime
ProcessList[tag].finishtime - ProcessList[i].arrivaltime;
}
else
{
}
ProcessList[i].waittime = 0;
ProcessList[i].finishtime
ProcessList[i].servicetime
+
ProcessList[i].waittime
ProcessList[i].arrivaltime;
<
=
=
+
ProcessList[i].roundtime = ProcessList[i].finishtime
- ProcessList[i].arrivaltime;
ProcessList[i].weighttime = ProcessList[i].roundtime