衡阳师范学院《计算机操作系统》课程设计.docx
《衡阳师范学院《计算机操作系统》课程设计.docx》由会员分享,可在线阅读,更多相关《衡阳师范学院《计算机操作系统》课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
衡阳师范学院《计算机操作系统》课程设计
衡阳师范学院
《计算机操作系统》
课程设计
题目:
进程调度的设计
班级:
计算机系0901班
学号:
作者姓名:
指导教师:
2011年12月10日
目录
1.需求分析-1-
1.1设计目的-1-
1.2设计要求-1-
2.概要设计-1-
3.主要数据结构-2-
4.程序清单-2-
4.1详细设计-2-
4.2调试与分析-8-
4.3运行结果-8-
5.用户手册-10-
5.1运行环境-10-
5.2执行文件-10-
5.3用户使用说明-10-
6.参考文献-10-
7.心得体会-10-
8.小组成员任务分配-11-
1.需求分析
1.1设计目的
通过优先权与轮转调度算法的模拟加深对进程概念和进程调度过程的理解,掌握进程状态之间的切换,同时掌握进程调度算法的实现方法和技巧。
1.2设计要求
(1)设计进程控制块PCB表结构,分别适用于优先数调度算法和循环轮转调度算法。
(2)建立进程就绪队列。
对两种不同算法编制入链子程序。
(3)编制两种进程调度算法:
1)优先数调度;2)循环轮转调度
2.概要设计
1.1设计内容
1.用语言来实现对N个进程采用不同调度算法的进程调度。
2.每个用来标识进程的进程控制块PCB用结构来描述,包括一下字段:
(1)进程优先数ID,其中0为闲逛进程,用户进程的表示数为1,2,3等。
(2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大yu0,且随机产生,优先数越大,优先级越高。
(3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4.
(4)进程总共需要运行时间Alltime,利用随机函数产生。
(5)进程状态,0:
就绪态;1:
运行态;2:
阻塞态。
(6)队列指针next,用来讲多个进程控制块PCB连接位队列。
3.优先数改变的原则
(1)进程在就绪队列中每呆一个时间片,优先数增加1。
(2)进程每运行一个时间片,优先数减3.
4.在调度前系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程块PCB链接成就绪队列。
2.2实现概要
(1)本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态
(2)为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
(3)在优先算法中,优先数的值为50与运行时间的差值,即PTIME-process->needtime。
进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。
在轮转算法中,采用固定时间片(即:
每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。
(4)对于遇到优先数一致的情况,采用FIFO策略解决。
3.主要数据结构
1.structpcb()定义pcb
2.Voiddisplay()显示结果信息函数
3.Intprocessfinish(pcb*q)进程完成表示
4.Voiddispla_round()显示循环轮转调度算法运行结果
5.Priority_call()优先数调度算法
6.Voidcpu_round()处理器的工作状态
4.程序清单
4.1详细设计
#include
#include
#include
#include
#include
#include
#defineP_NUM5
#defineP_TIME50
enumstate{//进程状态
ready,
execute,
block,
finish
};
structpcb{//定义PCB块
charname[4];
intpriority;
intcputime;
intneedtime;
intcount;
intround;
stateprocess;
pcb*next;
};
pcb*get_process();
pcb*get_process(){
pcb*q;
pcb*t;
pcb*p;
inti=0;
cout<<"inputnameandtime"<while(iq=(structpcb*)malloc(sizeof(pcb));
cin>>q->name;
cin>>q->needtime;
q->cputime=0;
q->priority=P_TIME-q->needtime;
q->process=ready;
q->next=NULL;
if(i==0){
p=q;
t=q;
}
else{
t->next=q;///
t=q;
}
i++;
}
returnp;
}
voiddisplay(pcb*p){//现实结果信息函数
cout<<"name"<<""<<"cputime"<<""<<"needtime"<<""<<"priority"<<""<<"state"<while(p){
cout<name<<""<cputime<<""<needtime<<""<priority<<"";
switch(p->process){
case
ready:
cout<<"ready"<case
execute:
cout<<"execute"<case
block:
cout<<"block"<case
finish:
cout<<"finish"<}
p=p->next;
}
}
intprocess_finish(pcb*q){//进程完成标示
intb1=1;
while(b1&&q){
b1=b1&&q->needtime==0;
q=q->next;
}
returnb1;
}
voidcpuexe(pcb*q){
pcb*t=q;
inttp=0;
while(q){
if(q->process!
=finish){
q->process=ready;
if(q->needtime==0){
q->process=finish;
}
}
if(tppriority&&q->process!
=finish){
tp=q->priority;
t=q;
}
q=q->next;
}
if(t->needtime!
=0){
t->priority-=3;
t->needtime--;
t->process=execute;
t->cputime++;
}
}
voidpriority_cal(){//优先数调度算法
pcb*p;
system("cls");//清屏
p=get_process();
intcpu=0;
system("cls");
while(!
process_finish(p)){
cpu++;
cout<<"cputime:
"<cpuexe(p);
display(p);
//Sleep(100);
getch();//压任意键继续
system("cls");
}
printf("Allprocesseshavefinished,pressanykeytoexit");
getch();
}
voiddisplay_menu(){//选择调度算法
cout<<"CHOOSETHEALGORITHM:
"<cout<<"1PRIORITY"<cout<<"2ROUNDROBIN"<cout<<"3EXIT"<}
pcb*get_process_round(){
pcb*q;
pcb*t;
pcb*p;
inti=0;
cout<<"inputnameandtime"<while(iq=(structpcb*)malloc(sizeof(pcb));
cin>>q->name;
cin>>q->needtime;
q->cputime=0;
q->round=0;
q->count=0;
q->process=ready;
q->next=NULL;
if(i==0){
p=q;
t=q;
}
else{
t->next=q;
t=q;
}
i++;
}
returnp;
}
voidcpu_round(pcb*q){//处理器的工作状态
q->cputime+=2;
q->needtime-=2;
if(q->needtime<0){
q->needtime=0;
}
q->count++;
q->round++;
q->process=execute;
}
pcb*get_next(pcb*k,pcb*head){
pcb*t;
t=k;
do{
t=t->next;
}while(t&&t->process==finish);
if(t==NULL){
t=head;
while(t->next!
=k&&t->process==finish){
t=t->next;
}
}
returnt;
}
voidset_state(pcb*p){
while(p){
if(p->needtime==0){
p->process=finish;
}
if(p->process==execute){
p->process=ready;
}
p=p->next;
}
}
voiddisplay_round(pcb*p){
cout<<"NAME"<<""<<"CPUTIME"<<""<<"NEEDTIME"<<""<<"COUNT"<<""<<"ROUND"<<""<<"STATE"<while(p){
cout<name<<""<cputime<<""<needtime<<""<count<<""<round<<"";
switch(p->process){
case
ready:
cout<<"ready"<case
execute:
cout<<"execute"<case
finish:
cout<<"finish"<}
p=p->next;
}
}
voidround_cal(){//循环轮转调度
pcb*p;
pcb*r;
system("cls");
p=get_process_round();
intcpu=0;
system("cls");
r=p;
while(!
process_finish(p)){
cpu+=2;
cpu_round(r);
r=get_next(r,p);
cout<<"cpu"<display_round(p);
set_state(p);
//Sleep(100);
getch();
system("cls");
}
}
voidmain(){
display_menu();
intk;
scanf("%d",&k);
switch(k){
case1:
priority_cal();break;
case2:
round_cal();break;
case3:
break;
display_menu();
scanf("%d",&k);
}
}
4.2调试与分析
(1)为了更清楚地显示调度的过程及结果,采用了c++中的sleep函数,让程序暂缓执行,结果后调度system(“els”)命令清屏,以免和之前的结果混淆,影响观察效果。
(2)在实验时,将五个进程状态调度顺序搞反,影响了实验结果,经温习课本知识,重新编写代码,最终得以实现。
4.3运行结果
5.用户手册
5.1运行环境
操作系统:
WindowsXP
应用软件:
MicrosoftVisualC++6.0
5.2执行文件
进程调度算法.exe
5.3用户使用说明
运行程序以后,得到以下提示:
CHOOSETHEALGORITHM:
PRIOPITY
ROUNDOBIN
EXIT
其中选1为优先调度算法,选2为循环轮转算法,输入1或2按确认键以后,出现如下提示:
Inpurnameandtime在此将实验测试数据输入,确认后即可演示,为了清楚地观察数据结果,每次调用之后按任意键继续下一时间片的调度,直到结束。
6.参考文献
《操作系统实验教程》,张丽芬、刘利雄、王全玉等,清华大学出版社。
《操作系统原理与实践教程》周湘贞、曾宪权编,清华大学出版社。
《Windows操作系统核心编程实验教程》,宋晓宇,中国铁道出版社。
7.心得体会
此次课程设计快结束时,我们交流了各自的感受,得到的体会如下:
一开始听到要课程设计时,我们都不清楚操作系统编程要怎么设计,然而在仔细阅读课本以及实验说明后,发现只要弄清楚了优先级数调度实现原理后其实并不和我们起初以为的那么困难,用优先队列就可以了。
这次课程设计最重要的是使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
这课程设计的,难免会遇到过各种各样的问题,虽然基本实现了实验要求,但是程序仍然还存在一定的问题,在设计的过程中遇到问题,我们将会在以后想办法改进。
最后,我们在设计的过程中发现了自己的不足之处。
对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。