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