QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3202|回复: 0
打印 上一主题 下一主题

优先级调度算法

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 15:39 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    " l% ~4 L# i2 l! w# L! A优先级调度算法
    5 M9 h" U* |# @6 s. b

    算法介绍
    - S) X6 w  H0 T# T- m* b) i% S2 {优先调度算法的类型(用于作业调度)0 T2 V7 ~2 X9 y) l
    1)非抢占式优先权调度算法
    * c' r5 I2 H7 ]5 W. R0 n4 r4 r系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    7 g$ R: W$ l* _6 {( r/ j- d$ I- C2)抢占式优先权调度算法
    . R+ l; H& T9 u7 L# [1 G只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型7 k9 [, t9 O( `5 E8 l
    1)静态优先权
    % b0 V1 L' m6 ]+ F) l2 `/ M  i静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。$ O" F9 q% T  B) Q

    2)动态优先权 , G; u  L/ i. O7 d

    算法实现

    抢占式动态优先权:

    - @$ [! R, Y6 X, w* C9 K; x
    PS:本人认为非抢占式静态优先权没有实际价值。


    • 4 U- u' F% h$ z, X: g) R5 Z
      " M+ Z3 X! b5 X: ]& ~/ J1 S
      #include <stdio.h>
      % l' b3 @) r8 t; Y
      6 g, c( r- X- D% F: J( a
    • , f6 Q0 {6 r/ L8 p2 t, w# {

      0 b9 W8 g: v8 E- W3 h" U#include <stdlib.h>  
      8 G7 l& w  N2 N, t; G  H
      8 n2 r, ~8 r4 Z+ m: y4 x& r

    • ! E% K# w- y* C# ]- ], z6 t9 d

      / ^' F# v# ^! w, g9 K#include <string.h>  
      ; o2 o- a% O- O9 J7 O9 o" R
      / O& ]# z1 w$ S+ p8 e
    • . l8 E/ `3 d. P' E
      ( d4 q. X) d  p- [- L3 P
      typedef struct node  
      4 Z) O: T7 E% O2 H1 J5 w

      # b4 e7 e6 \8 m& ?

    • 7 E5 I- ?; t0 n
      5 {& [  v! a% W4 b6 A1 D3 c
      {  
      % Z! o9 k4 K( Q- Z8 G& x7 n  s  T

      5 v0 p+ R) g( f! ^; N0 ?
    • 5 ?3 p2 t3 X! T7 d% S/ P" q
      2 ]* ^+ M  D" b5 q  a% U1 @
         char name[10];  /*进程标识符*/  $ J8 {# U# |* f6 o% V

      ! ?# f7 P/ X, Y( J+ U
    • 2 N* D* g! f! n" G

      ! H: b3 U: x/ N. H2 G" Z   int prio;   /*进程优先数*/  7 K. P9 c# L0 w1 \6 t5 u% M
      # ]- @0 `  u8 ?+ h
    • ' Q! Z' r) V7 e) b9 J- r, U* ^. u7 g2 `

      ! B" H$ t+ P6 F/ c) b   int round;  /*进程时间轮转时间片*/  
      ! M  [+ a4 |5 Y. w) B
      / s& k& b5 {  _( t
    • " q3 m- }. i+ y) v$ i
      5 m# h* G2 ]/ I2 h
         int cputime; /*进程占用CPU时间*/  
      2 u, i/ M/ [) g+ q6 n/ i  Q/ a3 m- R

      2 N5 g& X" ?# f7 i; l& j+ a% U

    • ! \& \% z( h) D
      1 l) }: L) d  ?
         int needtime; /*进程到完成还要的时间*/  , B7 F1 @. @5 q" ^3 D4 S0 r

      5 Y! H, `6 f; |
    • 5 c7 B7 a3 d; p% V4 P+ Y1 Z

      8 S3 f2 ^7 f& O0 w2 j! I   int count;  /*计数器*/  * a3 \9 L1 T8 h# V, ^

      . ?3 x; ^. a" o. e3 h

    • & d. F& S. z( R' x* }
      " N+ I$ o% C9 V7 B  a
         char state; /*进程的状态*/  , m& b! v& Y6 l* F. b, c
      % Z9 j: ~, N1 K. ?% O8 p  K7 }
    • ' h  T$ [& W$ K9 A, e  A
      ; q9 j+ x; m+ r2 f: P8 s5 l
         struct node *next; /*链指针*/  ! A( H5 y: o5 \- H% }  I  E, y1 R1 ]

      + v' S8 }. ]/ J4 d5 x# B$ l

    • 7 [6 Q2 ?: V  T
      $ k( b' U- @" F9 c" W8 Y
      }PCB;  0 ]) K( z# [- A3 q5 {2 I9 A! j
      + b1 u  B; W* q* [

    • ! l! Z7 J8 M" w; ]( j* t5 D7 T

      $ @$ s5 u0 t# I3 x7 YPCB *finish,*ready,*tail,*run; /*队列指针*/  
      % x! @! K- f6 V! Z  w/ O
      , W5 E5 V4 k. _$ O9 h* [& P/ {
    • & O, ^; F7 ^' G8 x# u) ]

      % c+ a# c) O* _  m0 C2 S5 Uint N; /*进程数*/  
      $ j- ~# {. }/ ^/ w3 ?+ j, X, c

      ' A9 n6 r  Q) R
    • 7 i& }: o8 E8 ?
      - ^' X1 q* c% z5 b
      /*将就绪队列中的第一个进程投入运行*/  " `' S; B! c6 r" @2 u2 R% `

      8 @$ Q  Z$ G% X2 V, K. h
    • ; f8 `$ O+ B) U3 Z: }# Q
      0 b, F5 z, c) Y$ D8 K
      firstin()  
      8 }$ ]! n% W8 _, _* G8 y5 C

      , \! U; i  e+ p+ [# ]# n2 k

    • ; r7 E! O0 R) u
      " f6 m9 F- x0 {
      {  
      # R* O5 y* M2 s5 c% _/ [- ]
        X! B* V; A) I) {" A& O

    • 8 P& v' Q$ M7 @$ @
      * r3 ^' N3 h0 u5 r) `1 ^$ T
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  . c# e% d$ D8 h4 i$ ?& P
      ( \( ^* f' S  Z7 b. s
    • 1 S" J% m1 [/ ?) _5 X7 W

      ! o/ h3 X! V# ~# A9 y$ ]8 a$ x   run->state='R';   /*进程状态变为运行态*/    X- y1 s% k3 t4 i; U' ]

      * z: A2 `/ C' F' O& |7 P

    • 6 E) S, M; l0 p' N/ x- v# \6 z

      1 v* I" t: J) r! }' b8 j, A" j1 w   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  2 R) Y% _/ h/ E/ }2 o6 y
      * |' M/ P7 N' y6 r+ O7 O

    • / R, T' m, a- e& S6 A. U) r7 a
      ( v$ Y3 t* g( r' f0 w
      }  , y% J! y' Y3 ?5 Y
      ( A8 d: H) J5 C% B
    • 4 N0 w. @$ v6 C  N3 @

      ) P& G* j/ U! f/*标题输出函数*/  
      + p" s" Q, b6 y% [: o: Q4 O

      % ~% w& d2 e4 _% m$ `
    • 8 z8 z3 k: V/ _" V5 H
      6 s) L/ m! N! u* u6 X
      void prt1(char a)  4 ^, m2 D5 c/ ]! S
      . D' r, T/ C+ S% T6 _9 |

    • 3 C& a% x/ Y1 N2 G! I: B' R+ X# b' J

      9 e7 h( v* T: u7 U+ R{  
      7 V7 v+ ?, ?& r. e3 \8 D! e1 U
      4 z+ b9 Q* v2 X0 f* W

    • ) s! h$ O5 {- K! G& [9 f! T& A
      2 G6 N- I; _$ n! S
         if(toupper(a)=='P') /*优先数法*/  ' N; w+ w5 Z4 O- {- G7 ^1 z1 I
      6 d, k: }2 g" h2 t" }1 b

    • . F- Q9 @: @$ {, a0 G1 g

      & Q4 R* y0 b7 X; x$ [      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  & d! I% D2 _" M
      ; |! N" n3 K% q: Z: v' o  F2 n
    • 6 O) l& f6 H- I+ m# L+ Y% [" s

      0 _7 V: T) T! H$ x! a   else  7 m2 B* H" K0 }/ M8 Q6 e
      ) I8 k+ ^1 h) C1 b# k' {" T0 N& S4 p2 F

    • , W: T& E8 ]( [6 ^: e/ [6 b/ y& |
      ' E8 q. I! R& s
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      : f$ k  y# \) X& ]
      * _) D8 A( P/ G  I& k
    • ; U0 v+ _$ Y3 d0 ^, D1 o

      , [/ H/ B0 m# u/ d! {- V" C}  & a* Z7 @8 B& S2 t. v. Y- H
      ( V9 s9 \' X: k5 `* k4 V

    • / D: ]  m( t! `2 ^
      , r+ x8 `5 ~1 i3 `# ?* i0 N2 Y
      /*进程PCB输出*/  
      + i' }, e5 q3 R1 D

      " v! D, ], u& r6 h2 \' S2 }
    • : b) ]- f. E* L
      ! e* `7 T- [2 C' M5 ~# S, O
      void prt2(char a,PCB *q)  & p. J/ {! g, A; ]/ A

      : b0 x6 T0 B" C, q

    • 1 G9 y9 A+ x) Q, B4 y1 H) f

      $ q4 ]1 Y" P- }7 P{  
      , l" s! }2 Q, @) _# Y6 T; Y

      2 w9 }5 f$ G( I8 I- |- S' l
    • ( N6 U# |7 I/ y7 ]- O, t9 S1 ~& b

      # i$ o6 N* v8 Q! V. |% l   if(toupper(a)=='P')  /*优先数法的输出*/  
      + U; h# F% G: o8 n
      . G* g2 X( O2 g. s6 C; q
    • 1 Z1 e1 ^' }9 c: Z

      5 R: E" b6 I! ~8 g      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      4 y. }! b" B8 x/ ^( Q: r* Q

      : U- P# Z+ o+ _
    •   `* C9 z/ w, n# q* a0 F* @

      - B2 H! W. y5 j8 k- B+ e       q->cputime,q->needtime,q->prio,q->state);  
      9 T; ^  \  |7 t; q: B

      . y$ ?& W4 ]$ v* S5 ?! Q4 K
    •   U: b- \$ n# L( `; o
      * G+ _) A7 g$ i0 ~. j
         else/*轮转法的输出*/  
      / @7 w* g( {4 _8 @8 ~) F3 Z

      0 V1 p+ W6 G( Z3 |8 h, p# v* Y

    • 2 Z2 T5 B4 J3 n" h# A+ H% v

      # h& D  L: Z0 R& \: y) M      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      4 E# T  u' y/ z& R; J! E
      . d. O6 l- M; v9 x  A9 Z
    • 1 J4 Q$ n* x4 v; ^% ]! R7 Y" F
      1 ]! N$ m* G7 ]
             q->cputime,q->needtime,q->count,q->round,q->state);  
      9 k! B7 s% u4 S/ C
      5 d, p3 M# w9 k( g& V9 \

    • ; z9 F3 o7 L1 c1 Q- C

      ) @/ a: X  E. c+ S0 r* Z3 }( Y}  ' [+ Q9 `0 d1 ~& L0 ~/ o" d' W

      - ~9 u& L) j' S3 Y1 B

    • ( I- `- T7 s2 E* F& ]" |
      1 y1 K5 n( I; X3 p2 x
      /*输出函数*/  
      . G% x' H  f+ _7 c( c
      $ n$ l! j) g! H) X

    • . {0 K! y1 C. u; v7 A' M

        E1 C+ d! w- w- T5 q! Uvoid prt(char algo)  + R) H1 `* q3 _: U7 ~$ n+ y# x
      ( x0 l+ K$ L/ d
    • $ C5 Z) B5 b$ I$ P8 L  I& @) Q

      ! d2 e+ H7 q) `% c6 a( J/ V4 Z$ h) H, k{  
      - S) Q) @  `! @1 I& p

      2 a) x# a) a2 H' v& \9 C

    • 2 l, L9 m0 X% p0 w5 s2 d0 |' g

      ' l5 Y0 @7 M, S2 M; l1 d, S0 @   PCB *p;  8 x7 ^# H) ]0 t9 B6 i

      8 I* M9 o7 _: {. m( n
    • + V& ^+ l: i: @8 ]; `6 G
      5 d  }, n$ h5 G$ W& ]+ |7 P. W
         prt1(algo);  /*输出标题*/  
      4 ?  a+ S# k( Q8 l& M
      , Q( s7 E+ X) E* [5 W8 K

    • / T0 a* \5 r, d1 ^# K: ]+ b; g, W2 e3 U

      0 N5 Z9 H, ]9 d) i! X   if(run!=NULL) /*如果运行指针不空*/  , ~' o* B* v' z' M5 ^

      3 H/ B$ I* B+ z( C5 y
    • 0 [% G7 }) P2 l

      4 K/ \; E3 Z/ [, J+ W0 i      prt2(algo,run); /*输出当前正在运行的PCB*/  * W; ~3 _) }  H& D# H9 n5 m

      + r8 g6 f$ o% A8 n* S
    • 4 f1 J" v% X7 G! d% C/ B4 y: k
        s7 c' D1 y- ^( @8 P# W: t
         p=ready;  /*输出就绪队列PCB*/  
      , x) f! j7 \! r
      & A  |4 t9 K8 y& x! _* V

    • 9 U6 R! I% e+ v1 M# \& W  J6 Q
      - B8 B2 i: J2 K* N5 ~9 K
         while(p!=NULL)  
      9 s) ?$ b7 w# B% C: W+ v! D
      0 k/ ~& b- F6 `9 e$ N
    • 3 u  ]- X1 T. Y+ ~5 j) |- ?
      % J. @+ h! h' o6 @% h' |
         {  
      . `3 x7 c8 ^2 r5 g, U7 s
      4 }; [1 T1 O+ F0 G8 r
    • + f/ d- \6 ^, |% Z& i
      + K2 h! L. H. T0 W0 \4 A
            prt2(algo,p);    H1 Y; C+ }; [, S6 n0 G
      8 M1 T* W2 x8 Y
    • 8 o1 C2 G6 @, Z/ p4 G# n  W
      5 N) v, y5 M) u9 L
            p=p->next;  , ~. P* ^0 y/ F, B4 ~& N7 K( A, F. _

      * X7 ?% u# d6 |8 F. ^
    • 0 @2 c2 M  g1 k  E! _
      9 g" d/ _" I3 f3 R0 W; E
         }  
      : F3 L) ]  ]7 o. o( W

      # \2 d. {/ _' W7 z! R/ K6 d

    • 0 O7 }  y; o, G5 r; F3 @

      ' ?" a2 T, s3 v3 K( j% p   p=finish;  /*输出完成队列的PCB*/  
      : k* ~: i2 x: x  r. {5 l% g* O
      5 V' p3 ]8 E3 \) J! p8 x1 T/ ?# A+ Q
    • 4 f/ C9 o* B" z7 C4 k
      $ L! u  ]7 k) [5 G0 {
         while(p!=NULL)  
      : m9 E7 f7 M  Q6 W% ?3 Y7 |) ?

      9 |- X$ I, l  S# L5 w3 q
    • / L. l* [" H' Y. p) E. M" n

      + e8 {3 o( p! A  ]   {  
      4 S4 R7 X4 r7 a0 K% A

      - Z8 J  ~- z$ W4 n3 v, V" ~

    • - y5 T4 Y8 O4 r2 Z( _
      8 d: S) X; z$ `4 C
            prt2(algo,p);  % z; }6 D2 L3 t/ o$ S, }( w. H8 d
      5 W  h" a( Q# R) q9 l
    • ; {* F/ _! X2 T1 t% K
      + y( Q% r, g9 Q8 c
            p=p->next;  - R' p- B! h& F/ g
      # d6 T% ^; y' ?9 N9 V

    • 1 U5 ^& U/ I+ C' C' i$ K/ Y; l

      0 K+ K, E, n% \9 [( P$ O  b4 f   }  
      2 d( `5 [1 H5 X  n& v1 V3 Z

      % u) Z% ^/ u$ V! x

    • 2 x$ H  n7 J9 G

      : h$ u0 z/ w/ ]6 ~/ k   getchar();  /*压任意键继续*/  & C" G, f0 b, p# x
      4 ~% N  t: P1 X4 k  q. O" w* R
    • : B# m5 K  e- S7 Z+ k

      ( S. e1 l% P9 @}  
      3 F, f1 l* q8 t. k2 {3 E4 L

      7 m3 _, Y% _) U3 S0 L( }% |
    • 2 G& L4 W  |& Z9 I
      + v. }+ @" e2 H" W
      /*优先数的插入算法*/  , i" L: {( [/ }
      % ~2 Y3 D* ?/ f) r: M) Q
    • 7 n/ x  f  V% ^# m0 v$ e- F

      0 E+ W! z/ n" G9 |insert1(PCB *q)  4 E8 u8 j. s1 m

      ( }4 c  G( z1 V- @$ L6 H+ h

    • % E* b0 E& @; J/ I3 z; {1 u

      + z' T, Q5 z. \- b$ X{  ' ?% ?. b) o, O" ]: B0 x

      " L/ ^; T  d$ E; @! o8 _. j

    • ( i* X4 v0 a- n" U3 o: l
      3 b: J/ H: G# m2 j
         PCB *p1,*s,*r;  3 [6 O! n2 G* u7 R# m3 H
      3 X8 _, B7 P  P: h/ F( U. o

    • 4 B: t, |; }) O6 w- R
      $ F: X1 r: v3 Z, @9 p- d3 ]
         int b;  
      ' Z" N8 W; l+ F0 r
      ! J2 u0 r0 |. ]$ F

    • . B, @& [0 p% k# k2 d  m4 \! y4 ^

      ; r* r2 l( i2 T: A% J% T' F- O   s=q;  /*待插入的PCB指针*/  
      6 W' U% J+ i( J8 _, d% x( x
      4 v6 w# U6 U$ v, S
    • + j3 Z5 c3 w. P; G- ?1 t

      " x- u9 Y# e2 ]- p0 h$ A; I. r5 M   p1=ready; /*就绪队列头指针*/  
      & T0 ]6 D) i7 a) Y) ~3 D( Q

      % u$ K& O0 e' E$ R3 M
    • $ Z, Z/ M( p, ^' v3 s

      - A& I. G1 O7 e0 H   r=p1; /*r做p1的前驱指针*/  6 n( N2 s" |- W" F, k

      ; R! E6 M( O1 G5 e! L
    • 9 d$ V0 t4 {' ], L/ j; z2 ^

      ! e0 E1 w: D: `3 b) e   b=1;  6 f0 |7 }5 z# l
      1 x, c& a! `' i0 m1 {- {
    • 8 B' K" D! c) j
      " Y8 ]" F- Z& |" u
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  ( C/ [% b" f1 C/ p3 y9 K
      0 _6 z2 [( _- E# K

    • / Y' f# u$ K$ X* o! Q5 t
      , k  J) t3 ]8 x
            if(p1->prio>=s->prio)  
      ' Y1 y* i8 x: \

      ' K0 y: q" U* z0 r3 v
    • , s% f, y0 _0 F$ d# E

      ( z, r' J& l4 [6 T( r& m% F      {  
      # k& q$ g# w2 n. ?, ?; x
      $ f/ |# M+ I# t! O8 A. l$ P

    • ! f. M1 P' e5 q$ Q

      # @  T7 h$ F. i$ W, q     r=p1;  
      ; k1 C  L* ~* q/ J1 @. F# F
      , I$ c# G0 T, I8 c' d) C& q

    • * @/ }! d2 I3 _2 H
      + a1 p' r. }5 b  O- `8 A
           p1=p1->next;  ' M7 E$ l; z+ @0 A) }* e
      0 c1 L8 C! X' t* _( ?

    • * D. B& [" D; {5 U  W
      3 b" L; ^9 M5 N
            }  
      $ B! Z1 i' h- s: u! l

      - X: ]3 e# i, v, e6 B$ R
    • 3 J( K( n1 S1 L3 h3 Z$ n
      2 a7 g  }9 ?6 C4 l" r. R% m4 _; V
            else  
      2 J2 H7 K* Q4 P6 [2 w
      - @8 @9 b6 f3 c2 p" Q/ q

    • , f& k% Z# {4 t, R. y

      1 b2 x2 c  B) J: c, B! }     b=0;  
      ' b: E5 l( s+ _5 O2 s

      7 s' M  d! z+ v) m& S

    • / D7 J# G1 R' A
      0 H! P6 l, `1 S$ b
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  1 T6 j. p9 n3 W6 D$ x
      9 d7 z# j+ P" M. G  F* F6 c% K! A

    • " O2 F* ^- U9 F" H
      . U! J" A0 P( T  V) k# u9 ], D
         {  
      # z- |( Z& r; s: Y

      ; Y, m3 |" ?0 i; Q# i  X

    • # m* P6 V3 {8 e: x

      $ Y! `! r: B# B7 s      r->next=s;  4 \) F4 C7 R! Q. ^9 u

      8 O* I* T4 w# ]" t2 B

    • ' M3 {2 |* O* C  y7 S' z  s4 D
      " V; j  e/ p# K1 P8 u/ h
            s->next=p1;  
      8 u, V: p7 ]6 z1 V

      * |3 ]6 i" w+ u
    • ' N% o" K( i0 d+ {  u

      5 U3 J) x6 H. W# e5 `# f, V   }  
      8 N5 e5 M  c: \% Y
      . V* W2 g, {. k/ Y. W+ _- B: S

    • $ s. x- V. o% b7 V
      & h$ X6 p& i7 l2 F
         else  $ D# V7 f& i! t; U5 w" t" e

      " X/ [2 f6 s6 n# C( M! O
    • ) N! g" U( s; Q5 E4 v0 z1 Y

      8 J8 _3 ?. c: r0 X   {  
      3 g( A# T' X6 W8 j* d5 v" G
      * K- n5 d% }. U2 f" {2 K* t. ~2 c; i
    • ) s1 p+ @7 F0 y1 f2 D3 L* M6 q# h, Q

      6 k0 R; e& b6 s3 c5 C+ n2 Y/ H      s->next=p1;  /*否则插入在就绪队列的头*/  8 E2 b2 |0 [$ U
      7 P* E0 p/ @' H8 f

    • 7 U" F. n  z7 y( {8 h+ F) f0 ^  _

      . `' O" H& C0 A* K7 s" s      ready=s;  
      1 J3 @0 q0 K9 x3 F

      ( \, W  q$ Y) _4 v
    • ( F. ~0 c* _$ g
      4 i+ w' a, f, r& s/ d( O( B
         }  3 S* D7 K& A9 h" D- z  h5 w
      5 E  B/ b1 C( v- _4 K9 V/ T- ?

    • 3 |( _  Y6 E* C8 ]) f  i
      * }; k0 i* G4 m0 F% `" e9 b( P
      }  ; C5 H8 P  }* K7 @0 q  b, F

      1 p0 ?$ I  {" r0 F8 n8 e( B. J
    •   x) {6 y2 ]1 L: ^
      : l; ^0 `7 f" r, M  }
      /*优先数创建初始PCB信息*/  , ^% q7 B- l* T- a

      . V2 ~/ X" Q9 s/ U/ T, q" K8 D, q
    • / \# q' X2 {6 a8 A( ]0 H
      1 l1 G/ W8 z( X* r6 w# h
      void create(char alg)  ' ], B- I0 G0 z* a6 E3 c

      6 J/ Q, n9 f% y* o$ C6 K
    • . |5 \1 w# T$ O2 z# w9 L7 U8 y. g

      ( m6 ?5 _5 m/ [0 j  T$ X{  7 Y9 d0 ~1 C4 _1 |6 f
      5 {8 n% U# Q3 X- }+ N4 x

    • # g+ C2 i  N# ^
      & V$ l1 O) l6 _' j/ p) Z% r$ f. g
         PCB *p;  6 l6 h9 z+ Y4 u1 U1 O0 F
        t7 T, |4 L7 O# k

    • # y7 e; S' ]3 U& S2 o
      3 `$ P7 }" Z% V& z
         int i,time;  
      # Z& g* n4 }; p
      6 U4 U/ p- N1 b3 [* @" V# O/ x/ C7 }

    • , }% s! @3 @" i- J8 }+ h
      6 P2 D- G" `! d; T
         char na[10];  
      , q- V# N1 C' E4 V8 K

      7 @) B% G$ j: b* P

    • & i* K; C0 B! w: d6 M
      2 m& g9 e; h2 b+ w) M
         ready=NULL; /*就绪队列头指针*/  
      ! y, q$ A  J% E. [

        Q6 x: w3 H3 c. C5 n

    • ) z! C' Y' Z: t; W- d! _5 I' I

      5 V, U: G( V% ^  `   finish=NULL;  /*完成队列头指针*/  
      ) K$ I6 [. a' D

      ( z1 A* m  @6 `8 T
    • ' Q5 [9 y7 _" [7 I+ D

      5 m! b# P4 b4 o7 O' r$ k  t   run=NULL; /*运行队列指针*/  
      5 O6 J8 t) z. y4 x2 ^4 }
      & C# a8 N; B6 \% }$ t

    • 6 l# I3 u0 x. w& U* o3 L- X
      : H; e) ?3 j, ]* \5 J: [  w. M' `
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      , W- X1 E6 a% l/ B# y& g1 J

      5 g8 ~4 z' o3 S' k+ g8 W4 N. a0 s
    • $ |  X# T! H' q1 [9 m2 _% v$ l

      6 S3 t5 i/ n$ U6 L0 j9 N1 ~+ V$ G   for(i=1;i<=N;i++)  # @9 g" b% E1 H- i. b
      9 k  n  W+ b+ @. @: Y
    • / K$ w- D7 D( C; t' _  f

      : ^/ I- H( I% K7 h   {  ! g4 y% B+ {2 _

      2 E- w: P- V+ G8 x+ P8 i8 s
    • " F' R' }6 L# k  Q- }

      : ^  E: W5 c# t5 E( X      p=(PCB *)malloc(sizeof(PCB));  9 @  `: R% n! V& R

      ; O. v  D# e' U. g! C: z

    • 7 J- v4 Y6 m2 }5 q3 X
      . u: R8 `& I, _; b5 C( g
            scanf("%s",na);  # D' G: \) _& L; m
      ) V+ M( r% q  ]" w' b5 O0 m

    • ' F2 I) Q( z5 ^; `1 f. L6 g
      ; J: I( S  M4 ~+ O0 o
            scanf("%d",&time);  
      ; |# C8 D# d. P8 S2 S. S

      * u2 |# K5 q2 J1 H

    • 1 ^# {! m  k. V% l
      ( E* C* G! K2 w+ h: w0 b* t
            strcpy(p->name,na);  
      + d9 O5 k" E' h5 |( u& w
      1 W: u; m( `9 S; {

    • : J3 a/ r7 a  o1 w' H  T1 K
      3 v- N/ N5 y, l& t
            p->cputime=0;  
      # p9 A: V9 m6 q4 j1 Y
      / h6 n, f$ G6 c
    • - y  U) C4 U6 D" k1 H
      - f# }' }1 n  A* A7 i3 W8 E
            p->needtime=time;  
      , ]8 f* k# m/ F% m
      % M' c6 ^! _' j1 W) ]
    • % Z8 [+ D0 r' b
      3 ]. N; `( W4 @! ^+ q
            p->state='w';  
      7 a& F" W! }; z' y7 [! ^# A; f% J! W

      ' V: E% m. o, {* [6 `, O

    • 8 R  g' A& R8 W# x$ g' t& ~: G
      & F, {" G( v/ _! ?$ g
            p->prio=50-time;  : B. H9 V3 d$ R1 j# m4 }+ k. n

      9 y, t8 R5 z+ r

    • + T" k+ [/ K8 w% t  Y3 Z0 i

      . k5 \' B7 K/ I5 K      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      & z+ w$ \# L6 N' H2 Q0 O  n( D
        \5 k4 y9 N% |
    • * r  M: u2 O) N) |  ~

        k* l- r, c9 d5 H' h: Q$ U     insert1(p);  - A+ g0 L% j, k3 }  E. o- y$ Q+ d- s
      * P+ g5 M% n1 M# Q
    • & Y. l# J/ v( C6 }6 ~% C

      & M+ k. }) ?* p3 d+ `5 G      else  
      ( L1 t" B* k3 m
      : z; _# A( F* ]6 W7 V8 k

    • ( h# C# \( U/ p% d% }

      ' g0 g. W" }( l$ q' X      {  
      5 c' s2 F) X. K2 _

      1 L# j1 C0 n1 t" S: ]- _% b" M; I

    • # Q' i" V' I; w# U, M: m8 y" a, l
      ( `' X# T- T+ R8 H1 F0 W" e
           p->next=ready; /*创建就绪队列的第一个PCB*/  " }' [  Y- N( C
      0 u* X: j: c3 V9 J+ M
    • . _# Z, g; V$ y. @2 U

      5 ?  A0 g7 F7 M8 t7 y4 e+ Y6 E2 R     ready=p;  
      7 |2 b8 \0 d8 ]' I& }
      - C  ^$ b! S" q: u! \% q) o' I

    • , x1 s. s( s% m- I" _

      ! Y. }. Z9 ^4 W6 q4 W5 V! p      }  
      # c$ m* V" L/ U1 c
      2 S. H5 A* u' X3 K

    • ( y0 q8 Y0 q3 z. G& r  A

      $ D$ `) |3 {1 m3 c7 z   }  
      - S3 b" |* ~& K
      8 O$ R; Y6 }* l1 A" e- `& l
    • " z* Y9 q2 o) {, ^4 d
      7 ]9 J+ e3 c' ~  i
         printf("          优先数算法输出信息:\n");  
      " l6 I$ L" F2 v& m/ t, [
      , W# l3 S* U1 a5 ?- i2 ~

    • 9 l2 n% q! {% [: C8 T# a0 t; K
      $ L2 [* _. m$ w
         printf("************************************************\n");  
      ! K) O& b, V1 d/ O' K- d3 C. [

      $ S0 Y/ O0 Z0 D' F4 Y" x$ p
    • 4 O2 L# L7 ?! T
        I& t6 ^* ]; f. U2 v
         prt(alg);  /*输出进程PCB信息*/  + `" W( I. p3 ^& T; n/ q( J- |' Y

      % z+ W. B$ Q+ c7 d( x9 }
    • 8 Q' x4 g" F8 F. s9 h& g
      $ Q3 t3 ?$ u$ j+ h# I
         run=ready; /*将就绪队列的第一个进程投入运行*/  
      - t) |1 k- d% ]! J

      * z" T4 s( P$ i5 l3 E+ L1 r

    • / l- [) L4 w5 f& }9 |4 a* l

      + q( I. g' f; o   ready=ready->next;  . e: ~' L6 _# e& m* r4 V' H
      , n. U  g0 W+ I2 e! M) ~
    • & L& {- W2 l0 o9 r5 H0 a( h+ m8 w4 x

      . `  N. `/ b- b$ Z5 ~$ J6 ?: R: s   run->state='R';  : B4 [& y5 x5 D

      - a9 [: N' ^6 q% G

    • % }7 W9 _) N+ l! K' E+ r1 l4 p
      " @+ Z' o$ ]* E6 L2 p
      }  
        C) ]0 n- J* U

      4 x+ V/ [: |# q4 ~. Q; Q3 K+ d
    • $ q5 v  ~8 g" W# n+ Z
      8 d+ K/ R, ?5 t) K+ @7 |
      /*优先数调度算法*/  
      6 }1 @5 `0 ^& g/ b  _1 S$ S8 a, Y

      9 x; i" S) m, M

    • 3 T4 R& s6 m) Y8 h' |2 Y9 \$ {; N
      : I7 I3 w: }6 x
      priority(char alg)  ) w4 E& {, l$ o' C" ?

      " Q4 r9 @, G8 l! T& L
    • 0 X9 N& E$ k2 s- z$ P/ v
      & v# M1 R, w* ^7 a# S$ J* p
      {  + k: f- j# j/ K" o4 D
      ! U3 R0 J. e4 {; {5 H( e
    • ( R  u4 p6 N7 m- l
      ! I! @1 d' e, u- h6 E% O
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      ! H1 b# t6 I3 `5 M; P  R9 l6 @/ A
      + M) v6 ^4 I) m8 Q/ |2 W
    • ( |" R* l4 [& _" d( l: X; A: G

      * t1 f. F2 ?( r4 c  E   {  
      ' X0 h+ R. t" D

      ( w7 H  h/ w, [
    • ' y% d3 s  K' ~  g
      / Y) a4 @$ c& z/ I
            run->cputime=run->cputime+1;  
      " P9 i6 G, E8 q' [  `
      ! U1 o' S) A! n1 @$ j
    • + y$ q- ]$ \# ~+ o
      + w8 b) l3 p6 R0 U% V$ u  c& o
            run->needtime=run->needtime-1;  
      * ~, w2 O3 n# S5 w: J* r* r! b( b
      7 K, ?- C( I% f/ U9 c& F2 U; M& C: E

    • ! n# T8 |3 N8 B& E

      7 U7 S) d5 f, h; y      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  ' F& ~5 j6 z& C3 n+ k  ?2 p8 H4 C
        k1 K3 x: \' U- M
    • : R/ u+ C! G- ?  a/ S+ H
      ( X8 \% m) M, z+ C% X# @
            PCB *p;1 B5 N) p- g0 j0 i9 H6 B' Q
      - I9 g& ?& @: Y
    • / T4 K& Z* r. _  P1 {/ G

      : ~! }0 {+ I) I4 B+ }, Q9 G9 t( m      p=ready;5 }0 T. A2 ~- s5 B. ~/ `6 a

      $ S! H& N5 {  ?
    • : g, r, s* J1 c/ l

      + I' `: k) Z1 M% t6 k) J; u      while(p!=NULL)  
      ' i7 T$ s- [: R8 N

      . i1 J: r, q- ~  P/ e
    • 5 L/ O9 n$ T" X7 H" f5 x

      , ~; @  h# o- p6 Y- c6 B/ I# o      {  3 {# @  m  _9 Z( W2 u# a

      7 R) p8 U/ M8 z' {

    • $ k; ?9 `. d9 L( V8 T9 m
      0 b$ K! A( Z/ s  ?% t6 g
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      * [  ]( d" p  U" b0 a
      4 {" @) Z. [# h* t" }( Y' g$ h9 p

    • 5 w% S3 g6 z6 ~3 U- O: U

      , N5 E% K" P  Q0 s+ n$ [# J1 |          p=p->next;  4 n0 I5 d+ H5 N$ w5 p& ?

        V0 x4 B% w6 ]& Z5 v& t
    • ) {) Q& }/ L1 H- {, j- \

      & A$ g& Y1 f4 t' Z% v, g; O' d$ n      }  
      + Q& k6 ~0 _4 Q7 X6 s$ v$ A$ c

      # [  @  h8 l; J, l6 V5 Z9 j& y
    • 6 M0 q5 y% v% Z/ L9 l

      8 `' r+ S# W9 s& u      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  $ B6 c! S# D7 P8 U! }4 M
      $ p6 V( j; z1 V0 E8 a, e: @
    • # u( o6 X( N4 X7 Z8 F
      8 h, n8 K8 W$ g& @! q$ t! x
            {  ) K  q- |8 }& k) X
      5 j- Z( T* O# v1 }

    • " ~9 \. @$ [4 ~5 M. U8 w0 r

        E3 f# r7 n% H, p$ N# x         run->next=finish;  # G/ V6 |: g% M
      3 _+ L" N% {6 G9 T! P; e6 l

    • 6 h! d( q/ p% D; S7 X: ?; Y3 _8 R+ \4 |* R

      + N4 H9 j. w9 V* W         finish=run;  
      7 _  B: y& d! W+ P. T7 M6 B
      - g: n+ `8 ~2 c/ n
    • 2 x* g6 O8 I" e4 S+ s7 f" d
      4 b/ g1 w9 z7 B' ]
               run->state='F';  /*置状态为完成态*/  
      ' {( L2 y" r; E

      & m0 ]) c( L  [* u) @/ ^( G
    • 2 ?; b7 |4 ]2 ^  w! A5 p
      ( D" b0 s8 }8 w; V! ?+ o
               run=NULL;  /*运行队列头指针为空*/  
      0 Y% K; n3 G0 i* y1 E

      / `8 `4 ?, [, U  m& y

    • 0 Y! b7 o5 @1 h) |% p5 Q. L

      % M' h0 k  H: y- H6 a         if(ready!=NULL) /*如就绪队列不空*/ . r4 _3 j( W1 k% m) h
      " x% `4 d" j! K

    •   B6 O1 q3 p. g1 J
      ) y# N  i) i: W+ x6 |2 i) K
               {  $ ?: I, Y5 K- ]# G
      : a0 @' f& t. Y: c% e9 w
    • & q( e* D( K( i2 @8 ?8 u7 l
      + u% c4 [- c2 z; h; p1 Y4 y
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      . P  z& v; {7 S: V$ l7 S& D+ N3 f

      9 J6 `& m. l/ l* d& }3 G

    • 9 a8 B. u8 i1 S, h# O

      * b6 a4 [( h1 {) x; Z         }
      . f* h8 j& m3 t( P: E. u# s% q

      4 l9 b3 ?! _$ V2 a& D* O" g( ]
    • / d8 F1 ?2 ?4 S5 i( V

      ! m' ]# V/ Y8 M9 ?5 U      }  
      ) B3 S; d6 M4 U
      . H/ F% V8 x" ?  C& ]9 W
    • 5 t6 |$ ~0 V. v1 V$ T8 U

      4 l$ X1 Z" d3 ?  I      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  2 r. y+ X  n2 z
      ) N, {7 Z& n2 U# A( n

    • + {( a: u  {1 i5 w$ @% [

      ! R0 n, R" Y8 T% I     if((ready!=NULL)&&(run->prio<ready->prio))  4 F0 ?# S$ v0 i7 f7 z

      6 [7 X3 P" M9 I" L& ?9 l

    • 0 }3 T% N7 i& Q$ z) c

      ' O& D; E  r, O+ j: j     {  / e+ }( s( [! W, t  R# G

      ! S' y* f# ^. E1 N& K
    • ; p5 O% K6 \/ \* ?6 u$ G5 b

      3 z; j3 ~8 P! d: ~! g6 \9 E& r3 r        run->state='W';  + U+ \# z$ V3 r  I: D

      7 f. Z- S8 S, W
    • : r9 `5 [! O5 u3 {
      4 Z2 W$ F& b" u0 r
              insert1(run);  
      ; P/ H5 L' `% Q7 {/ r8 V

      2 U* s+ V5 y2 L  i, v
    • : T8 |! `" M& h# ~

      + I  J& Z/ X5 ?4 A0 R+ O+ x        firstin(); /*将就绪队列的第一个进程投入运行*/  5 l9 ?# d: |8 q
      1 b, G6 v: {0 w8 m) r: d

    •   ]9 e& n+ A! l5 S$ |
      : c4 Z7 v9 P! K' X) H% r
           }  ! d7 L! E1 r* n) j% b
      3 }% W" g, x; |5 J, c

    • 7 p- W0 ~5 _* j4 g; i& h2 s

      : S( k6 i. t! r/ }% p      prt(alg); /*输出进程PCB信息*/  $ W6 T  O# }3 N

      8 q/ Q! l  ^) [) B5 T* \' i

    • 6 }! w0 L( [7 j8 D

      ; [2 d5 a- E/ m0 U$ q: R   }  
      0 n8 @" X/ Z" \2 j+ g; r7 U( \0 c
      # D( Y5 E% p/ a* N; l9 q

    • : h% q( Q; w( Y6 j

      " f+ p' y/ d' R) ?; c1 d: b' m0 F}  
        J( t# p0 P3 X

      ! _; R; c3 q3 m/ g
    • . m% ?0 S; B6 ~3 [8 _. F2 D
      # \+ Q& u* G1 h% U7 y& \
      /*主函数*/  
      / P- H! q) }1 `$ N3 v7 }* ]

      + m% @* l7 |. [4 s8 q) a
    • & q, o, @, b; h1 p. O

      % Y- x7 E; r$ y4 C8 amain()  " x9 T! H. j  H$ F. M# [- y! X
      6 B9 o$ m7 N5 o: A% v5 c
    • 7 h* a$ V6 X8 n' e; ~$ R: s
      / Q4 I4 i9 Q! I: m
      {  ' G$ o; M% F8 B2 b) Y  |
      * w7 J7 c# B/ `. h. Y" S

    • " r7 ^+ h- }7 o& G0 V9 [* g" ~
      $ N7 i% v9 Q6 u7 w( [
         char algo;  /*算法标记*/  
      $ e3 B7 z7 i6 Y+ l5 {6 t# o' M. i/ ^
      * t1 D) ~- E. B3 S

    • : ^' I$ K; e4 E5 _2 {- H4 i
      & i+ m* _: Q3 H$ U$ O  T' r
         printf("输入P确定算法:优先数算法\n");  6 Z, }# b; T( G2 K, l& ]

      5 c$ @& E4 M: m( U# p6 {( Z

    • ; s, \! n- t. z8 J+ f

      0 `( i5 ?/ r2 _   scanf("%c",&algo); /*输入字符确定算法*/  
      9 ?0 k; U0 i. ]

      % [; [+ f8 e5 i3 n4 y5 Y; |
    • & P- c/ r% L( N) T3 W+ N7 z

      ; M; |8 o+ K1 N   printf("输入进程数:\n");  ) Y; o/ c; Y) P8 Z; ~3 x6 M( o

      2 K' ~3 m, E) c2 K( y

    • 2 j; H5 y  f2 c) W

      4 J, Q. `3 H6 _6 E3 M   scanf("%d",&N); /*输入进程数*/  
      3 t8 a% W- V+ p: R( |

      9 E  l1 S/ y1 m+ L6 `! e) d
    • , j, ?3 o4 f. W* A
      7 V7 \2 T# G6 l* T: Z
         if(algo=='P'||algo=='p')  ! p- K: ?& i5 Q9 s

      1 u# G; L& _) x) q9 u
    • 5 y  |  W8 H/ r
        Q) l' r( Q4 D. t
         {  8 c, J7 V9 c3 k! P/ V, A. s7 t- J
      " `+ c& B9 O5 s0 w/ f* q
    • 7 D7 o; ^* C/ T, ^
      1 y# Y* b& y7 \5 S/ W
            create(algo); /*优先数法*/  ! K7 N! z, e+ |* l5 Z  r9 _8 P
      & j; U) ~) d1 k

    • ) h- K, L4 e7 z8 e. B5 S
      ; _4 Y" ], e& }" n
            priority(algo);  - {( U: i& k, `' X) Z
      ' G# ~/ ~& G, [1 S& x, {5 H4 K
    • . p5 ^2 `0 H$ W, R6 y

      ; l, A8 H- ~. K( V+ P7 P( f4 u; a   } ' r2 @9 c$ e2 g& }

        a* J8 [! V6 [1 B: i6 ~( J# Y

    • - R. ]! P# l( c# A2 M; ]6 n( m, F

      2 k, y9 z5 d2 L5 a/ ?}+ A* x, k9 O$ G, ?' |2 q9 t- [0 b

      : l4 y: {# c: Y) J  B0 b6 |2 x0 A8 R  }9 ]7 x- r  f$ i) W% _# d- I6 `


    + o1 d) B- }1 x# ]+ }. M3 Q4 q/ Z( ~输出结果:9 s/ `/ v* M4 h" J, B% x

    6 K( x' @( C& Y) ?
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    3 t' h- Y- C9 n* ?, c
    ' }' `) [6 [% D# z2 M
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-8 08:49 , Processed in 0.337128 second(s), 51 queries .

    回顶部