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