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