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