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