时间片轮转进程调度模拟算法的实现.docx
《时间片轮转进程调度模拟算法的实现.docx》由会员分享,可在线阅读,更多相关《时间片轮转进程调度模拟算法的实现.docx(19页珍藏版)》请在冰豆网上搜索。
时间片轮转进程调度模拟算法的实现
某某理工大学华夏学院
课程设计报告书
课程名称:
操作系统原理
题目:
时间片轮转进程调度模拟算法的实现
系名:
信息工程系
专业班级:
计算机1132班
姓名:
李杰
学号:
指导教师:
司晓梅
2015年6月26日
某某理工大学华夏学院信息工程系
课程设计任务书
课程名称:
操作系统原理课程设计指导教师:
司晓梅
班级名称:
计算机1131-2开课系、教研室:
自动化与计算机
一、课程设计目的与任务
操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进展实际问题处理的能力,进一步提高学生进展分析问题和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。
学生将在指导教师的指导下,完成从需求分析,系统设计,编码到测试的全过程。
二、课程设计的内容与根本要求
1、课程设计题目
时间片轮转进程调度模拟算法的实现
2、课程设计内容
用c/c++语言实现时间片轮转的进程调度模拟算法。
要求:
1.至少要有5个以上进程
2.进程被调度占有CPU后,打印出该进程正在运行的相关信息
提示:
时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原如此调度,但一旦进程占用处理机如此仅使用一个时间片。
在使用完一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。
1〕进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加1就可以了。
2〕为进程设计出PCB结构。
PCB结构所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以与指针的信息等。
3、设计报告撰写格式要求:
1设计题目与要求2设计思想
3系统结构4数据结构的说明和模块的算法流程图
5使用说明书〔即用户手册〕:
内容包含如何登录、退出、读、写等操作说明
6运行结果和结果分析〔其中包括实验的检查结果、程序的运行情况〕
7自我评价与总结8附录:
程序清单,注意加注释〔包括关键字、方法、变量等〕,在每个模块前加注释;
三、课程设计步骤与时间进度和场地安排
本课程设计将安排在第17周,现代教育技术中心。
具体安排如下:
时间
设计内容
第一天
下发任务书,学生查阅资料
第二天
系统设计和原型开发
第三天-第四天
系统功能实现
第五天
系统调试、测试、打包和验收
课程设计集中时间安排:
周次
星期一
星期二
星期三
星期四
星期五
第17周
第2-3节
第2-3节
第2-3节
第2-3节
第3-6节
地点
现教
现教
现教
现教
现教
四、课程设计考核与评分标准
课程设计考核将综合考虑学生的系统设计方案、运行结果、课程设计报告书的质量、态度、考勤、辩论情况等各因素。
具体评分标准如下:
〔1〕设计方案正确,具有可行性、创新性;30分
〔2〕系统开发效果较好;20分
〔3〕设计报告规X、课程设计报告质量高、参考文献充分20分
〔4〕课程设计辩论时,问题回答正确;20分
〔5〕态度认真、刻苦钻研、遵守纪律;10分
按上述五项分别记分后求和,总分按五级制记载最后成绩。
优秀〔100~90分〕,良好〔80~89分〕,中等〔70~79分〕,与格〔60~69分〕,不与格〔0~59分〕
一、设计题目与要求:
进程时间片轮转调度算法。
要求:
用C++语言编写程序完成单处理机的进程调度,要求采用时间片轮转调度算法。
实验具体要求包括:
首先确定作业控制块的内容和组成方式;然后完成作业调度;最后编写主函数,并对所做工作进展测试。
二、设计思想:
在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。
对调度的处理又都可采用不同的调度方式和调度算法。
调度算法是指:
根据系统的资源分配策略所规定的资源分配算法。
三、系统结构
处理机管理模拟系统由创建进程、运行程序和显示结果三局部组成。
而它们又分别包括输入进程信息、创建结点和插入结点三个步骤。
系统功能说明:
创建进程模块在输入进程页面输入要创建的进程数,输入后逐个将进程信息录入插入到就绪队列中,完成进程的创建过程。
运行程序模块:
此模块实现时间片轮转调度算法,从就绪队列中取出进程结点,并模拟运行该进程,反复循环,直至进程全部运行完毕。
每次运行进程后,将运行信息存入到文件中,实现信息的持久化。
方便信息的记录,系统功能的分析和出错时便于检查错误。
现实结果模块:
从文件读入进程运行的结果,在图形界面下操作,提供友好的用户操作方式,方便直观了解进程呢过的调度过程,便于数据的分析和研究。
算法描述:
1、在创建进程界面将进程信息录入,将进程控制块进展包装,插入到循环队列中;2、当运行程序时,每次从就绪队列队首取出一个进程,判断是P进程是否到达。
到达如此运行该进程;3、假如P进程为首次运行,如此记录进程开始运行时间;4、运行完P进程后,输入进程运行信息,并将此进程移动至队尾;5、假如循环队列长度大于1,如此返回执行B,否如此完毕程序。
四、数据结构的说明和模块的算法流程图
typedefstructjcb
{
charname[N];
intprio;
intround;
intcputime;
intneedtime;
intcount;
charstate;
structnode*next;
}PCB
图1流程图
五、使用说明
(1)建立一个进程控制块PCB来代表。
PCB包括:
进程名、指针、到达时间、估计运行时间、剩余时间和进程状态。
进程状态分为就绪〔W〕、运行〔R〕和完成〔F〕。
(2)为每个进程任意确定一个要求运行时间和到达时间。
(3)按照进程到达的先后顺序排成一个循环队列。
再设一个对首指针指向第一个到达进程的首址。
(4)执行处理机调度时,开始选择对首的第一个进程运行。
另外再设一个当前运行进程的指针,指向当前正运行的进程。
(5)执行:
a)预计运行时间减1;b)输出当前运行进程的名字。
(6)进程执行一次后,假如该进程的剩余运行时间为零,如此将该进程的状态置为完成态F,并退出循环队列;假如不为空,如此将其移至队尾。
继续在运行队首的进程。
(7)假如就绪队列不空,如此重复上述的〔5〕和〔6〕步骤直到所有进程都运行完为止。
在所设计的调度程序中,要求包含显示或打印语句。
以便显示或打印每次选操作系统课程设计中进程的名称与运行一次后队列的变化情况。
六、运行结果
1、输入数据
图2输入数据
2、运行结果示例
〔1〕数据输入完成后的初始状态,进程标识为x1的进程首先得到调度,运行10个时间单位。
图3运行结果1
〔2〕进程标识为x2的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图4运行结果2
〔3〕进程标识为x3的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图5运行结果3
〔4〕进程标识为x4的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图6运行结果4
(5)进程标识为x5的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图7运行结果5
〔6〕进程标识为x1的进程再次得到调度,从就绪态“W〞改为运行态“R〞,因进程x1只剩下5个单位时间,所以进程x1只运行5个单位时间。
图8运行结果6
〔7〕进程标识为x2的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
进程x1已运行完,从运行态“R〞改为运行完毕状态“F〞。
图9运行结果7
〔8〕进程标识为x3的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图10运行结果8
〔9〕进程标识为x4的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图11运行结果9
〔10〕进程标识为x5的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图12运行结果10
〔11〕进程标识为x2的进程得到调度,从就绪态“W〞改为运行态“R〞,运行5个时间单位。
进程x5已运行完,从运行态“R〞改为运行完毕状态“F〞。
图13运行结果11
(12〕进程标识为x3的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
进程x2已运行完,从运行态“R〞改为运行完毕状态“F〞。
图14运行结果12
(13〕进程标识为x4的进程得到调度,从就绪态“W〞改为运行态“R〞,运行10个时间单位。
图15运行结果13
(14〕进程标识为x3的进程得到调度,从就绪态“W〞改为运行态“R〞,运行5个时间单位。
进程x4已运行完,从运行态“R〞改为运行完毕状态“F〞。
图16运行结果14
〔15〕所有进程都已运行完,状态都为“F〞。
图17运行结果15
七、小结
在这次实验中,我能够正确分析实验过程和实验结果,思路清晰,能够比拟好的理解进程按时间片轮转算法这一调度过程,加深了我对进程时间片轮转调度过程的理解。
但是还有很多不足。
我自己的C++根底差,不能够自己编写这一调度算法的程序,只能通过网络和同学、教师的帮助得到正确的程序编码;另外一开始输入进程运行需要的时间时,由于输入运行时间的数值较大,导致后面进程繁多,但后来与时改正,走了弯路,也增加了理解。
因此以后要加强自己在C++方面的学习,能够理解源程序;并且要多上机操作,多调试多尝试,争取能理解好了解透。
本次实验题需要详细阅读题目和不断地尝试才能找到简便的过程,能加强学生的上机操作能力。
八、参考源程序
#include
#include
#include
#include
typedefstructnode
{
charname[10];
intprio;
intround;
intcputime;
intneedtime;
intcount;
charstate;
structnode*next;
}PCB;
PCB*finish,*ready,*tail,*run;//队列指针
intN;//进程数
voidfirstin()
{
run=ready;//就绪队列头指针赋值给运行头指针
run->state='R';//进程状态变为运行态]
ready=ready->next;//就绪队列头指针后移到下一进程
}
//输出标题函数
voidprt1(chara)
{
if(toupper(a)=='P')//优先级法
cout<<""<cout<<"进程名占用CPU时间到完成还要的时间轮转时间片状态"<}
//进程PCB输出
voidprt2(chara,PCB*q)
{
if(toupper(a)=='P')//优先级法的输出
cout<name<<""<cputime<<""<needtime<<""<<
q->round<<""<state<}
//输出函数
voidprt(charalgo)
{
PCB*p;
prt1(algo);//输出标题
if(run!
=NULL)//如果运行指针不空
prt2(algo,run);//输出当前正在运行的PCB
p=ready;//输出就绪队列PCB
while(p!
=NULL)
{
prt2(algo,p);
p=p->next;
}
p=finish;//输出完成队列的PCB
while(p!
=NULL)
{
prt2(algo,p);
p=p->next;
}
getchar();//按住任意键继续
}
//时间片轮转的插入算法
voidinsert(PCB*q)
{
PCB*p1,*s,*r;
s=q;//待插入的PCB指针
p1=ready;//就绪队列头指针
r=p1;//*r做pl的前驱指针
while(p1!
=NULL)
if(p1->round<=s->round)
{
r=p1;
p1=p1->next;
}
if(r!
=p1)
{
r->next=s;
s->next=p1;
}
else
{
s->next=p1;//否如此插入在就绪队列的头
ready=s;
}
}
//优先级创建初
voidcreate(charalg)
{
PCB*p;
inti,time;
charna[10];
ready=NULL;
finish=NULL;
run=NULL;
cout<<"输入进程名与其需要运行的时间:
"<for(i=1;i<=N;i++)
{
p=newPCB;
cin>>na;
cin>>time;
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='W';
p->round=0;
if(ready!
=NULL)
insert(p);
else
{
p->next=ready;
ready=p;
}
cout<<"输入进程名与其需要运行的时间:
"<}
prt(alg);
run=ready;
ready=ready->next;
run->state='R';
}
voidtimeslicecycle(charalg)
{
while(run!
=NULL)
{
run->cputime=run->cputime+10;
run->needtime=run->needtime-10;
run->round=run->round+10;
if(run->needtime<=0)
{
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!
=NULL)
firstin();
}
else
{
run->state='W';
insert(run);
firstin();
}
prt(alg);
}
}
//主函数
voidmain()
{
charalgo='P';//算法标记
cout<<"输入进程的个数:
";
cin>>N;//输入进程数
create(algo);//创建进程
timeslicecycle(algo);//优先级法调度
}//main()
设计过程中质疑〔或辩论〕记载:
指导教师评语:
签名:
年月日