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