logo资料库

操作系统实验四------进程调度.docx

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
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 调度算法中,应在何时进行进程的切换,可分为两种情况:①若一 个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将
他从就绪队列删除,再调度就绪队列中队首的其他进程运行,并启动一个新 的时间片。②在一个时间片用完时,计时器阻断处理程序被激活。如果进程 尚未运行完毕,调度程序把他送往就绪队列的末尾。
3. 实验代码 #include #include #include #include #include #include using namespace std; class PCBNode { friend void sort(vector&); friend void RR(vector&, const float&); public: char name; //进程名 float arrivaltime; //到达时间 float servicetime; //运行时间 float remainingtime;//剩余服务时间 float waittime; //等待时间 float finishtime; //完成时间 float roundtime; //周转时间 float weighttime; //带权周转时间 float prior; //优先级 float rrtime; //时间片轮转法的完成标记 int flag; //只是标记默认排序的方式 deque readyQueue; //双端队列 void display() const; //显示进程信息 bool crt(float rr); //计算剩余时间 void cft(float time); //计算结束时间 float ct1(); float ct2(); //计算周转时间 //计算带权周转时间 operator float() const
{ 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
分享到:
收藏