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