级法最高响应比优先调度算法报告Word文件下载.docx
《级法最高响应比优先调度算法报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《级法最高响应比优先调度算法报告Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
进程调度模拟设计——优先级法、最高响应比优先调度算法
初始条件:
1.预备内容:
阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
1设计题目————————————————1
2需求分析————————————————1
2.1功能需求——————————————————1
2.1.1进程调度模拟设计优先级法—————------------1
2.1.2进程调度模拟设计最高响应比优先调度算法————--2
2.2环境需求——————————————————2
2.3用户界面需求————————————————2
3功能设计————————————————3
1
2
3
3.1数据结构——————————————————3
3.2模块说明——————————————————3
4开发平台及源程序的主要部分———————4
4.1开发平台——————————————————4
4.2源程序主要部分———————————————4
5测试用例,运行结果与运行情况分析————8
5.1测试用例——————————————————8
5.2运行结果——————————————————8
5.3运行情况分析————————————————11
6自我评价与总结—————————————11
4
5
1.设计题目
1.优先级法、最高响应比优先调度算法
2.需求分析
2.1功能需求
2.1.1实现优先级法:
优先级法可被用作作业或进程的调度策略。
首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。
该算法的核心是确定进程或作业的优先级。
确定优先级的方法可分为静态法和动态法。
静态法根据作业或进程的静态特性,在作业或进程开始执行之前就确定它们的优先级,一旦开始执行之后就不能改变。
动态法则不然,它把作业或进程的静态特性和动态特性结合起来确定作业或进程的优先级,随着作业或进程的执行过程,其优先级不断变化。
静态优先级
作业调度中的静态优先级大多按以下原则确定:
(1)由用户自己根据作业的紧急程度输入一个适当的优先级。
为防止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用。
(2)由系统或操作员根据作业类型指定优先级。
作业类型一般由用户约定或由操作员指定。
例如:
可将作业分为:
I/O繁忙的作业,
CPU繁忙的作业,
I/O与CPU均衡的作业,
一般作业,等等。
系统或操作员可以给每类作业指定不同的优先级。
(3)系统根据作业要求资源情况确定优先级。
例如根据估计所需处理机时间、内存量大小、I/O设备类型及数量等,确定作业的优先级。
进程的静态优先级确定原则可以是:
(1)按进程的类型给予不同的优先级。
例如,在有些系统中,进程被划分为系统进程和用户进程。
系统进程享有比用户进程高的优先级。
对于用户进程来说,则可以分为:
I/O繁忙的进程,
CPU繁忙的进程,
I/O与CPU均衡的进程,
其他进程。
对系统进程,也可以根据其所要完成的功能划分为不同的类型,例如,调度进程、I/O进程、中断处理进程、存储管理进程等。
这些进程还可进一步划分为不同类型和赋予不同的优先级。
例如,在操作系统中,对于键盘中断的处理优先级和对于电源掉电中断的处理优先级是不相同的。
(2)将作业的静态优先级作为它所属进程的优先级。
2.1.2实现最高响应比优先调度算法:
最高响应比优先法(HRN)是对FCFS方式和SJF方式的一种综合平衡。
HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
响应比R定义如下:
R=(W+T)/T=1+W/T
其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。
每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。
这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。
这种算法是介于FCFS和SJF之间的一种折中算法。
由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,从而采用HRN方式时其吞吐量将小于采用SJF法时的吞吐量。
另外,由于每次调度前要计算响应比,系统开销也要相应增加。
2.2环境需求
开发环境、运行环境及开发语言:
开发环境:
Windows平台+VisualC++6.0
运行环境:
Windows全系列平台
开发语言:
C++
2.3用户界面需求
输入输出均采用命令行界面。
格式如下:
首先输入进程数。
其次输入进程编号,姓名,到达时间,执行时间等相关信息。
然后选择算法,优先法或者是最高响应比算法。
最后,输出程序运行所得结果。
3功能设计:
3.1数据结构:
创建一个进程信心类:
classProcess
{
public:
Process(){};
voidmodify();
//进程信息输入
voidprint();
//进程信息输出
friendvoidoutput();
friendintPRI();
friendinthrn();
private:
charname[10];
//进程名称
intnumber;
//进程编号
intpri;
//优先级
doublecomet;
//到达时间
doublerunbt;
//开始运行时间
doublerunt;
//运行时间
doublerunet;
//运行结束时间
doubletrt;
//周转时间
doublewtrt;
//带权周转时间
doublerespond_rate;
intorder;
//运行次序
intrun_flag;
//运行状态
};
//ProcessProcess[MAX],Processcopy[MAX];
voidcopy()//复制函数
inti;
for(i=0;
i<
counter;
i++)
{
Processcopy[i]=Process[i];
}
}
说明:
防止修改了原信息中的的内容
设置进程的优先级算法和最高响应比算法:
intPRI()//优先级函数
intj=0,i;
intd=0;
inttemp=Process[0].comet;
Process[j].runbt=Process[j].comet;
Process[j].runet=Process[j].comet+Process[j].runt;
Process[j].run_flag=1;
Process[j].order=d+1;
d++;
temp=Process[j].runet;
这是部分代码,设置各进程的优先级来调用;
inthrn()//最高响应比函数
最高响应比是调度策略同时考虑每个作业的等待时间的长短和估计需要执行时间的长短,从中选出响应比最高的作业投入执行。
4开发平台及源程序的主要部分:
4.1开发平台:
4.2源程序主要部分:
intPRI()//优先级算法
intj=0,i;
intd=0;
inttemp=Process[0].comet;
Process[j].runbt=Process[j].comet;
Process[j].runet=Process[j].comet+Process[j].runt;
Process[j].run_flag=1;
Process[j].order=d+1;
temp=Process[j].runet;
intpritemp=100;
intz=0;
for(i=1;
for(inta=0;
a<
a++)
{
if(Process[a].run_flag==0)
if(Process[a].pri<
pritemp)
{
pritemp=Process[a].pri;
z=a;
}
}
Process[z].runbt=temp;
Process[z].runet=Process[z].runbt+Process[z].runt;
temp=Process[z].runet;
Process[z].run_flag=1;
pritemp=100;
Process[z].order=d+1;
return0;
inthrn()//最高响应比优先调度算法
inti,j,p;
intcurrent_counter=0;
doublecurrent_time=Process[0].comet;
i++)
{
doublemax_respond_rate=-1;
for(j=0;
j<
j++)
{
if(Process[j].run_flag==0)
{
Process[j].respond_rate=(current_time-Process[j].comet)/Process[j].runt;
}
}
if((Process[j].run_flag==0)&
&
(Process[j].respond_rate>
max_respond_rate))
p=j;
max_respond_rate=Process[j].respond_rate;
if(Process[p].comet<
=current_time)
Process[p].runbt=current_time;
else
Process[p].runbt=Process[p].comet;
Process[p].runet=Process[p].runbt+Process[p].runt;
Process[p].run_flag=1;
current_counter=current_counter+1;
Process[p].order=current_counter;
current_time=Process[p].runet;
5测试用例,运行结果与运行情况分析:
5.1测试用例:
测试用例1:
进程个数:
3,
内容:
11111
221.21.53
331.822
测试用例2:
进程个数:
3
内容:
11111
221.11.23
3321.52
a)运行结果
优先级法结果如下:
最高响应比算法结果如下:
测试用例2:
b)运行情况分析:
2组测试数据完全符合通过手工计算出来的结果
六自我评价与总结:
本次课程设计题目较为简单,主要是对优先级和最高响应比这两个算法的理解和对进程调度的功能以及进程调度算法有深入的理解。
在这次的课程设计中,让我感觉较为不满意的地方是,在课程设计开始之前我对于最高响应比优先法理解不熟悉,导致了响应比的计算错误,从而加大了完成代码的时间量,对于这次出现的这个问题,使我有了对程序设计的严谨性,课本基础知识的理解程度上有了更深刻的认识,也让我明白到了基础知识的重要性。
完成此次课程实际之后,我对进程调度模拟设计的各种算法有了更进一步的理解,也加深了我对于C++面向对象方面的掌握,在编写程序中所遇到的问题让我有了对操作系统有了迫切要更深层次的掌握,并操作系统这门课程实在是很重要的一门课程。