资源描述
衡阳师范学院
《计算机操作系统》
课程设计
题 目: 进程调度设计
班 级: 计算机系0901班
学 号:
作者姓名:
指导老师:
年 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和运行时间差值,即P TIME-process->needtime。进程每实施一次,优先数减3,CPU时间片数加1,进程还需要时间片数减1。在轮转算法中,采取固定时间片(即:每实施一次进程,该进程实施时间片数为已实施了2个单位),这时,CPU时间片数加2,进程还需要时间片数减2 ,并排列到就绪队列尾上。
(4)对于碰到优先数一致情况,采取FIFO策略处理。
3.关键数据结构
1. struct pcb ( ) 定义pcb
2. Void display ( ) 显示结果信息函数
3. Int process finish(pcb *q) 进程完成表示
4. Void displa_round ( ) 显示循环轮转调度算法运行结果
5. Priority_call ( ) 优先数调度算法
6. Void cpu_round ( ) 处理器工作状态
4. 程序清单
4.1具体设计
#include<stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream.h>
#include<windows.h>
#define P_NUM 5
#define P_TIME 50
enum state{ //进程状态
ready,
execute,
block,
finish
};
struct pcb{ //定义PCB块
char name[4];
int priority;
int cputime;
int needtime;
int count;
int round;
state process;
pcb * next;
};
pcb * get_process();
pcb * get_process(){
pcb *q;
pcb *t;
pcb *p;
int i=0;
cout<<"input name and time"<<endl;
while(i<P_NUM){
q=(struct pcb *)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++;
}
return p;
}
void display(pcb *p){ //现实结果信息函数
cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"state"<<endl;
while(p){
cout<<p->name<<" "<<p->cputime<<" "<<p->needtime<<" "<<p->priority<<" ";
switch(p->process){
case
ready:cout<<"ready"<<endl;break;
case
execute:cout<<"execute"<<endl;break;
case
block:cout<<"block"<<endl;break;
case
finish:cout<<"finish"<<endl;break;
}
p=p->next;
}
}
int process_finish(pcb *q){ //进程完成标示
int b1=1;
while(b1&&q){
b1=b1&&q->needtime==0;
q=q->next;
}
return b1;
}
void cpuexe(pcb *q){
pcb *t=q;
int tp=0;
while(q){
if(q->process!=finish){
q->process=ready;
if(q->needtime==0){
q->process=finish;
}
}
if(tp<q->priority&&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++;
}
}
void priority_cal(){ //优先数调度算法
pcb * p;
system("cls"); //清屏
p=get_process();
int cpu=0;
system("cls");
while(!process_finish(p)){
cpu++;
cout<<"cputime:"<<cpu<<endl;
cpuexe(p);
display(p);
//Sleep(100);
getch(); //压任意键继续
system("cls");
}
printf("All processes have finished,press any key to exit");
getch();
}
void display_menu(){ //选择调度算法
cout<<"CHOOSE THE ALGORITHM:"<<endl;
cout<<"1 PRIORITY"<<endl;
cout<<"2 ROUNDROBIN"<<endl;
cout<<"3 EXIT"<<endl;
}
pcb * get_process_round(){
pcb *q;
pcb *t;
pcb *p;
int i=0;
cout<<"input name and time"<<endl;
while(i<P_NUM){
q=(struct pcb *)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++;
}
return p;
}
void cpu_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;
}
}
return t;
}
void set_state(pcb *p){
while(p){
if(p->needtime==0){
p->process=finish;
}
if(p->process==execute){
p->process=ready;
}
p=p->next;
}
}
void display_round(pcb *p){
cout<<"NAME"<<" "<<"CPUTIME"<<" "<<"NEEDTIME"<<" "<<"COUNT"<<" "<<"ROUND"<<" "<<"STATE"<<endl;
while(p){
cout<<p->name<<" "<<p->cputime<<" "<<p->needtime<<" "<<p->count<<" "<<p->round<<" ";
switch(p->process){
case
ready:cout<<"ready"<<endl;break;
case
execute:cout<<"execute"<<endl;break;
case
finish:cout<<"finish"<<endl;break;
}
p=p->next;
}
}
void round_cal(){ //循环轮转调度
pcb *p;
pcb *r;
system("cls");
p=get_process_round();
int cpu=0;
system("cls");
r=p;
while(!process_finish(p)){
cpu+=2;
cpu_round(r);
r=get_next(r,p);
cout<<"cpu "<<cpu<<endl;
display_round(p);
set_state(p);
//Sleep(100);
getch();
system("cls");
}
}
void main(){
display_menu();
int k;
scanf("%d",&k);
switch(k){
case 1:priority_cal();break;
case 2:round_cal();break;
case 3:break;
display_menu();
scanf("%d",&k);
}
}
4.2调试和分析
(1) 为了更清楚地显示调度过程及结果,采取了c++中sleep函数,让程序暂缓实施,结果后调度system(“els”)命令清屏,以免和之前结果混淆,影响观察效果。
(2) 在试验时,将五个进程状态调度次序搞反,影响了试验结果,经温习书本知识,重新编写代码,最终得以实现。
4.3运行结果
5.用户手册
5.1 运行环境
操作系统:Windows XP
应用软件:Microsoft Visual C++6.0
5.2 实施文件
进程调度算法.exe
5.3 用户使用说明
运行程序以后,得到以下提醒:
CHOOSE THE ALGORITHM:
PRIOPITY
ROUNDOBIN
EXIT
其中选1为优先调度算法,选2为循环轮转算法,输入1或2按确定键以后,出现以下提醒:
Inpur name and time 在此将试验测试数据输入,确定后即可演示,为了清楚地观察数据结果, 每次调用以后按任意键继续下一时间片调度,直到结束。
6.参考文件
《操作系统试验教程》,张丽芬、刘利雄、王全玉等,清华大学出版社。
《操作系统原理和实践教程》周湘贞、曾宪权编,清华大学出版社。
《Windows操作系统关键编程试验教程》,宋晓宇,中国铁道出版社。
7.心得体会
此次课程设计快结束时,我们交流了各自感受,得到体会以下:
一开始听到要课程设计时,我们全部不清楚操作系统编程要怎么设计,然而在仔细阅读书本和试验说明后,发觉只要搞清楚了优先级数调度实现原理后其实并不和我们起初认为那么困难,用优先队列就能够了。这次课程设计最关键是使我们知道了理论和实际相结合是很关键,只有理论知识是远远不够,只有把所学理论知识和实践相结合起来,从理论中得出结论,才能提升自己实际动手能力和独立思索能力。这课程设计,难免会碰到过多种多样问题,即使基础实现了试验要求,不过程序仍然还存在一定问题,在设计过程中碰到问题,我们将会在以后想措施改善。最终,我们在设计过程中发觉了自己不足之处。对部分前面学过知识了解得不够深刻,掌握得不够牢靠,经过这次课程设计以后,我们把前面所学过知识又重新温故了一遍。
展开阅读全文