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