操作系统实验报告模板文档格式.docx
《操作系统实验报告模板文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告模板文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
实验内容及要求(详见实验讲义与实验指导书):
实验内容
本实验要求用C语言编写和调试一个简单的进程调度模拟程序。
须在实验报告中给出详细算法描述和流程图。
实验要求
①设计进程控制块PCB表结构,分别适用于优先数调度算法和轮转调度算法。
②建立进程就绪队列。
对两种不同算法编制入队子程序。
③编制两种进程调度算法:
1)优先数调度;
2)轮转调度
实验用到的软件(:
)
Visualstudios2010
实验内容及关键步骤(代码)Q3(15分)
#include<
ctype.h>
stdio.h>
stdlib.h>
string.h>
typedefstructnode
{
charname[10];
/*进程标识符*/
intprio;
/*进程优先数*/
intround;
/*进程时间轮转时间片*/
intcputime;
/*进程占用CPU时间*/
intneedtime;
/*进程到完成还要的时间*/
intcount;
/*计数器*/
charstate;
/*进程的状态*/
structnode*next;
/*链指针*/
}PCB;
PCB*finish,*ready,*tail,*run;
/*队列指针*/
intN;
/*进程数*/
//几个函数的声明
voidcreate1(char);
voidcreate2(char);
voidpriority(char);
voidroundrun(char);
voidinunization()//初始化界面
printf("
\n\n\t\t*********************************************\t\t\n"
);
\t\t\t\t实验六进程调度模拟\n"
\t\t*********************************************\t\t\n"
\n\n\n\t\t\t\t\t2009级计算机/软件\n"
\t\t\t\t\t刘德华\n"
\t\t\t\t\t3204007102\n"
\t\t\t\t\t完成时间:
2011年10月20日\n\n\n\n"
}
/*标题输出函数*/
voidprt1(chara)
if(toupper(a)=='
P'
)/*优先数法*/
进程号cpu时间所需时间优先数状态\n"
else
进程号cpu时间所需时间记数时间片状态\n"
/*进程PCB输出*/
voidprt2(chara,PCB*q)
)/*优先数法的输出*/
%-10s%-10d%-10d%-10d%c\n"
q->
name,
q->
cputime,q->
needtime,q->
prio,q->
state);
else/*轮转法的输出*/
%-10s%-10d%-10d%-10d%-10d%-c\n"
count,q->
round,q->
/*主要的输出函数*/
voidprt(charalgo)
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*/
getchar();
/*压任意键继续*/
/*主函数*/
intmain()
charalgo;
/*算法标记*/
inunization();
选择算法:
P/R(优先数算法/时间片轮转算法)\n"
scanf("
%c"
&
algo);
/*输入字符确定算法*/
输入进程数:
\n"
%d"
N);
/*输入进程数*/
if(algo=='
||algo=='
p'
create1(algo);
/*优先数法*/
priority(algo);
create2(algo);
/*轮转法*/
roundrun(algo);
//system("
pause"
return0;
voidinsert1(PCB*q)//优先数插入函数
PCB*p1,*s,*r;
intb;
s=q;
p1=ready;
r=p1;
b=1;
while((p1!
=NULL)&
&
b)
if(p1->
prio>
=s->
prio)
{
r=p1;
p1=p1->
}
else
b=0;
if(r!
=p1)
r->
next=s;
s->
next=p1;
ready=s;
voidinsert2(PCB*q)//轮转法插入函数
tail->
next=q;
tail=q;
next=NULL;
voidfirrun()//将准备队列的第一个进程投入运行
run=ready;
run->
state='
R'
;
ready=ready->
voidcreate1(charalgo)//优先数进程创建
inti,time;
charjinchengname[10];
ready=NULL;
finish=NULL;
run=NULL;
for(i=1;
i<
=N;
i++)//创建N个进程
p=(structnode*)malloc(sizeof(PCB));
printf("
请输入进程名%d:
i);
scanf("
%s"
jinchengname);
请输入运行时间:
time);
strcpy(p->
name,jinchengname);
//将进程几个属性进行赋值
p->
cputime=0;
needtime=time;
w'
prio=100-time;
//准备队列不为空时进行插入
if(ready!
insert1(p);
//当准备队列为空时将p设定为第一个进程
p->
next=ready;
ready=p;
优先数进程调度模拟:
prt(algo);
//输出进程的信息
firrun();
//将就绪队列的第一个进程投入运行
voidcreate2(charalgo)//轮转法进程创建
finish=NULL;
run=NULL;
p=(structnode*)malloc(sizeof(PCB));
count=0;
round=2;
//时间片赋值
insert2(p);
//当准备队列为空时将p设定为第一个进程
else{
tail=p;
轮转法进程调度模拟:
prt(algo);
firrun;
//将就绪队列的第一个进程投入运行
voidpriority(charalgo)//优先数调度过程
while(run!
=NULL)//当运行队列不为空,进行进程调度操作
run->
cputime=run->
cputime+1;
needtime=run->
needtime-1;
prio=run->
prio-3;
//完成了的进程放入完成队列
if(run->
needtime==0)
run->
next=finish;
finish=run;
F'
run=NULL;
if(ready!
firrun();
//没运行完而且优先数不是最大的,将其插入到就绪队列
elseif((ready!
(run->
prio<
ready->
prio))
{
run->
W'
insert1(run);
}
//输出下一个调度表
voidroundrun(charalgo)//轮转法的调度过程
count=run->
count+1;
needtime==0)//运行完的进程插入到完成队列
firrun();
//如果运行时间达到时间片限制
elseif(run->
count==run->
round)
//运行时间计数器置0
//讲时间片到的进程插入到就绪队列末端!
insert2(run);
//讲第一个进程投入到运行
实验过程中遇到的问题解决办法与实验体会Q4(需手写,10分)
评阅教师特殊评语:
评阅教师:
日期: