数学建模社区-数学中国
标题: 优先级调度算法 [打印本页]
作者: 杨利霞 时间: 2021-4-9 15:39
标题: 优先级调度算法
~3 Z: _. O7 K: d8 x; N X9 B) U0 e优先级调度算法
5 R/ M1 U& s6 J算法介绍
# v' y" q% h6 D8 R2 G, [优先调度算法的类型(用于作业调度)4 s, D8 h7 R! l
1)非抢占式优先权调度算法 2 C2 D( V% k2 a7 [
系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
. N( v$ L: I0 U1 ]2)抢占式优先权调度算法
, J. a, S3 r5 K9 ~/ P) B& h7 Y3 v只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。
优先权类型
3 n) Z* x! M: ^5 K0 z$ |1)静态优先权 2 ?& U1 J$ Y" q& R: }7 a
静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
( V+ X8 c4 u# C: d
2)动态优先权 : x/ Y. w3 |" h% L

算法实现抢占式动态优先权:

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

+ O! i6 z/ ?: B' Y# ^
原文:https://blog.csdn.net/weixin_40962955/article/details/80072769
* T7 m4 w! b5 s. K+ X6 E8 K: N1 S6 N/ g" w
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |