数学建模社区-数学中国
标题: 优先级调度算法 [打印本页]
作者: 杨利霞 时间: 2021-4-9 15:39
标题: 优先级调度算法
+ a6 x% S% U2 A, q" ?3 i
优先级调度算法$ _) R( g1 ~2 j
算法介绍
* d5 J! k; Y+ j& l' v* h. k4 {优先调度算法的类型(用于作业调度)" B' N# Z% p! g; v. n
1)非抢占式优先权调度算法 4 I5 F# x& a1 y0 S8 v' o1 {- {
系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
2 V4 E( q! _$ H3 s2)抢占式优先权调度算法 / q+ w6 k* P( I2 M3 }: C5 I
只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。
优先权类型
! r7 o6 H9 n$ D K y# v/ X1)静态优先权
0 m( u" U' J( y静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
# n$ ~% [9 o( ? H8 W, J
2)动态优先权 0 k1 B3 G: M5 _! I% T& l* u s3 u

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

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

! J! A% }4 k" k+ D" m V- c! _, t
原文:https://blog.csdn.net/weixin_40962955/article/details/80072769
8 D* \2 w6 i* Q, T! a! i. ~( g; v/ f/ L$ T1 A/ [
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |