西安交通大学自动化系操作系统进程调度实验Word下载.docx
《西安交通大学自动化系操作系统进程调度实验Word下载.docx》由会员分享,可在线阅读,更多相关《西安交通大学自动化系操作系统进程调度实验Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
三、实验内容
进程调度实验
●目的要求
用VC编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
●内容
设计一个有N个进程并行的进程调度程序。
其中:
1)进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
4)进程的运行时间以时间片为单位进行计算。
5)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
6)就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
7)如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程;
如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
8)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
9)重复以上过程,直到所要进程都完成为止。
调度算法的流程图如下:
四、编程实现
1.主要变量定义
structpcb{//进程控制块PCB,注:
进程序列以进程控制块为基本单位
charname[10];
//进程名
charstate;
//进程状态
intsuper;
//进程优先级
intntime;
//进程所需运行时间
intrtime;
//进程已运行时间
structpcb*link;
//定义指向PCB控制块的指针,用于创建进程序列
}*ready=NULL,*p;
//定义两个PCB结构的全局变量ready和p,ready初始值为空
typedefstructpcbPCB;
//用PCB来申明进程控制块变量
2.主要模块
VoidInitialInterface()//初始化界面
Voidmenu()//算法选择的主菜单
VoidScheduling(intflag)//调度算法的程序入口
Voidinput(intflag)//进程控制块输入函数
Voidsort(intflag)//进程序列的排序函数
Intspace()//计算进程等待序列中进程控制块的个数
Voidrunning(intflag)//进程运行函数
Voidcheck(intflag)//进程序列的查看函数
Voiddisplay(PCB*pr,intflag)//显示进程控制块的信息
Voiddestroy()//进程撤销函数
3.代码
#include<
stdio.h>
stdlib.h>
conio.h>
#definegetpch(type)(type*)malloc(sizeof(type))
structpcb{
voidInitialInterface()//初始界面
{
printf("
\n\t\t***********************************************\t\t\n"
);
\t\t\t操作系统进程调度实验\n"
\t\t***********************************************\t\t\n"
\n\n\n\t\t\t电信学院\n\n"
\t\t\t班级:
自动化1X\n\n"
\t\t\t姓名:
XX\n\n"
\t\t\t学号:
21105040XX\n\n"
\t\t\t完成时间:
2014年11月17号\n\n\n\n"
\t\t\t请输入任意键进入演示过程......"
getch();
}
voidsort(intflag)//进程排序函数,flag==1表示对优先级进程的等待序列进行排序,flag==0表示对FCFS进程的等待序列进行排序
PCB*first,*second;
if(flag==1)//flag==1,对优先级进程的等待序列进行排序
{
intinsert=0;
//insert用来判断新近进程是否插入队尾,仅在优先级进程的排序中使用
if((ready==NULL)||((p->
super)>
(ready->
super)))
{
p->
link=ready;
ready=p;
}
else
first=ready;
second=first->
link;
while(second!
=NULL)
if((p->
(second->
super))
link=second;
first->
link=p;
second=NULL;
insert=1;
//insert==1,表示新近的进程在序列中间插入
first=first->
second=second->
if(insert==0)first->
//insert==0,表示序列已经检索到队尾,新近进程插入序列尾部
}
else//flag==0,对FCFS进程的等待序列进行排序
first=ready;
if(ready==NULL)ready=p;
while(first->
link!
=NULL){first=first->
voidinput(intflag)//初始化时进程序列输入函数,flag==1表示优先级进程序列的输入,flag==0表示FCFS进程序列的输入
{
inti,N;
system("
cls"
printf("
\n\n\t\t*********************************************\t\t\n"
if(flag==1)
\t\t\t\t最高优先数优先算法\n"
\t\t\t\t先来先服务算法\n"
\t\t*********************************************\t\t\n"
\n请输入进程数:
"
scanf("
%d"
&
N);
if(flag==1)//优先级进程序列输入
for(i=0;
i<
N;
i++)
\n进程号No.%d:
\n"
i);
p=getpch(PCB);
\n输入进程名:
%s"
p->
name);
\n输入进程优先数:
super);
\n输入进程运行时间:
ntime);
rtime=0;
state='
w'
;
link=NULL;
sort
(1);
for(i=0;
i++)//FCFS进程序列输入
sort(0);
}
intspace()//计算进程等待序列中的进程个数,从ready开始算起
intl=0;
PCB*pr=ready;
while(pr!
l++;
pr=pr->
return(l);
voiddisplay(PCB*pr,intflag)//进程信息显示,flag==1表示优先级进程的显示,flag==0表示FCFS进程的显示
if(flag==1)printf("
\npname\tstate\tsuper\tndtime\truntime\n"
elseprintf("
\npname\tstate\tndtime\truntime\n"
|%s\t"
pr->
|%c\t"
state);
|%d\t"
rtime);
voiddestroy()//释放进程
\n进程[%s]此次运行之后已完成,将退出进程序列.\n"
free(p);
voidcheck(intflag)//进程查看函数,flag==1表示优先级进程查看,flag==0表示FCFS进程查看
PCB*pr;
\n****当前正在运行的进程是:
if(flag==1)display(p,1);
elsedisplay(p,0);
pr=ready;
\n****当前就绪队列状态为:
if(flag==1)//查看优先级进程序列
display(pr,1);
else//查看FCFS进程序列
display(pr,0);
voidrunning(intflag)//进程运行函数,flag==1表示优先级进程的运行,flag==0表示FCFS进程的运行
(p->
rtime)++;
if(p->
rtime==p->
ntime)
destroy();
//进程已运行时间等于所需运行时间时将被释放,自动从进程序列中消失
if(flag==1)//优先级进程运行时的规则:
运行时间加一,优先级减一,同时进入等待状态,进入等待序列重新排序
(p->
super)--;
else//FCFS进程运行时的规则:
运行时间加一,直接进入等待状态并插入队尾
p->
voidScheduling(intflag)//调度算法,flag==1表示优先级算法,flag==0表示FCFS算法
intlen,h=0;
charch;
if(flag==1)input
(1);
elseinput(0);
len=space();
while((len!
=0)&
&
(ready!
=NULL))
ch=getchar();
h++;
\nTheexecutenumber:
%d\n"
h);
p=ready;
ready=p->
R'
if(flag==1)//flag==1,优先级进程的查看和运行
check
(1);
running
(1);
else//flag==0,FCFS进程的查看和运行
check(0);
running(0);
\n按回车键继续......"
\n\n进程已经完成.\n"
/***********************模块结束*************************/
voidmenu()//界面主菜单
{intm;
\t\t\t\t进程调度实验\n"
\n\n\n\t\t\t1.最高优先数优先算法."
\n\t\t\t2.先来先服务算法."
\n\t\t\t0.退出程序."
\n\n\t\t\t\t请按键选择进程调度方法:
m);
//注意:
主菜单中只能输入整型数
switch(m)
{case1:
Scheduling
(1);
menu();
break;
case2:
Scheduling(0);
case0:
default:
voidmain()//主main()函数
InitialInterface();
//初始化界面
menu();
//主菜单界面
五、使用说明
1.初始化界面
(在此省略……)
2.调度算法选择界面
3.最高优先数优先算法
4.输入3个进程控制块a,b,c
进程a的优先数为3,运行时间为2
进程b的优先数为2,运行时间为2
进程c的优先数为5,运行时间为2
5.输入完所有进程信息后按回车键,进程开始运行,控制窗口显示正在运行进程的信息和进程等待序列中进程的信息,直至所有进程运行结束
6.先来先服务算法
7.输入2个进程控制块a和b,进程a的运行时间为2
进程b的运行时间为2
8.输入完所有进程信息后按回车键,进程开始运行,控制窗口显示正在运行进程的信息和进程等待序列中进程的信息,直至所有进程运行结束
9.在算法选择菜单中输入0,按回车键退出程序
六、结果分析
1.最高优先数优先算法
初始化时输入的三个进程信息是:
a的优先数为3,运行时间为2
b的优先数为2,运行时间为2
c的优先数为5,运行时间为2
按照优先级算法的规则(进程每运行一次,已运行时间加一,优先数减一,同时按优先级插入就绪队列),进程运行时的顺序应该是:
c→c→a→b→a→b,进程c在第二次运行之后就退出进程序列,进程a和b在轮流运行两次之后分别退出进程序列,以上分析结果与使用说明中的程序运行结果相一致,所以最高优先级算法的实现满足实验要求。
2.先来先服务算法
初始化时输入的两个进程信息是:
进程a的运行时间为2,进程b的运行时间为2
按照先来先服务算法的规则(进程每运行一次,已运行时间减一,同时插入进程等待序列的队尾),进程运行时的顺序应该是:
a→b→a→b,两个进程在轮转运行两次之后分别退出进程序列,以上分析结果与使用说明中的程序运行结果一致,所以先来先服务算法的实现满足实验要求。
七、设计体会