时间片轮转进程调度模拟算法的实现剖析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学华夏学院课程设计报告书
课程名称:操作系统原理
题目:时间片轮转进程调度模拟算法的实现系名:信息工程系
专业班级:计算机1132班
姓名:李杰
学号:10210413209
指导教师: 司晓梅
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)设计报告规范、课程设计报告质量高、参考文献充分 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,否则结束程序。
四、数据结构的说明和模块的算法流程图
typedef struct jcb
{
char name[N];
int prio;
int round;
int cputime;
int needtime;
int count;
char state;
struct node *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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
typedef struct node
{
char name[10];
int prio;
int round;
int cputime;
int needtime;
int count;
char state;
struct node *next;
}PCB;
PCB *finish,*ready,*tail,*run; //队列指针
int N; //进程数
void firstin()
{
run=ready; //就绪队列头指针赋值给运行头指针
run->state='R'; //进程状态变为运行态]
ready=ready->next; //就绪队列头指针后移到下一进程
}
//输出标题函数
void prt1(char a)
{
if(toupper(a)=='P') //优先级法
cout<<" "<<endl;
cout<<"进程名占用CPU时间到完成还要的时间轮转时间片状态"<<endl;
}
//进程PCB输出
void prt2(char a,PCB *q)
{
if(toupper(a)=='P') //优先级法的输出
cout<<q->name<<" "<<q->cputime<<" "<<q->needtime<<" "<<
q->round<<" "<<q->state<<endl;
}
//输出函数
void prt(char algo)
{
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(); //按住任意键继续
}
//时间片轮转的插入算法
void insert(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;
}
//优先级创建初
void create(char alg)
{
PCB *p;
int i,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
cout<<"输入进程名及其需要运行的时间:"<<endl; for(i=1;i<=N;i++)
{
p=new PCB;
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<<"输入进程名及其需要运行的时间:"<<endl; }
prt(alg);
run=ready;
ready=ready->next;
run->state='R';
}
void timeslicecycle(char alg)
{
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);
}
}
//主函数
void main()
{
char algo='P'; //算法标记
cout<<"输入进程的个数:"; cin>>N; //输入进程数
create(algo); //创建进程timeslicecycle(algo); //优先级法调度} //main()
设计过程中质疑(或答辩)记载:
指导教师评语:
签名:
年月日。