数学建模社区-数学中国
标题: 优先级调度算法 [打印本页]
作者: 杨利霞 时间: 2021-4-9 15:39
标题: 优先级调度算法
. ]! e* t# c: C) W9 `优先级调度算法- c& {( Q, I5 ^- k K' Y9 s/ H- [/ f
算法介绍
P( l; a& a' l% _优先调度算法的类型(用于作业调度)4 L3 e: M% w, Q' ~8 `: y7 \
1)非抢占式优先权调度算法 ( \. t' G1 U1 h) t. u& y
系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
6 G1 \3 j8 z* R0 x" L$ g2)抢占式优先权调度算法 5 W1 Z! s( S; V; H
只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。
优先权类型( S' ^& _ \2 F: l( C6 B1 E5 K
1)静态优先权 ! m c- d! J f& ?9 K
静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
+ _9 \% A* C& U+ o, t$ \% V% B
2)动态优先权
- E! v& b. K4 t/ f1 A' ]
算法实现抢占式动态优先权:

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

, T8 \3 k% A$ m- Y; X9 [2 _
原文:https://blog.csdn.net/weixin_40962955/article/details/80072769
4 j) R2 n0 Z9 V) L6 K& q
& U/ b5 a9 m$ }" a d
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |