数学建模社区-数学中国
标题: 优先级调度算法 [打印本页]
作者: 杨利霞 时间: 2021-4-9 15:39
标题: 优先级调度算法
9 p- z4 ~2 S4 d) O4 H& v
优先级调度算法$ l- ~) T* ?; t7 C6 U9 g6 _/ ?
算法介绍3 M2 {7 D) `% C* N
优先调度算法的类型(用于作业调度)
# K& s3 u. p( v+ Z* ^) Z1)非抢占式优先权调度算法
( D& F. m# k: J系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 % { h% T+ ]% k- Z. k1 Q
2)抢占式优先权调度算法
' k( E1 \& |% h) y+ l只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。
优先权类型4 r4 ~# V3 |4 B) N8 P- L9 M2 i
1)静态优先权 ' @+ A& p4 C6 B8 I! y3 J3 h$ S
静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。8 Y& d0 a8 {! ?1 A: Y2 X

2)动态优先权 ' o* `4 `0 d* I

算法实现抢占式动态优先权:

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