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