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