操作系统计划性实验报告.docx
《操作系统计划性实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统计划性实验报告.docx(15页珍藏版)》请在冰点文库上搜索。
操作系统计划性实验报告
《操作系统》
设计性实验报告
2013~2014学年第二学期
实验项目名称
进程调度
专业班级
12计算机二班
姓名
刘洋
学号
1206111105
进程调度
一、实验目的与要求
1、选用优先数法或简单轮转法对n个进程进行调度。
2、用高级语言编写和调试一个简单的进程调度程序。
3、上机调试程序,撰写实验报告。
二、实验条件(所需场地、设备、实验耗材等)
计算机机房,微型计算机,TurboC(或VC++)软件。
三、实验设计的内容
1、设计一个有n个进程(可假定系统有五个进程)共行的进程调度程序。
每一个进程用一个进程
控制块PCB来代表。
PCB中应包含下列信息:
进程名、进程优先数、进程需要运行的时间、占用CPU的时间及进程的状态等,且可按调度算法的不同而增减。
各进程的优先数或轮转时间片数,以及进程运行需要的时间片数,均由伪随机数发生器产生。
2、调度程序应包含2到3种不同的调度算法,运行时可任选一种。
3、每个进程处于运行R、就绪W和完成F三种状态之一,假定初始状态都为就绪状态W。
4、系统能显示或打印各进程状态和参数的变化情况。
四、实验设计的步骤及结果测试
为便于处理,程序中进程的运行时间以时间片为基本计算单位。
1、进程控制块PCB的格式为:
进程标识数
链指针
优先数/轮转时间片数
占用CPU时间片数
进程所需时间片数
进程状态
2、优先数算法:
进程就绪链按优先数大小排列,链首首先投入运行。
每过一个时间片,运行进程
所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先数应降低一级。
接着比较现行进程和就绪链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续运行,否则,调度就绪链的链首进程投入运行。
原运行进程再按照其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。
简单轮转法:
进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相应于优先数法的优先数记录项位置)。
每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。
3、随即函数rand()通常的使用方法:
rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。
如果你要产生0~10的10个整数,可以表达为:
intN=rand()%11;
这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:
intN=1+rand()%11;
总的来说,可以表示为:
a+rand()%n;其中的a是起始值,n是整数的范围。
若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依此类推。
通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。
若要产生每次不同的随机数,可以使用srand(seed)函数进行随机化,随着seed的不同,就能够产生不同的随机数。
此外,还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。
五、程序代码及运行结果
程序代码:
#include
#include
#include
#include
#include
#include
#defineP_NUM5
enumstate{
W,
R,
block,
F
};
structpcb{
charname[4];
intpriority;
intcputime;
intneedtime;
intcount;
intround;
stateprocess;
pcb*next;
};
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=20+rand()%31;
q->process=W;
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;
cout<<"";
cout<cputime;
cout<<"";
cout<needtime;
cout<<"";
cout<priority;
cout<<"";
switch(p->process){
caseW:
cout<<"W"<caseR:
cout<<"R"<caseblock:
cout<<"block"<caseF:
cout<<"F"<}
p=p->next;
}
}
intprocess_F(pcb*q){
intbl=1;
while(bl&&q){
bl=bl&&q->needtime==0;
q=q->next;
}
returnbl;
}
voidcpuexe(pcb*q){
pcb*t=q;
inttp=0;
while(q){
if(q->process!
=F){
q->process=W;
if(q->needtime==0){
q->process=F;
}
}
if(tppriority&&q->process!
=F){
tp=q->priority;
t=q;
}
q=q->next;
}
if(t->needtime!
=0){
t->priority-=3;
t->needtime--;
t->process=R;
t->cputime++;
}
}
voidpriority_cal(){
pcb*p;
system("cls");
p=get_process();
intcpu=0;
system("cls");
while(!
process_F(p)){
cpu++;
cout<<"cputime:
"<cpuexe(p);
display(p);
Sleep
(2);
}
printf("Allprocesseshavefinished,pressanykeytoexit");
getch();
}
voiddisplay_menu(){
cout<<"CHOOSETHEALGORITHM:
"<cout<<"1PRIORITY"<cout<<"2POUNDROBIN"<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=W;
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=R;
}
pcb*get_next(pcb*k,pcb*head){
pcb*t;
t=k;
do{
t=t->next;
}
while(t&&t->process==F);
if(t=NULL){
t=head;
while(t->next!
=k&&t->process==F){
t=t->next;
}
}
returnt;
}
voidset_state(pcb*p){
while(p){
if(p->needtime==0){
p->process=F;
}
if(p->process==R){
p->process=W;
}
p=p->next;
}
}
voiddisplay_round(pcb*p){
cout<<"NAME"<<""<<"CPUTIME"<<""<<"NEEDTIME"<<""<<"COUNT"<<""<<"ROUND"<<""<<"STATE"<while(p){
cout<name;
cout<<"";
cout<cputime;
cout<<"";
cout<needtime;
cout<<"";
cout<count;
cout<<"";
cout<round;
cout<<"";
switch(p->process){
caseW:
cout<<"W"<caseR:
cout<<"R"<caseF:
cout<<"F"<}
p=p->next;
}
}
voidround_cal(){
pcb*p;
pcb*r;
system("cls");
p=get_process_round();
intcpu=0;
system("cls");
r=p;
while(!
process_F(p)){
cpu+=2;
cpu_round(r);
r=get_next(r,p);
cout<<"cpu"<display_round(p);
set_state(p);
Sleep(5);
}
}
voidmain(){
display_menu();
intk;
scanf("%d",&k);
switch(k){
case1:
priority_cal();break;
case2:
round_cal();break;
case3:
break;
display_menu();
scanf("%d",&k);
}
}
运行结果:
六、实验体会
总之,这次实验是有收获的,自己也有许多心得体会。
首先,感受颇深的一点是,理论学习是业务实战的基础,但实际工作与理论的阐述又是多么的不同,结合着老师课堂上所讲的内容,磕磕绊绊地完成了实验的要求。
回想起来,虽然不同函数层层调用,看着很复杂,但通过与老师及同学们探讨交流,以及查阅资料,发现也并不如起初那样难以理解。
通过这次的实验,深刻体会到“纸上得来终觉浅,绝知此事要躬行”的真正内涵。
之前课堂上的学习只是让我们懂得了一些基础知识,当需要将理论付诸于实践的时候,才知道这远远是不够的。
书本上只是散乱的知识点,实践才可以让它们显得系统化,才能让我们在使用起来游刃有余。