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