进程调度算法的模拟实现

  • 格式:doc
  • 大小:361.30 KB
  • 文档页数:32

下载文档原格式

  / 32
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.2 测试结果
(1) 测试方案(一)结果。
输入测试进程数5,测试用例分别为(A 0 4),(B 1 3),(C 2 5),(D 3 2),(E 4 4),测试结果见图(图4-1 先来先服务调度算法)
图4-1 先来先服务调度算法
由运行结果可以看出,短作业D的服务时间最短,但带权周转时间高达5.5,而长作业C的服务时间为5,带权周转时间仅为2,因此先来先服务算法比较有利于长作业,而不利于短作业
}
avzztime=sumzztime/N1;
printf("\n该算法的平均周转时间为:%-.2f\t",avzztime);
avdqzztime= sumdqzztime/N1;
printf("该算法的平均带权周转时间为:%-.2f\t\n\n",avdqzztime);
}
3.时间片轮转算法
按照轮转的次序分配给每个程序一定的时间执行,执行完成后执行后面的进程 ,依次循环执行直到所有进程执行完成。
Print(p,arrivetime,servicetime,starttime,finishtime,N1);
for(int k=0;k<=N1-1;k++)
{
sumzztime=sumzztime+p[k].zztime;
sumdqzztime=sumdqzztime+ p[k].dqzztime;
2 设计原理
2.1先来先服务(FCFS)算法
每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列
2.2 时间片轮转法(RR)算法
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
(3) 测试方案(三)
在主界面输入3,选择时间片轮转调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一和二。
(4) 测试方案(四)
在主界面输入4,选择时间片轮转调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一和二和三。
从多次运行结果来看,时间片轮转调度算法不同的时间片对结果有很大的影响。
(4) 测试方案(四)结果。
输入测试进程数5,测试用例分别为(A 0 4),(B 1 3),(C 2 5),(D 3 2),(E 4 4),测试结果见图(图4-4 最高响应比优先调度算法)
图4-4 最高响应比优先调度算法
由运行结果可以看出,该算法既照顾了短作业,有考虑了作业到达的先后次序,不会使长作业长期得不到服务。因此,该算法是一个很好的折衷
{
if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )
current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/
}
else /* 如果作业是在上一个作业完成之后到达*/
{
if(JCB[j].arrTime<JCB[current].arrTime)
}
for(i=0; i<N4; i++)
{
if(!JCB[i].finish)
{
current=i; /*找到第一个还没完成的作业*/
break;
}
}
for( j=i; j<N4; j++) /*和后面的作业比较*/
{
if( !JCB[j].finish) /* 还没完成(运行)*/
{
if(JCB[current].arrTime<=JCB[pre].finTime) /*如果作业在上一个作业完成之前到达*/
算法:
void tt(rr *p,int N2)
{ float sumzztime=0, sumdqzztime=0,avzztime=0,avdqzztime=0;int timeprice=0;
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0,lefttime=0;
(2) 测试方案(2)结果。
输入测试进程数5,测试用例分别为(A 0 4),(B 1 3),(C 2 5),(D 3 2),(E 4 4),测试结果见图(图4-2 短作业优先调度算法)
图4-2 短作业优先调度算法
由运行结果可以看出,短作业优先算法每次都从未完成的队列中选取服务时间最短的作业进行调度。通过比较,短作业优先算法的平均带权周转时间小于先来先服务算法,提高了系统的吞吐量。因此,相对于短作业较多或者较为重要的系统中,可选这短作业优先调度算法。
for(int k=0;k<=N2-1;k++)
{
sumzztime=sumzztime+p[k].zztime;
sumdqzztime=sumdqzztime+ p[k].dqzztime;
}
avzztime=sumzztime/N2;
printf("\n该算法的平均周转时间为:%-.2f\t",avzztime);
current=j; /* 找出比较早到达的一个*/
if(JCB[j].arrTime==JCB[current].arrTime) /* 如果同时到达*/
if(JCB[j].priority>JCB[current].priority)
current=j; /*找出服务时间比较短的一个*/
}
}
}
return current;/*返回当前作业*/
for(int k=0;k<=N-1;k++)
{
sumzztime=sumzztime+p[k].zztime;
sumdqzztime=sumdqzztime+ p[k].dqzztime;
}
avzztime=sumzztime/N;
printf("\n该算法的平均周转时间为:%-.2f\t",avzztime);
操作系统课程设计报告
题目:进程调度算法的模拟实现_
专业
计算机科学与技术
学生姓名
班级
学号
指导教师
发放日期
2015.1.30
信 息 工 程 学 院
进程调度算法的模拟实现
1
选择一个调度算法,实现处理机调度,进程调度算法包括:先来先服务算法,短进程优先算法,时间片轮转算法,动态优先级算法。可选择进程数量,本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。
3 详细设计与编码
3.1 模块设计
(1) 进入系统模块,进入登陆界面。
(3) 菜单选择模块。选择相应的进程调度方式,选择相应的数字,进入相应的功能。
(4) 算法模块。选择相应的进程调度算法。
(5) 显现输出模块。显示每种进程调度算法情况。
(6) 平均周转时间与平均带权周转时间的计算结果。
(7) 退出系统模块。
2.3短作业优先(SJF)算法
短作业优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
2.4最高优先权优先(HRRN)算法
优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
(2) 系统模块
1.先来先服务算法
对于先到达的进程优先分配CPU,按照先来先服务的原则依次执行各进程。
算法:
void FCFS(fcfs *p,int N)
{ float sumzztime=0, sumdqzztime=0,avzztime,avdqzztime;
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;
avdqzztime= sumdqzztime/N2;
printf("该算法的平均带权周转时间为:%-.2f\t\n",avdqzztime);
getchar();
}
4.最高响应比优先算法
按照优先级从高到低依次执行程序。
算法:
int HRN(int pre)
{
int current=1,i,j;/* 优先权 =(等待时间+服务时间)/服务时间*/
for(i=0; i<N4; i++)
{
JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; /*等待时间 =上一个作业的完成时间-到达时间*/
JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
sort(p,N);
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
{
float sumzztime=0, sumdqzztime=0,avzztime,avdqzztime;
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N1);
}
4 结果与分析
4.1 测试方案
(1) 测试方案(一)
在主界面输入1,选择先来先服务调度算法,然后输入进程数目5,然后输入各个进程信息,观察测试结果。
(2) 测试方案(二)
在主界面输入2,选择最短进程优先调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一。
avdqzztime= sumdqzztime/N;
printf(பைடு நூலகம்该算法的平均带权周转时间为:%-.2f\t\n\n",avdqzztime);
}
2.短进程优先算法
先找到运行时间最短的程序,然后执行,再从剩余的程序中找到运行时间最短的在执行,依次每次都执行运行时间最短的,直到程序执行完毕。
算法:
void sjff(sjf *p,int N1)
4.3 测试结果分析
四种调度算法各有优劣。先来先服务算法比较有利于长进程,而不利于短进程,有利于CPU 繁忙的进程,而不利于I/O 繁忙的进程。短作业优先调度算法相比FCFS 算法,该算法可改善平均周转时间和平均带权周转时间,缩短进程的等待时间,提高系统的吞吐量。缺点是对长进程非常不利,可能长时间得不到执行,且未能依据进程的紧迫程度来划分执行的优先级,以及难以准确估计进程的执行时间,从而影响调度性能。时间片轮转调度算法的特点是简单易行、平均响应时间短,但不利于处理紧急作业。在时间片轮转算法中,时间片的大小对系统性能的影响很大,因此时间片的大小应选择恰当。高响应比优先调度策略是对FCFS方式和SJF方式的一种综合平衡,同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
ptt(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,avzztime,avdqzztime,lefttime,timeprice,N2);
printf("\n 综合信息为:\n");
Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N2);
(3) 测试方案(三)结果。
输入测试进程数5,测试用例分别为(A 0 4),(B 1 3),(C 2 5),(D 3 2),(E 4 4),测试结果见图(图4-3.1,4-3.2,4-3.3时间片轮转调度算法)
图4-3.1 时间片轮转调度算法
图4-3.2 时间片轮转调度算法
图4-3.3 时间片轮转调度算法
3.3 系统详细设计
(1) 系统主界面设计(包含登陆模块设计)
首先将各种进程调度算法放入不同的头文件,在主函数引用,是系统结构更加清晰。设置一个mean()方法,让用户选择不同的进程调度算法,mean()方法返回一个char类型字符,以便在主函数的switch语句中选择调用不同的进程调度方法。