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