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