|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/- s: i: s- h# r- f
#include "stdio.h"
0 M# P/ T. p2 d, b1 A#include "stdlib.h"' m! S- |- z' K) Q7 Z' e
#include "string.h"
7 q& S1 p' w" S: k5 Ftypedef struct node- `5 N5 r1 M. y- f3 _5 [
{
5 \1 Z$ \; N$ I! Y$ T4 m- w char name[10]; /*进程标识符*/
* t, ~5 D9 e( g9 h1 D; A- P int prio; /*进程优先数*/
4 w/ L F% Q/ ?6 k3 a int round; /*进程时间轮转时间片*/$ p) U4 B! v( [2 q
int cputime; /*进程占用CPU时间*/& J8 T9 Z5 i! t T4 K* j
int needtime; /*进程到完成还要的时间*/) I1 l" i5 Z( l$ _0 f3 [7 o
int count; /*计数器*/
2 y' M* @; \8 F! m1 y char state; /*进程的状态*/
; Y3 `1 A" p! a struct node *next; /*链指针*/5 K9 \/ f5 X2 C+ x2 F2 C7 P. l
}PCB;6 k0 _6 D# X3 T
PCB *finish,*ready,*tail,*run; /*队列指针*/, N4 {5 d2 f& d' }1 ?
int N; /*进程数*/' F" x% d% } P# B; _
/*将就绪队列中的第一个进程投入运行*/
- J# b# \( {2 ~) r% f" O& tfirstin()
' c* A; Z6 a8 d9 W{1 n" k x7 c' Z3 T$ w
run=ready; /*就绪队列头指针赋值给运行头指针*/# M) A8 E3 R: M) X
run->state='R'; /*进程状态变为运行态*/; ?( n+ N8 f2 }4 `
ready=ready->next; /*就绪对列头指针后移到下一进程*/
* `1 ]7 w- Q" V4 B/ A y}0 @6 |) [! f9 |' X3 w
/*标题输出函数*/
; E. F0 q2 d. i2 ^6 K2 uvoid prt1(char a)( W" N$ I' T' I9 }- ~, _9 _3 @
{
+ C1 Y5 [% w; }2 k2 M3 ^$ K3 p if(toupper(a)=='P') /*优先数法*/
* n0 i0 U6 e! G: i, O; q1 Y printf(" name cputime needtime priority state\n");
8 g5 i; q* w8 W. q. Z6 C4 d else# B' [5 _& N, f3 G: W2 k& K- D
printf(" name cputime needtime count round state\n");
, s: z3 b& w- M8 W}
1 \; K r+ U) e5 q/*进程PCB输出*/
4 q. `; A5 K' G! \, f: ?$ `3 |5 Gvoid prt2(char a,PCB *q). I# q* N- H+ [1 J
{6 K; D9 K: e, S. K# d# z
if(toupper(a)=='P') /*优先数法的输出*/
8 _2 F( Z2 `% f9 w8 s8 H+ A printf(" %-10s%-10d%-10d%-10d %c\n",q->name,/ s4 N( _9 ?) R- Z9 F r
q->cputime,q->needtime,q->prio,q->state);7 L) [3 f* t) u0 z, |$ x: E
else/*轮转法的输出*/
7 S. @7 ]4 }4 h: H/ @ printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
4 O1 c; {; L6 N# ?! I' f1 ^. H1 j q->cputime,q->needtime,q->count,q->round,q->state);! p: |5 j9 ?( C& ~- A9 `+ x9 j# t% w
}2 L* T2 R d3 q/ l( x& O+ ^
/*输出函数*/ {& e& o9 }; `: h3 i; g
void prt(char algo)
5 ~) ?+ l. c/ D( L; E0 W4 F{
) ^; a8 W* l! A6 p" i- y/ x PCB *p; {* V' O! T) j+ ~5 W: r0 |
prt1(algo); /*输出标题*/
# z" Z, ?7 }1 s/ ]# L' d+ d if(run!=NULL) /*如果运行指针不空*/
$ N+ C f M, b' i/ y prt2(algo,run); /*输出当前正在运行的PCB*/" s6 Z; i, k& p
p=ready; /*输出就绪队列PCB*/
4 b: K) U' K, u while(p!=NULL)- ^ j: i% J. w' }/ }" z4 J2 d! ~2 \
{
0 l8 d9 i& c* U2 @; R prt2(algo,p);
1 G/ x2 j+ V. V0 R9 F6 U& u p=p->next;8 O3 m4 m. R( r: H
}1 l) R, R; k# f T; J# u% c- r
p=finish; /*输出完成队列的PCB*/$ a5 ~% [4 t8 E- Y: k
while(p!=NULL)
7 [& Q+ R' h) Z {
6 d9 e1 y9 Y5 r- i' h prt2(algo,p);+ t( l% T4 z4 P" k
p=p->next;
2 c9 t0 u8 l& d9 k, P, I }, s, W5 ]6 Z) m* l1 y8 P
getch(); /*压任意键继续*/
) y6 r& R7 R3 k; D( C% U, g}8 P+ q4 l- G! x4 Y
/*优先数的插入算法*/7 t# W5 F( q) Q9 C! k# c, ?
insert1(PCB *q)
! z, e6 z$ c' G* @2 t; y{
V. b* @* b9 I; Q" l2 } PCB *p1,*s,*r;
* t3 l' \; v: }+ b7 @' m int b;2 Z$ H( {2 i9 R/ g! a9 g: C
s=q; /*待插入的PCB指针*/
2 r( _6 }* Q- ^, K& X+ | p1=ready; /*就绪队列头指针*/, M% V \+ {" K& C
r=p1; /*r做p1的前驱指针*/: Y+ \' v( o1 u- P
b=1;+ S$ ]8 j( r! \
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/0 V/ B. l8 d5 I) h6 X5 y
if(p1->prio>=s->prio)
/ t. U5 l+ [7 V N {
+ M# S* a* o7 S! {4 X r=p1;
0 [: A% i- V5 J3 I) e6 r6 o1 K% i p1=p1->next;
9 i1 i+ U8 n4 q' ?3 A }, a3 q# l& u9 k5 |
else
; z0 R7 x! Z Q& @* {! w b=0;; e+ s) I8 L. k6 i) u3 m
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/& @% F D7 n: `: ^
{
3 l& u0 P, K1 s+ q% U! g5 c$ d" T r->next=s;
% i* M9 M1 i% D2 @& j$ R s->next=p1;
5 q8 g5 k; E9 W% F" z3 y }
& u* B* S- G: t2 e8 k( h, y* o4 j else9 G/ |. ?5 S; J. P
{
# R0 N# K$ N2 k& N s->next=p1; /*否则插入在就绪队列的头*/
B! S/ a6 ~% {. w7 j ready=s;- s( J. U3 F% O# q6 Q& ~8 ~% N
}+ q% C. a* Y/ z& y- ]% ]6 I3 t
}9 H# g2 s X( x( S3 W [
/*轮转法插入函数*/; G* _+ y- C( a
insert2(PCB *p2)
0 o1 Q, o# Q9 V+ I+ X{3 u6 S$ J# l. }6 ^
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
& M; B w* z* M3 U$ k, D* o: V tail=p2;5 p) q, b( c, d8 t' p( ] v
p2->next=NULL;, u9 k' W9 C: C* ?
}
, D) Z: s# k- ^ `0 E/*优先数创建初始PCB信息*/; U. Z d% f4 }5 r9 l r& G
void create1(char alg)
- c( \! b# p* T8 ?8 a{
2 P$ o/ L! r* z PCB *p;
7 x" R! a3 u- r+ p& w int i,time;
7 a( G0 B# p0 @ char na[10];
* u+ U6 e; X5 h. } ready=NULL; /*就绪队列头指针*/$ e, ?: k. T. X& x( c# u) Y
finish=NULL; /*完成队列头指针*/
8 L7 ~# z$ D2 M3 p9 o! h/ |( V run=NULL; /*运行队列指针*/) A& J2 p0 k. I% |4 z3 {' [8 F
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/: a# a' Q7 s0 a1 n+ f3 [
for(i=1;i<=N;i++)
* N" S+ z- j7 Z6 Z% h5 e {
$ f. {1 F$ Y- M' n6 Q9 m; V9 G p=malloc(sizeof(PCB));# N# p1 g- u1 ~, ]
scanf("%s",na);
5 [+ T4 e! y4 H6 Y1 I$ \7 X6 q$ j4 a scanf("%d",&time);
/ T V' K' f& p2 }( |# H+ }2 h strcpy(p->name,na);
, B3 }) A7 ?9 n" y* P1 n p->cputime=0;
/ N, V" N) R8 q O" p p->needtime=time;
- y2 K( p' y1 M3 Y* m p->state='w';- a( Y# r u# |3 R
p->prio=50-time;
7 N) D* N: b& }* w+ f z- h if(ready!=NULL) /*就绪队列不空调用插入函数插入*/$ D8 f' L7 ^! w f# q: f% O7 m7 C
insert1(p);2 }- o8 C8 T1 K
else3 f4 q0 \3 }( K t+ d
{/ b7 h0 v$ { t4 V0 V* s3 z6 `5 V8 ^) u
p->next=ready; /*创建就绪队列的第一个PCB*// p h( `: \" f& f4 s* R3 J% x
ready=p;
' _* U6 x* f0 d7 W" Y4 D0 w/ k }3 O3 }- o0 B' o
}$ ?/ L3 `" t- {' c
clrscr();5 {5 g6 r: ~8 s3 ^9 d& t% E2 r: _
printf(" output of priority:\n");7 B t8 {- t* T" g. q) q
printf("************************************************\n");
/ x( Q, B: x' X# ~+ B0 f prt(alg); /*输出进程PCB信息*/
% N5 R3 r: f: Q. O/ z run=ready; /*将就绪队列的第一个进程投入运行*/( f, t# n, Q! B- E3 H( q4 I1 [$ t
ready=ready->next;6 @2 O" q2 N% X
run->state='R';
- ^1 r3 d- ]( |" O: D2 [}, B* G+ V8 R! }7 i" D* q% s
/*轮转法创建进程PCB*/
: v. T6 ?$ f P9 ^* vvoid create2(char alg)
% o! K; @5 X. C{
/ [& {, j9 |) ^" R2 R1 p PCB *p;# ^2 O! A# f% b& x3 o4 ]
int i,time;
) J6 E; p) s- N char na[10];" n) u ^" q) [. Z: D9 I, x, P$ X
ready=NULL;% F4 ]& J# L# D3 t# y
finish=NULL;
5 G) p5 F' _9 o+ ? run=NULL;) f* V( U* \1 X- d! \, G( G! O
printf("Enter name and time of round process\n");4 s4 d j7 ]" e! n
for(i=1;i<=N;i++)
5 ^9 L. g6 t4 W7 F' `# }6 s3 w {% x8 T' g; ?6 m: H! |' r
p=malloc(sizeof(PCB));
O$ @: W; c% Z4 U W' K! I scanf("%s",na);
% E/ a1 _3 P( J; P' f' e( t scanf("%d",&time);9 m9 T, g" L, [. D
strcpy(p->name,na);
3 P6 f6 e7 d7 z5 A- O p->cputime=0;/ h1 V! L2 ^2 J5 p) Z
p->needtime=time;) w) m Q* J. E$ f% d; A# P
p->count=0; /*计数器*/
! X: Y" v$ R0 |9 H' a+ T1 j p->state='w';- g4 B" V2 m& ^; W; z
p->round=2; /*时间片*/% F2 ~1 T# z+ X3 T( |6 p# _7 F
if(ready!=NULL)
0 R9 @- g8 Q" a9 r+ _ insert2(p);0 J; }1 N. f. b3 h* ]+ T
else
i% X4 m" v& ]8 J4 U {- m5 i# f* U7 v7 S: O) z
p->next=ready;
. {( i7 n; }+ d2 T ready=p;2 O" S) y: E" n7 A5 m
tail=p;
/ n+ x2 D( k5 `2 @& p, C, M8 C }9 {0 |2 s; K5 |) U* F
}' r5 j8 r- b6 j% G
clrscr();4 A" ?, m H5 n. U! G
printf(" output of round\n");" N& O$ V1 v" \: p& _8 O
printf("************************************************\n");
: l/ r( {, ]- D, D- Y prt(alg); /*输出进程PCB信息*/+ f9 t- f- N; H
run=ready; /*将就绪队列的第一个进程投入运行*/: d& c# Q. k+ [$ |& c% T
ready=ready->next;/ [# L! M# @9 g* `/ b0 ?
run->state='R';5 r6 J4 ?6 c' C/ f' j: U& M
}
2 {7 e: L& x$ D# v2 x! V. ~0 u/*优先数调度算法*/* b$ F$ C6 `8 K& E* [
priority(char alg); T Q8 U- k) ?8 A
{$ }7 l. Y8 _8 i$ {7 F
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
# d, Z" k2 X9 p& ?0 v# z F, M3 a* Y {
) Y8 U6 _8 |% F) k0 S7 P! @9 @ run->cputime=run->cputime+1;
+ @6 P" ]* b9 ~7 L, A- d run->needtime=run->needtime-1;
3 V4 c, q! ]! ^+ d) O run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
. z+ l" [! k3 T' r) o) D6 ~ if(run->needtime==0) /*如所需时间为0将其插入完成队列*/! S) T9 F: g! t- U% F6 S; w4 x
{
( j8 N* w) Q# u; K* C# K4 H run->next=finish;. N' p4 g9 |2 _- G
finish=run;
, }7 \" _- a( x. [: T, i run->state='F'; /*置状态为完成态*/
2 ^$ O* u9 g# Z2 T0 m% Z0 V$ t$ f; S run=NULL; /*运行队列头指针为空*/
9 @/ Y9 ^# f$ k0 C, G. @8 Z, `. c if(ready!=NULL) /*如就绪队列不空*/
- F7 V7 g2 p3 p firstin(); /*将就绪对列的第一个进程投入运行*/! ?6 w) S) g1 G
}
4 ^6 [7 ~9 j _+ i else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
" R A; e# I" h' b, \4 q if((ready!=NULL)&&(run->prio<ready->prio))$ H6 c9 e! ~8 o! _. u2 {' w
{
' a4 ], X0 Q5 _- L5 Z run->state='W';
2 _( G9 C U+ }% `. Q8 R insert1(run);7 G0 P5 d/ P0 ?
firstin(); /*将就绪队列的第一个进程投入运行*/- z$ {8 p. P7 S/ k' ]- a1 J
}
8 }0 E# W3 e0 g0 ^% a1 o" u prt(alg); /*输出进程PCB信息*/
9 R! b5 {. h9 {, P2 Q7 j# H2 Y }
% }+ Q4 H% g/ V9 d8 @0 \( H}
. z( |$ \) @# D8 `! H; z; O" i/*时间片轮转法*/4 D5 W1 ~" n- {4 o3 L& y* |) t
roundrun(char alg)
; C) j) ]8 b# J; ^" Y{& @. q$ M G0 b! c0 A
while(run!=NULL)5 P, O# ?2 i) b0 Y6 r `, i
{) K! H1 w Y0 M9 i6 c4 F
run->cputime=run->cputime+1;
3 s" N# h* p, R5 z0 K& v run->needtime=run->needtime-1;5 ]. X" M! [( [/ e) Z% Y4 S
run->count=run->count+1;7 D; ^! y, O0 L" W9 K+ s) }
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/) A/ A8 X9 B- i! L% d+ k
{# |5 _* ?; g9 h# X) [: c" D
run->next=finish;
9 P: G# ]0 k6 _ finish=run;
6 X, N8 ~( L& H4 q& ^) U run->state='F';
3 D8 w3 h0 o! \5 k1 h ] run=NULL;
- K( h- K6 Z$ C/ c) E if(ready!=NULL)
3 ?) R7 [+ |8 @2 m$ Z* [3 F firstin(); /*就绪对列不空,将第一个进程投入运行*/
* s1 j* }9 y! ?" J' Y }
7 S5 G: s8 ^& U1 Q4 `$ T else; p9 D0 O+ q- A1 J% y
if(run->count==run->round) /*如果时间片到*/
# n$ s. O g4 M2 r3 E' \: h# R {
- o) c( _8 k2 f/ ]+ R9 J' r5 l run->count=0; /*计数器置0*/; |8 p5 ^, Q0 Q0 b/ p& _
if(ready!=NULL) /*如就绪队列不空*/
9 h3 g( ?& k& f7 Y5 D E8 u {1 G! [* h' [# E1 l- _5 Q1 V4 }6 U
run->state='W'; /*将进程插入到就绪队列中等待轮转*/
5 H, n7 ]. m1 ~, d insert2(run);+ I c+ ^3 w+ _" _
firstin(); /*将就绪对列的第一个进程投入运行*/
* H0 K( d- K, D7 {' V! n2 ] }( n: h& H8 f# i% x( @6 b' b/ Q
}. p3 Y3 H, ?# d* r) w
prt(alg); /*输出进程信息*/
+ a" T1 K& X; |3 h2 ? }
4 L- y3 _ a T7 @- _}- l9 X! t5 @7 M) x7 I/ N
/*主函数*/
7 p9 L" y: Q3 y! K; |main(): t9 }5 Z o% W+ `# _" ]7 D9 d
{
j& q. R% w8 [$ p c4 Q B char algo; /*算法标记*/
6 P$ l U0 h6 a; I0 G/ r clrscr();
H4 h: G1 V4 E printf("type the algorithm/R(priority/roundrobin)\n");7 ?& g8 \; I; O# J/ r# ~4 C
scanf("%c",&algo); /*输入字符确定算法*/; Y$ U& l+ {$ [& L
printf("Enter process number\n");
- y& P# `# p) ]+ m P' z/ A scanf("%d",&N); /*输入进程数*/2 v2 h- L# F$ v; s. E3 V- \9 r
if(algo=='P'||algo=='p'); ^5 o$ c C" y Y7 s4 a: @* s/ ?
{
5 \2 O" ?. W$ `% t+ \. B create1(algo); /*优先数法*/' k% k. G! d* f) ?
priority(algo);" V1 L3 i- {: z. Y' F" N5 k; y
}
! }3 N! |: U* _ else
4 z$ n( ^% w4 e0 B! M if(algo=='R'||algo=='r')2 l2 c( O6 ~/ b& k$ ]" m& N6 d
{( M, R# ~0 t& p/ O) l& [& V2 \6 N- P
create2(algo); /*轮转法*/7 O2 }. r3 Q7 U* E* L# z
roundrun(algo);7 r+ ^ D1 x& p- [; Q
}- W" E- | z4 P& q
}
0 f% [6 ]0 ?% i: i5 Z7 y ~</pre> |
|