/ a1 a, K# \' p* p+ T优先级调度算法# n* m7 g5 i" E9 f' a* _
算法介绍
5 {1 I5 g& s1 V) u) z' u优先调度算法的类型(用于作业调度)$ _+ W5 s& `# @1 Z: }
1)非抢占式优先权调度算法 ; e! _/ \: B% ?5 d* M: W
系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 + c' {0 O0 O. P9 O5 V1 ?7 G
2)抢占式优先权调度算法 1 {5 q/ d g @
只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。 优先权类型
- [' h# S: Z* C; [1)静态优先权 ) F0 p: t0 x4 _& K; \* ~" ]
静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
$ u% A1 B* s T0 r" @' j![]() 2)动态优先权 " D7 A$ I# T# j9 M
![]() 算法实现抢占式动态优先权: ![]()
3 T7 X* w$ A! C# MPS:本人认为非抢占式静态优先权没有实际价值。
$ ?2 ?5 p8 ~) A9 R& h
. U, F% @# L6 b3 D#include <stdio.h> 0 s( ~# z, l" |5 ^9 U" a2 a
8 ?3 P+ {% ?2 F' K
* }* z4 ]& [* u; {5 a4 b! W {" ]6 K7 b9 F$ J
#include <stdlib.h> 3 u7 h' k" w, `
4 m1 M; l. l* T1 C! @" h7 R, X
2 w+ j- ?: M: q1 x5 [% Z
; |8 \- ?# w* Z( f1 k#include <string.h> ; R4 r- W/ w& z( X/ t& ]) t
8 ~+ H6 Y& u: k/ J/ m" `- 8 a9 y5 D5 @7 A5 J/ D
( O5 _, R/ W( N" I
typedef struct node
& g% @, ^, z( `
1 _5 N, Y% u. z D7 S
. i# h) ]! i8 c2 V+ K
$ ^/ y, o5 \+ v W{
, s" A `) _3 L* [" E) `3 ?8 p: O6 F
- + D3 _: n8 ^% F2 ~$ ]
# J) F' U4 w& V1 O
char name[10]; /*进程标识符*/ + e0 u1 O- G. k# \, c
- R5 \ R2 i4 f, T& T* ?
- ! u1 D& x& ^7 u5 j
8 a! v$ c. u4 Y3 b. ^
int prio; /*进程优先数*/ % B% i5 l+ K4 i
, Q: u* V8 `/ T- X# s; C - * Y s2 t! ^/ O7 e
4 F: g0 I* e& {$ b' T! K0 W int round; /*进程时间轮转时间片*/ ) J2 t4 @2 u. z$ c% ?2 z
, H$ F- G4 R( s6 k4 R* `
7 ~9 Z; a5 ~. I6 \3 F! V U, Q" P' F; t
int cputime; /*进程占用CPU时间*/ $ b4 `4 t: F. G. g; Z+ B% g
/ f$ j) d& i7 r$ P! w9 _+ U
0 O7 J' A! U& G% a! J/ t9 @% {, t2 X% J* w
int needtime; /*进程到完成还要的时间*/ , f( E0 ^8 s8 M/ ?
" b- }) [3 |/ p* }) K
( ?6 N0 T$ I2 w! E) H& G @ l- P$ {
( z9 N' }, [/ ]) q int count; /*计数器*/ ( H* v2 @: Y% g, y
6 e" x0 p$ d# Q+ K- # S) M7 P k& Y1 P3 j
6 @% c/ ?! t0 O/ t/ q char state; /*进程的状态*/
% `+ ]% _& Q' x5 L1 F' [2 j% \# M, O6 Z& s0 Z$ v7 b/ G! f0 s
/ }- x! P9 k7 E$ Y- ~2 a/ u5 N! V8 l: E
struct node *next; /*链指针*/ 7 r$ t/ l8 f3 ?* g* q2 {
+ f# l2 H- O8 h. x4 a
- 9 O! N2 F4 ?3 f! M1 P P* I1 S/ S
5 v5 X9 C$ T6 O}PCB;
* t; F0 L6 q, f0 [7 M& A& }( g* e# n2 _* K$ ?$ }0 n% c
- * i% Z( U% h0 X e' G
0 l% g: K( Y5 a% N+ s: G
PCB *finish,*ready,*tail,*run; /*队列指针*/ 3 r- T9 A' K) k
; G t0 Q3 y/ u/ T, J( u
; _4 O2 h. g% r7 e
6 X& t. h! Z! y% Gint N; /*进程数*/ / V5 { w& N# G
3 X0 u9 b. v6 v0 T, t- 3 J9 b3 d+ ~3 B6 e4 U
9 F2 ~( e* m: v+ J4 y! I/*将就绪队列中的第一个进程投入运行*/
8 R/ q$ [6 r( l
& v& l J3 {0 }# e) N- e
, z, V, i' U$ T) M+ q
/ m5 ~, p' h& N; k) P6 i! Vfirstin()
0 T) l$ ? U. v& A+ n1 V& G, B" }, z; f( R! D, {* R* }, e
- ; e" E1 n; `/ r' j
) o0 z: Z8 H0 i& |{ 7 k6 z. T! G4 d& R
9 [7 M. f+ U" P
: x2 S6 G& x$ ]) L6 p7 V. \* ?! W; d8 q( s% Y! H" Y6 O
run=ready; /*就绪队列头指针赋值给运行头指针*/
3 W) S# s/ k- v/ Y$ \' z$ D+ Z8 l* g5 E% ?
7 u/ n! n5 }8 u' x
& r' ~' z0 N5 b: Q, j0 H2 _2 E run->state='R'; /*进程状态变为运行态*/ , s9 H3 f+ `' u0 c& ^# ^% |
9 I$ b0 t9 v6 w/ {9 C' U
$ F2 P i; s7 A& C s: E, C9 J0 k& E; Z, S/ H* c
ready=ready->next; /*就绪对列头指针后移到下一进程*/ ; l* U6 p& s6 k2 P2 f. I+ Q& O
$ K- ^- I, M: J7 E
- ! T! u3 c3 p7 [* I" r8 {; Q
+ q' N1 r1 g& O
}
; n) q7 T [0 R& h+ y/ Q( c8 Z% C1 w3 u u* B- i/ d
- ^1 F5 g) u9 D$ [; K7 U! [7 c" l8 Y; c
/*标题输出函数*/ 5 h7 e) Z7 v6 }' ?6 h5 y+ o0 G: c
0 ?3 }" P; k4 b( B3 P2 U
- , G: D: C: K: L2 g6 F- O" r- a
4 ]. R- Z0 u/ U
void prt1(char a)
) j$ j9 w4 s* V1 C- i3 t0 Q/ x* P1 s n) e
- % l: o. }6 g7 r9 l
2 E' F. D( z0 D& j
{ ; [8 L& W Q5 L6 Q& `
% T! B" j# F$ }# m% R- U
- k+ M, L/ ? F
+ S- F2 {% F8 F; E h0 \ if(toupper(a)=='P') /*优先数法*/
0 S/ o' P* `3 w9 k* B+ j3 V
# k' u. j3 R7 \! Y/ Y- 9 U8 {, ^/ {4 @+ N; y2 i
( E$ J7 M: a9 ?& T# A- V! N printf(" 进程号 cpu时间 所需时间 优先数 状态\n");
. M; [. X ?# u" s6 B7 C! p7 S9 Y* L% H3 ?
- & V7 r& N: x6 ~$ X0 C$ P
3 P) v8 [# m" l" I4 g else
# t! t+ j* Q }9 I* R1 L4 X
; ~5 D8 o( C2 O4 M0 F; |. o
: S2 ?; n5 Q; G4 r
$ x% D3 h( }+ c; C) k4 V- ] printf(" 进程号 cpu时间 所需时间 记数 时间片 状态\n");
/ p0 f: H" A4 w1 J C
; m" _4 _$ s2 ?. i# j h4 U) T9 L* D- : V) {5 F6 Q8 W4 h8 Z* f/ P
! ]' {2 _; P, n} ) V. e: e* ]! F6 ^7 J8 }
6 R: K( k- K9 g5 b: |
- 1 X& [0 z& S2 _6 c4 y6 u
- K" U# x, U& E7 H5 G( @5 r6 d
/*进程PCB输出*/
: ^: d- y3 h# }0 D% e& B$ C& ^1 l* Z
- . T& H3 j7 _ }
6 P# h5 _( B6 \& Pvoid prt2(char a,PCB *q) 1 ^- E: z \% Y o7 _8 a9 D7 D2 U) a0 Y
N( ]# H' ]( p/ }. }8 K - % u4 @/ n, O. V% |" \
! c: P4 b( @0 y- _% D
{ ! v2 _6 i4 e2 L8 i" f6 K; Z
& [- [ T$ Q, N ~! o - 8 r- c0 P9 O) _. Z: @5 n" M( {
3 D M$ u) v" H b$ J9 o }
if(toupper(a)=='P') /*优先数法的输出*/
* p( r" z4 y% q; ~7 i. j9 y& U
* H; `$ R# \8 ?4 [; u! {8 D - & T; r& k0 R0 F$ G6 r& m7 J
$ ^2 \" D& |6 g) k
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
* L' I- e: E( \& K6 ?
6 E0 K3 e \; e" j! |- g - ; i( R) T) D% o' e+ ]8 h
. G! ?4 ^9 w a9 i5 k3 o ?( C
q->cputime,q->needtime,q->prio,q->state); 0 R* U- g. [. b2 L% @
' M J/ ]* ]0 n& N - ; p' V n) w6 P2 p8 i8 _ w
B0 P- J( \1 O, q) k" f+ ]8 v else/*轮转法的输出*/
7 q+ p! T8 n: ]: Y: J3 J
; _- q; _$ l$ u - - D- X7 d+ d/ A# L
" G3 Z6 m+ S# D, F printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
; r' J0 c9 ^# a- k) q7 j( J) i& F: ~& C) q& w
- # {# z- u: a& J' p; U4 P8 {
, G( T1 V a! M- g q->cputime,q->needtime,q->count,q->round,q->state);
) ~2 T0 B$ P7 I0 g
$ M g3 `( x" v - 0 i+ r& w6 u1 B- a
. [/ a& k6 g! [7 L5 s& V! B- y}
1 T, T. ]3 N0 D8 k
& b* A) Y; ~( ]) u% Z - % M8 G) c8 J% B
" u. [+ [7 z' z" `% x/*输出函数*/ F6 s3 h5 O7 c! @
2 M/ v2 J( l4 }& a- ?
, ?7 a6 @* k0 E" ]9 \/ | M4 Z( [* O7 x: Q/ H/ ~( q
void prt(char algo) ' X! s. N) `5 ~+ J
* u* O( k- R! o+ d- t) x& l h5 ]
- 9 {% |# V7 r9 g) {! N+ Y5 ^: _, \& G
" T [; d6 [+ e{ * S4 [1 c. P) [2 n( a5 l4 F( ]
. S) d" J5 O' d2 G: q
4 c6 I9 ?* h% |8 Z+ A* p& {! |0 ^* T7 G5 o
PCB *p;
3 ]' _8 F0 O' O# W
4 q/ K5 n: q' Q6 S4 S" U
7 l8 H* W) l6 h5 K+ U
0 m, O6 v8 B! y4 \- w4 z prt1(algo); /*输出标题*/ / U0 v% m8 a: q: l. L. @
$ j2 v( O M1 r6 M! L- 4 f( D1 L6 A% W; S! D% o
+ F3 d( f" m+ q! g if(run!=NULL) /*如果运行指针不空*/
$ ^% N8 d0 @6 T ~' U$ J8 }$ d/ `9 _: v9 b
4 j: O& T! o# }$ c
8 R0 ]- F( l- t. H6 f4 F prt2(algo,run); /*输出当前正在运行的PCB*/ 9 W# u8 V, w- s& I
+ M% ?( F8 K/ h% O: J
' F& M$ |. k: l$ X* l3 V. H7 u
0 O' \- |$ i' }4 H) L7 V- u& H1 z p=ready; /*输出就绪队列PCB*/
0 A: S: ^ k0 k2 f' v5 u9 z6 n" I6 o. f6 o; k3 O: t# B0 ]3 i5 M# S
7 t$ P* `( s3 U3 B* A7 o0 A9 j: V5 {5 U y: q
while(p!=NULL)
( N1 C& S9 ?5 E; F4 b2 Q+ t9 _ F, p6 m+ k& ]! p+ @) \) x, U
5 o& H. N+ `2 T4 k
8 S5 x/ Q' a" z; o9 Z% c3 b9 R4 P8 q { ! p- g3 W! W8 ^
e' q. r1 x8 ^; j! f& K, @( S
7 s% B" ]9 ]) e9 e! M" c% O) F# }) g5 Q" \( u& e
prt2(algo,p); ( g6 X& d R& S, X1 }1 a
! [: p |! E1 T. A6 V
C- b+ G% ?, r6 q0 P8 O/ z
% g8 t9 b& p m- r- q* _5 Z# r p=p->next; # |4 _6 j' ? m) P
2 h! y* Y# j, E" F5 b/ a5 p# X: `. y
- " T& ]+ I- [9 c6 ?/ F/ c$ X
+ m5 I; Q' x. D% Q } 1 G; O5 j" f0 i: i+ g
0 h% d. J2 o) _$ |% e
- / @/ {1 x9 P) k- E
6 E k! ]/ S& R4 c+ [
p=finish; /*输出完成队列的PCB*/ ; ]# m$ U) J7 L8 [ @3 ~
/ W& P0 M) a! o- q7 S9 q
, A& L* b2 _$ c6 ~5 y( P [! [& V3 L V
while(p!=NULL) . s$ }+ b; ?: ]/ o# y* w: [6 ~, e
- r! c7 C0 K, J- 0 q0 u/ _3 U' |" T" J9 @
i/ |. ?9 w, e8 O, F5 q {
- Y+ P# h4 @4 Y, @1 C+ m9 O) U0 Y1 o4 @7 ~5 n$ `7 |4 d6 D3 v: G6 k2 H
& U. k- p. @3 c( s; W
8 d+ E$ w# _) ^2 G, |. H prt2(algo,p); * U% U& r; g( m7 l$ B
/ a8 o2 Z4 E( E7 a8 ]! F# x6 s/ l
$ y4 L- }# u% @: m
3 {. t o) o7 s7 N0 e4 x3 f2 Z p=p->next; : n9 m# \' [6 H' F2 e
- c! h4 s/ X" l. P: k- i- 1 S% A/ [4 V7 w5 U. b
7 @1 _8 ^. K1 @- z
} / ?6 x1 U6 R4 U+ A' T
) y3 E' }/ T1 [( `: e% l% Y - 5 z0 p p- v1 Y4 {* s
) ?; r$ c9 p8 f4 I6 n6 h1 A# a6 N' o
getchar(); /*压任意键继续*/ : N4 e% C _7 s, e
' |2 h/ b* y1 B; b; P. M
* b; G* v6 ]* _ o+ w% X( N# \( |" e& f
}
0 }: d/ r( V$ H# k* Z1 E, v/ M8 [: e5 V5 L
- + d5 F0 }4 n* l# w( q! I
! g3 s* \# P( x$ @' J) h
/*优先数的插入算法*/ 6 D$ m: L Q1 P D5 A, M `; f g
0 [+ \0 H* H/ Z, k0 a. L3 z
) G/ j. a& |; d- e9 @: F6 H* z
5 J- O9 c, w" ~, ainsert1(PCB *q) 6 F' C/ S3 Q' \
6 ?( E$ v8 g3 m, j# v3 ~
; A- o( e% u: s! r2 o' e& K
$ q$ K8 ]: u4 |8 l ]{ # v3 w# O8 ~' C f. N2 ^8 e4 y1 B
# E" V% H/ t" H1 A, k7 ]( R/ k( _! j
& E& w8 s, h* O+ M7 q8 O
5 h7 s- b8 V. k PCB *p1,*s,*r;
O4 z7 y z/ X/ B. {& P+ ?) S6 J" i/ D7 b
- $ c2 p9 f9 F7 [% P
- ?' ~, h& L, H int b;
* v* n; U9 x _: a; l9 \
# v& w' v9 j3 l7 W6 E - y( A1 ?$ N' U5 B; @2 z
7 p/ U$ C; C( z& K- C
s=q; /*待插入的PCB指针*/
& O: a* f2 N% V" `& O, N2 z
1 H5 d8 } V0 {3 v* M4 n - 9 [+ W' |! ]: q# L' H. B! k
' ]6 w$ L6 y/ p p1=ready; /*就绪队列头指针*/ v: }1 C! Y. A+ s2 @% f6 s
2 ?( l% G8 t7 C# k, z( L; t" {4 ]
- h& O: ?0 E; w& t d. d
, @; r4 j: F& [& e: p8 g. [- ~% H/ O r=p1; /*r做p1的前驱指针*/
: l8 z' u1 O [8 x- Y
6 K2 ^/ m1 V# Y' [ - 7 D' |1 h# V7 A- n( t8 W, m
8 U1 U# ~. u' r3 F: ^0 v; u b=1; 3 y6 q5 w- G, v0 X- Q0 L
, n/ M# r6 O7 R, { - 8 \# r# j9 Z; Y( L, }/ F
3 l8 w6 B: U3 B' M8 [
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/ 0 v Z8 ^! i2 x& T
+ R' O4 M$ }/ c" E' Z6 |7 A4 R V
+ B9 i" S7 K& M- n) W$ s
4 Z O" Y* P- r8 F' X if(p1->prio>=s->prio) ; t6 c8 \6 s" b. t" g+ b0 ?- {
" A& L% r% N, Z) S
- 4 e8 P$ B" e1 }- @, V: O1 k/ T
3 \& r1 r, o# b5 q1 L* Y {
0 Z2 W4 Q6 U$ e
1 E7 p) q4 x# X6 C - ) \5 M! ?4 j1 b
1 U1 j4 S: [! e; t r=p1;
1 u9 j" h5 [" {; | F
' v- c- b' b3 ?' v& v l; Z
. f! j$ b j, r( `: q2 _0 W
: \6 k* L$ N+ D/ J1 U2 L p1=p1->next;
- v; E- @9 m9 G1 D z+ W& K. D' C1 R' ~8 Q) N
- 2 N; }% z& K! f) e9 c# n
/ w8 q" y8 X. a8 X2 e6 H5 E: q
} ' L7 W3 O* N; O6 ?5 v% S2 Y; D
1 b ~: H$ T% k( _0 j% w - 4 X+ @; z2 t1 q
9 Y; G$ H/ a O8 R4 v$ V, m else
( l9 ?3 r" V5 g& I# r
1 K$ s; Z( o, u! p2 b
! q2 F0 `3 T6 ~: M E: n3 t. I0 P% Z" N6 A) x3 l8 J6 v
b=0;
& ~: L$ [6 Y# J- e
( q7 F3 t0 r E$ U' x3 }
& A1 z. `' n# X- F4 ^- q9 l# @) T; Z( }9 a6 F Y% }
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/ 5 S4 A3 \4 x7 r+ J) y2 ]) K
. H- P* Q0 R9 o' \7 V5 a
8 r( f* A3 A$ D' O. A9 Z) R k0 m( H; T7 V j7 d1 ^
{ * p& Y/ T/ ?& z" k0 n! ^, U
- R' e! V- {1 c. H* V* M( M
- W. r) t5 Y1 ]; R( c# Q o
* B. K8 a% W, ]1 ]5 A" G
r->next=s; - M! @$ n* a1 Z
. _" n! p0 ], ~( W+ D$ s
- . M" J8 C: k' U7 X. A. C! G9 Q
- P7 p6 a1 ~7 [4 T k s->next=p1;
9 x5 E5 n( B# F/ w
1 A6 u) g1 n( B% [9 j1 J - - t. V" e$ z- w; Y; c
! X7 ?! n- f4 H, q4 ^$ z9 n }
& ? s1 q0 A" v. \( ]' k4 \
9 r. Y5 l, v6 M h V - 3 O6 J" q d& E1 r1 d1 E
+ w/ w( X1 |% w
else
; ^5 l9 }: R& ?/ \" E) S+ F
K& y) r6 [6 ] - & \+ N/ O2 f% g" g3 n2 H7 w7 C9 B
5 U+ J) z: h2 L/ z, u4 O9 Z
{ # O( o j3 ?7 K$ t5 ]
( [2 v: B. g, a" }( n
- ^2 {) E+ g9 H+ E' v( z
: \1 F1 R8 R3 g5 A! E8 m$ a* ? s->next=p1; /*否则插入在就绪队列的头*/
/ [1 ~+ C$ y! a, o, R4 e( @! e4 y" v. k; t
9 f2 m1 l% B: A [ @% e! @- H. N$ ^5 U( \8 T4 x: J+ X( r
ready=s;
. }; C4 O w c, h( P: Y
3 [2 `, U' I0 Q- ( x! c7 P, G6 { H2 {' n
. t% f% c- P- U$ S' Q3 f
} ! s) C$ Z p- O- j j5 _
/ R4 l+ k. \1 u7 R7 N - - L( i- P1 |- ~+ N+ v2 w4 n- G, n$ Q! O
# F' w+ |/ X+ b( t, p}
6 E: T1 x9 _* U. t o+ |9 A2 d6 k( x& E* j- |+ i
2 {. O$ t" ]! Q1 W
% h8 ?0 X, P/ B/ g) J: M/*优先数创建初始PCB信息*/
% o Q0 P: m! V% z8 ?8 U
2 R0 B7 W( h- S) ?! h) `2 c
3 p: p8 x% R$ @: c( E- a4 Z
* B" l3 M0 |5 s; e+ G4 Avoid create(char alg) $ C, A' @$ `) G; s6 b P; b9 C+ B
; p- f- ]! x( i( A
- " O8 m6 B' S1 G! A! A4 u
7 }% ?& ]0 Q+ n3 m( }2 t{ 3 a5 H) k! W. W7 i7 j5 t# w1 r
- I7 J6 I# N8 b
- 9 H4 ^4 A1 y9 D: \- z/ s4 y
$ G6 N" Q. R( U0 I PCB *p; 7 s7 r8 K0 L5 D* V0 m1 C
( d$ `: r5 a# _( K1 Q
- 0 R$ Q( A, J$ N- A( M5 w
9 T; y2 f+ L2 O# X3 S8 Z int i,time; 0 K/ a' h. d8 C t5 h
& V1 I4 Z( J" W. E( K- b0 H3 a
# n/ y8 n9 f! P: L0 e8 k* [, \8 d; Z# a- l, c) T- @# M
char na[10];
" T1 C1 M" q( W; @, n7 u9 f: |, H; @* D; I" q+ G1 L
) m u7 ~3 A7 n/ w) r8 \ `9 e. O! K$ M: b) P
ready=NULL; /*就绪队列头指针*/ 1 z; ^1 k5 r% K2 w5 n8 K' M* w
; H6 J8 M3 w+ D) z: {3 [3 ]: d
; o* Z* [$ }+ S: D, C4 B0 s, D" B) A
3 Z, s1 X: C9 J# d* O/ k. @ finish=NULL; /*完成队列头指针*/ 9 @' Z. l- e/ v$ T
: X9 z+ t! M" x
- 1 R4 i( i M1 h* {: |
% a4 I0 G& @# M+ x7 U7 G% ?6 F+ K
run=NULL; /*运行队列指针*/
+ F( n% M, |7 y l- M! ^
; w: g# @8 K/ @0 O1 x2 p
, y* |& _& p y) m; |/ @8 q/ I3 ^- T
printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/
7 h$ ?: j" a/ f, @5 O d1 k! F b. s, A: P* L6 O% [
- : R2 o0 T: Y7 d. M& Q0 Y3 }6 m
% ?1 I" ]5 I C* C" Q7 Y for(i=1;i<=N;i++)
7 S7 O8 V' c" L) _! } H) k/ s5 k1 X4 x ~% Z$ y
7 M0 d+ h( |- J7 ~2 J% s: Z- d" _7 N* s' I/ z {
{
7 Q" s5 c9 C7 s/ Z& x: t: c) K
+ W3 r2 p# N8 q, K" J& g# T- ! f7 j' `$ D2 n& D- Q* O: k- F1 \
) L0 N9 I* x5 U p=(PCB *)malloc(sizeof(PCB)); $ f0 a, I1 `9 i2 L7 ^* r
0 A' E7 D- h+ b5 B8 l" Y - ' c! J$ e# W1 w6 w
1 \9 |" V# n2 i& ^ scanf("%s",na); 1 l6 u: j5 {) ~' e0 e9 M* n
/ v* K) M! W" I
# T3 v3 d+ o4 m( | e; i. N" O4 Q
, ^$ d$ v& U( Y! {+ @$ ?! A scanf("%d",&time);
& u' j3 `% ~1 ~$ |( z: } u# ]! C* y% @: t- i( s9 ~& p
$ I! x# J, [3 d: ?0 u0 ]8 ]' j& o( V
strcpy(p->name,na); ' |% ]1 u9 u4 J5 x
6 v6 E" h- T: `! G7 i( n' J/ f8 K
$ s. t7 b( c0 S. l; b1 M* i; w+ W4 S; d# S- ~( x' H& w4 _9 Y1 P9 L
p->cputime=0;
6 T: f' a1 q& _+ Z0 S* `8 T9 U
+ O- L4 P: A- T+ F- T) M( w) r7 M
7 {+ T. l7 b1 h# d p->needtime=time;
# b4 r5 I8 k' r) g& ]$ i+ s, Q2 v m |( M9 \( _4 o
- ( n9 i+ S) k. ?) e% i& R2 F
1 n2 {9 F% n. [% l p->state='w';
$ k9 E" y9 P0 u n: o
! N( O. I; r* q - 5 m' I" [% d! C" M& Z
8 h& c/ m4 K) M! | p->prio=50-time;
% |$ K# h' e) B$ i3 p1 M* G8 {1 x3 V; B0 B" n* p5 ^; E9 i( D
% H% q2 e& k- K. T
( ^' v+ ~. h/ | if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
+ z# b: f, c4 U' d# R" N
. F+ q) C* Z- N# ~* y3 s
0 t! o2 c( O6 U. }! J
" c k. C, A6 U9 {3 j2 k3 P insert1(p);
8 j p/ s& U: k/ B3 @6 m. b- a: N6 o! c! K
# }8 N0 S# N4 z# U5 i8 j" x6 U" \' q( }, c* \3 [; l
else " R% J, ]$ w( V2 S
. O: b# W& u/ o! K4 b
- 5 k. b, i) f- I7 P, r
# q) c( Z1 ] ~/ t! l6 Z c2 l {
6 W+ Q% ]( D$ {- _ y. f' c X- \1 m
. B ^4 ]' Y/ B- K h
- c( \- y' H1 T. @0 a p->next=ready; /*创建就绪队列的第一个PCB*/ 6 K6 K* W8 u* D$ X2 m( a* X
: u, f4 L7 B7 i" _( y& v. K" Q9 ]
3 b1 v2 h8 t6 p' Y6 g7 G" b; `4 n- n+ G
ready=p;
! j. A. i: D. ]) y- `5 P. ]& r/ G/ ^ Q7 B, Z
- . s; M9 w' Y% I6 @$ Z+ i
. X* ~6 v2 d8 H7 h4 ~- a8 I }
4 g& S. }$ Y" o" U. |# H/ x% e$ { m! n& o. f0 u
8 |' c# L. I' ^
/ H; t* u3 _% u, @- B# o* ]" ? } ! X0 V$ x% f6 q. T/ \
( I) k8 y7 n- o' `' `; {1 f1 [1 E h- 3 v6 I% p$ V8 N/ e6 L- _7 ~
! `5 P* y' Y' O! ~# S! c
printf(" 优先数算法输出信息:\n");
5 |8 ~2 I: r( D2 d& K/ Q' Q
3 U# M" o* S L9 s! ~0 [, w' e3 q$ s2 M - # E3 q8 `% u4 W
! ?/ X+ ], K9 ?9 T1 j
printf("************************************************\n"); % ?5 \5 a9 M% v0 ?
) p7 k* r" u1 p/ n# m
/ V- P* s/ ]7 F6 k
" m/ B, L5 e4 ~% i prt(alg); /*输出进程PCB信息*/ 1 l1 w3 I ~% O M- s8 m' ^
5 G5 s4 C9 x* S
2 ]1 s) h4 ^" ^5 J, p3 z1 p3 @1 G! W) J6 n/ D3 D0 V( Y- h
run=ready; /*将就绪队列的第一个进程投入运行*/ - G; k7 ^) O j( Z* A2 o0 G& v
- O* q& G; h) k
+ S3 |8 g/ D3 q& u! C2 C3 M
6 O, i! f0 l; H" l ready=ready->next;
( o5 }0 o9 j9 a* ~
2 H) ]/ \4 T# `( g) [, C- \/ b
; }8 K# P' O; U) w* M/ J8 ?" H! p ]$ S5 ^6 }+ L
run->state='R';
/ U# q0 [; P9 ^. f# h2 T! |0 d. u: a5 H3 X8 s1 i7 I5 H
% M7 E/ @" ?# p/ K2 B/ s7 o: p/ c8 L8 r4 I
} , n5 Y# V& f. b# Q2 j+ E
6 {5 R6 p- N7 Y) Q4 L+ v3 y- " U/ {/ @, E, o( w) c& Q
1 f- Z& U) T1 c. S0 [% W
/*优先数调度算法*/
. } \+ ]7 x$ M6 @5 f0 N8 Y/ t5 p9 }/ [: V& w, ?
8 W8 s9 `% P" N: {6 {9 E1 l
8 I) E) A! W& T7 I/ d+ _priority(char alg)
. k3 [' e; \ y' E$ V; G$ _6 q
9 |- z% o3 `0 q* Q; V( R
$ `+ I+ {, g. z* z8 n8 b4 l, t
8 N' {. a, t" {7 z# s" C E{
0 R& M9 N+ C$ C1 {. q9 q6 ^ q& C L; z* e0 e: }" r8 W1 x
- % Q! \6 b: D) T- |8 k% {8 Z: Z
3 y9 R$ q: o% l( w, a, [
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/ : s9 k4 [! ^4 ?3 M/ C; H# @0 y. v
* B: I3 f* v5 j2 ?% b3 g
: M, k) `, V9 j/ `+ @0 s
2 |/ P) I" i2 ^0 g3 u: U- m, K { 2 h: l7 K8 }6 d/ f% _& \' ^# a* Y: I* ^
, r; S) k( A2 {" f+ x2 v* ]
- : Z( t8 N# E4 m. K; d
) D6 k- a. w1 M* K7 L run->cputime=run->cputime+1; . K2 L! m% G# E! K0 r) k
6 _) w& `6 u& N: F
- 1 W$ o1 j0 @- c% O8 ~
: i4 e; d6 J' w3 m3 X$ [: I
run->needtime=run->needtime-1; ! g ?, Y8 F' m E* O& t
) B% D1 H& h$ R - 4 [) X0 _3 v4 G) z! f- o( N$ V
( ^( u. J4 g* p6 y6 t7 Y+ G run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
# l8 D' ~7 ^" ~4 k- n) u) `- t9 l
' L2 c1 {4 I2 ~2 V. r! ^. G - ! F5 T9 r# s! y3 w. P8 N2 V
& Z9 H+ t+ c0 H0 A9 ]+ ^
PCB *p;
/ q4 s2 Q `' Z2 f6 B9 }. h H, w# A
- 1 a; m f6 F, }& f! K5 j
5 h+ N) T9 u7 j) Q. X) x- ~
p=ready;7 e( t% x4 b! J. A. N" ~
( p' V2 r! m% D2 w# f- e. p: \/ m - ' h" a2 Y! t: G* O' y
8 D5 O- r. E* |! F, w while(p!=NULL)
* `5 g8 F& S* F) Y# r+ W
$ @4 Q0 \2 T) _) R5 {' E - 7 u& Q* E [ K
8 R: r. I9 X, A7 n. h. Q { , z- c1 i' b& n0 L3 D
" k. q1 X- _/ W - 7 f ?% y2 _3 s
* S; s& s3 R8 [% f" r4 m0 G+ p
p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/ 5 N& C8 X4 k h; b8 y" Y9 V
- L( h8 W( E5 D+ {/ ?, g) i! }; J6 B
: I5 `0 Y$ c0 {9 G' P3 w' m
/ Z5 N6 m9 [ q4 E p=p->next;
4 b: w1 W+ ]' `/ a5 f% y/ ^) I- F
6 K2 q. E, ~6 m6 h Z* ~/ C7 Q
/ l" E) J5 x. T
+ Z$ b4 c( J7 X* Y8 [ }
1 d* [9 M2 I7 k
7 V# e- w7 k- r
' P7 S T! z+ y* {. h
2 B9 {% m) Y: M7 G$ P if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
; h, w* p/ v3 L" j, D8 v# A; K. C& c# l9 o3 S" l3 H6 c
: z7 {# J% t# I" e8 ^
! F, z- J1 ~! z2 J' Q- {& R {
0 g. I' o+ R: N1 p* }$ F
* l. @2 f. H% S4 ^! K0 h6 N- 0 ~# V4 H x, w: q
3 P* h* _* v6 j$ ~7 J: h
run->next=finish; 6 a- g7 X1 j5 Q/ e0 B
0 L1 J8 c: @/ J9 d8 H
7 ? U" a( t, b" }/ X% D* L& \; k( F- i3 G! b
finish=run; ( W& u# X' `; Q. `
1 J- G1 d1 a* x7 T3 j* [
- 7 O7 i: `0 ^7 E
5 C* g2 M0 w2 e$ h) ] run->state='F'; /*置状态为完成态*/
; P4 ~) Z5 ^8 D, V9 s, ^/ n8 w" R( M, j
5 \4 T, ]/ M- b0 ~- v3 I% d# }3 o! p+ q1 c; n
run=NULL; /*运行队列头指针为空*/ " i/ Y+ t% W; }0 q( b' D
, c/ v. N9 g V5 @
" f! l3 e' H% c, G" E
* l3 D; o1 X8 L3 w2 M& g$ d/ B if(ready!=NULL) /*如就绪队列不空*/ . A" J0 i3 P @( v
8 t1 o* v! @! X0 g
- % A+ h; R5 L1 V& d* Q- J
. Y) J! D! S4 ~
{ 9 Y4 z# I( @; o/ y& w
?) N- E! D B) \" G
- / r, [# S. J- O, S; x6 ^2 @0 n
. \5 i1 T" C9 r$ r& N/ h4 s' e firstin(); /*将就绪对列的第一个进程投入运行*/ ' d& T, ^* e3 L! }3 h6 M
# J& W& H- r/ ^: ~
- ( K( z" T U3 X1 @, w
9 J5 h* N/ k: ~1 Y ~: p0 ^
} b7 N& c( }+ A3 ]
: }3 k' H; g4 g- U8 H; c
+ r- a8 G3 M) g& ?5 ~& \5 C, v0 }& z2 `& W7 T/ r! d
} 5 U. p1 u! r0 T% e' X# |2 J. G
0 l3 e9 R8 C' H- - [- [5 @5 m$ U- \' @( z
0 @$ x( ]+ U( v* L
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/ ) I5 ]1 U0 Q6 ^# G8 k$ m( J" ]
% S. T9 e _5 W/ G& {4 @; C
0 K# K5 c) |+ ]9 o% n6 f9 v- \( q
4 z- a1 U8 r/ c/ P& r4 ] if((ready!=NULL)&&(run->prio<ready->prio)) 3 p n: s$ n1 ?% y% e0 M
0 i2 Y6 S2 g% D- P/ z8 F
+ {/ n6 m% f5 \; r9 x
8 G% b3 a1 N, v1 T3 F/ d" V {
0 J! g C* u# K$ |% ^# X3 {9 p& R
8 ]3 c4 D# X6 K
2 T- s+ I$ a- ]4 _ \! T( ~! d8 j" l3 f( G
run->state='W';
. V2 f$ \+ C! F; y2 r8 [% Q4 t
: P* w- Z4 O4 w& O- : v2 o' d# j3 ?6 w
5 i ?' E- q0 H/ c1 _/ g9 I insert1(run);
( @; c! p$ p% Q A2 G; Y1 y* n5 C- @ `
- 7 e( N2 { K! }
7 P, s8 B7 x6 q* U! } firstin(); /*将就绪队列的第一个进程投入运行*/ ! \* V5 Z7 D3 ]: D2 W, k! C
1 Z" k l! p9 f! d5 L - - V4 u, x I) Z( n1 l& z9 O
. `; @# W# z" R1 `$ V2 ?3 z }
* Y ^8 P: i3 x5 @
0 q5 Z5 E7 I3 o* l
/ @2 L5 {" J7 C+ A! U8 K$ f6 D
) `* W; p- h: `- \4 | prt(alg); /*输出进程PCB信息*/ , `+ l* m$ ?& w2 B3 R4 J! A
, }4 o" |5 q, |0 v& g, v- # l% h- T+ t; g$ o$ g2 u
: o- ~2 t5 J% l: | }
& F# S! w$ {4 ]) v2 \( D1 Y8 \% Q
- 9 B6 H# e5 C3 Z$ C. t" D
5 j3 g5 ?% r7 W4 d0 i' w7 T$ C} : c9 [4 R; g0 F6 G" a n4 e
4 P( R5 \8 c+ R5 n, I
, Q9 A$ J6 r( Q) T' r1 L; M# }2 u6 }% T+ a/ m. j7 T1 @; |% H
/*主函数*/ $ k g; O3 [ t. }
6 R0 D3 g+ K; L5 g7 t5 V4 V- 8 P. A# _8 V R9 L
- j( V+ d- ~- G0 ^1 K1 i. ?main()
& q4 q# F! L( b: t$ c
$ N7 W* G ?& [ d x, v0 M
1 r; ~# e4 ?% m, _7 R8 D& W! k: _3 M! c
{ 3 n/ e* a- `; D) Z8 i
3 a6 B) ]$ M6 ^
- ; Q7 _/ ^9 \ K
8 v9 w( l( v' Z6 D: r char algo; /*算法标记*/ 2 y! {1 ]' z/ D9 ~: I9 @ }1 r
! k/ F$ ~6 J$ M. J u( U* c( [% s
4 }7 p1 T% n* |5 ]9 Q q7 A
4 r9 n3 P6 N F1 c printf("输入P确定算法:优先数算法\n");
" M" B# s$ j: }& d" `+ h1 Y4 z8 m5 w0 |) _+ a7 Z
- ' [5 G( J, J! J( ?/ K, h
, q3 q- K9 t! ^) W+ U3 L# ` scanf("%c",&algo); /*输入字符确定算法*/ 3 G9 Y) T( d' R; O3 x0 u
" W( K; U) Z; ~* N/ u
- , Z1 k1 a# _: J
1 K7 f* T" j, t3 { printf("输入进程数:\n");
1 Q$ D- U3 c, _3 s( F
1 `1 N/ {: ]# n2 t0 O - " [: k& t, ~( R: }
9 K0 v z% _) A; N Z q; l! D
scanf("%d",&N); /*输入进程数*/ - t8 S1 P1 O, l
o5 N* }# L$ H8 w4 h: f j: J: g
- \+ e* k) @ }8 \; f; o! j
$ t* l8 I9 n; Z if(algo=='P'||algo=='p')
; y8 A& _% T5 [ T! @; X- B) E4 T& ]5 a: e2 z% U5 C9 k. v5 @
5 `+ E1 z/ j- t/ B( P. R8 x2 Y9 h- k; U0 r: o
{
- `8 a% ] V8 [
2 R& @! u X) E' u2 ?
! D; I4 n3 r2 i# a+ Y% J; T% |1 Z" U' W6 c4 `
create(algo); /*优先数法*/
, K' u: W- P7 N0 U
" e; f% ^7 ?+ f1 F+ V5 H4 z
! t7 Y' _# e/ L+ t% B9 ~1 K7 Z& t R" O+ F8 [ b3 ]% w
priority(algo); 7 ?' X) e* q3 v6 ]/ n) [; O4 x
% \* y6 T4 t+ m
/ P; R9 {1 [- E. Q. T8 D: T2 c! E4 l( H, F% C" s ^$ ~9 Q4 w
}
4 E# Y! b$ `3 s: d8 V+ e0 [ L4 v
0 a! B4 T5 T+ C) \- $ R' @4 H. [7 C) u; D' c
" D0 b' C1 H1 c+ j+ A+ K7 {6 f
}# B% n8 E9 K u& q# l4 R$ @
( |8 r1 J' x$ H& g2 w( G' E9 Q
; J5 z. }! Y: @' S# f
- |2 U# Q+ S0 f3 q6 S
输出结果:
" e% r# ?& l" N7 E5 `![]() ) E# {0 e5 w0 }& X6 ^4 x* Y* T9 {
原文:https://blog.csdn.net/weixin_40962955/article/details/80072769
3 Z2 P! k! E4 } u! m7 C0 N$ f* Y2 A* C- C# g' _# U( N
|