|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
) I. ]4 ^. C; n$ A9 s( d3 m% |7 o#include "stdio.h"
8 N! F( j( J( ^#include "stdlib.h"9 S+ Y+ V3 X: [$ _6 x
#include "string.h"2 L4 w! N8 D$ }# [# c% y' o$ p
typedef struct node$ l1 @/ j O* J& N8 Y, W" d' q
{" @8 l# M: E, J/ n6 y+ W
char name[10]; /*进程标识符*/
+ V, l j3 z v* y: s3 l# C int prio; /*进程优先数*/
( f$ F# F$ _1 L7 x K6 w1 V5 X: e int round; /*进程时间轮转时间片*/5 e+ S% F1 E' p) n1 {
int cputime; /*进程占用CPU时间*/3 b- C% x) U+ `+ U- \ x# [
int needtime; /*进程到完成还要的时间*/* e, O4 R# F$ T: j0 Q1 V
int count; /*计数器*/! o2 B1 {) ?, { Z) _ J9 Q7 _
char state; /*进程的状态*/( P3 ^) t1 F {0 f3 J3 k, ?4 m
struct node *next; /*链指针*/, H' w9 k( f9 n# d* S
}PCB;+ b$ m1 B" I# V+ B$ `6 p" X8 i* A
PCB *finish,*ready,*tail,*run; /*队列指针*/
- M# D) J/ G M2 t6 R# F, mint N; /*进程数*/2 A5 e m$ [0 n+ k g( J8 W" _
/*将就绪队列中的第一个进程投入运行*/
& \9 V0 k6 g# a. q8 _2 Mfirstin()/ t3 d; f8 v2 k
{1 ?( b9 ]/ J) M, a# I5 r
run=ready; /*就绪队列头指针赋值给运行头指针*/) Y1 B! {8 U% X: H) K1 q, C
run->state='R'; /*进程状态变为运行态*/( d: Y2 C) N% ~6 U0 }
ready=ready->next; /*就绪对列头指针后移到下一进程*/
& q% H7 ~; L* R5 z$ d; s5 y) R3 m; s6 ^}
: q3 {( X( ?8 f$ F/*标题输出函数*/
a* z0 r5 r: N9 A, B8 {void prt1(char a)
6 Y" n0 A3 H7 _2 P7 o8 e, @& P{3 t& _6 F Z# d& H) U1 f# @: q- I
if(toupper(a)=='P') /*优先数法*/
1 z2 |+ z# l! A) { printf(" name cputime needtime priority state\n");
q8 |, D6 ] N2 q# V4 q6 m; n" q* w else9 @8 `3 `, R4 {2 o2 \. A% m
printf(" name cputime needtime count round state\n");
9 G$ h9 ~, ]1 v( h& V; a}1 E4 X/ t' {/ Q9 A
/*进程PCB输出*/
, g* ?( D( v6 fvoid prt2(char a,PCB *q)
' t( D2 n7 @$ w3 s{, a- s# W7 z' l+ B
if(toupper(a)=='P') /*优先数法的输出*/
6 z. v7 Z: t+ l) K; ]& e' I printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
# O7 F! F) O' e7 [ _ q->cputime,q->needtime,q->prio,q->state);
$ F, F8 {* `0 }1 f6 R else/*轮转法的输出*/
$ _3 K, J6 }0 ? printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,2 Y2 ^8 J& V* w
q->cputime,q->needtime,q->count,q->round,q->state);" K* `' B6 Q! j3 l0 D8 k$ i
}
. s5 k/ @; N% w/*输出函数*/: d* |/ x* G. D* H) ]
void prt(char algo)# q6 A+ I% X8 b: D# b
{
9 J6 B/ R2 S6 t) i PCB *p;
5 Y/ W6 G- T6 G6 G& y prt1(algo); /*输出标题*/. S9 N. C' J7 R$ S* i
if(run!=NULL) /*如果运行指针不空*/8 j6 J1 A- g+ }( Q% z. |& O7 M
prt2(algo,run); /*输出当前正在运行的PCB*/
! o$ ~( L- Q7 @3 S" j p=ready; /*输出就绪队列PCB*/
: m. {' C( Q8 m5 H& B" W' j while(p!=NULL)
8 J, Z9 @; L3 m' v; K/ l' ] {' g* Y( j3 K) ~# ^/ }; C
prt2(algo,p);; U( E! [/ a ~( v0 F6 E3 @/ s
p=p->next;- A- R' m6 P9 I2 a# h4 H
}4 C# l$ S% _. E" ]) v
p=finish; /*输出完成队列的PCB*/0 u1 z0 p7 ~0 V3 g. g; y R
while(p!=NULL)4 C& N$ R, P: V0 p0 ~" J
{6 |. R2 V/ J# e3 S8 n
prt2(algo,p);6 V- V2 H5 w. y
p=p->next;! [ z4 D9 @( M! ^ _$ [3 l
}
9 b/ R8 Y$ |9 e% Z; Q getch(); /*压任意键继续*/
* ]2 V2 h. z* Q7 P2 R}# {) I, `, _; c0 l `6 r
/*优先数的插入算法*/
2 E8 R& c6 g. C, E7 Linsert1(PCB *q)
) t5 R. M: J* k9 g" C{
. W5 z" K# [+ l# E PCB *p1,*s,*r;
$ J* t8 H" w2 |( S s2 a int b;
) {7 d T5 R- |" P& h s=q; /*待插入的PCB指针*/
0 J. W% H0 R( x, J7 S# D, i p1=ready; /*就绪队列头指针*/
# `6 U5 d! v" Y r=p1; /*r做p1的前驱指针*/
' G5 |9 V# m* Z' P% u b=1;
B9 _" x3 m; @/ R- W while((p1!=NULL)&&b) /*根据优先数确定插入位置*/; M _; i' N, H( C' z) g3 ~
if(p1->prio>=s->prio)
* P. ~8 b% Z6 k {
" n5 m# a5 V: O2 w- g r=p1;
7 F" x6 P" X! l+ d+ c. Y& X p1=p1->next;6 d& ]7 o' J6 w# A
}9 A- U- [5 b3 ^6 c
else. D, _3 A- t! V, x) m- K, r
b=0;& L7 }! S* K$ R. F
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
% T9 {' H6 {8 d. Z; y7 r4 y3 D8 q {0 B* K. x+ J/ C3 w8 y8 E
r->next=s;
2 C* [* [8 q4 W! x s->next=p1; e8 Z& D" }" k" w) Q, S; r
}6 C. @. e5 @ Q1 h
else4 C) U5 Y# n: z
{
: q" w7 m& M# L s->next=p1; /*否则插入在就绪队列的头*/
j, O& h) H7 |( r: P- y1 m! s0 \ ready=s;
9 V7 s2 R# C7 d4 F! d }6 @& H/ ?6 ~7 S4 M Q* u
}
+ t1 P1 _- f" i) F, c4 P2 C# M/*轮转法插入函数*/4 {5 C( f* Q) n/ _
insert2(PCB *p2)) Z: z1 J. e8 [; D7 V% j
{) i9 \* b* s# i4 n# x0 m
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/( E4 V' |7 z/ a. r2 _ |
tail=p2;2 H6 \: Z( x" ~" i# A1 R9 i: F
p2->next=NULL;+ S( i- E; y9 O( L
}
) n+ J4 A. {; ~+ B" r% w1 i) t" ^ s/*优先数创建初始PCB信息*/6 Q4 o7 V1 |% } T2 y O
void create1(char alg)
( X+ F2 u& d3 E. C6 E* H6 H{2 F4 r; D8 {2 J7 E
PCB *p;
) L8 i( J+ u, ] int i,time;$ z( t, P9 k1 D
char na[10];! x8 P' A" t/ r; s4 k* t# ~
ready=NULL; /*就绪队列头指针*/* d2 ^/ R: `- X7 N7 K+ L: Y5 E
finish=NULL; /*完成队列头指针*/
+ K7 F4 W7 Y$ }. W run=NULL; /*运行队列指针*/. j7 k' L5 S7 k3 Q) ?2 o4 b' Z
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/4 m4 _6 |! z2 }3 [7 R6 o1 c) J
for(i=1;i<=N;i++)
' q: S8 N* [# t. `& @, m8 D9 y. x {, X4 g" ^$ G+ O' t) M
p=malloc(sizeof(PCB));
, v8 k7 F6 ` D& a9 _( M( ? scanf("%s",na);
. S" T+ K* n9 Z! A' ~$ B scanf("%d",&time);
' u# q/ M) T$ \- ~9 b# y5 \ strcpy(p->name,na);
& \) T7 ~# Q1 A% F$ a( N p->cputime=0;
: M u5 H( u: | t7 a p->needtime=time;* Q4 E M/ z4 A' I4 |( A
p->state='w';
" S# `1 G: ~+ S- v0 l$ x p->prio=50-time;
# n! [4 G9 [" a) T2 Q7 s, T V if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
: k5 R4 u7 i5 B& M0 H/ [ F insert1(p); k% h* \ L" q
else; i. y7 v" t9 p) Z6 I( B1 O
{
, ?+ f" O# {4 E; m! a2 ]# D& X p->next=ready; /*创建就绪队列的第一个PCB*/
7 e3 J' K, B" ~+ X$ A ready=p;
5 u9 k- @" O$ S- n7 r9 q, V }
3 I6 ]/ @0 j; ~4 P7 H }
' i7 e# a: r1 A. u T p; r clrscr();, z m8 J+ v; E
printf(" output of priority:\n");
6 x m: Y% t2 q& C printf("************************************************\n");; j+ z7 B7 e% T+ K/ w8 k: J
prt(alg); /*输出进程PCB信息*/- L2 `: S) E2 O" n" F8 w5 A0 P2 |* X
run=ready; /*将就绪队列的第一个进程投入运行*/$ c: H9 o$ u" m6 v
ready=ready->next;" D; I- v0 H7 @
run->state='R';
, @, {- I7 R( M" o2 [}* Q& Q' k S3 f9 S
/*轮转法创建进程PCB*/
. `4 e* s- m# mvoid create2(char alg)
A" x3 s' t! N+ W* T5 h( i{
& N3 P! ^, D) f% M PCB *p;
2 p- n! D+ M- W5 j* Z int i,time;
F# F' f8 f- X8 \1 Q char na[10];
* D+ D c& P6 i; @ ready=NULL;
- z9 X r# E8 N. B3 T finish=NULL;6 {' ~5 ]8 U2 Q" D9 m/ H7 k
run=NULL;
$ O# G. `5 F. Y printf("Enter name and time of round process\n");, K4 R; A+ h8 h4 [
for(i=1;i<=N;i++)
5 c9 t- ~5 o$ j {% n' Y, ?; E; h. d
p=malloc(sizeof(PCB));
8 p o* q" I* m: N* l5 b$ Z3 Z scanf("%s",na);
4 x7 M; _/ C% `/ R5 d% ?7 Z scanf("%d",&time);
" n9 T% `! ]3 d, X# _4 g# s2 S strcpy(p->name,na);8 F' S6 G* k% H/ ?+ E) S4 x
p->cputime=0;
3 x& F p7 p% [" p p->needtime=time;- s/ E) y( F/ {" U
p->count=0; /*计数器*/! ^4 I5 p, i' P$ p" a0 L2 q/ O5 D7 w# @
p->state='w';
# ?8 j7 H2 r: y m. C p->round=2; /*时间片*/
7 d0 G# K( o& X3 c/ H M if(ready!=NULL)( v. N& U2 _1 c' \' I' {
insert2(p);
% K' {! @8 u' y2 b- H* ^ else
" }4 M& c: Z7 Q4 W/ M. }$ I {
6 P* O" T( G9 X8 ~ p->next=ready;9 f- ?% X: n M% v7 q; T7 a [
ready=p;' p- Y/ t$ l5 e/ J5 T4 {
tail=p;
* H- ~; V/ e1 @9 E7 G; C, `4 D# N }$ g7 U! Q$ G) o. P
}$ a c# j, E0 z( k* }
clrscr();% \8 q: D) n6 R
printf(" output of round\n");/ H" @! O, b# v% j6 \) D* d
printf("************************************************\n");
4 P; r, G6 d2 z8 }! v* K2 _/ \ [ prt(alg); /*输出进程PCB信息*/
$ O5 f9 j( \1 W0 Q8 I6 s run=ready; /*将就绪队列的第一个进程投入运行*/- j4 J+ w& p; \' E9 k/ X
ready=ready->next;# l6 G. w$ m( `+ T; a0 w' h
run->state='R';
5 Q" p( P8 s5 e8 m0 Q}
Q7 J8 A+ t0 s& d c" l0 Z/*优先数调度算法*/
( Z# R& k5 n0 _2 F" d) gpriority(char alg)/ I+ O" Q% J" W, P. \+ S9 H
{! t2 }; g5 x0 S$ F6 S4 H
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
/ ^4 i( `, f& v. ?0 d9 k+ I' k {
1 i' A: n' G+ g y run->cputime=run->cputime+1;1 A$ @; q: c& Q5 F4 C/ n/ a" `
run->needtime=run->needtime-1;: r# S$ r1 e: W% E
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
9 k4 h) D2 f3 m$ b8 D if(run->needtime==0) /*如所需时间为0将其插入完成队列*/* C. @: ?! a/ D! a" x+ [6 W/ v4 Y
{3 C0 z7 @1 t7 k: S+ }0 C' N. a
run->next=finish;
9 z6 r8 k( O; i: H9 Y finish=run;5 y& ~0 d- P8 Z9 |4 a l: p
run->state='F'; /*置状态为完成态*/
5 X& n' T5 Y4 D run=NULL; /*运行队列头指针为空*/& y$ N7 [' [4 k! k0 ?
if(ready!=NULL) /*如就绪队列不空*/
/ X' c$ s* J4 o firstin(); /*将就绪对列的第一个进程投入运行*/6 ~: \+ q1 e5 v" H- ~
}" M9 J' l6 K* z
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/, R5 e5 m9 P$ M. u( d
if((ready!=NULL)&&(run->prio<ready->prio))" k0 M; |! S, K8 V
{2 B' `4 K7 W% l, j. N4 n g. r) d0 M
run->state='W';
7 @$ \& k4 ^! j( W7 \4 x1 q insert1(run);2 u4 k7 q: {8 i: Y ]
firstin(); /*将就绪队列的第一个进程投入运行*/" b0 t4 P6 j! {0 `- c
}* x, c8 T& m# H8 h( u4 \
prt(alg); /*输出进程PCB信息*/2 c# I* N7 s* T# `, W% E9 A
}' x9 X% N! z! R, ?1 M" ?
}
; s5 H9 Q" P4 V6 |/*时间片轮转法*/
$ X; P5 P y& n" S( sroundrun(char alg), t6 S! s; O+ s3 s/ d& u
{- {6 _, l& P1 T3 B' P8 K
while(run!=NULL)
' u( u& o/ @. g# w5 K7 D+ V {! Z; Q# u3 J p, o1 n
run->cputime=run->cputime+1;' A0 F5 h- g* v* ~1 T# p& q
run->needtime=run->needtime-1;
3 {/ }7 [/ D6 V) Y4 Y7 U; G/ J run->count=run->count+1;
9 r6 N# s. H+ C6 p1 s if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
" G c0 N' v. q1 j# ]* X8 R& x0 q) M { C D7 R0 a5 _& C7 H8 B# i
run->next=finish;$ t/ g2 Y) f. V7 o, f* S
finish=run;; g: {3 h/ l+ {$ T$ ~
run->state='F';
8 ?1 k; N6 E* Z2 @7 {9 _ run=NULL;0 E0 {( r0 j6 d+ s+ M8 d2 B& }
if(ready!=NULL)
: }7 ~9 b E8 J* I3 E/ z firstin(); /*就绪对列不空,将第一个进程投入运行*/: q7 q# m3 J f: `# V
}
. ]" i( I3 N- \ b else; R1 |$ l( k* ?$ J. R# r6 C
if(run->count==run->round) /*如果时间片到*/% j X3 M( \$ i+ \5 Y. v) H
{
* N6 b) [8 i4 ` a8 e* ^0 U3 ] run->count=0; /*计数器置0*/' m3 y5 T) k! ~' f( I
if(ready!=NULL) /*如就绪队列不空*/6 U! X! A" e# T# K, U% X
{
5 ~5 g9 I* A% `0 ` run->state='W'; /*将进程插入到就绪队列中等待轮转*/1 o. |/ C. }3 k1 f0 k9 _" }
insert2(run); c6 i- S1 D0 L9 q
firstin(); /*将就绪对列的第一个进程投入运行*/2 h% Z8 d* K$ ]1 E, Q
}: ^3 k6 d, _) D
}9 V8 s q+ ?9 t0 B8 c- J
prt(alg); /*输出进程信息*/
/ u4 u6 K% y* e. l+ G' J- j }3 P3 ^2 G3 P7 d! G8 F" B) J
}
: X, W; T+ e+ X/*主函数*/0 l) \, t: ?& ^3 n# q4 d
main()
# B0 I; G0 A H/ R5 L{% h9 J+ t5 y$ }1 T& o. [
char algo; /*算法标记*/ u3 r7 N j" O$ @$ T
clrscr();
2 V: C% e B* @0 a printf("type the algorithm/R(priority/roundrobin)\n");; {8 V( _8 e( D C+ |0 k I" V+ `
scanf("%c",&algo); /*输入字符确定算法*/) c- I' _& ?4 { h* \! i
printf("Enter process number\n");
6 b" u( b/ `9 M" \+ p5 s) ~ scanf("%d",&N); /*输入进程数*/
V' H5 a! m) r$ f2 U) n if(algo=='P'||algo=='p')
% C; \; ~8 i0 d H c' l* ^) ^ {
" K* M- z' @1 B" ~3 E create1(algo); /*优先数法*/5 A. g0 S. v$ w9 j
priority(algo);3 E! G* N6 L7 J7 ]0 D
}
. }1 ~5 g' f1 d: ^5 z+ G else
7 O0 _; Q" B/ H' I5 a if(algo=='R'||algo=='r')% v7 O e+ l8 k5 D& G! `
{
+ P0 L) i' L! P create2(algo); /*轮转法*/
/ b1 f I6 f4 A' L3 F roundrun(algo);6 ^; D$ l% J* S6 g6 S! p7 u3 p
}# f( E' b3 t1 r3 m
}, s. n- e* n% \5 {# g, m) G
</pre> |
|