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