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