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