|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/* ^$ l' ?( l4 Y- s! H: I# \; U
#include "stdio.h") W4 a/ |& f$ W* D$ @; [% P
#include "stdlib.h". \/ u; b0 z% R* L7 w4 z
#include "string.h"/ t) W! B3 s/ O4 q% `9 E# s7 [/ j0 Q
typedef struct node8 \) s( _ w3 ^1 Y. N9 ~. ?
{
, J* I% J( Y) \: j" S$ T4 F char name[10]; /*进程标识符*/6 Y3 ~. i2 J( H% ]: E% J
int prio; /*进程优先数*/
% D% L* Y! z- i! O* A int round; /*进程时间轮转时间片*/
. l0 {( @7 L$ ?+ D5 b& d6 f int cputime; /*进程占用CPU时间*/5 o. j5 y4 h( g' O1 E
int needtime; /*进程到完成还要的时间*/) d' C$ [* i1 E4 Q
int count; /*计数器*/% y# b& y; l3 T& P: @
char state; /*进程的状态*/: d6 |: Y: W; I/ q0 A- Y
struct node *next; /*链指针*/# c: |' q' U. t ~+ b
}PCB;0 J% R2 P d9 [/ Y J; @
PCB *finish,*ready,*tail,*run; /*队列指针*/* \9 A! h" b9 s8 J5 ~) S
int N; /*进程数*/6 U6 u& Q8 u% \. S; ^
/*将就绪队列中的第一个进程投入运行*/- M0 ]: {$ G1 D5 h) _" b4 B
firstin()
! ]) H% c- o# g! p6 x/ ?* v' z{
* N( c; ?( ] k4 V" g5 L run=ready; /*就绪队列头指针赋值给运行头指针*/
3 @9 z$ }" ?" |" l run->state='R'; /*进程状态变为运行态*/1 z: Q9 a8 g7 B. x
ready=ready->next; /*就绪对列头指针后移到下一进程*/
! v, M- D3 A) e+ l4 b% h}8 p/ f( T r- a
/*标题输出函数*/
) C2 ]+ q" `1 F& cvoid prt1(char a)& ~; j0 |6 f0 g+ v' A" M
{3 [% g* o7 @ p7 @
if(toupper(a)=='P') /*优先数法*/+ W0 L$ N+ c3 D: H6 a
printf(" name cputime needtime priority state\n");
# b# c' \) j0 Z else
; S. k. U5 l9 F+ z4 V: a printf(" name cputime needtime count round state\n");! k" F, r# K! u( P( J
}
% k9 v! K5 u/ w. V) q* M/*进程PCB输出*/
4 j5 B& i& Y1 K7 _0 g, p0 G6 Uvoid prt2(char a,PCB *q)
/ N0 i! E0 _8 b2 v8 g9 K o{9 f0 [. `& e3 m+ }6 D5 Y
if(toupper(a)=='P') /*优先数法的输出*/- I# H, \7 t4 K9 f
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
* v; H4 b$ C8 L7 m* E/ ~ q->cputime,q->needtime,q->prio,q->state);
m$ p& ]+ }, m; D: o. E else/*轮转法的输出*/
( s( t5 Q& @) ^. }8 A! O6 g printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,) l: s9 ^- w( z
q->cputime,q->needtime,q->count,q->round,q->state);
% y: ?: @# H u0 D}
1 ^4 `2 ~. M( @4 N0 ^. G' i! }/*输出函数*/ i6 |8 k+ r- a( h) u9 a5 @
void prt(char algo)" [5 {6 o# L+ \! Z8 ]1 M
{
# }: I- Q# ^- q0 T+ O PCB *p;
2 ^7 \! _5 s- t3 Y1 L prt1(algo); /*输出标题*/6 ^8 r; }" h+ u/ d' R3 a/ X
if(run!=NULL) /*如果运行指针不空*/) H# x9 G) P3 C) p
prt2(algo,run); /*输出当前正在运行的PCB*/# R# j* s5 m9 ?: [, u' V
p=ready; /*输出就绪队列PCB*/% r$ ~5 f: P. L4 q6 |: F% C$ @
while(p!=NULL)
0 j: a* \( j' ]6 `, v( W {6 ]% t6 m$ q7 }
prt2(algo,p);
5 {# n4 z$ B( f2 o& a* [. `+ @ p=p->next;
5 W/ s5 G j _/ U$ K }- B0 M+ }8 @* y/ G) Q, w
p=finish; /*输出完成队列的PCB*/
1 @: j3 @+ E* k6 v# B6 m* M while(p!=NULL)! m! Q$ s! Y( N/ c8 u$ r K* L! O
{ i h7 V0 |2 g: E! K
prt2(algo,p);
+ A* e+ [2 x: V. B p=p->next;1 x& I; n& d$ F: P3 F
}: M( u) h5 P& ~0 ^8 e4 W9 b
getch(); /*压任意键继续*/# ?7 y( B6 D0 H) f7 n( |$ C1 j% h9 ]
}0 ?3 t* z0 I/ m; O! R5 \6 x3 \: z
/*优先数的插入算法*/# v$ U# t0 {7 U5 H2 M6 ], i" i
insert1(PCB *q)
: k! W" n" a: {4 I" N3 H{
0 O4 J9 k: R& ~( E: @7 _ PCB *p1,*s,*r;
% `. _0 X" Z" |. Y& S6 C( v int b;
2 ]5 K; I" A1 r5 `/ G$ ` s=q; /*待插入的PCB指针*/6 W6 J! k, \! k6 P: [3 d' n
p1=ready; /*就绪队列头指针*// i# c/ `1 t" |: {$ ~8 a
r=p1; /*r做p1的前驱指针*/
- p2 A; m. X7 M, ~ b=1;
$ C7 E& @5 y/ n; G# D4 f while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
7 r) x9 x' F e2 X if(p1->prio>=s->prio)- M: s" j. k$ y
{
( |. n. H# j% Z# n1 X) d r=p1;
; }6 Q" q& O/ N% Y/ ]& h p1=p1->next;
: ?9 p! U" _9 s. V3 Z. `# w+ i }2 o$ B) K5 x3 O( s! v# T
else p6 {! w- K/ x. B
b=0;
& O) M, x# Q/ j& \' w if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
+ ?. n' Y" d/ S I8 J6 c) G) s {' A9 D5 x) K6 h0 h$ \% \0 H$ f5 |/ `
r->next=s;: H T( W* n V9 M0 c# c$ c
s->next=p1;
3 d% B* I0 g* v4 e4 m, A }
: S+ ?& ?( b# N g else$ a W1 S! L |9 A
{
' x) }# Z/ K! G/ M q0 c; H3 B s->next=p1; /*否则插入在就绪队列的头*/
8 E% f) @0 B+ O( v% i9 k6 s ready=s;- A9 S7 Z+ {+ q% w8 ?3 W
}
9 ]- v3 A; h0 r( Z}4 R: v, l2 u! v3 M8 B7 O
/*轮转法插入函数*/- e1 n" y# b9 s6 p
insert2(PCB *p2)
% Y( D* {, h' @6 {9 @{
0 A2 E) E# [) q' h tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
3 y# L9 @0 d) l3 U; D tail=p2;. T9 [2 ^9 M' ~
p2->next=NULL;
/ B$ j+ l9 @4 s' l, G. m E) ~}
$ B- U8 f5 D' c: V/*优先数创建初始PCB信息*/
$ ]" e$ A. H4 }; j' D; x. \void create1(char alg)5 x/ J+ ~6 [, i* m8 _3 \) l
{
" h# c/ g( G8 F PCB *p;: W9 v1 F: ?% s3 b, }
int i,time;
' Y P, h b& `9 i4 j' N char na[10];( |. I+ ]1 c& V$ M
ready=NULL; /*就绪队列头指针*/
+ k* N- H q( {* d7 y6 S0 b6 F finish=NULL; /*完成队列头指针*/
) N- l. f2 H' e run=NULL; /*运行队列指针*/$ C } I: b( m# ~: F
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
: o/ I- m3 l. K7 A for(i=1;i<=N;i++)0 h& m9 l/ t# K8 A8 P2 B
{
, P2 J. O% j/ d2 d p=malloc(sizeof(PCB));
" I' ?3 L0 `5 ]' `6 ^% } scanf("%s",na);
9 F. }6 ^( d7 N scanf("%d",&time);
" Q+ [5 s8 x& K strcpy(p->name,na);+ i# [- |1 i0 `8 Z
p->cputime=0;2 W! D g% p* j0 M
p->needtime=time;4 V$ b- H' b; n" L5 N
p->state='w';% D; O# [2 m; E0 @
p->prio=50-time;5 T6 b. ?+ z2 \: s7 [. }
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/0 d& g* X& H3 \7 }
insert1(p);& q: N `; K7 I1 z( }
else
* }2 _0 n4 l7 V( @* W) z& O {
9 J" ^- F8 g8 [, o p->next=ready; /*创建就绪队列的第一个PCB*/& r/ Z: J5 k! C( \
ready=p;
9 ~$ Q5 R# u1 v }
9 T& \4 n& H# W4 q2 S }1 ^/ A# q: S% _4 w* R9 O9 N2 k9 Q
clrscr(); `- g6 N! |( T3 w
printf(" output of priority:\n");
: y# c( X P4 ?+ ^) N printf("************************************************\n");( H& R$ G$ T4 _5 \6 ^4 ~
prt(alg); /*输出进程PCB信息*/
* _9 b! R" G% X( E run=ready; /*将就绪队列的第一个进程投入运行*/3 [. Z4 k) }8 [3 h
ready=ready->next;
$ R1 n$ R. ~$ E) u9 R run->state='R';7 q0 C- k7 o. q
}& T3 G% E! t7 v$ ^* F/ P
/*轮转法创建进程PCB*/) Y( Z3 o- K! S! k+ _& O. q- f) F
void create2(char alg)3 s/ Y/ l6 Z/ `0 N/ h
{ G% T+ `" G& V8 A4 n. e
PCB *p;
* L( C+ }5 @! W- ?4 l$ ^4 P' l int i,time;. z+ Y6 @2 D! B* q
char na[10];
* l- ^9 d/ ?4 A C. X5 X ready=NULL;- x9 b# r3 W9 ]7 `
finish=NULL;( }! @: e4 j/ Y+ _* a
run=NULL;
r6 L+ p. m- n7 t) k printf("Enter name and time of round process\n");% |, X4 f- j, G, M
for(i=1;i<=N;i++)
) j& J7 N3 T9 u5 t' c* O* Q- O {
- T- p3 L W* w! C p=malloc(sizeof(PCB));* I* ^( V, [6 C) t: z$ D
scanf("%s",na);
; Z/ V6 c2 K" t/ y+ T scanf("%d",&time);
) \7 a% K* _& n4 z+ i/ v5 r strcpy(p->name,na);9 q% }' u- M: M$ n- M8 m1 |
p->cputime=0;2 L( V% ?( @2 q% H7 r2 x+ P
p->needtime=time;
# J( u( N/ u! ?. W4 y5 v p->count=0; /*计数器*/8 q* W9 _& j7 I9 z
p->state='w';: I2 f# T8 C1 J: c: |% Q: r9 M3 v
p->round=2; /*时间片*/
. v; C$ V c9 H2 ]( c! w: f }* S if(ready!=NULL)( j/ [ l' F( ]4 e# l) W; L& [
insert2(p);
5 ~0 a3 k U5 q* o2 `" J+ m else) O) X9 R `. ^/ j6 u7 U2 e
{
8 q7 V0 R4 g* P p->next=ready;; ^* T! @' f" u5 x9 [
ready=p;
" _% l) o. \ {: D+ |( O9 x tail=p;. W" `0 ` i+ p# \1 ]$ U
}
4 D) G" I- M0 D( E }% d- H+ O7 x* ?- `% m8 I# ~
clrscr();
! U& m. s1 ^8 G0 s printf(" output of round\n");
! f" z' f8 I1 H5 i1 A- j printf("************************************************\n");
5 b9 d% d3 j" R) x; M H! h prt(alg); /*输出进程PCB信息*/6 ~0 j, q4 D8 x0 F% p8 d
run=ready; /*将就绪队列的第一个进程投入运行*/
% t+ D }( I8 T/ S" N ready=ready->next;6 |( Q$ p s2 N8 k- v, t0 |
run->state='R';0 A$ |+ @3 x) P1 z( U
}1 s, w9 i! { d! k/ ?
/*优先数调度算法*/
2 ?0 _/ M/ R I+ z% jpriority(char alg)! P: C; f& h ^2 a& ^2 M) T, W# ^
{
# \' F2 X3 f7 G4 Z0 u2 r while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
9 s% z0 ]1 y( ?4 k {; u$ `' S9 w {( J
run->cputime=run->cputime+1;6 U- |# {/ W5 t" f0 f! e
run->needtime=run->needtime-1;
' g; c4 W A, i( O9 _) H7 H. S' l9 v run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/8 n1 x0 L2 Q1 k6 J, B: a7 q. E
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/' C$ P: X* f: g* b
{
2 D3 X2 ~. R+ j9 V8 L6 K6 g run->next=finish;
: g( g6 A. j3 _& {/ o8 ] finish=run;
s+ `/ l n6 Z$ X y6 q S' q$ | run->state='F'; /*置状态为完成态*/. t/ B h5 |% h
run=NULL; /*运行队列头指针为空*/' |( \& h, \& D7 m, R
if(ready!=NULL) /*如就绪队列不空*/
0 T$ `6 Y) s6 b0 A$ G7 y, V firstin(); /*将就绪对列的第一个进程投入运行*/
( e& z4 s& j7 V3 k3 }9 ? }
9 e) c2 }+ G4 z; _ else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
' b! g0 `* }1 @ if((ready!=NULL)&&(run->prio<ready->prio))
, T, q/ z0 V8 L: ` {$ ~; r3 E; `! y; x) K z4 S
run->state='W';
+ ]6 C( T( ~( `, s5 p* k. s/ l) L& {0 i insert1(run);
0 g/ H D/ V4 x6 p1 ^- v d+ `! F" l firstin(); /*将就绪队列的第一个进程投入运行*/, W) b" H4 a7 @0 v7 d
}) [, O3 P& M" `6 Y' u+ c5 c& L6 c
prt(alg); /*输出进程PCB信息*/
" Z0 M, z8 n* {/ B& y i }% d, T! N7 [( y8 M; P
}2 E+ k" |2 C8 w5 \) K9 m& @& l. ^
/*时间片轮转法*/
( }5 q! u7 R' {# e: Troundrun(char alg)
2 D$ p1 u9 }1 n) l" L- A{
' Q$ T# b$ Y, N, R9 P, T: l/ N while(run!=NULL)
- S$ {- s/ M/ K4 z+ m* ^. B0 O6 q {
0 G$ S' ~9 a K run->cputime=run->cputime+1;, j5 c H I, b
run->needtime=run->needtime-1;' B( L5 z# s% u1 J' p1 W7 }* }
run->count=run->count+1;
% n# u! [. V n0 | b( h$ D0 c if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
2 w. E+ ?5 h4 _+ h {& Q4 y- l; R8 ~$ S, A
run->next=finish;. H+ U" n$ ^0 V* g G7 q
finish=run;/ }! x" \6 S- S1 W2 {
run->state='F';
) e! a Q3 V, L3 v4 j( M+ ~8 ~ run=NULL;6 r" I1 h" M8 j$ n. ~8 Q% e+ E
if(ready!=NULL)
! m: _4 S' U3 p: N ~/ w, a7 j6 e firstin(); /*就绪对列不空,将第一个进程投入运行*/* p2 i' H, o9 V3 X
}3 Y; ^/ s0 w0 B! b8 F
else, d) ?" j/ y) }3 V: P4 j
if(run->count==run->round) /*如果时间片到*/
- z1 m3 \( Y4 z2 n {- f, m! O! W9 ]/ ]4 Z8 M t
run->count=0; /*计数器置0*/- R1 i* U1 e% }. N8 l
if(ready!=NULL) /*如就绪队列不空*/ `# l. \4 f/ p
{1 i2 ~9 Y# d6 |- v9 d* l
run->state='W'; /*将进程插入到就绪队列中等待轮转*/* N: g# ?+ F: d7 r7 a9 c* D. Z
insert2(run);
8 Y3 G9 k, G) h# R. |8 N6 T* K) A firstin(); /*将就绪对列的第一个进程投入运行*/
/ b( u- u0 E$ V4 E. C$ j1 M }
2 K/ }; P; U5 i& _" g& g }( ?, P( ^: X6 [+ ^, C. j6 O
prt(alg); /*输出进程信息*/
$ i' |, X9 h0 U5 @% J }7 B$ h2 _' n: B2 D" c4 B/ T( f* g
}" `$ y' I* f% z, V* `
/*主函数*/
! v: T2 L; @0 q2 Z/ H: g T4 [main(); u3 |4 I" z v7 O9 x6 t
{/ Z4 e1 J* f- a F( t: F1 g
char algo; /*算法标记*/. Q9 Q' ~7 {) P6 M) e9 ?% o
clrscr();, @* }( v8 c2 Y2 @
printf("type the algorithm /R(priority/roundrobin)\n");/ B- m; r* O6 g c
scanf("%c",&algo); /*输入字符确定算法*/
+ Q. v T$ f$ O( e; ^5 j/ T printf("Enter process number\n");
* h. l- S8 z" J% W! P0 ] scanf("%d",&N); /*输入进程数*/, ]6 O$ e3 d4 B1 L2 R3 T& y. ]
if(algo=='P'||algo=='p')! s% T2 {( F) b2 @# b9 H) i
{
5 \4 }8 G- z% P0 ?2 f2 Y! }& j. ` create1(algo); /*优先数法*/
( @$ U0 s i- p0 W. u! k priority(algo);
, d, i, y9 K7 C; u& A. z }0 V( |' Z/ E0 `2 [# B' Z
else
3 f4 I9 F& k# q0 Q/ L" k: h if(algo=='R'||algo=='r')
# P6 ]8 ^2 g, d9 ~1 J0 X {
5 t2 ?. W& ~ G4 S% ] create2(algo); /*轮转法*/) r% P d4 u2 _
roundrun(algo);5 a' p3 N+ g* D
}4 _& ~- D" {3 l$ y- [6 k8 i( x& g
}: U- Z, L- w- c ]3 Q; {' ~( w0 M
</pre> |
|