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