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