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