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