|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
2 l3 j! @% w0 {( l& O#include "stdio.h"
. N, p1 q& c* N8 i+ O#include "stdlib.h"3 w% w* R1 h* P1 o/ c
#include "string.h"1 e1 h: w. @/ P
typedef struct node2 h, x- t& y6 }' c& U- } d- }
{
% J) t/ G5 ~. S- P& ~7 g+ G; K char name[10]; /*进程标识符*/
. d4 X7 a% D H+ h: \ int prio; /*进程优先数*/9 |) u0 A5 U: N8 a1 s4 E4 B4 E# Y
int round; /*进程时间轮转时间片*/7 K+ T% s% p# _0 Z: R
int cputime; /*进程占用CPU时间*/$ N$ N1 l% ]( A0 O+ J4 g: L
int needtime; /*进程到完成还要的时间*// g6 l1 ?9 M" {6 c+ _2 H8 ~
int count; /*计数器*/- X& B Y# v4 p0 L/ l4 l$ [5 B
char state; /*进程的状态*/% J/ N. X* ?$ A+ d8 W( u
struct node *next; /*链指针*// p- P. D- C7 z2 V
}PCB;
1 W& C7 n# ]' |2 T" @- nPCB *finish,*ready,*tail,*run; /*队列指针*/
- Z4 Z7 E, ~1 Z7 _# kint N; /*进程数*/5 T# }: f) P) m) T5 t. ^
/*将就绪队列中的第一个进程投入运行*/; Z1 M% N5 c: O4 q, e
firstin()
7 Y6 j0 E; c( R' E{
: S" G) H5 X( M1 Z& e) S run=ready; /*就绪队列头指针赋值给运行头指针*/
+ i3 h. z4 n' _* h& T+ T run->state='R'; /*进程状态变为运行态*/
6 q+ @. t' _% W8 b) O2 E/ p- K0 q ready=ready->next; /*就绪对列头指针后移到下一进程*/+ o' ]% X% w' g5 S9 y3 e
}, X. h0 W4 g9 a: P: n
/*标题输出函数*/% Z/ ]7 w1 U: r3 y+ S' s2 _% T
void prt1(char a)
: O* Q# w, c. g# [{: W) V4 A6 \! h) {1 L; V. w8 [
if(toupper(a)=='P') /*优先数法*/( x+ n! S6 |3 k
printf(" name cputime needtime priority state\n");
5 n) G( U: Y# w$ T- c1 i2 K else! y! O8 L+ v8 N" Z
printf(" name cputime needtime count round state\n");
- a9 m0 y i6 U% Z+ y% j. h- | Y}
! k/ \ q( J: g; u/*进程PCB输出*/
1 f* W8 x$ a( B/ ~% w. lvoid prt2(char a,PCB *q)
3 G8 i! J }# w) o{* l8 O$ E' t x3 V
if(toupper(a)=='P') /*优先数法的输出*/& \ M! K& e# {4 x: }8 V
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
$ s8 ^* B. P7 Q0 h" J$ y q->cputime,q->needtime,q->prio,q->state);
- W- U; F+ P: W# v o else/*轮转法的输出*/& k, L: I1 n. {5 J( L
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
- a, H2 M( d+ p( M8 D q->cputime,q->needtime,q->count,q->round,q->state);
) F$ {$ c! m4 w7 i3 T6 D}
! H# _& D m, w( u1 D1 a/*输出函数*/
5 O2 q4 T* `: t8 z5 R5 Avoid prt(char algo)$ O3 o! i8 p g( b* O
{
" Q- M% V# I. p1 G9 E PCB *p;1 D3 p7 U5 @4 L
prt1(algo); /*输出标题*/, m# e. _0 O/ M$ L0 Q, y2 a
if(run!=NULL) /*如果运行指针不空*// y" d+ _, C+ p4 R$ b! {0 V
prt2(algo,run); /*输出当前正在运行的PCB*/
4 O2 U& J- Q. O: L p=ready; /*输出就绪队列PCB*/) L" U$ S( `$ F% b% W
while(p!=NULL)
$ U0 g) z9 ?* [0 i9 P3 { {1 o0 _& {2 W; Q" h( p) U' ] M
prt2(algo,p);
, L4 S$ w. a) ^' C: G' g p=p->next;
) U7 v7 K! r- n4 h7 i }
' ?* P( t7 G6 k% s p=finish; /*输出完成队列的PCB*/
5 {, t( [! `' _ while(p!=NULL)$ `. c! K" V2 N9 x
{, c" i6 @# m& P, P# m* R
prt2(algo,p);7 J( g, T( L4 K0 k0 C: v2 S3 I; S
p=p->next;# \# N1 f) w0 S8 p$ U) _" r
}
3 R. `) n1 H( S; k2 N getch(); /*压任意键继续*/
1 R& n3 b( i# R}
: A+ i7 W0 `3 A) {/*优先数的插入算法*/' j# i z5 e9 c& |! U' v, C
insert1(PCB *q)+ A/ }' L, X, k' L0 I
{' G3 `- r( v: m
PCB *p1,*s,*r;
+ A1 ?4 G- G, j) U int b;* Q& k) _/ W7 @; m: ?. c
s=q; /*待插入的PCB指针*/8 w+ K1 G3 A/ [7 ?4 q9 ]8 g* r
p1=ready; /*就绪队列头指针*/# c! |9 A4 B4 o, O; @+ {. V' Z
r=p1; /*r做p1的前驱指针*/. z- s# Q) Q* L0 @2 l& p7 l" w
b=1;9 j% a+ @" J# Y. y; W4 h7 x6 G
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/% a( @- A7 c! p$ J& ?# }
if(p1->prio>=s->prio)$ `. S: @* J* K& o. r3 G
{9 L0 ~, h1 x1 d- [( l7 i0 ]
r=p1;
- d! k" ?8 G H% ^7 i* c p1=p1->next;
* Z* D b3 Z( r; h* \ } O1 K p6 t9 n Y0 Y
else* F8 g f; l( t; T
b=0;
9 X8 a4 ^- \+ r7 z if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
' i# t _4 U( F; N, E {
8 c$ K4 H* B; D: [: O! Z r->next=s;
) k% I' ?) _& s0 X9 U s->next=p1;
9 g L* `# H: r6 l: X6 [ }: s) W& F' v) b
else
& W* |9 J/ a. B0 \" L/ c {
& \+ t0 r# I& n) i4 F; |" { s->next=p1; /*否则插入在就绪队列的头*/- ]) x' i) K9 k5 W+ q: j/ @+ K
ready=s;
: [ ^/ x y0 ] }1 ^$ C4 a7 T$ i
}
7 d: R; _" n4 ~; G! {/*轮转法插入函数*/
5 P9 u+ _5 |0 q( `: e8 Minsert2(PCB *p2)8 L$ k+ z) y/ J) J2 R; ]
{
* G5 k7 [+ ]5 q; x Z tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
' s4 R+ K* Z- O: b7 M tail=p2;+ x' L2 m% l; ^, t4 x, S$ D* O! X
p2->next=NULL;
W! q( O" p3 q}
; C: ~2 F y5 u1 l: Z( h6 Q% d/*优先数创建初始PCB信息*/& K# ^8 |/ L5 I. H5 {+ G
void create1(char alg)
% N: y; z. m8 F0 ^4 M{
: `. o& Z* M) i$ ^7 H# |, o8 @( J PCB *p;! w2 X9 g9 {( i" L- e" M, X; R
int i,time;# k1 |5 }* y' W" b/ e5 a
char na[10];
$ Q& l) {4 C1 B7 |. d$ P ready=NULL; /*就绪队列头指针*/# m( P" b3 M: l: G, j9 I" ~/ Y8 }
finish=NULL; /*完成队列头指针*/
; _ g* a1 @* }# L. H* } run=NULL; /*运行队列指针*/9 Q: z3 l/ z( e
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/( ?3 ?: D _. s! V1 `# P, f
for(i=1;i<=N;i++); e) h; N. Q6 B: m6 s0 l2 M
{
% I% N6 }9 ?0 l p=malloc(sizeof(PCB));8 Y# w; d: b% l( c
scanf("%s",na);" T! u4 h5 Q: P' F! B3 W
scanf("%d",&time);
- H" {1 ` g$ ` strcpy(p->name,na);2 ]+ |3 I3 e' Y4 W: Z; v
p->cputime=0;8 X* X# ~3 U# b
p->needtime=time;
$ F6 N6 B( j' P8 e. F! T8 J p->state='w';3 d- o, L5 z* F' n( z u* z
p->prio=50-time;1 r. @" c+ Z* r+ t* M+ E5 C
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/# E9 A+ v; C4 p0 I% \
insert1(p);
! a3 ]4 Q( k7 Z5 B2 e2 f else
D, B, P' i" G {
' }, }% m7 x. ]8 }7 C# v8 |* | p->next=ready; /*创建就绪队列的第一个PCB*/- l" ]) l/ ~* w2 H! ` X
ready=p;
, U$ L$ g( {3 Z E* i) n7 i }
3 _: Z1 a5 c- Z }- ~$ H9 e3 r7 G1 F. i' I
clrscr();% c) p9 u% R" A6 K8 R; P
printf(" output of priority:\n");
' `$ r: M! W- i- y \" i printf("************************************************\n");3 O( D& F* S% Q% T: \+ C6 f V
prt(alg); /*输出进程PCB信息*/* Y x3 A- s0 S! \4 e% x9 ]$ U
run=ready; /*将就绪队列的第一个进程投入运行*/
" ~7 X; L5 f- o$ o, K/ d0 ` ready=ready->next;
+ T. C O; \0 |; d" L3 S! [/ k. C run->state='R';' E4 q% T" j( E# s
}1 r! i, ~1 M0 } N/ T }
/*轮转法创建进程PCB*/
, r1 B, S7 g3 C9 j. v3 F: e2 p: wvoid create2(char alg). _( P( C x! a0 A: _% @
{& u) w# A3 M8 {; p6 Q* ?
PCB *p; q6 V, T, g9 h) y
int i,time;4 Q" ?6 ~! t! w' i0 a" q! B, C
char na[10];) L3 e" o B& w, p
ready=NULL;
) T7 p( _: r1 M7 f3 ^1 K' Q) Z, V finish=NULL;
; ]& f7 t4 v* W# \ run=NULL;( o) Q$ a u* g$ S
printf("Enter name and time of round process\n"); g3 m! o! w* q$ M4 y: Z: Q5 V
for(i=1;i<=N;i++)
+ t+ r$ q% r" Z {
; A) k: ?4 s, q) a! K p=malloc(sizeof(PCB));
/ E X( G5 O0 r+ ^& H scanf("%s",na);
0 B3 o) ]0 s q( y; }/ { scanf("%d",&time);& s" i' h' W y5 i4 J$ w
strcpy(p->name,na);
$ \ |0 v. U( c! O6 x7 h1 ?! M( n p->cputime=0;
8 F' q( E5 Z' X3 ?7 V p->needtime=time;
) D& _( [' ` v" ^8 [ p->count=0; /*计数器*/
' f5 m" F' V- z- D( b p->state='w';" O' S4 Q8 d) m1 J
p->round=2; /*时间片*/
0 E1 c* n7 \: |5 D& F- r" K; a if(ready!=NULL)
9 `# M. {6 o) ` insert2(p);
0 A' y6 J! z7 n3 e/ c3 k' |6 Y else6 |) d/ | f. ^. ?" c
{
3 f2 c$ {# o) \0 m4 G2 I p->next=ready;$ q* J" u& B$ p" i- B: A
ready=p;3 ?4 _& s6 Z! Y/ g: i
tail=p;, u; D: C. _2 T" F& a' h9 w
}9 }" ^: Z6 t0 a9 ?8 ^ ]( r
}
9 v. A& L7 E, W% n+ Y clrscr();6 R; g9 q; B9 _8 t/ l
printf(" output of round\n");' V+ r" I# j4 p" t1 E
printf("************************************************\n");
8 f$ e; Y) d% ?+ _5 l' Y prt(alg); /*输出进程PCB信息*/% U. ~2 C6 x- F" `. P F
run=ready; /*将就绪队列的第一个进程投入运行*/
y! i, K" n- r ready=ready->next;+ |! E; p& M/ S# a) }) C9 R
run->state='R';
, m( w- m/ E, ~/ V7 H7 o3 l, T( v}
' i" f9 O# z: q! U5 F+ k/*优先数调度算法*/+ Y" l6 U! g$ L# ], M
priority(char alg), M/ u% E+ j) z
{
4 k/ s7 N# W' m6 N# t( N. M while(run!=NULL) /*当运行队列不空时,有进程正在运行*/2 z! _8 a9 e# E/ d: w% b
{" k7 b% v; a8 `8 y, Z: |8 }
run->cputime=run->cputime+1;
`$ I) y/ j+ i$ ?* ]0 @ run->needtime=run->needtime-1;% g' `8 R; J2 q8 B1 m7 {+ E
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/! @2 }) Z) j n
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
+ a( W5 l, L& m" l {7 k$ a% \/ B- h K- Z
run->next=finish;
( b9 K- c* ~" D& ~) z finish=run;
, ?% w E6 V3 h1 Z run->state='F'; /*置状态为完成态*/: z! F/ O! |1 O1 Z/ C7 X, [
run=NULL; /*运行队列头指针为空*/# h) y6 b: @, H% f0 F5 \( W
if(ready!=NULL) /*如就绪队列不空*/ ~; ~1 @5 T, r+ E: i, p) P( E
firstin(); /*将就绪对列的第一个进程投入运行*/8 Y4 M# L9 M; O4 b" E
}" h4 `1 c+ ]/ V; `4 V0 m+ X; N; G% l
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/' r- H0 p' l$ I) Q* V
if((ready!=NULL)&&(run->prio<ready->prio))
{4 p" s4 n- @% C/ M {
; e+ @* u# q" N5 V6 }+ C run->state='W';; K; e- t( [6 ?3 j1 a
insert1(run);
4 i' j" S7 N0 q1 g% I firstin(); /*将就绪队列的第一个进程投入运行*/& C+ V; l: G m' g/ G% K6 l
}* U1 X5 Z) J# D/ i; B" }
prt(alg); /*输出进程PCB信息*/% ^1 y" D3 z$ t9 K' _% x; e
}
4 B) S, D; m. F* X" B( y2 W8 A |}
B3 F1 d( Q- v- j% G( P. p/*时间片轮转法*/9 z6 Y' o5 {' `4 _) s/ @( |9 r
roundrun(char alg)$ ], j0 O$ u, G5 ]1 I9 Z
{
; \6 S) q; ]; o2 r, W while(run!=NULL)" \9 ?3 S: Q. L/ }' L- K
{) f+ N& B, |% w+ O* r2 L
run->cputime=run->cputime+1;
3 R; F/ l! _. { run->needtime=run->needtime-1;
. G4 X: t! L1 s, j* P run->count=run->count+1;
, v* ^* }" ^$ m' z if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
# K% s7 \. F6 _1 T8 p" @ {
) D* L' d6 g% z% }9 P run->next=finish;4 h* E# c- q) K; F& ^% s. }* h
finish=run;$ u& E& N5 ^+ H. k- p! q
run->state='F';# S. |- O. R2 U. R
run=NULL;
* o! b& m8 g4 A$ G' X; e9 F if(ready!=NULL)0 k: I) X% s6 A
firstin(); /*就绪对列不空,将第一个进程投入运行*/
$ b0 H6 a" G: Z/ `# v }
$ s2 ?$ Y1 f5 e else; \* D$ F' m j: C
if(run->count==run->round) /*如果时间片到*/
- ?( W2 Q/ @: m1 I { y: a# Q. p1 N$ a8 Y" D
run->count=0; /*计数器置0*/
" n3 g( M" @% Q: _2 E: H if(ready!=NULL) /*如就绪队列不空*/. Z/ @& [) e1 ]' ?' m0 _! f: i$ m! ]
{* P. @- |7 W. \- g4 `
run->state='W'; /*将进程插入到就绪队列中等待轮转*/
# f) p2 z2 h) v( k, w insert2(run);% | x+ t- q2 e' B' ]% ]
firstin(); /*将就绪对列的第一个进程投入运行*/
) s) o1 w2 u2 p$ s$ i: e6 m% I }
) e5 y" [. z2 R- w/ u) F S }
! |6 M% P- \& Y% N7 H' R1 H prt(alg); /*输出进程信息*/
8 A3 w+ e! N: Z, ~ }* i1 ^1 B7 ?* Z# L- G5 ~; y, Y3 Q
}1 h$ }7 K6 B. F
/*主函数*/# v( A9 s4 B, b, G
main()
& o; n9 v: K8 V2 ^{
1 P0 I' \5 @% O) s7 `/ A: t char algo; /*算法标记*/ ^3 K! r# A: r" E
clrscr(); w% ?# a5 Y8 B( u
printf("type the algorithm/R(priority/roundrobin)\n");8 `, k9 P: L% k* l
scanf("%c",&algo); /*输入字符确定算法*/2 I A. p3 L! `, U
printf("Enter process number\n");
! a: Z: M- b5 l; L9 | scanf("%d",&N); /*输入进程数*/) n6 x, |5 L1 B, o& D. z7 }
if(algo=='P'||algo=='p')
" L: \4 x U9 Y0 g$ B {( K, q: O8 N1 P2 i1 M
create1(algo); /*优先数法*/8 a8 o3 R4 g B2 W5 L$ C) V0 ^
priority(algo);
9 `. G0 }! @3 \$ M ` }4 n* u* w& j4 ^/ d6 Y. E
else
' \+ ~7 R' v* a% |5 E& w. j if(algo=='R'||algo=='r')
1 Y& k; Q( a4 R% S; x# E [& j {) @% j5 H! n+ X+ W7 l
create2(algo); /*轮转法*/
9 ?. e* m9 S8 |8 n6 P% \) S" _ roundrun(algo);; q& H# ~& b) ]6 y
}
! D" w% s6 ~" S6 Y& X( Z9 E7 a% E}2 [8 {- Y" I j. y7 {
</pre> |
|