实验一进程调度文档格式.docx
《实验一进程调度文档格式.docx》由会员分享,可在线阅读,更多相关《实验一进程调度文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;
如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。
2、实验步骤:
(1)按先来先服务算法将进程排成就绪队列。
(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。
(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。
(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。
(5)重复步骤
(2)、(3)、(4),直到就绪队列为空。
五、流程图
退出程序
是
六、结果过程及截图
初始化队列
输入所有进程后的进程信息如下:
按Y键继续运行进程:
运行若干次后的状态:
添加新的进程:
运行到结束时的状态显示:
七、所遇困难的解决以及心得体会
在这个实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还有一个标志位Fend用来表明新插入的队列的位置。
虽然实验原理很简单,但是在编写代码的过程中遇到了不少的问题,在两个小时之内已经完成的大体代码的编写,但是之中存在不少的问题,导致了用了差不多四个小时的时间去调试才把它弄好,这主要归咎于在开始设计代码的不太合理,在后期使得代码结构有些混乱,使得调试更加的麻烦,以及对编程的不熟悉。
通过这个实验不仅使我对进程的调度算法有了更深的认识,使得理论知识得到的实践,也使我的编程能力得到了进一步提高。
七、源代码
#include<
stdio.h>
stdlib.h>
conio.h>
#definegetpch(type)(type*)malloc(sizeof(type))
#defineNULL0
#defineTIME2//时间片长度
typedefstructpcb////进程管理块
{
charname[10];
//进程名字
charstate;
//进程状态
intqueue;
//进程所在的队列
intntime;
//进程需要运行的时间
intrtime;
//进程已经运行的时间
intetime;
//进程在本队列可运行的时间片
structpcb*link;
}PCB;
PCB*ready=NULL;
//就绪队列,进程插入位置的变量
PCB*pinsert=NULL;
PCB*pfend=NULL;
PCB*p=NULL;
intgeti()//使用户仅能输入整数
charch;
inti=0;
fflush(stdin);
ch=getchar();
while(ch=='
\n'
)
{
printf("
\tf输入不能为空..请重新输入\n"
);
fflush(stdin);
ch=getchar();
}
while(ch!
='
if(ch>
'
9'
||ch<
0'
{
printf("
\t输入有误!
!
输入只能为正整数,请重新输入...\n"
fflush(stdin);
i=0;
ch=getchar();
}
else
i=i*10+(ch-'
returni;
}
voidfindpos()//更新状态量
PCB*ps=pfend;
if(!
ps||!
ps->
link||(ps->
link->
queue-ps->
queue)>
1)
pinsert=ps;
else
while(ps->
link&
&
queue!
=(pfend->
queue+2))
ps=ps->
link;
voidinsert()//插入进程
ready)
ready=p;
pfend=p;
pinsert=p;
elseif(ready->
queue==1)//第一队列存在
p->
link=pfend->
pfend->
link=p;
findpos();
link=ready;
voidinput()/*建立进程控制块函数*/
inti,num;
printf("
请输入进程的个数:
"
num=geti();
for(i=0;
i<
num;
i++)
进程号No.%d:
\n"
i+1);
p=getpch(PCB);
输入进程名:
scanf("
%s"
p->
name);
输入进程运行时间:
p->
ntime=geti();
rtime=0;
state='
w'
;
queue=1;
etime=TIME;
link=NULL;
insert();
/*调用insert函数*/
voiddisp(PCB*pr)/*建立进程现实函数,用于显示当前进程*/
\nname\tstate\tqueue\tntime\trtime\t在队列可停留时间\t\n"
%s\t"
pr->
%c\t"
state);
%d\t"
queue);
ntime);
rtime);
etime);
voidcheck()/*建立进程查看函数*/
PCB*pr;
\n****当前正在运行的进程是:
ready->
/*显示当前运行的进程*/
disp(ready);
pr=ready->
\n****当前就绪队列状态为:
/*显示就绪队列状态*/
while(pr!
=NULL)
disp(pr);
pr=pr->
voidsort()//调整进程队列
ready->
link||ready->
queue<
ready->
queue)
return;
p=ready->
ready->
link=pinsert->
pinsert->
pinsert=ready;
ready=p;
if(ready&
queue==pinsert->
queue)
voidaddnew()//添加新的进程
if(ready->
queue!
=1)
(ready->
queue)++;
ready->
etime*=2;
ready->
state='
sort();
/*调用sort函数*/
input();
}
voiddestroy()/*建立进程撤销函数(进程运行结束,撤销进程)*/
\n进程[%s]已完成.\n"
p=ready;
ready=ready->
free(p);
voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/
(ready->
rtime)++;
etime--;
if(ready->
rtime==ready->
ntime)
destroy();
etime==0)
inttime=2;
for(inti=2;
i!
=ready->
queue;
++i)
time*=2;
etime=time;
voidmain()
input();
while(ready!
=NULL)
\nTheexecutename:
%s\n"
ready->
state='
R'
check();
running();
\n按i键添加新进程....按其他任意键继续运行..."
ch=getchar();
if(ch=='
i'
||ch=='
I'
addnew();
\n\n进程已经完成\n"
getchar();