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