|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
1 ]" _; J T7 `6 {5 K7 O#include "stdio.h"
8 m" h* V. l, G9 P4 p+ j+ s#include "stdlib.h"5 `. A- a u& K, [7 s
#include "string.h"
' R$ y2 k: g" ]4 M( H0 ~ A. J2 etypedef struct node+ R1 q7 d; u( G. Y# x
{
3 a* _# H. Y$ z7 _" Y4 r char name[10]; /*进程标识符*/7 x8 p* W! L& T- A# ` J5 s9 @
int prio; /*进程优先数*/, E6 S- M) O; }, R: U
int round; /*进程时间轮转时间片*/
& @. s( t+ B) u% \5 k4 Y int cputime; /*进程占用CPU时间*/
/ j, Z6 R) |2 m# E int needtime; /*进程到完成还要的时间*/# h g* V6 y- _9 C0 S: f3 v
int count; /*计数器*/) ?# k( j3 Q5 _5 \
char state; /*进程的状态*/1 s4 e0 J3 W8 [" [, ]/ g0 r: K: Z
struct node *next; /*链指针*/
& w2 C p5 w: r}PCB;
6 H( g4 e! @/ p. b9 b9 U, s, sPCB *finish,*ready,*tail,*run; /*队列指针*/6 u$ u h: {+ C3 `* U
int N; /*进程数*/
+ {+ m4 @9 L1 ^1 f/*将就绪队列中的第一个进程投入运行*/
7 h3 S3 o% _% j- T1 hfirstin()% A0 X: A# O1 y" N/ P
{! s1 w/ W" u% O) P$ G- C S8 |* B
run=ready; /*就绪队列头指针赋值给运行头指针*/
1 q1 s0 b& U; C+ A7 m6 V7 x& z run->state='R'; /*进程状态变为运行态*/
$ ^/ Z, ?. K$ z" B& r9 h ready=ready->next; /*就绪对列头指针后移到下一进程*/
: Y2 y% P: M9 w4 E" I' O8 k}/ z, S, W$ ?) d# a' b
/*标题输出函数*/9 _8 N9 a( `9 y8 \/ e
void prt1(char a)
' L2 I, h3 }) z# v{& d5 I& T" f; d5 Z6 ~
if(toupper(a)=='P') /*优先数法*/3 t' ?0 |7 G. h: G ]1 P
printf(" name cputime needtime priority state\n");' W/ y/ E( M) s1 @
else
8 w) H8 A3 D4 V3 }( n printf(" name cputime needtime count round state\n");( A* r, x4 x9 V
}# [, a4 B0 d g6 B2 \! b' r. _
/*进程PCB输出*/+ x$ B1 H- B; \. l, o/ K' m
void prt2(char a,PCB *q)
( T+ s" B' R# j' G& n{
" Q7 j2 ]% O7 h0 R$ F+ ` if(toupper(a)=='P') /*优先数法的输出*/
. V) S4 F5 H _# d( m& D printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
" v v4 |4 p& c% ~" |3 i q->cputime,q->needtime,q->prio,q->state);
: O6 h; J7 n+ q- E# Z. ]* \ else/*轮转法的输出*/' ~: G1 X% w& G9 H. o
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,) [3 A- |5 _9 n; ?8 X
q->cputime,q->needtime,q->count,q->round,q->state);, i8 r$ j1 w2 i' u
}9 o, J/ j( F) e0 \, _- M; ?
/*输出函数*/
( Z0 l- H) ~2 T% b& y g4 J2 Pvoid prt(char algo)( S. Q) m$ A. j/ B) u7 |
{9 v" L% A! Y I3 D: ^% s0 ?
PCB *p;
$ w' R3 R' s$ i5 P/ E& V9 O prt1(algo); /*输出标题*/
J! B/ o: Z* a8 | if(run!=NULL) /*如果运行指针不空*// V: _/ O9 ?5 A) \& P3 f5 m
prt2(algo,run); /*输出当前正在运行的PCB*/! l2 {6 t) R! e) g
p=ready; /*输出就绪队列PCB*/
E; ]/ p) X$ `- M while(p!=NULL)
$ n% L2 t/ H9 O3 `' g6 H, g2 G1 ^ {
& ~- o" z3 [3 c9 D, W% W$ ~+ D. q prt2(algo,p);
# Y( k5 O9 B2 g2 o0 {8 p, r& k8 R- ? p=p->next;
8 {5 w1 H: t& @ }
% [4 I; `* |7 p* a- Q6 u p=finish; /*输出完成队列的PCB*/
% P! F, }2 }% b: B while(p!=NULL): G: J' B0 _7 K2 X9 i
{
. m$ M1 g7 s2 \- J5 v prt2(algo,p);
3 ^2 o/ \0 |% l; F- K3 z( U p=p->next;
1 {& Y" _" y( c; l: K- Z; U }0 b# m7 S7 ^' l: |( W& A; q
getch(); /*压任意键继续*/' I+ K2 D) d9 f) q/ E% _: F
}. j1 g s; y4 a* J
/*优先数的插入算法*/
9 U+ ?& [( [/ _/ @! ^insert1(PCB *q)
. e+ A3 O$ f' C# U- X1 c" z) r$ U{- M* M, [7 U2 Q4 n w/ A
PCB *p1,*s,*r;# L& {! `$ Z" v* @
int b;8 F+ H( k( O8 I; Y2 l/ q
s=q; /*待插入的PCB指针*/
% J/ J/ x' |% A! ?; N p1=ready; /*就绪队列头指针*/
7 J9 ^. N9 J) M2 o% ] r=p1; /*r做p1的前驱指针*/
" f0 z1 A4 A% W9 r" y b=1;
7 S* g2 O: L- j, N4 ? while((p1!=NULL)&&b) /*根据优先数确定插入位置*/# K7 {6 m) L ~
if(p1->prio>=s->prio)3 A5 w7 f7 J0 E% L" }: X% d
{
, U# M* F, v. R7 D9 Y; l# [ r=p1;! _% s8 }& S) A) z- Y- M
p1=p1->next;7 q3 h, H" o% u* W* _7 F1 F
}1 e, b' I0 \. e
else$ v e) B$ A: y5 A6 ?1 R5 ?
b=0;
4 @7 X2 ?' j( E3 I+ U9 q* _4 m& L if(r!=p1) /*如果条件成立说明插入在r与p1之间*/) T6 K$ B" s) m: k9 E9 t9 U
{; u5 ~; k2 J. q
r->next=s;
5 n, F2 _3 A2 ~& L s->next=p1;
5 o* W+ ~5 i! C! T- U }
`* R; A+ ^1 W" } y: M, \ else3 _) f2 ]( s8 L; f' @' G
{8 Q7 A3 a9 R: O: T
s->next=p1; /*否则插入在就绪队列的头*/
) s8 ?6 W, q1 V" a' k ready=s;+ n7 a) W- y) l& d/ _' l1 n q
}" V; g; C0 y( W$ t9 Q& T" s
}+ g( Y% m$ x$ K2 u8 j) l# B4 m
/*轮转法插入函数*/
8 `* f$ t4 X9 l m3 V- Finsert2(PCB *p2)
, A0 ^5 C/ ]$ Z1 ?* a% G{% P" W& E7 Y- R, q4 h# c' D
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
$ U) T3 ~, H" R, F" [ tail=p2;8 t0 N0 a; |: r, z. s
p2->next=NULL;$ z: {8 E: {' d* d) r1 s. O5 ?! a
}5 { m# J2 [7 ~ t# d1 Y9 T3 o
/*优先数创建初始PCB信息*/3 {" R* v+ Z( c, ^' ]
void create1(char alg)4 b' B" R8 H' e, N
{
4 _: r$ L$ z6 x: { PCB *p;, X5 e- ?0 P& {+ y$ E
int i,time;+ H! C- n# W% v2 I6 T% J
char na[10];
9 W1 @# ^8 _3 }, L ready=NULL; /*就绪队列头指针*/) [8 P0 T" I+ ?% f
finish=NULL; /*完成队列头指针*/
8 n- t1 k+ R- t/ x, o' K# C run=NULL; /*运行队列指针*/7 q4 X% O! ~# ~- d4 C$ t9 e, U
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
' \! {7 l; P7 v for(i=1;i<=N;i++)3 E" n& z# x4 r, l# ]6 f
{
+ i [% E9 P0 G2 w- E p=malloc(sizeof(PCB));& U& |7 K; i1 |$ y3 X6 X8 O) x0 m
scanf("%s",na);
, C1 V- j" a4 v; Q( ?7 n3 Y scanf("%d",&time);
* g. d2 {7 e* P$ ^# q' O3 Y strcpy(p->name,na);. ~: t9 }( z2 ]# g- b6 U1 r8 ^/ _
p->cputime=0;
; C- ?& k: V1 |6 e p->needtime=time;
1 Y9 v x9 L7 H; `6 z" f p->state='w';
2 s, I! h& ] X p->prio=50-time;
; i8 k8 z, V4 w% u& ~5 n5 d if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
& |2 n, Q% g' ~ insert1(p);% y$ x) P9 I' ?/ D' Q& A; _" F
else
' `( C7 H" S* y( @$ J5 D u6 ~ {
) q5 t# U7 Y# O! o2 D" t p->next=ready; /*创建就绪队列的第一个PCB*/
1 e8 r! _; a1 G: r) w, B ready=p;9 U; V: S6 [5 d
}. E V$ x7 u! Y: t( Q8 D
} W0 Q7 a. Q, x6 k8 ^
clrscr();9 T/ W5 h% N" ]7 K. M8 C8 r
printf(" output of priority:\n");
9 d. ?$ n6 z' y printf("************************************************\n");
- Z }- _* R' `( Y1 Z! D2 M% W prt(alg); /*输出进程PCB信息*/
3 X/ I2 R8 w; b run=ready; /*将就绪队列的第一个进程投入运行*/
% }" {$ J" V; j% v" A# u; f ready=ready->next;
0 G! D% U8 G4 O8 @* {+ Y0 ^ run->state='R';
: ~: F9 q5 @; u) b# _}- o+ [$ ^) r/ R( d# ^
/*轮转法创建进程PCB*/1 r! _1 j* s: ^1 J5 \7 z7 @
void create2(char alg)
* g: z2 _" ]+ z{2 g: B7 H7 D' d
PCB *p;
/ n& r. f" G1 d" }: o8 M: e int i,time;
1 @/ G7 a/ c+ o( \ char na[10];
% ^* f9 G6 Q- E4 e7 i ready=NULL;
- i! N- @+ p% T, j3 N$ J/ ~ finish=NULL;1 Z& R9 X n1 L6 h
run=NULL;
+ Y P+ l# o0 W# ]& Z/ t1 R- ~ printf("Enter name and time of round process\n");. O ]) d: e; T/ m) {/ [. q
for(i=1;i<=N;i++)7 z4 l) H9 C+ m8 `
{, I! p$ P( i3 v
p=malloc(sizeof(PCB));& b0 V8 s. o8 b* W) h# x% C2 q/ X" T( U
scanf("%s",na);/ g& B4 X9 T# N8 S8 v
scanf("%d",&time);' e) y8 V: y6 c* \/ _, g8 P7 a
strcpy(p->name,na);
1 _7 Y& Q1 ?" I2 N6 G p->cputime=0;
0 y' U) e) A7 q1 ~+ ~; A- w p->needtime=time;
: t8 u" `+ K1 h! V( n# D p->count=0; /*计数器*/* \0 _$ m& [; z% h! {. i# J
p->state='w';0 \6 ?( I$ M. U; F4 q
p->round=2; /*时间片*/* h7 A" q% F( f$ i O% i
if(ready!=NULL)6 D+ ^9 B' w2 a
insert2(p);4 K5 P* F. o+ M" J
else
# W& F( @& x( {2 W5 T {& F4 a1 Y, A: c2 R2 m
p->next=ready;
( }' Q2 U) u7 ]: \: _. Y ready=p;
* E3 A5 ^* j$ u6 c4 h! M tail=p;
$ d6 Z: F" f, l }
) t4 U; q- v4 v }
1 q( \9 ]/ t& z& H clrscr();
2 V: @/ O% c8 k6 V1 p- y, t printf(" output of round\n");
, f5 y" S1 K" M- Y+ t( E0 _ printf("************************************************\n");6 J9 D! M ]/ u6 u% o' n; W
prt(alg); /*输出进程PCB信息*/
3 H1 Q, I- x. {6 x run=ready; /*将就绪队列的第一个进程投入运行*// P" i1 g; o, e
ready=ready->next;
& X1 T$ X% t' {8 u( v& Z: } run->state='R';) T M$ `8 w: p5 n8 K
}
* K/ Y, ], {/ r: _! j/*优先数调度算法*/, _" F& F: W8 M/ G3 B+ R7 t Y6 N
priority(char alg)
\2 p* m1 [: ]/ L, ^) s0 m{% X' J2 y0 \9 Y' q
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/' w% j9 U- C: i( s% \1 @( Q
{ Z' t: Z# v% N* X. A1 T
run->cputime=run->cputime+1; U2 V0 V/ A' ~# |# s
run->needtime=run->needtime-1;4 B' h1 h9 u1 N" [% G
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
2 ~; i H: p& Q9 w. d6 J- |# N; I! h if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
! k$ U5 `6 `$ l3 d7 u+ a2 W6 K {
R3 o- y- p, \" q run->next=finish;3 ]! Q0 Q2 {2 O9 [; z0 n% O
finish=run;' ]; f. x/ z% W B& Y1 r: M
run->state='F'; /*置状态为完成态*/
p& n4 y/ c8 V4 P run=NULL; /*运行队列头指针为空*/
: Y2 D8 a- ~( g* Y5 \ if(ready!=NULL) /*如就绪队列不空*/
: t, Q( J7 m! y8 [ firstin(); /*将就绪对列的第一个进程投入运行*/2 k- H& Y' u2 ~( C5 A* [( |% d
}: I2 R2 E5 u% _) {# g5 Z; q! e6 F
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
6 M2 o4 j' ? B if((ready!=NULL)&&(run->prio<ready->prio))' W, S) `: m1 u! v( k2 r3 D" H8 Q
{
K) |: ~" D7 v, @1 U run->state='W';7 ]% s1 U6 a5 u1 M3 E
insert1(run);9 W Y. x! `# v
firstin(); /*将就绪队列的第一个进程投入运行*/
4 x0 S, k# s( A4 K }: h B# V! ^' C
prt(alg); /*输出进程PCB信息*/! B* Z9 r/ ?3 b9 p0 T
}* H! W! b6 h: O" b- Q h
}. b0 n' b' Y3 r1 N
/*时间片轮转法*// r6 f. H" W: X+ u9 }
roundrun(char alg)
6 t9 x, V$ @# L7 f( A4 u5 o7 N{
( T+ R. K+ [' F( T5 ?3 j0 B while(run!=NULL)" J0 O! P" q6 B, |* f3 w( E! @# o
{. N; X! T* r: x* m5 J1 k( d
run->cputime=run->cputime+1;
1 d& l( c2 j; x7 s run->needtime=run->needtime-1;
. |- E1 l" ]: f run->count=run->count+1;
! S9 M" E& ~8 G) f% G, Z if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
6 M( r: L# j% I0 ?& w {
5 \& K9 l$ n" Q7 @ run->next=finish;9 n0 b8 X9 @& q) I5 f
finish=run;
; }) y: h: f0 | run->state='F';
( b M: @. N6 m% O run=NULL;
`- h4 R. d( K/ z; E3 x2 j if(ready!=NULL)4 @, `! k- H/ _: T! d
firstin(); /*就绪对列不空,将第一个进程投入运行*/0 j' i; k6 i! F& _' Y
}
: }$ h5 L/ x/ J+ o else
7 e6 \5 C1 R) Z, d& B, p% r if(run->count==run->round) /*如果时间片到*/
. c$ Q+ W+ p( e0 m! B0 H! X {* z6 U6 y, {1 A& ]) N
run->count=0; /*计数器置0*/
( g% _, l0 D2 X" ?5 D F if(ready!=NULL) /*如就绪队列不空*/8 V) l& o$ r$ n3 I6 c
{
1 O+ m l$ l2 V run->state='W'; /*将进程插入到就绪队列中等待轮转*/6 u# Q& y4 V" X( N! d/ q* W
insert2(run);1 Z4 B$ @* Q) `2 `! c3 v2 g
firstin(); /*将就绪对列的第一个进程投入运行*/( v4 T& c6 ]% G% f R
}
0 o* _0 d1 t3 P- G" R }
; M% o* e, K5 v7 } prt(alg); /*输出进程信息*/
2 |, L; n% M! v% A }+ x9 w1 L$ {: X& Y/ J) `- _3 }' w" f
}- g( J: C' O4 }
/*主函数*/, q! A9 q/ H; i) M8 f3 d0 \0 r& V7 }) [
main()# Y7 [0 e. v1 q$ z* |/ _
{1 c4 W2 n9 {; b7 X1 `- Z
char algo; /*算法标记*/
+ ?; p( E8 o' O: X clrscr();$ w1 P! ^7 c0 J7 R
printf("type the algorithm /R(priority/roundrobin)\n");
4 K" @0 i5 ]+ p: ?) S. M( x scanf("%c",&algo); /*输入字符确定算法*/* j7 k7 y% v% I$ \1 {' J( u! ?7 J" b
printf("Enter process number\n");. p; t1 f3 F* q( p. p% B
scanf("%d",&N); /*输入进程数*/
: Q0 o# A9 h* o" Q" n; ~ if(algo=='P'||algo=='p')- Y2 ]. q3 I) V5 e
{
4 W% T% v8 ]) \# [, ] create1(algo); /*优先数法*/
5 R+ \+ R9 O, h5 m& u K priority(algo);
. W( y/ G+ p$ n H }- [ h" ]9 X' C2 T1 Z
else. E% |8 s# W# |' e
if(algo=='R'||algo=='r')
1 H! r" e8 ~) ]6 z( R, K, | {
" Y) ~6 J, T0 p8 b' Q0 C: u c( x! _ create2(algo); /*轮转法*/; f m% x1 `9 Y6 v, W B' R |
roundrun(algo);
( ]% r1 F; |0 U3 B" F% c/ h2 | }$ u$ A4 C5 F* b; V0 I/ H
}
! a6 ~! I; {( g+ ^</pre> |
|