响应比最高者优先算法Word格式文档下载.docx
《响应比最高者优先算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《响应比最高者优先算法Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
(2)服务时间相等时,则等待时间越长,优先级越高,符合FCFS思想。
(3)对于长作业,只要其等待时间足够长,也能获得处理机。
四、实验步骤
实验中,作业控制块及队列的数据结构定义如下:
structtask{
stringname;
/*作业号*/
intarrTime;
/*作业到达时间*/
intserTime;
/*作业要求服务时间*/
intwaiTime;
/*等待时间*/
intbegTime;
/*开始运行时间*/
intfinTime;
/*结束运行时间*/
intturTime;
/*周转时间*/
intwTuTime;
/*带权周转时间*/
intpriority;
/*优先权*/
intfinish;
/*是否已经完成*/
}JCB[10];
存放作业控制块的区域:
#definen10
JCBjobtable[10];
intjobcount;
将作业控制块组织成一个队列,实验中采用静态链表的方式模拟作业的后备队列,作业队列头指针定义为:
int*head;
实验中,内存采用可移动的动态分区管理方法,即只要内存空闲区总和作业大就可以满足作业对内存的需求;
对打印机和磁带机这两种独占设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。
采用响应比高者优先调度算法进行调度时,必须计算出系统中所有满足必要条件作业的响应比,从中选择响应比最高的一个作业装入主存储器分配资源。
由于是实验,所以就将作业控制块出队,并输出作业名代替装入处存储器,同时修改系统的资源数量。
五、实验清单
#include<
dos.h>
time.h>
stdlib.h>
stdio.h>
conio.h>
string.h>
typedefcharstring[10];
/*//定义string为含有10个字符元素的字符数组类型*/
stringname;
intarrTime;
intserTime;
intwaiTime;
intbegTime;
intfinTime;
intturTime;
intwTuTime;
intpriority;
intfinish;
intnum;
voidinput()
{
inti;
system("
cls"
);
printf("
\n请输入作业数量:
"
scanf("
%d"
&
num);
for(i=0;
i<
num;
i++)
{
printf("
\n请输入作业NO.%d:
\n"
i);
作业名称:
scanf("
%s"
JCB[i].name);
到达时间:
&
JCB[i].arrTime);
服务时间:
JCB[i].serTime);
JCB[i].priority=0;
JCB[i].finish=0;
}
}
intHRN(intpre)
intcurrent=1,i,j;
/*优先权=(等待时间+服务时间)/服务时间*/
i<
i++)
JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime;
/*等待时间=上一个业的完成时间-到达时间*/
JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
if(!
JCB[i].finish)
{
current=i;
/*找到第一个还没完成的作业*/
break;
}
for(j=i;
j<
j++)/*和后面的作业比较*/
if(!
JCB[j].finish)/*还没完成(运行)*/
if(JCB[current].arrTime<
=JCB[pre].finTime)/*如果作业在上一个作业完成之前到达*/
{
if(JCB[j].arrTime<
=JCB[pre].finTime&
&
JCB[j].priority>
JCB[current].priority)
current=j;
/*找出到达时间在上一个作业完成之前,优先权高的作业*/
}
else/*如果作业是在上一个作业完成之后到达*/
JCB[current].arrTime)
/*找出比较早到达的一个*/
if(JCB[j].arrTime==JCB[current].arrTime)/*如果同时到达*/
if(JCB[j].priority>
JCB[current].priority)
current=j;
/*找出服务时间比较短的一个*/
returncurrent;
/*返回当前作业*/
voidruning(inti,inttimes,intpre,intstaTime,intendTime)
if(times==0)
JCB[i].begTime=JCB[i].arrTime;
JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;
JCB[i].turTime=JCB[i].serTime;
JCB[i].wTuTime=1.0;
staTime=JCB[i].begTime;
else
if(JCB[i].arrTime>
JCB[pre].finTime)
JCB[i].begTime=JCB[i].arrTime;
else
JCB[i].begTime=JCB[pre].finTime;
JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;
JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;
if(times==num-1)
endTime=JCB[i].finTime;
JCB[i].finish=1;
voidprint(inti,inttimes)
名称到达时间服务时间开始时间完成时间周转时间带权周转时间\n"
%9s%9d%9d%9d%9d%9d%9d\n"
JCB[i].name,JCB[i].arrTime,JCB[i].serTime,
JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);
voidcheck()
intstaTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveTurTime,aveWTuTime;
intcurrent=0,times=0,pre=0;
JCB[pre].finTime=0;
JCB[i].finish=0;
staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveTurTime,aveWTuTime;
current=0;
times=0;
pre=0;
-------------------------------------------------------------------------\n"
\n--HRRN-----------------------------------------------------------------\n"
for(times=0;
times<
times++)
current=HRN(pre);
runing(current,times,pre,staTime,endTime);
print(current,times);
pre=current;
{
sumTurTime+=JCB[i].turTime;
sumWTuTime+=JCB[i].wTuTime;
aveTurTime=sumTurTime/num;
aveWTuTime=sumWTuTime/num;
(计与平均值)%9d%9d%9d%9d\n"
NULL,sumTurTime,aveTurTime,aveWTuTime);
voidmain()
charagain;
do{
system("
/*清屏*/
pleaseinput4groupsofdatas:
input();
check();
Continue...(Y/N):
do{
again=getch();
}while(again!
='
Y'
&
again!
y'
N'
n'
}while(again=='
||again=='
六、实验结果
七、实验分析及心得体会
从运行结果得到调度序列结果为:
X1X2X3
X1到达时间最早,服务时间也最短,其响应比最高;
X2到达时间为22,但因X1早到达,所以开始时间为22,其服务时间为12,所以响应比X1小;
X3到达时间最迟,其响应比最小,所以在最后。
本次课程设计题目较为简单,主要是对优先级和最高响应比这两个算法的理解和对进程调度的功能以及进程调度算法有深入的理解。
在这次的课程设计中,让我感觉较为不满意的地方是,在课程设计开始之前我对于最高响应比优先法理解不熟悉,导致了响应比的计算错误,从而加大了完成代码的时间量。
对于这次出现的这个问题,使我有了对程序设计的严谨性,课本基础知识的理解程度上有了更深刻的认识,也让我明白到了基础知识的重要性。
完成此次课程实际之后,我对进程调度模拟设计的各种算法有了更进一步的理解,也加深了我对于C++面向对象方面的掌握,在编写程序中所遇到的问题让我有了对操作系统有了迫切要更深层次的掌握,并操作系统这门课程实在是很重要的一门课程。