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