高响应比调度算法

合集下载

高响应比优先调度算法

高响应比优先调度算法

高响应比优先调度算法
高响应比优先调度算法是一种计算机进程调度算法,它的主要目的是将资源分配给最需要的进程,从而提高系统的性能。

高响应比优先调度算法是一种抢占式调度算法,它是基于进程的响应比来决定哪个进程应该被调度,响应比定义为进程等待时间与服务时间之比。

这意味着,如果一个进程的等待时间更长,它的响应比就会更高,因此,它有更大的机会被调度。

高响应比优先调度算法的优势在于,由于它可以更准确地确定哪些进程应该被调度,从而有效地消除浪费,提高系统的性能。

此外,它还可以有效地避免处理比较耗时的进程,从而提高系统整体性能。

然而,高响应比优先调度算法也有一些缺点。

首先,由于它是一种抢占式调度算法,因此它可能会增加进程的上下文切换次数,这会降低系统的整体性能。

其次,由于它是基于响应比的,因此它可能会优先处理更短的进程,而忽略更长的进程,从而影响系统的效率。

总之,高响应比优先调度算法是一种有效的进程调度算法,它可以有效地提高系统性能,但也有一定的缺点,需要用户慎重考虑。

高响应比优先调度算法

高响应比优先调度算法

高响应比优先调度算法
1 什么是高响应比优先调度算法
高响应比优先调度算法(也称为HRRN算法)是一种用于调度作业
的排队策略,它重点关注已经等待了较长时间的作业。

它根据作业的
响应比(response ratio)来排序作业,响应比反映作业的等待时间。

HRRN的目的是在作业的服务时间和系统的性能之间进行平衡,从而提
高系统的效率和作业的响应时间。

2 HRRN 算法的原理
HRRN算法的基本原理是按照作业的响应比排序,其公式如下:
响应比 = (等待时间 + 服务时间) / 已等待时间
也就是说,响应比是作业等待时间和服务时间的比值,用来衡量
排队等待时间与作业完成时间之间的关系。

HRRN算法把等待时间越长
的作业优先选择,也就是说,整个系统会尽可能花更多的时间在等待
时间较长的作业上,以减轻作业的响应时间。

3 HRRN 算法的 the 优点
1.HRRN算法把等待时间较长的作业优先考虑,从而提高系统的效率,减轻作业的响应时间;
2.HRRN 算法非常灵活,可以根据实际情况,调整等待时间和服务
时间的比值,从而达到最佳的调度效果;
3.HRRN算法的算法比较简单,实现起来也比较容易。

4 HRRN 算法的缺点
1.HRRN算法由于过于关心等待时间较长的作业,因此作业的处理时间会有偏差,某些新的作业需要等待很长时间才能被处理;
2.HRRN算法不能很好地考虑系统中的吞吐量,因此如果系统中有大量的小作业,系统的吞吐量会受影响;
3.HRRN算法不能很好地考虑系统中的可靠性,因此在一些可靠性要求较高的应用场景中,HRRN算法可能不太合适。

高响应比优先调度算法

高响应比优先调度算法

高响应比优先调度算法
高响应比优先调度算法(HRRN)是一种多任务调度策略,它将任务按照它们的响应比(Response Ratio)来进行排序,响应比由当前时间(Current Time)和上次服务时间(Last Service Time)组成,它体现了任务等待时间以及服务时间的比值。

HRRN算法通过比较任务的响应比,将等待时间长的任务放在队列的前面,从而提高系统的响应时间。

HRRN算法的优势在于它能够更好地满足多任务的需求,它能够有效地减少等待时间,提高系统的效率,使系统能够更好地满足客户的需求。

HRRN算法的实现步骤如下:
1. 计算每个任务的响应比(R),R=(当前时间-上次服务时间)/服务时间;
2. 将任务按照响应比从高到低进行排序;
3. 从队列中取出响应比最高的任务,分配给处理器进行处理;
4. 如果任务还没有完成,就将它重新放回队列,等待下次调度;
5. 当任务完成后,更新每个任务的响应比,重新排序,重复以上步骤。

总之,HRRN算法是一种高效的多任务调度策略,它能够有效地提高系统的响应时间,满足客户的需求,实现良好的任务调度效果。

先来先服务,短作业优先,高响应比进程调度算法的实现

先来先服务,短作业优先,高响应比进程调度算法的实现

先来先服务,短作业优先,⾼响应⽐进程调度算法的实现⼀、实验内容编程实现先来先服务算法、短作业优先算法、⾼响应⽐算法,并求出每个作业的完成时间、周转时间、带权周转时间,及平均周转时间、平均带权周转时间。

⼆、实验要求1.任选⼀种⾼级语⾔实现;2.选择FCFS、SJF、HRRN调度算法;3.能够输⼊进程的基本信息,如进程名、提交时间、预估运⾏时间等;4.根据选择的调度算法显⽰进程调度顺序;5.显⽰完成调度后每个进程的开始时间、完成时间呢、周转时间,带权周转时间;6.计算平均周转时间和平均带权周转时间;三、实验过程1、设计思想FCFS算法对提交时间进⾏排序,按提交时间从⼩到⼤的顺序调度,SJF算法从第⼆个进程开始计算找出当前处在就绪等待队列的进程,并找出其中运⾏时间最短的作为下次调度的进程,HRRN算法从第⼆个进程开始计算找出当前处在就绪等待队列的进程,并找出其中响应⽐最⼩的作为下次调度的进程2.运⾏结果四、实验代码#include<iostream>#include<Windows.h>#include<stdio.h>#include<stdlib.h>#include <time.h>#define N 5using namespace std;struct Mystruct{float arrivetime;float runtime;float starttime;float waittime;float endtime;float turnaroundtime;float rightturnaroundtime;}Thread[N];void sort(struct Mystruct Thread[]) {//按进程到达时间排序for (int i = 0; i < N; i++) {for (int j = 0; j < N - 1; j++) {if (Thread[j].arrivetime > Thread[j + 1].arrivetime) {float t1 = Thread[j + 1].arrivetime;Thread[j + 1].arrivetime = Thread[j].arrivetime;Thread[j].arrivetime = t1;float t2 = Thread[j + 1].runtime;Thread[j + 1].runtime = Thread[j].runtime;Thread[j].runtime = t2;}}}}float JRR(float i, float j, float k) {//计算响应⽐float s = (i - j + k) / k;//cout << i << " " << j << " " << k << "响应⽐" << s << endl;return s;}void RRsort(int i) {//找出最⼩响应⽐进程的下标与下次要运⾏的进程交换次序,使处在就绪状态响应⽐最⼩的进程下次运⾏int next = 0;float min = 30;for (int j = i + 1; j < N; j++){if (Thread[j].arrivetime <= Thread[i].endtime) {float RR;// cout << Thread[i].endtime << endl;if (i != 4)RR = JRR(Thread[i].endtime, Thread[j].arrivetime, Thread[j].runtime);if (RR < min)//找出最⼩响应⽐{min = RR;next = j;}}}Mystruct temp;temp = Thread[i + 1];Thread[i + 1] = Thread[next];Thread[next] = temp;}void FCFS() {int count = 0;cout << "==========================先来先服务算法调度==========================" << endl;sort(Thread);float avewaittime = 0,aveturnaroundtime=0,averightturnaroundtime=0;cout << "作业号" << "\t" << "提交时间" << "\t" << "运⾏时间" << "\t" << "开始时间" << "\t" << "等待时间" << "\t" << "完成时间"<<"\t" << "周转时间" << " \t" << "带权周转时间" << endl;for (int i = 0; i < N; i++){count++;if (count == 1)Thread[i].starttime = Thread[i].arrivetime; else Thread[i].starttime=Thread[i-1].starttime+Thread[i-1].runtime;if (Thread[i].starttime<Thread[i].arrivetime){Thread[i].starttime = Thread[i].arrivetime;}Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;avewaittime += Thread[i].waittime; aveturnaroundtime += Thread[i].turnaroundtime; averightturnaroundtime += Thread[i].rightturnaroundtime;cout <<count<<"\t" <<Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thr ead[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;}cout << "平均等待时间:" << avewaittime / N << "\t" << "平均周转时间:" << aveturnaroundtime/N << "\t" << "平均带权周转时间:" << averightturna roundtime / N << endl;}void SJF(struct Mystruct Thread[]){float avewaittime = 0, aveturnaroundtime = 0, averightturnaroundtime = 0;for (int m = 0; m < N - 1; m++){if (m == 0)Thread[m].endtime = Thread[m].arrivetime + Thread[m].runtime;else{if (Thread[m - 1].endtime >= Thread[m].arrivetime){Thread[m].starttime = Thread[m - 1].endtime;}else{Thread[m].starttime = Thread[m].arrivetime;}Thread[m].endtime = Thread[m].starttime + Thread[m].runtime;}int i = 0;for (int n = m + 1; n <= N - 1; n++){if (Thread[n].arrivetime <= Thread[m].endtime)i++;}//按运⾏时间排序float min = Thread[m + 1].runtime;int next = m + 1;//m+1=nfor (int k = m + 1; k < m + i; k++){if (Thread[k + 1].runtime < min){min = Thread[k + 1].runtime;next = k + 1;}}// cout << min << endl;Mystruct temp;temp = Thread[m + 1];Thread[m + 1] = Thread[next];Thread[next] = temp;}int count = 0;cout << "==========================短作业优先算法调度==========================" << endl;cout << "作业号" << "\t" << "提交时间" << "\t" << "运⾏时间" << "\t" << "开始时间" << "\t" << "等待时间" << "\t" << "完成时间" << "\t" << "周转时间" << " \t" << "带权周转时间" << endl;for (int i = 0; i < N; i++){count++;if (count == 1){Thread[i].starttime = Thread[i].arrivetime;Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;cout << count << "\t" << Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;}else{Thread[i].starttime = Thread[i - 1].starttime + Thread[i - 1].runtime;if (Thread[i].starttime < Thread[i].arrivetime){Thread[i].starttime = Thread[i].arrivetime;}Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;avewaittime += Thread[i].waittime; aveturnaroundtime += Thread[i].turnaroundtime; averightturnaroundtime += Thread[i].rightturnaroundtime;cout << count << "\t" << Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;}}cout << "平均等待时间:" << avewaittime / N << "\t" << "平均周转时间:" << aveturnaroundtime / N << "\t" << "平均带权周转时间:" << averightturn aroundtime / N << endl;}void HRRN(struct Mystruct Thread[]){int count = 0;float avewaittime = 0, aveturnaroundtime = 0, averightturnaroundtime = 0;cout << "==========================⾼响应⽐算法调度==========================" << endl;cout << "作业号" << "\t" << "提交时间" << "\t" << "运⾏时间" << "\t" << "开始时间" << "\t" << "等待时间" << "\t" << "完成时间" << "\t" << "周转时间" << "\t" << "带权周转时间" << endl;for (int i = 0; i < N; i++){count++;if (count == 1)Thread[i].starttime = Thread[i].arrivetime; else Thread[i].starttime = Thread[i - 1].starttime + Thread[i - 1].runtime;if (Thread[i].starttime < Thread[i].arrivetime){Thread[i].starttime = Thread[i].arrivetime;}Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;RRsort(i);//找出处在等待的最⼩响应⽐的进程下次运⾏Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;avewaittime += Thread[i].waittime; aveturnaroundtime += Thread[i].turnaroundtime; averightturnaroundtime += Thread[i].rightturnaroundtime;cout << count << "\t" << Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << T hread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;}cout << "平均等待时间:" << avewaittime / N << "\t" << "平均周转时间:" << aveturnaroundtime / N << "\t" << "平均带权周转时间:" << averightturn aroundtime / N << endl;}int main() {srand((int)time(0));for (int i = 0; i < N; i++) {Thread[i].arrivetime = rand() % 20;Thread[i].runtime = rand() % 20 + 1;}FCFS();SJF(Thread);HRRN(Thread);return 0;}五、实验总结通过本次实验我更加了解了先来先服务算法、短作业优先算法、⾼响应⽐算法,通过带权周转时间的计算知道了FCFS算法对长作业有利,对短作业不利,SJF算法对短作业有利,对长作业不利,在所有进程同时可运⾏是采⽤SJF算法的平均等待时间、平均周转时间最少。

调度的调度算法实验报告

调度的调度算法实验报告

调度的调度算法实验报告调度的调度算法实验报告引言:调度是计算机科学中一个重要的概念,它涉及到任务分配、资源管理和优化等方面。

调度算法则是实现调度的关键,它决定了任务的执行顺序和资源的分配方式。

在本次实验中,我们将探讨几种常见的调度算法,并通过实验对其性能进行评估和比较。

一、先来先服务算法(FCFS)先来先服务算法是最简单的调度算法之一,它按照任务到达的先后顺序进行处理。

实验中,我们模拟了一个任务队列,每个任务有不同的执行时间。

通过实验结果可以看出,FCFS算法的优点是简单易懂,但当任务的执行时间差异较大时,会导致平均等待时间较长。

二、最短作业优先算法(SJF)最短作业优先算法是一种非抢占式调度算法,它根据任务的执行时间来进行排序。

实验中,我们将任务按照执行时间从短到长进行排序,并进行调度。

实验结果显示,SJF算法的优点是能够最大程度地减少平均等待时间,但当任务的执行时间无法预测时,该算法可能会导致长任务等待时间过长的问题。

三、时间片轮转算法(RR)时间片轮转算法是一种抢占式调度算法,它将任务分为多个时间片,并按照顺序进行调度。

实验中,我们设置了每个时间片的长度,并将任务按照到达顺序进行调度。

实验结果表明,RR算法的优点是能够公平地分配资源,但当任务的执行时间超过一个时间片时,会导致上下文切换频繁,影响系统的性能。

四、最高响应比优先算法(HRRN)最高响应比优先算法是一种动态调度算法,它根据任务的等待时间和执行时间来计算响应比,并选择响应比最高的任务进行调度。

实验中,我们根据任务的到达时间、执行时间和等待时间计算响应比,并进行调度。

实验结果显示,HRRN算法能够在一定程度上平衡长任务和短任务的等待时间,但当任务的执行时间过长时,会导致其他任务的等待时间过长。

五、多级反馈队列算法(MFQ)多级反馈队列算法是一种综合性的调度算法,它将任务分为多个队列,并根据任务的执行情况进行调度。

实验中,我们设置了多个队列,并根据任务的执行时间和等待时间进行调度。

高响应比调度算法

高响应比调度算法

高响应比调度算法1.计算响应比:每个进程的响应比定义为(等待时间+服务时间)/服务时间。

等待时间是指进程已经等待的时间,服务时间是指进程已经运行的时间。

2.选择响应比最高的进程:从就绪队列中选择响应比最高的进程,即响应比最大的进程。

3.执行进程:执行选择的进程,直至进程完成或者被阻塞。

4.更新等待时间:当进程进入等待状态时,更新等待时间。

5.重复执行以上步骤直至所有进程完成。

```c#include <stdio.h>//进程结构体typedef structint process_id; // 进程号int response_ratio; // 响应比} Process;//计算第一个进程的等待时间for (int i = 1; i < n; i++)//计算进程的等待时间//计算总的等待时间//更新响应比}void high_response_ratio_scheduling(Process *processes, int n)Process selected_process;while (1)int max_response_ratio = 0;int selected_process_index = -1;//选择响应比最高的进程for (int i = 0; i < n; i++)max_response_ratio = processes[i].response_ratio;selected_process_index = i;}}//如果没有进程可以选择,跳出循环if (selected_process_index == -1)break;}selected_process = processes[selected_process_index];//执行进程printf("正在执行进程 %d\n", selected_process.process_id); //更新状态}int mai//进程数int n = 3;//进程数组Process processes[n];//初始化进程信息processes[0].process_id = 1;processes[1].process_id = 2;processes[2].process_id = 3;//计算等待时间和响应比//高响应比调度high_response_ratio_scheduling(processes, n);return 0;```总结:高响应比调度算法是一种有效的实时调度算法,能够提高系统的响应速度和效率。

hrrn调度算法

hrrn调度算法

hrrn调度算法HRRN调度算法是一种基于响应比的进程调度算法,全称为Highest Response Ratio Next。

它是一种非抢占式调度算法,即一个进程被分配到CPU后,直到完成或等待IO操作时才会被剥夺CPU的使用权。

HRRN调度算法的核心思想是根据进程等待时间和服务时间的比值来计算响应比,响应比越高的进程将会被先执行。

这样可以保证长时间等待的进程能够得到更多的CPU时间片,并且不会出现饥饿现象。

具体来说,每个进程都有一个等待时间和服务时间,等待时间表示该进程已经在就绪队列中等待了多长时间,服务时间表示该进程需要执行多长时间才能完成。

那么响应比R=(W+T)/T,其中W表示等待时间,T表示服务时间。

当一个新的进程加入就绪队列时,系统首先计算每个就绪进程的响应比,并选择响应比最高的那个进程执行。

HRRN调度算法有以下优点:1. 公平性强:HRRN调度算法能够保证每个就绪进程都有机会得到CPU资源,并且长期等待的进程能够得到更多资源。

2. 响应速度快:由于HRRN调度算法考虑了等待时间和服务时间的比值,因此能够更快地响应进程请求,减少进程等待时间。

3. 避免饥饿现象:HRRN调度算法能够避免短作业优先算法中的饥饿现象,保证每个就绪进程都有机会得到CPU资源。

但是HRRN调度算法也存在一些缺点:1. 计算量大:由于需要计算每个就绪进程的响应比,因此需要进行大量的计算,导致系统开销较大。

2. 无法处理长作业:如果有一个长时间运行的进程占用了CPU资源,那么其他短作业将会被迫等待很长时间才能得到CPU资源。

总之,HRRN调度算法是一种高效、公平、避免饥饿现象的进程调度算法。

它能够更好地满足多任务操作系统中对于公平性和响应速度的要求。

高响应比优先调度算法求平均周转时间

高响应比优先调度算法求平均周转时间

高响应比优先调度算法求平均周转时间
高响应比优先调度算法(Highest Response Ratio Next, HRRN)是一种动态调度算法,它通过计算作业的响应比来决定下一个要执行的作业。

响应比越高,说明该作业等待时间越久,优先级越高,会被优先调度。

计算响应比的公式为:响应比 = (等待时间 + 需要时间) / 需要
时间。

假设有n个作业,每个作业的需要时间为t[i],等待时间为
w[i],则平均周转时间可以通过以下公式计算:
平均周转时间 = (总周转时间) / n,其中总周转时间等于每个
作业的周转时间之和。

具体计算方法如下:
1. 初始化总周转时间为0。

2. 对于每个作业i,计算其响应比R[i] = (w[i] + t[i]) / t[i]。

3. 选择响应比最高的作业i,并将其执行。

4. 更新作业的等待时间,等待时间等于之前所有执行过的作业的运行时间之和。

5. 更新总周转时间,总周转时间等于作业i的周转时间加上之
前的总周转时间。

6. 重复步骤3-5,直到所有作业都被执行完毕。

7. 计算平均周转时间,平均周转时间等于总周转时间除以作业的数量。

需要注意的是,高响应比优先调度算法可能存在饥饿问题,即某些作业一直无法得到执行。

为了解决这个问题,可以采用一些策略来提高低优先级作业的执行机会,例如引入时间片轮转算法或者动态调整响应比的计算公式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

淮北师范大学计算机学院实验设计报告操作系统程序设计实验报告实验课题:高响应比调度算法所属学院:计算机科学与技术所属班级:11级计算机非师**:*******:***2014年3月20日目录实验设计课题 (03)课程设计目的 (03)课程设计内容 (03)课程设计要求 (04)相关知识介绍 (05)程序功能说明 (06)各段程序说明 (07)设计的流程图 (09)程序执行截图 (11)源程序的代码 (14)实验小结体会 (19)实验设计课题设计题目:采用高响应比算法的进程调度程序指导老师:施汉琴课程设计目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

•进一步巩固和复习操作系统的基础知识。

•培养学生结构化程序、模块化程序设计的方法和能力。

•提高学生调试程序的技巧和软件设计的能力。

•提高学生分析问题、解决问题以及综合利用 C 语言进行程序设计的能力。

课程设计内容问题分析:在批处理系统中,短作业优先算法是一种比较好的算法,其主要的不足之处是长作业的运行得不到保证。

于是我们想到了一种办法解决这个问题,就是引用动态优先权、并使作业的优先级随着等待时间的增加而以速率a提高,长作业在等待一定的时间后,必然有机会分配到处理机,这样长作业也得到了运行。

由此可见:(1)如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因此该算法有利于短作业。

(2)当要求服务的时间相同时,作业的优先权取决与其等待的时间,等待时间越长,其优先权越高,因而它实现的是先来先服务。

(3)对于长作业,作业的优先权可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高,从而也可以获得处理机。

设计内容:设计并实现一个采用高响应比算法的进程调度演示程序,响应比 R 定义如下:RWT/T1W/T 其中 T 为该作业估计需要的执行时间,为作业在后备状态队列中的等待时 W间。

每当要进行作业调度时,系统计算每个作业的响应比,选择其中 R最大者投入执行。

这样,即使是长作业,随着它等待时间的增加,W/T 也就随着增加,也就有机会获得调度执行。

这种算法是介于 FCFS 和 SJF 之间的一种折中算法。

由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF 法,从而采用 HRRN 方式时其吞吐量将小于采用 SJF 法时的吞吐量。

另外,由于每次调度前要计算响应比,系统开销也要相应增加。

课程设计要求1.每一个进程有一个PCB,其内容可以根据具体情况设定。

2.进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定3.可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、进程优先级的初始化4.可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互斥资源与进程间的同步关系,故只有两种状态)5.采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列6.有性能比较功能,可比较同一组数据在不同调度算法下的平均周转时间7.具有一定的数据容错性相关知识介绍定义高响应比优先调度算法的基本思想是把CPU分配给就绪队列中响应比最高的进程。

基本思想短作业优先调度算法+ 动态优先权机制,既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。

原理高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。

该算法中的响应比是指作业等待时间与运行比值,响应比公式定义如下:响应比=(等待时间+要求服务时间)/ 要求服务时间,即RR=(w+s)/s=1+w/s,因此响应比一定是大于1的。

如实例:某系统有3个作业,系统确定它们在全部到达后,再开始采用响应比高者优先的调度算法,则它们的调度顺序是什么?各自的周转时间是什么?作业号提交时间运行时间1 8.8 1.52 9.0 0.43 9.5 1.0(1)如果都到达再算的话,等待时间=最后一个的提交时间-该作业到达的时刻1: 9.5-8.8=0.72: 9.5-9=0.53: 0所以响应比为(等待时间+要求服务时间)\要求服务时间=等待时间/要求服务时间+11: 0.7/1.5+1=1.472: 0.5/0.4+1=2.253:1所以2先运行,2从9.5开始运行到9.9结束;再以9.9时刻算响应比:1:(9.9-8.8)/1.5+1=1.733:(9.9-9.5)/1+1=1.4所以2执行完后1开始执行,从9.9执行到11.4结束最后一个是3:从11.4开始执行到12.4结束(2)如果不是都到达后才运行,那么在8.8时只有作业1到达,所以先运行作业18.8+1.5(运行时间)=10.3到10.3的时候作业1完成,此时作业2和3都已到达所以计算其响应比(等待时间+要求服务时间)\要求服务时间=等待时间/要求服务时间+1作业2:(10.3-9.0)/0.4+1=4.325作业3:(10.3-9.5)/1.0+1=1.8所以先运行作业210.3+0.4=10.7到10.7运行作业310.7+1.0=11.7到11.7结束优缺点短作业与先后次序的兼顾,且不会使长作业长期得不到服务响应比计算系统开销,增加系统开销。

适用场合批处理系统。

程序功能说明程序通过定义调用函数,杜如用户从键盘输入的需要服务的进程的各项参数,并进行调度算法模拟。

首相对读入的进程各个参数进行保存,而后进行判断是否进入内存之中,如果在内存之中则进行高响应比优先的的方式进行排队服务运行,如果没有进入内存,则进程等待。

直到所有进程服务运行完毕为止。

各个函数都有各自的功能,相互协调进行整体函数功能的实现。

采用响应比高者优先调度算法进行调度时,必须计算出系统中所有满足必要条件作业的响应比,从中选择响应比最高的一个作业装入主存储器分配资源。

由于是实验,所以就将作业控制块出队,并输出作业名代替装入处存储器,同时修改系统的资源数量。

各段程序说明首先进行函数相关参数定义,具体函数如下:struct P{char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};定义函数参数中进程的名字“name”、进程到达的时间“arrivetime”、进程所需服务时间“servicetime”、以及处理时间“starttime”和完成时间“finishtime”。

Input函数接收用户键盘输入的进程各个参数并作为函数后期执行的引用数据,包括进程的名称、到达时间、要求服务时间。

for(i=0;i<=N-1;i++){printf("请输入第%d个进程的进程名: \n",i+1);scanf("%s",&p[i].name);printf("请输入第%d个进程的到达时间:\n",i+1);scanf("%f",&p[i].arrivetime);printf("请输入第%d个进程的要求服务的时间:\n",i+1);scanf("%f",&p[i].servicetime);由此函数可实现对用户所输入的数据的接收功能。

sort(P *p,int N),run(P *p,int N)函数实现对进程响应比的计算和排序。

首先利用公式“优先权=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间”计算用户输入的进程的响应比,函数实现如下:for(int i=0;i<N-1;i++)for(int j=i+1;j<N;j++)if(p[i].arrivetime>p[j].arrivetime){P temp;temp=p[i];p[i]=p[j];p[j]=temp;}int k;for(k=0;k<=N-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}for(k=0;k<=N-1;k++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servicetime;}计算的响应比进行比较,结果根据需要进行排序响应比高的进程排在前面,响应比低的进程排在后面,这样就可以使响应比搞得进程获得较高的优先权,能够先运行。

最后通过函数Grade(P *p,int N)来实现输出进程在各个时间短的运行状况,包括正在运行,正在等待和已到达状态。

设计的流程图程序设计总流程图:返回这一次要执行的作业程序执行截图用户手动输入进程的各项信息:确定后程序执行输出如下图:源程序的代码#include <stdio.h>struct P{char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};P a[100];void input(P *,int);void Traverse(P *,int);void sort(P *,int);void Grade(P *,int);void main(){int N;printf("\n");printf("\t\t\t模拟高响应比调度算法\n");printf("\n");printf("NOW!模拟开始:\n");printf("\n");printf("请输入需要服务的进程的个数:\n");scanf("%d",&N);Grade(a,N);}void input(P *p,int N){int i;for(i=0;i<=N-1;i++){printf("请输入第%d个进程的进程名: \n",i+1);scanf("%s",&p[i].name);printf("请输入第%d个进程的到达时间:\n",i+1);scanf("%f",&p[i].arrivetime);printf("请输入第%d个进程的要求服务的时间:\n",i+1);scanf("%f",&p[i].servicetime);}}void Traverse(P *p,int N){int k;printf("\n");printf("\n");printf("进程运行的顺序为:");printf("%s",p[0].name);for(k=1;k<N;k++){printf("->%s",p[k].name);}printf("\n");printf("\n");printf("进程运行的详细信息如下:\n");printf("名称到达时间服务时间开始时间结束时间\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].ser vicetime,p[k].starttime,p[k].finishtime);}printf("名称周转时间带权周转时间\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t\n",p[k].name,p[k].zztime,p[k].dqzztime);}}void sort(P *p,int N){for(int i=0;i<N-1;i++)for(int j=i+1;j<N;j++)if(p[i].arrivetime>p[j].arrivetime){P temp;temp=p[i];p[i]=p[j];p[j]=temp;}}void run(P *p,int N){int k;for(k=0;k<=N-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}for(k=0;k<=N-1;k++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servicetime;}}void Grade(P *p,int N){float arrivetime=0;float servicetime=0;float starttime=0;float finishtime=0;float zztime=0;float dqzztime=0;sort(p,N);printf("\n");printf("\n");for(int m=0 ; m<N-1 ; m++){if(m==0){p[m].finishtime=p[m].arrivetime+p[m].servicetime;printf("在第%-.0f时刻进程信息\n",p[m].arrivetime);}else{p[m].finishtime=p[m-1].finishtime+p[m].servicetime;printf("在第%-.0f时刻进程信息\n",p[m-1].finishtime);}int i=0,n;printf("%s正在运行\n",p[m].name);for(n=m+1;n<=N-1;n++){if(p[n].arrivetime<=p[m].finishtime){printf("%s进程已到达\n",p[n].name);i++;}elseprintf("%s进程未到达\n",p[n].name);}for(int l=0;l<m;l++){printf("%s进程已完成\n",p[l].name);}float max=(p[m].finishtime-p[m+1].arrivetime)/p[m+1].servicetime; int follow=m+1;for(int k=m+1;k<m+i;k++){if(max<=(p[m].finishtime-p[k+1].arrivetime)/p[k+1].servicetime) {max=(p[m].finishtime-p[k+1].arrivetime)/p[k+1].servicetime;follow=k+1;}}P temp;temp=p[m+1];p[m+1]=p[follow];p[follow]=temp;}run(p,N);Traverse(p,N);}实验小结体会本次课程设计题目较为简单,主要是对优先级和最高响应比这两个算法的理解和对进程调度的功能以及进程调度算法有深入的理解。

相关文档
最新文档