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