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