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