数学建模社区-数学中国
标题: 优先级调度算法 [打印本页]
作者: 杨利霞 时间: 2021-4-9 15:39
标题: 优先级调度算法
- h* Q! Y# ^& B1 o6 F9 U3 p优先级调度算法- r' I5 s2 k/ Y$ T: Q
算法介绍
" F2 O( v2 _1 i* c4 S优先调度算法的类型(用于作业调度)
7 A% }8 W( k5 I7 f1)非抢占式优先权调度算法
. |/ J% z T* d) |- G/ G2 {4 P系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 d- G0 X$ e- {) k( m& `
2)抢占式优先权调度算法
* S: N; u' M0 V$ c. @. x. U6 `只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。
优先权类型2 f g! M- D8 r4 }* `% j0 ]6 |; M
1)静态优先权
# m7 ]2 ?) t5 W' f% q静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
/ I# Q6 F2 W8 T
2)动态优先权 + P7 b. c: ?4 N7 d! Y+ _* \

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

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

! b% U. F4 ]3 G/ y原文:https://blog.csdn.net/weixin_40962955/article/details/80072769
) U+ \& L9 U# M# O/ J8 Z: D( Y z8 _; P+ l2 D/ f% {
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |