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