进程调度模拟设计时间片轮转优先级法概要.docx
《进程调度模拟设计时间片轮转优先级法概要.docx》由会员分享,可在线阅读,更多相关《进程调度模拟设计时间片轮转优先级法概要.docx(18页珍藏版)》请在冰豆网上搜索。
进程调度模拟设计时间片轮转优先级法概要
学号:
课程设计
课程名字
系统软件开发实训A
题目
进程调度模拟设计——时间片轮转、优先级法
学院
专业
班级
姓名
指导教师
2014
年
01
月
17
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
题目:
进程调度模拟设计——时间片轮转、优先级法
初始条件:
1.预备内容:
阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结。
时间安排:
设计安排3周:
查阅、分析资料1天
系统软件的分析与建模4天
系统软件的设计5天
系统软件的实现3天
撰写文档1天
课程设计验收答辩1天
设计验收安排:
设计周的第三周的指定时间到实验室进行上机验收。
设计报告书收取时间:
课程设计验收答辩完结时。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
2013年12月10日
系主任(或责任教师)签名:
2013年12月10日
进程调度模拟设计
——时间片轮转、优先级法
1设计目的
1.1阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解,能够使用其中的方法来进行进程调度模拟设计。
1.2练掌握并运用时间片轮转和优先级法,掌握一种计算机高级语言的使用。
2设计要求
2.1能够选择不同的调度算法(要求中给出的调度算法);
2.2能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
2.3根据选择的调度算法显示进程调度队列;
2.4根据选择的调度算法计算平均周转时间和平均带权周转时间。
3需求分析
无论是在批处理系统、分时系统还是实时系统,用户进程数一般都多于处理机数,这将导致用户进程互相争夺处理机。
另外,系统进程也同样需要使用处理机。
这就要求进程调度程序按照一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
进程调度的主要任务是按照某种策略和方法选取一个处于就绪状态的进程占用处理机。
这次课程设计所要求使用的方法是时间片轮转和优先级法,并且能够选择不同的算法。
而时间片轮转法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。
时间片轮转法的基本概念是将CPU的处理时间分成固定大小的时间片。
如果一个进程选中之后用完了系统规定的时间片,但未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。
同时,进程调度程序又去调度当前就绪队列中的第一个进程或作业。
优先级法是系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。
优先级高的作业或进程优先调度。
4程序流程图
5功能设计
5.1数据结构
typedefstructinnode
{
intnum;//进程提交顺序
stringpname;//进程名
doublectime;//到达时间
doublertime;//运行时间
doubleyx;//优先级
intbj;//标记项
innode*next;
}*inlist;
typedefstructrnode
{
stringpname;//进程名
doublectime;//到达时间
doublertime;//执行时间
doublestime;//开始时间
doubleetime;//结束时间
doubleztime;//周转时间
doubledztime;//带权周转时间
doublexu;//执行次序
rnode*next;
}*rlist;
typedefstructdnode
{
stringpname;//进程名
doublectime;//到达时间
doublertime;//执行时间
doublerrtime;
doublestime;//开始时间
doubleetime;//结束时间
doubleztime;//周转时间
doubledztime;//带权周转时间
intbj;
intbb;
intxu;
dnode*next;
}*dlist;
5.2主要函数
intmain()
voidINPUT(intn)//用来输入进程的基本信息
voidRR(inlist&head,intlen)//使用时间片轮转法来进行进程调度
voidSRR(inlist&head,intlen)//使用优先级法来进行进程调
6源程序各部分代码及分析
本次程序主要由三个部分组成:
main函数部分,时间片轮转算法RR函数,和优先级算法SRR函数。
6.1main函数部分
intmain()
{
intchoice;
cout<<"请选择方法,1.时间片轮转。
2.优先级法"<cin>>choice;
if(choice==1)
{
INPUT
(1);
}
elseif(choice==2)
{
INPUT
(2);
}
else
{
cout<<"Error"<}
return0;
}
6.2时间片轮转法函数代码
voidRR(inlist&head,intlen)
{
dlistdhead,dp,dq;
cout<<"时间片法"<doubletime;
cout<<"请输入时间片长度"<cin>>time;
inlistp=head;
dp=newdnode;
dp->pname=p->pname;
dp->ctime=p->ctime;
dp->rtime=p->rtime;
dp->rrtime=dp->rtime;
dp->bj=0;
dp->xu=1;
dp->next=NULL;
dhead=dp;
p=head->next;
intrnum=2;
while(p)
{
dq=newdnode;
dq->pname=p->pname;
dq->ctime=p->ctime;
dq->rtime=p->rtime;
dq->rrtime=dq->rtime;
dq->bj=0;
dq->next=NULL;
dq->xu=rnum;
dp->next=dq;
dp=dq;
rnum++;
p=p->next;
}
doubleletime=dhead->ctime;
rlistrhead,rp,rq;
rp=newrnode;
rp->next=NULL;
rp->xu=-1;
rhead=rp;
while
(1)
{
dp=dhead;
intrn=0;
while(dp)
{
if(dp->ctime<=letime&&dp->bj!
=1)
{
if(dp->bb!
=1)
{
dp->stime=letime;
dp->bb=1;
}
if(dp->rrtime>time)
{
dp->etime=letime+time;
dp->rrtime=dp->rrtime-time;
letime+=time;
}
elseif(dp->rrtime==time)
{
letime+=time;
dp->bj=1;
rq=newrnode;
rq->next=NULL;
rq->pname=dp->pname;
rq->ctime=dp->ctime;
rq->rtime=dp->rtime;
rq->stime=dp->stime;
rq->etime=letime;
rq->ztime=rq->etime-rq->ctime;
rq->dztime=rq->ztime/rq->rtime;
rq->xu=dp->xu;
if(rp->xu==-1)
{
rp->next=rq;
rp=rq;
}
else
{
rlistr1,r2;
r1=rhead;
r2=r1->next;
intn=0;
while(r2)
{
if(rq->xuxu)
{
r1->next=rq;
rq->next=r2;
n=1;
break;
}
r1=r2;
r2=r2->next;
}
if(n==0)
{
r1->next=rq;
}
}
}
else
{
letime+=dp->rrtime;
dp->bj=1;
rq=newrnode;
rq->next=NULL;
rq->pname=dp->pname;
rq->ctime=dp->ctime;
rq->rtime=dp->rtime;
rq->stime=dp->stime;
rq->etime=letime;
rq->ztime=rq->etime-rq->ctime;
rq->dztime=rq->ztime/rq->rtime;
rq->xu=dp->xu;
if(rp->xu==-1)
{
rp->next=rq;
rp=rq;
}
else
{
rlistr1,r2;
r1=rhead;
r2=r1->next;
intn=0;
while(r2)
{
if(rq->xuxu)
{
r1->next=rq;
rq->next=r2;
n=1;
break;
}
r1=r2;
r2=r2->next;
}
if(n==0)
{
r1->next=rq;
}
}
}
if(dp->bj!
=1)
{
rn++;
}
}
if(rn==0)
{
dlistdf=dp->next;
if(df)
{
if(df->ctime>letime)
{
letime=df->ctime;
}
}
}
dp=dp->next;
}
if(rn==0)
{
break;
}
}
cout<<"进程名提交时间运行时间开始时间结束时间周转时间带权周转时间执行顺序"<rp=rhead->next;
while(rp)
{
cout<pname<<""<ctime<<""<rtime<<""<stime<<""<etime<<""<ztime<<""<dztime<<""<xu<rp=rp->next;
}
}
6.3优先级法函数代码
voidSRR(inlist&head,intlen)
{
inlistinhead=head;
doubleletime;
cout<<"优先级法"<rlistrhead,rp,rq;
rp=newrnode;
rp->next=NULL;
rp->pname=inhead->pname;
rp->ctime=inhead->ctime;
rp->rtime=inhead->rtime;
rp->stime=inhead->ctime;
rp->etime=rp->stime+inhead->rtime;
letime=rp->etime;
rp->ztime=rp->etime-rp->ctime;
rp->dztime=rp->ztime/rp->rtime;
rp->xu=1;
rhead=rp;
inhead->bj=1;
intnum;
for(inti=0;i{
inhead=head->next;
intbb=0;
doublenn=0;
while(inhead)
{
if(inhead->yx>nn&&inhead->bj!
=1&&inhead->ctime<=letime)
{
nn=inhead->yx;
num=inhead->num;
bb=1;
}
inhead=inhead->next;
}
if(bb==1)
{
inhead=head->next;
while(inhead)
{
if(inhead->num==num)
{
rq=newrnode;
rq->next=NULL;
rq->pname=inhead->pname;
rq->ctime=inhead->ctime;
rq->rtime=inhead->rtime;
rq->stime=letime;
rq->etime=rq->stime+rq->rtime;
letime=rq->etime;
rq->ztime=rq->etime-rq->ctime;
rq->dztime=rq->ztime/rq->rtime;
rq->xu=i+2;
rp->next=rq;
rp=rq;
inhead->bj=1;
break;
}
inhead=inhead->next;
}
}
else
{
inhead=head->next;
while(inhead)
{
if(inhead->bj!
=1)
{
rq=newrnode;
rq->next=NULL;
rq->pname=inhead->pname;
rq->ctime=inhead->ctime;
rq->rtime=inhead->rtime;
rq->stime=inhead->ctime;
rq->etime=rq->stime+inhead->rtime;
letime=rq->etime;
rq->ztime=rq->etime-rq->ctime;
rq->dztime=rq->ztime/rq->rtime;
rq->xu=i+2;
rp->next=rq;
rp=rq;
inhead->bj=1;
break;
}
inhead=inhead->next;
}
}
}
rp=rhead;
cout<<"进程名提交时间运行时间开始时间结束时间周转时间带权周转时间执行顺序"<while(rp)
{
cout<pname<<""<ctime<<""<rtime<<""<stime<<""<etime<<""<ztime<<""<dztime<<""<xu<rp=rp->next;
}
}
7程序测试
7.1测试用例
时间片轮转法:
优先级法:
7.2运行结果
时间片轮转法:
优先级法:
8自我评价与总结
在本次课程设计中,我的条理较清楚,能够运用两种不同的方法来进行进程调度。
在进程调度函数的实现时运用的结构体来实现各个的功能。
编写程序时要先画出程序的流程图是非常有必要的,根据流程图的顺序来实现程序,并要注意合理的使用函数调用来使程序得到简化,并且易读易懂。
实验中一些不太好的部分就是本次实验虽然完成了老师所要求的任务,但是程序设计的界面还不是很优秀,用户体验不是很好。
以后需要在这方面改进,一个好的程序不仅要有高效率,易读性,我认为还需要较好的用户体验,以后我要在这方面多加改进。
通过这次课程设计,我对操作系统有了更进一层的理解,同时对以前学的c++程序设计语言也有了更深的理解。
我觉得在以后的学习过程中还应该多做这样的设计,它可以让我们把所学的理论用于实践,一方面可以检验并巩固我们所学的内容,另一方面可以让我们在实践中感到所学知识的实用性,从而提高我们的学习兴趣。
总的说来,这次课程设计不仅丰富了我的理论知识,也加强了我的动手能力,还锻炼了我的思维能力。
在实验程序编写和调试过程中我学会了很多,也认识到了自己的不足,我还需要进一步的努力,以致取得更大的进步。
我需要的就是要对自己有信心,脚踏实地,持之以恒,遇到困难时要冷静思考,勇敢面对,直到得出结果。
本科生课程设计成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
2012年 月 日