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