|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/( M: h7 W2 @6 b& S1 V
#include "stdio.h"
& _. x, p$ d$ J#include "stdlib.h"0 X/ L( B% K T$ i
#include "string.h"
; w0 \* U, k- Ftypedef struct node" s! o, Y, K. C
{
( a7 @4 c. C! v' O: [) r ~9 W char name[10]; /*进程标识符*/. @# F# _$ ?% v
int prio; /*进程优先数*/
6 M% @2 o! l2 c$ g5 V, {: X# T' U int round; /*进程时间轮转时间片*/
+ I2 c) U7 J( ^; o1 |; h! u+ T) { int cputime; /*进程占用CPU时间*/
' e9 B( l1 P% T, j int needtime; /*进程到完成还要的时间*/
' H& m! k" j9 S$ h! k2 L int count; /*计数器*/* w+ {+ V* i9 `' N
char state; /*进程的状态*/# h4 I" P3 |7 ?( @& d. `
struct node *next; /*链指针*/9 P1 b3 m* s8 { e# N( H2 C9 G7 }
}PCB;
8 O4 i% [/ l3 Y6 k) w( w g; qPCB *finish,*ready,*tail,*run; /*队列指针*/. K" |- }7 Q) R8 P4 T% g
int N; /*进程数*/+ {8 B2 {7 k( ^; z/ X7 N3 K/ j+ n
/*将就绪队列中的第一个进程投入运行*/* W Y5 S: M6 U% X. p- J
firstin()
( c4 Y2 s+ w8 U/ a g{! _0 o# C+ B' x2 h' u4 |2 h( B
run=ready; /*就绪队列头指针赋值给运行头指针*/, X+ a; O- c! {1 O; S
run->state='R'; /*进程状态变为运行态*/% G! u2 a# }1 f, s1 `- K
ready=ready->next; /*就绪对列头指针后移到下一进程*/+ V( o# Q, k4 G, N* a, w6 b" i" u; m
}
5 S+ ^# b" d( |. N/*标题输出函数*/
0 [5 A) Q) Q' J8 ?0 Uvoid prt1(char a)
' F- W2 ^3 n4 `+ U# E/ S{) {$ N5 G" ^# O9 Q: l5 s
if(toupper(a)=='P') /*优先数法*/7 A$ F/ r. c ~& i' n5 V
printf(" name cputime needtime priority state\n");% Y1 g! ]' ]& G) {& n4 ?' n
else
" S. Y1 S1 ]3 J: C) G2 F# C printf(" name cputime needtime count round state\n");# k, [* q) Z/ ?5 X( b& h
}
! c9 ^( [0 J/ x% z6 C/*进程PCB输出*/
) N' R- [+ c: O P3 i, n" q3 qvoid prt2(char a,PCB *q): q6 Y7 I+ |1 G" d- F
{
6 w" L0 b& T0 A8 W* e5 s if(toupper(a)=='P') /*优先数法的输出*/
0 o* p6 d8 A8 b6 S: S5 ] printf(" %-10s%-10d%-10d%-10d %c\n",q->name,7 V7 {; \; `) G- L, p b. a
q->cputime,q->needtime,q->prio,q->state);* X' F- g% e4 ?5 H4 W! {
else/*轮转法的输出*/$ @4 R6 s" j7 t1 d7 X9 T3 R9 y
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,& @6 W7 f% {9 S7 `4 e- Q
q->cputime,q->needtime,q->count,q->round,q->state);& p: V, E2 j; v( G
}, H3 G: B. R$ ?
/*输出函数*/- y8 Q o" r/ w4 }: ~& G! ~
void prt(char algo)4 m) e+ }; ~- w1 ]9 {( m
{
" C$ e, j& h1 x: { N- [9 o PCB *p;
# z3 z' ~/ p$ g2 H: k prt1(algo); /*输出标题*/
4 O$ {7 f" x+ j& f" G if(run!=NULL) /*如果运行指针不空*/
8 r$ g( S3 F4 @: F4 F R prt2(algo,run); /*输出当前正在运行的PCB*/- |0 y; q, Y6 \+ @0 l8 u' Q/ z
p=ready; /*输出就绪队列PCB*/* q _1 l5 Z! g8 `3 p+ Q# t& u
while(p!=NULL)% Z4 O' T- Z6 S$ X2 ?" i# s
{
7 {. J5 P( B& A% ~" h: p/ Y prt2(algo,p);
* U) o% B& [. B3 o p=p->next;/ c5 |5 [4 ?# x
}3 Q4 Y$ O' O% i) L
p=finish; /*输出完成队列的PCB*/
/ }6 n) F9 j% ~- I% ~4 _6 m while(p!=NULL)
9 Y+ Z" H8 o7 C! A; b {
) W+ v8 c* z. v& ^ prt2(algo,p);- }: b y# h0 w/ U5 `; n
p=p->next;$ z3 [+ |) ]7 X; s* U9 k
}2 @, g" A3 J) [
getch(); /*压任意键继续*/
; G2 B4 D; i- }2 b, a3 H4 f7 x* U}! r% d* w7 h( c% ~) Y/ W/ Z
/*优先数的插入算法*/
8 D2 v! `! x3 `, H1 Rinsert1(PCB *q)
, ?/ V. w+ D! y9 w* g% p{
3 H* T) e! |, l5 a% z6 Y PCB *p1,*s,*r;# W9 V; i5 B" k$ b y/ O) o' O
int b;
* E0 i+ r% {3 D& @7 D s=q; /*待插入的PCB指针*/$ T7 M' n9 G/ I, F2 {
p1=ready; /*就绪队列头指针*/
9 T( R- }, T/ R( E- d r=p1; /*r做p1的前驱指针*/' a* {' T, g9 v% h
b=1;
' }. ^2 q* G! ?& F# E while((p1!=NULL)&&b) /*根据优先数确定插入位置*/$ |. } x8 W N ~4 a
if(p1->prio>=s->prio)6 ]3 Z; L7 b9 F
{
* f3 _' p3 e4 J1 E# w r r=p1;
5 Q2 D( @. B( r p1=p1->next;
) a6 @$ D$ j+ W: P6 g2 w+ X$ r }6 L, Q0 T7 \" |3 H- G
else: s6 e/ S# P- t5 l$ e5 B8 ?
b=0;* v- J0 z- t. S' x5 U
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
+ G J4 ]' ^" A6 `0 E( L {
* C2 h. ~: j$ q. a8 b# T5 k r->next=s;
. i5 A8 D# f, u s->next=p1;
]3 y' ?1 G0 d9 K* ~# l }
' J4 J' r5 v1 w& P else: n8 L1 g" C4 t8 M
{
% _5 A7 ~4 O9 z0 |; J s->next=p1; /*否则插入在就绪队列的头*/
5 v9 j0 B7 l$ T& H6 u ready=s;
}' n' R+ ]" l8 K1 M }
9 F; h# F/ P. }! M) [6 d; D2 e} M1 G1 c% Q$ [; \5 I7 w6 i
/*轮转法插入函数*/1 e# H) d& L# ], G' b" @" @' m2 R
insert2(PCB *p2)
1 H1 f3 G& W" d; \& B9 v{0 k# C. b( D! E6 d2 a+ {& d5 X
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
; C: i4 u6 Y6 ?% g; u5 [7 t2 O( u% k tail=p2;! s8 T! b" t0 M( R, G; ~- L. c
p2->next=NULL;
) K" `5 y4 B+ j6 z0 k}! [" ?7 Z1 Y& q( ~4 M
/*优先数创建初始PCB信息*/1 S. F) @+ O0 q4 p8 L
void create1(char alg)
0 T: k- H/ ?. P{
: S% A9 h7 E( }3 _& d; @) T PCB *p;
8 q0 ^; ]- Z1 k! r int i,time;
. T/ g, i* Z1 \" f( v char na[10];, S4 Z2 k$ n$ m8 U/ o7 f
ready=NULL; /*就绪队列头指针*/
5 |7 v6 V5 s( K. Y9 S2 W0 \: |& ^ finish=NULL; /*完成队列头指针*/
: y) f6 U) S6 v |( f8 } run=NULL; /*运行队列指针*/; X2 Q* |. W4 L
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
, f( _! K u. j# X) o4 M. A+ z+ ~ for(i=1;i<=N;i++)$ y3 t. T5 [. n p- y% g' a6 v1 m; k
{. U2 ^! u v% ~. q7 C1 ^; p
p=malloc(sizeof(PCB));
% A! J# e& O) b scanf("%s",na);4 E, |2 }1 X+ _; T8 @7 W' s
scanf("%d",&time);1 o6 K5 E P: G/ Y# N& \9 X/ ~( `
strcpy(p->name,na);" h/ D+ n$ `5 x6 g! J
p->cputime=0;
# v6 y0 |, [$ h0 H5 b p->needtime=time;
8 C& _7 b. S+ ]4 D8 u) q p->state='w';+ F( ]9 c" S, ~
p->prio=50-time;
4 B/ [+ p6 |* z if(ready!=NULL) /*就绪队列不空调用插入函数插入*/9 \: H& z' a( y& I8 G& F
insert1(p);
, F0 {+ `2 @& m' G$ B else8 D8 I# h5 p- \+ k, w* h) v
{( l m2 z! c! |" z
p->next=ready; /*创建就绪队列的第一个PCB*/
; o; ~* W9 @! }, O% e ready=p;
% B6 W* q& x, f+ m9 @* Z$ [ }
l X) A* f; D( A% h% ~ }
9 J' ?$ F* y* r/ Y1 F8 t: o clrscr();' c7 @3 `8 I+ p; w$ `% x$ x
printf(" output of priority:\n");9 P+ I/ `- d$ Y6 ]
printf("************************************************\n");
" I5 E( G6 o6 [. I m5 H0 Q prt(alg); /*输出进程PCB信息*/
# e' Y- n" g* a, O, M run=ready; /*将就绪队列的第一个进程投入运行*/
8 V# e5 C2 ]( g0 T7 ? ready=ready->next;
# I* V: G. ^4 ?* ^6 b3 D run->state='R';
6 {& A" L" Q1 w {% s5 o* ~}
$ d3 S2 A3 a3 m$ K& F/*轮转法创建进程PCB*/1 n4 g: ]/ }7 V) e5 s
void create2(char alg)' E2 \" }1 h* ]! Y- A8 u5 m
{6 l8 s9 ~( @& k @' j Y
PCB *p;
' e; C- I% E- [ a1 Z3 W c& Q int i,time;
& v9 m |2 x4 @( ~ char na[10];0 r5 V# w% m6 n0 R9 B
ready=NULL;
" r. y3 ?5 ^: z/ q7 o finish=NULL;
8 e+ N: n3 I% o, C! B5 s) L) P8 ]% O run=NULL;
: b+ _" ?( N6 @2 ^ printf("Enter name and time of round process\n");
( ^5 \9 v: m' N; A; J# d! Q! U for(i=1;i<=N;i++): R" D8 h0 e: E+ _, v
{9 j1 [" M) Q9 I; C6 O
p=malloc(sizeof(PCB));; P7 w1 L" K h' u6 l4 D
scanf("%s",na);% d0 `3 p0 S: d ~& d% ^
scanf("%d",&time);* g4 P2 N9 d, d& w' S4 _
strcpy(p->name,na);
* j- i+ ^3 ^7 ~2 e! w/ @ p->cputime=0;; @ N: J5 L( | x
p->needtime=time;
: z' t( f6 e# b* L4 ^. w p->count=0; /*计数器*/3 J" t% W( x% i8 I5 o
p->state='w';; ?. V1 h3 Z7 i6 Y0 c; D
p->round=2; /*时间片*/! m& U4 b# R3 X% H
if(ready!=NULL)# n& L* T! G B; e6 \% ^8 H1 L
insert2(p);2 C2 ]; x8 g- ]0 A: o- f& a5 z3 w
else
8 }& T2 w" |% f/ s; K' f% B6 } {& M- F: I5 O( T, E) u( Z& z+ n. J8 c
p->next=ready;5 J4 B: O9 W; t7 K$ W0 r; t
ready=p;1 p0 A# e Q" r' L- s
tail=p;
& o% Q6 L( ~- k }
3 q8 D) m5 S+ c% |0 X }
# A7 L9 T% I+ A2 ]9 x, t clrscr();
. e/ s- C* H4 U) t" l8 z printf(" output of round\n");, k d* l9 I! l9 {2 O$ v: t
printf("************************************************\n");2 G3 B# v: z# O$ Z+ V
prt(alg); /*输出进程PCB信息*// L, W6 {1 f0 |+ [6 g) y
run=ready; /*将就绪队列的第一个进程投入运行*/" B2 ~% l1 N2 W! y, x' T( y, g
ready=ready->next;: K0 `8 h7 W7 n1 [& a. Y
run->state='R';; Z* X$ [" ^7 K5 E3 p
}
- l+ I" z7 r& S6 [! s2 ~$ V/*优先数调度算法*/! f& A' ~3 J) I# H+ T9 e, l, ?
priority(char alg)/ u2 o0 |3 B! ~3 R6 M$ \: Y
{& ]% |* l+ t j1 c; a9 s: Z
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/- z& i$ U# X# v! D' l
{- o N% P. w' u8 \
run->cputime=run->cputime+1;
1 O* s) E0 E/ T# w5 ] run->needtime=run->needtime-1;
4 Z x) m6 _. l U6 N, M0 i run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
$ \1 r& E$ i# }. [! B if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
& }' `# R( y5 G6 E {
8 L* Y) K3 [: {6 Y K6 r- R run->next=finish;
4 L2 j* L0 o& g& G finish=run;- I4 s p% J" _2 g
run->state='F'; /*置状态为完成态*/
v& {$ }+ N! F! Y. { run=NULL; /*运行队列头指针为空*/
- p: m6 f5 q: Q- C# ] if(ready!=NULL) /*如就绪队列不空*/1 f: f: r$ S, T. G( e% V& `+ ]) c
firstin(); /*将就绪对列的第一个进程投入运行*/
) \* K1 }, A9 a- H- P/ p }/ {0 F2 y! j. [% g( j2 e0 n2 @
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
% P* V7 m. d, T/ s if((ready!=NULL)&&(run->prio<ready->prio))9 O) r4 I$ [, f( i; V; D% v% T: K) u
{
& x6 y5 ]9 H9 Z, g D$ I+ H% F run->state='W'; `$ `+ W* S, ]7 H
insert1(run);
! f2 Y W6 a# ?& \8 p firstin(); /*将就绪队列的第一个进程投入运行*/+ O3 ^6 k8 p* h n+ `3 E
}
" D8 H3 Y3 h- s1 |' f1 R prt(alg); /*输出进程PCB信息*/
. i2 ?9 j$ l% `) W. x }- U. X$ \3 K& r' o/ w
}
3 H. Y/ Z6 i! \6 K9 h( X) x" y, J/*时间片轮转法*/% F4 k2 v2 L- y- N
roundrun(char alg)( G* n/ b2 O+ J% ?
{2 Q' e: g) G0 M2 P# W
while(run!=NULL)
8 j- A+ ~* S# c2 y0 q* [$ k7 P& z {
& b: r! p3 x& c! o1 J7 ^7 A1 ^" h0 q run->cputime=run->cputime+1;8 I& Q0 s2 _) g, E
run->needtime=run->needtime-1;2 x" a5 Q, v0 u* S7 Y
run->count=run->count+1;
" I. K5 v, b; Z if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/2 W5 G' V( p* O: l8 F
{
6 U# i# [6 Y0 w4 `6 x) O run->next=finish;0 [" k7 Q. B/ R3 q5 h
finish=run;
/ e1 p2 N" G* J5 b/ T# B run->state='F';6 V, `* k0 O; r( J( l+ q0 e0 `
run=NULL;
& y* R" d$ n" m+ L% o4 z if(ready!=NULL)
9 }8 Y) W: K7 h) Q firstin(); /*就绪对列不空,将第一个进程投入运行*/. S8 s, x& p& G O1 W& K- u
}
- `1 T6 b W; u2 Q2 a/ t2 R: S& {4 c9 u else
0 g# ]8 u1 z K: A/ D& ^( U if(run->count==run->round) /*如果时间片到*/
7 Q. s7 k; i( l8 E& i: P {
/ B7 ?- h4 K# }1 V0 x4 Q9 l6 `1 r- Y5 M run->count=0; /*计数器置0*/2 r' A- g9 K6 `/ Y$ i2 p
if(ready!=NULL) /*如就绪队列不空*/
% A [8 Q3 o4 u9 |3 q! V8 u/ g {7 h0 V9 w5 e2 h0 A2 D
run->state='W'; /*将进程插入到就绪队列中等待轮转*/% O; R- ~9 {# x4 f7 S; \. O
insert2(run);
+ M3 }/ s7 G5 e' e3 x' E. ^2 X2 P firstin(); /*将就绪对列的第一个进程投入运行*/
) Z7 ^1 Y; L5 v; a) V3 x8 _0 e }
( H" Y: t/ D6 \$ Y }
- b4 a2 T3 u. M+ f; `3 p# M) o prt(alg); /*输出进程信息*/
% X9 |; f# P' |% x }
( H8 a' c z6 w9 x}, B: F3 R. t1 q: @3 @! H. T& n" K
/*主函数*/" Y" D6 [) G5 h, ~
main(), J0 _5 @% V+ M: z4 a
{
5 G2 p1 k) [+ i, j0 P4 d3 a; E, a char algo; /*算法标记*/9 d/ J E. U1 w$ V& t) d0 S
clrscr();
5 g# P- [! t2 [1 \, T printf("type the algorithm /R(priority/roundrobin)\n");( b- X* \3 O7 _8 B( }/ u
scanf("%c",&algo); /*输入字符确定算法*/
1 B8 H+ l7 d5 }+ U printf("Enter process number\n");, e9 d( z5 w8 N
scanf("%d",&N); /*输入进程数*/5 G# ~# I* G# E: l5 v/ \
if(algo=='P'||algo=='p')8 [7 ?, n3 H9 i$ Q# c2 ?+ ?) D
{
( Y h( ? b5 \0 X R1 I create1(algo); /*优先数法*/
5 e5 b' t5 x$ P" C4 X- s" ]: b priority(algo);8 V+ [0 O: Y/ F( R! y5 ^( T
}
- H* s' Z( U; D; m+ a else9 S5 ?/ \; d8 n# ?
if(algo=='R'||algo=='r')+ {) e& e. G: G3 s" o8 m
{
1 J6 {8 x! U- @2 Y8 B. S" f8 z create2(algo); /*轮转法*/
R% l; ]+ q- M1 V; i7 I9 x roundrun(algo);
: D7 k4 P9 X X0 [/ G0 v! Q }9 ~* A! Q* Q$ D
}
( }% t& m8 J& g; J4 E</pre> |
|