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