实验一进程调度实验报告文档格式.docx
《实验一进程调度实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《实验一进程调度实验报告文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
2
****当前正在运行的进程是
!
aa
$七at七巳:
R
supei*:
ndtine!
6
G
rimtine
****当前就绪队列状态为:
super
ndtinc
runtine
CG
:
10
1
state
ndtine
runtime
ibb
u
;
5
当进程CC了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程aa
按照这种方式一直运行下去:
Su
=-一—■
S1
5:
1灯
-键继续…
----
1Theexecutenumber;
3
I
当前正在运行的进程是SC
Iqniame
ndtime
F-untlute
licc:
:
110!
13*当刖就洁队列状态为
■
(jnane
鲁七atu
•dtin)«
runtirt^
hh
Q
quame
niltine
runtime
iaa
i6il
按任L
扌踰并
首输入法
半丁_
直到:
Iheexecutenunbep:
i?
uintIme
14
****当刖正在运厅的进程是:
hbqnanestatesitpei*ndLtj_mehb亦!
-3IS
当进程bb的CPU占用时间等于它需要的执行时间时,进程bb度完成则这时进程调度中还有两个进程:
进程aa进程cc
按任一键继缄
Theexecutenumber:
17
i当前就绪队列状态为:
进程Caal已完成.
当调度进程中只剩下进程aa程cc这时根据进程优先级的大小,进程aa入运行态。
当进程aa调度时,进程调度程序中直剩下进程cc这时进程cc进入运行态,而当前就绪队列将为空。
TheexecutenuLinbei"
二£
****当前正在运行的进程是託匚
qnanestatesupepndtimeruntine
ce!
H!
-G!
10!
9
****当前就绪队列状态为=
进程l«
J已完咸.
按任一键继续……
当进程i的CPU占用时间等于所需要的执行时间时,进程cc调度完成,则这时进程调度中已经没有需要调度的进程了,则整个进程调度完成。
2、编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。
轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。
简单轮转法的基本思想是:
所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。
如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。
直至所有的进程运行完毕。
将老师给的源程序修改成简单的时间片轮转法
流程图如下:
进程完成,撤消该进程
时间片轮转法
#include<
stdio.h>
#include<
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"
);
}
while(ch!
='
if(ch>
9||ch<
'
0'
\t输入有误!
输入只能为正整数,请重新输入...\n"
i=0;
}else{
i=
i*10+(ch-'
ch
=getchar();
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;
插入进程
voidinsert()//////
ready){
ready=p;
pfend=p;
pinsert=p;
第一队列存在
}elseif(ready->
queue==1)//////
{p->
link=pfend->
pfend->
link=p;
pfend=p;
findpos();
Else
p->
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=O;
state='
w'
;
queue=1;
etime=TIME;
link=NULL;
insert();
/*调用insert函数*/
voiddisp(PCB*pr)/*建立进程现实函数,用于显示当前进程*/
\nname\tstate\tqueue\tntime\trtime\t在队列可停留时间\t\n"
|%s\t"
pr->
name);
|%c\t"
state);
|%d\t"
queue);
ntime);
rtime);
etime);
voidcheck()/*建立进程查看函数*/
PCB*pr;
\n****当前正在运行的进程是:
%s"
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;
if(ready&
ready->
queue==pinsert->
queue){findpos();
voidaddnew()〃添加新的进程
if(ready->
=1){
(ready->
queue)++;
etime*=2;
state='
sort();
/*调用sort函数*/input();
input();
voiddestroy。
/*建立进程撤销函数(进程运行结束,撤销进程)*/
\n进程[%s]已完成.\n"
name);
p=ready;
ready=ready->
free(p);
queue)
voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/
rtime)++;
etime--;
if(ready->
rtime==ready->
ntime){
destroy();
return;
etime==0){
inttime=2;
for(inti=2;
i!
=ready->
queue;
++i)time*=2;
etime=time;
/*调用sort函数*/
voidmain()
while(ready!
=NULL)
\nTheexecutename:
%s\n"
ready->
state='
R'
check();
running();
\n按i键添加新进程....按其他任意键继续运行..."
if(ch=='
i'
||ch==T)
addnew();
\n\n进程已经完成\n"
getchar();
运行结果如下:
根据题意输入五个进程
按任意键继续
'
C:
\Users\pc\Desktop\Debug\jj-exe"
科键添加新进穆-…按其他任意键继续运行…山
Theexecultename=aa
****当前正在运行的进程是=aa
nane!
aa
state:
queue
11
ntine\12
rtime:
在队列可停留时间
員ttXJt
当前就绪队列状态为:
name
ntine
rti_me
B
\2
naine
ntine
rtine
icc
w
IS
12
nam&
ntime
rtime
dd
Ujp
(7
nane
See
ur
孩舞据加两进程-…按其他任意键继续运行---
serApc\Desktop\Det>
ug\jj.exe'
按i键添加新进程.・.■按其他任意键继续运行.・/
Tlieexecutename
CC
****当前正在运行的进私是
cc
ntin?
rtimQ
cc;
i5
ntlne
rtine
dd:
7
0i
nanestate
ncime
lee
names^^ite
nt±
me
i*time
嗣!
112
namestate
Queue
ntime
ptine
柱队列可停留时间
hh!
110
按i键電Q新囲呈.
丄山焉J丄A.Th-+ridt胡丄、1
…按其他任意犍继续运行.
1?
=■q
按i键添加新进程……按其他任意键继续运行.•丄
Theexecutenane:
当前正在运行的进程<=dd
sitatequeuentine
ftime
在队列可停留时间!
IR!
i
19
“当前就绪队列状态为:
statequeue
ncifne
i*-time
ee
lu:
sCatequeue
idi€L
lw;
vtime
bb
u;
il0
st^itequeue
iCC
ut2
杭久键添加新进程……按其他任意键继续运行.
Xll]XA-1~^T*1■?
丄
9■
€;
\Users\pc\Desktop\Debug\jj.exe"
\Users\pcADesktQp\Debug\jj.exe*
-□
按i键添加新谜程•
…按其他任意键继续运行.
■…p
Theexecutenane
1****当冃证在运仃的进程是心■lamkestatequeuent:
£
liee!
R11!
tlute:
卜**当前就绪队列狀态为:
neiFieitate
aa!
w
i*tine
在队列可停留时间\2
name:
Ibb;
n±
ine
lie
r*tine;
namest*te
Sip
ntineIS
ine
idd!
queue:
n七ine!
tine!
2■坪他任意键继知
■■■
四、实验问题及原因
(1)本次试验,思路设计不难在这个多级反馈的实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还有一个标志位Fend用来表明新插入的队列的位置。
(2)在建立优先数就绪队列时主要运用,链表插入模型。
但是由于本题是从建立、到完成一个就绪对列,所以必须分多种情况讨论。
五、实验体会和收获
(1)本次试验后对优先数调度算法和时间片轮转调度算法实现的过程,有了很清楚的
认识、理解。
设计计数器来对进程执行状态的时间分析,使得进程调度这一抽象模型得
到具体化。
之后,便是对进程的插入(执行完,插入到完成队列,否则插入到就绪)和
再次调度(当改进程再次满足条件时,从就绪队列调度到执行队列)重复过程。
(2)通过设计PCB结构,模拟进程调度,加深了对进程的理解。
(3)提高了C语言编程动手能力