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