实验2进程调度设计分析Word文档下载推荐.docx
- 文档编号:18789307
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:11
- 大小:149.64KB
实验2进程调度设计分析Word文档下载推荐.docx
《实验2进程调度设计分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验2进程调度设计分析Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
进程的到达时间及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)两种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用运行时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应分配时间片给就绪队列中排在该进程之后的进程,并将它插入就绪队列队尾。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
四、实验步骤
1、进程调度算法:
采用多级反馈队列调度算法。
其基本思想是:
当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;
如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。
2、实验步骤:
(1)按先来先服务算法将进程排成就绪队列。
(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。
(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。
(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。
(5)重复步骤
(2)、(3)、(4),直到就绪队列为空。
3、流程图:
Y
五、实验结果及分析
按Y键程序继续执行,直至所有进程结束。
程序源代码:
#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,*pinsert=NULL,*pfend=NULL,*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&
&
ps->
link->
queue!
=(pfend->
queue+2))
ps=ps->
link;
pinsert=ps;
}
voidinsert()//插入进程
if(!
ready)
ready=p;
pfend=p;
pinsert=p;
elseif(ready->
queue==1)
{//第一队列存在
p->
link=pfend->
pfend->
link=p;
findpos();
else{
link=ready;
voidinput()/*建立进程控制块函数*/
inti,num;
printf("
\n请输入进程的个数?
"
num=geti();
for(i=0;
i<
num;
i++)
\n进程号No.%d:
\n"
i+1);
p=getpch(PCB);
\n请输入进程名:
scanf("
%s"
p->
name);
\n请输入进程运行时间:
p->
ntime=geti();
rtime=0;
state='
w'
;
queue=1;
etime=TIME;
link=NULL;
insert();
/*调用insert函数*/
voiddisp(PCB*pr)/*建立进程,实现函数用于显示当前函数*/
\nname\tstate\tqueue\tntime\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->
=1)
(ready->
queue)++;
ready->
etime*=2;
ready->
state='
sort();
/*调用sort函数*/
input();
else
voiddestroy()/*程序运行结束,结束进程*/
\n进程已完成.\n"
p=ready;
ready=ready->
free(p);
queue)findpos();
voidrunning()/*进程运行时间到,之就绪状态*/
(ready->
rtime)++;
etime--;
if(ready->
rtime==ready->
ntime)
destroy();
return;
etime==0)
inttime=2;
for(inti=2;
i!
=ready->
queue;
++i)
time*=2;
etime=time;
ready->
sort();
voidmain()
charch;
input();
while(ready!
=NULL)
\nTheexecutename:
%s\n"
ready->
state='
R'
check();
running();
\n按i键添加新程序....按任意键程序继续运行..."
if(ch=='
i'
||ch=='
I'
)
addnew();
\n\n进程已经完成\n"
getchar();
六、总结
先来先服务调度算法就是根据进程达到的时间为依据,哪一个进程先来那么该进程就会先执行这就是本次试验的依据。
通过本次实验了解到算法很重要,又更加明白算法本身可以节约时间,而且不同的函数之间在调用的时候要注意很多的问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 进程 调度 设计 分析