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