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