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