进程调度模拟设计先来先服务最高响应比优先调度算法Word文件下载.docx
《进程调度模拟设计先来先服务最高响应比优先调度算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《进程调度模拟设计先来先服务最高响应比优先调度算法Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
1设计题目................................1
2需求分析................................1
2.1功能需求....................................1
2.1.1进程调度模拟设计先来先服务法..................1
2.1.2进程调度模拟设计最高响应比优先调度算法.........2
2.2环境需求....................................3
2.3用户界面需求................................3
3功能设计................................3
2
3
3.1数据结构.....................................3
3.2模块说明.....................................4
4开发平台及源程序的主要部分...............5
4.1开发平台.....................................5
4.2源程序主要部分................................5
5测试用例,运行结果与运行情况分析.........6
5.1测试用例....................................6
5.2运行结果.....................................6
6自我评价与总结..........................7
7附加代码.................................8
4
5
1.设计题目
1.先来先服务、最高响应比优先调度算法
2.需求分析
模拟进程调度,能够处理以下的情形:
2.1功能需求
2.1.1实现先来先服务法:
先来先服务算法基本思想:
按照作业提交或进
程变为就绪状态的先后次序,调入系统或分派
CPU,换句话说,调度程序每次选择的作业/
进程是等待时间最久的,而不管其运行时间的
长短。
这种调度算法突出的优点是实现简单,
效率较低,在一些实际的系统和一般应用程
序中采用这种算法的较多。
因此,在设计中,
首先对输入的各进程的提交时间进行比较,对
先进入等待队列的进程提供服务。
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数据结构:
创建一个进程信息结构:
structPCB
{
stringname;
//进程名
floatta;
//进程到达时间
floatts;
//进程估计运行的时间
floattb;
//进程开始运行时间
floattm;
//进程仍需运行的时间
floatto;
//进程完成的时间
floatrn;
//进程运行的次数
floattotalTime;
//周转时间
doubleweightTotalTime;
//带权周转时间(周转时间/估计运行时间)
PCB*next;
//定义指向下一个进程的指针
};
此外,对输入信息进行创建链表队列:
PCB*create(PCB*head)
PCB*p1,*p2;
p1=p2=newPCB;
head=p1;
cout<
<
"
请输入进程数:
;
cin>
>
pronum;
for(inti=0;
i<
i++)
{
p2=p1;
p1=newPCB;
p1->
next=NULL;
cout<
请依次输入第"
i+1<
个进程的信息(进程名、到达时间、估计运行时间):
cin>
p1->
name>
ta>
ts;
tm=p1->
rn=1;
p2->
next=p1;
}
returnhead;
}
3.2模块说明
首先选择调度算法,若选1先来先服务然则调用create()创建进程队列,然后调用fcfsrun()进行先来先服务算法,后Goto到起始点。
若选择2最高响应比算法则调用create()创建进程队列,然后调用Hrn()进行最高响应比算法,后Goto到起始点。
若选择3则退出,选择其他则报错。
4开发平台及源程序的主要部分:
4.1开发平台:
开发环境:
4.2源程序主要部分:
structPCB{};
//进程结构
#defineMAX_NUM15
intpronum;
//定义进程数为pronum
floattotal;
//记录所有进程的总时间
doubleweight;
//记录所有进程的带权周转时间
PCB*create(PCB*head);
//创建进程队列
voiddeal(PCB*head);
//FCFS记录处理
voidsort(PCB*head);
//将进程按到达的先后顺序排列
voidfcfsrun(PCB*head);
//先来先服务算法
voidHrn(PCB*head,intn);
//最高响应比算法
voidmain(){}//主函数
流程图如下:
5测试用例,运行结果与运行情况分析:
5.1测试用例:
正确的测试用例:
先来先服务算法结果:
最高响应比结果:
其他:
六自我评价与总结:
这次课程设计是让我们用已经学过的操作系统知识对先来先服务算法和最高响应比算法进行设计,使我在对进程调度的先来先服务和最高响应比优先算法充分理解的同时,也使我的实践编程能力和运用理论知识的能力得到进一步提高。
在此次实验中,我认为我比较出色的是自己一开始就有了一个整体的思路,不像以前的课程设计一样,对全局的规划不是很清楚,以至于在后来模块的衔接做得不到位,但是此次的设计由于初始就对各个功能块的相互调用也比较了解,所以对该课设的设计整体上比较轻松,也使程序的编写比较清晰。
不过,在此次课设中我也出现了不少问题,尤其是在对先来先服务和最高响应比优先功能块的设计时,对其中每个进程之间的时间比较和响应比比较的具体代码还比较模糊,因此使得设计一度陷入了修改和编写中;
此外,刚开始对程序的容错能力并未加入考虑的范围,所以使得程序的完整性和健壮性比较欠缺。
所以,从中看出自己在具体细致的地方还约显不足,还有待提高。
通过此次课程设计,也使我见到对同一实验目的可以使用多种方法,C++的编程比较符合我们现在的编程设计能力,但是使用JAVA也可以完成相同功能,而且会使得某些步骤还比较简易。
此外,使程序具有较强的容错能力也对程序设计的优劣性起到较为重要的因素。
相信通过这次的设计,对我以后的学习和编程能力有一定的帮助。
七、附加代码
#include<
iostream>
string>
iomanip>
usingnamespacestd;
#defineMAX_NUM15
intpronum;
floattotal;
doubleweight;
PCB*create(PCB*head);
voiddeal(PCB*head);
voidsort(PCB*head);
voidfcfsrun(PCB*head);
voidHrn(PCB*head,intn);
voidmain()
intchoice;
*进程调度模拟设计——先来先服务、最高响应比优先算法*"
endl;
***********1.先来先服务算法***************************"
***********2.最高响应比优先算法*********************"
***********3退出*************************************"
l1:
请输入您的选择:
l2:
choice;
PCB*head=NULL;
switch(choice)
{
case1:
head=create(head);
fcfsrun(head);
gotol1;
case2:
Hrn(head,pronum);
case3:
break;
default:
cout<
输入错误!
\n请重新输入:
gotol2;
voidsort(PCB*head)//将进程按到达的先后顺序排列
PCB*p,*q,*r,*s;
if(head->
next!
=NULL)
p=head->
next->
next;
head->
while(p)
q=p;
p=p->
r=head;
s=head->
while(s&
&
s->
ta<
=q->
ta)
{
r=s;
s=s->
}
r->
next=q;
q->
next=s;
voiddeal(PCB*head)//FCFS记录处理
sort(head);
PCB*p,*q;
q=head->
q->
tb=q->
ta;
to=q->
tb+q->
totalTime=q->
to-q->
weightTotalTime=q->
totalTime/(double)q->
total+=q->
totalTime;
weight+=q->
weightTotalTime;
p=q->
while(p!
p->
to;
to=p->
tb+p->
totalTime=p->
to-p->
weightTotalTime=p->
totalTime/(double)p->
total+=p->
weight+=p->
q=p;
p=p->
voidfcfsrun(PCB*head)//先来先服务算法
deal(head);
PCB*p,*q,*s;
p=head->
进程执行顺序为:
--"
p->
name;
进程名提交时间开始时间结束时间周转时间带权周转时间\n"
s=head->
while(s!
setw(4)<
name<
setw(7)<
setw(10)<
tb<
setw(11)<
to<
totalTime<
weightTotalTime<
s=s->
平均周转时间:
total/(double)pronum<
平均带权周转时间:
weight/(double)pronum<
******************************************************"
total=0;
weight=0;
//最高响应比算法函数
voidHrn(PCB*head,intn)
PCB*p,*p1;
PCB*flag=NULL;
PCB*q=NULL;
doubletime=0,j=0,runTime=0,drunTime=0;
intxuhao=0;
stringpname[MAX_NUM];
for(intss=0;
ss<
MAX_NUM;
ss++)
pname[ss]="
顺序进程名提交时间开始时间结束时间周转时间带权周转时间\n"
head=head->
p=head;
while(head)
q=head;
if(time<
ta)//如果该进程提交时间早于其它进程,则先执行该进程
time=p->
flag=head;
//用于暂存将要执行的进程
//计算当前链表中进程的响应比
while(q&
ta<
=time)
if((time-q->
ta)/(q->
ts)>
(time-flag->
ta)/(flag->
ts))
flag=q;
q=q->
flag->
ta)//如果上一次结束时间比当前选中要执行进程的结束时间小
time=flag->
//则当前进程开始时间为提交时间
//输出当前执行进程的信息
xuhao+1;
setw(8)<
flag->
time;
(time+flag->
ts);
(time-flag->
ta+flag->
"
(double)((time-flag->
ts)/flag->
ts)<
j=(time-flag->
ta+flag->
//当前执行进程的周转时间
runTime+=j;
//记录周转时间
time+=flag->
drunTime+=j/flag->
//带权周转时间
pname[xuhao]=flag->
xuhao++;
//将执行过的进程从链表中删除
if(flag==head)//在链表头
head=head->
else
{//在链表中
p1=head;
while(p1->
=flag)
p1=p1->
p1->
next=flag->
deleteflag;
//删除这个进程所占的节点
for(ss=0;
n;
pname[ss];
if(pname[ss+1]!
="
)
cout<
->
平均周转时间为:
runTime/n<
平均带权周转时间为:
drunTime/n<
本科生课程设计成绩评定表
班级:
计算机009姓名:
旭 学号:
序号
评分项目
满分
实得分
学习态度认真、遵守纪律
10
设计分析合理性
设计方案正确性、可行性、创造性
20
设计结果正确性
40
设计报告的规范性
6
设计验收
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
201年 月 日