QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3170|回复: 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

    / a1 a, K# \' p* p+ T优先级调度算法# n* m7 g5 i" E9 f' a* _

    算法介绍
    5 {1 I5 g& s1 V) u) z' u优先调度算法的类型(用于作业调度)$ _+ W5 s& `# @1 Z: }
    1)非抢占式优先权调度算法 ; e! _/ \: B% ?5 d* M: W
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 + c' {0 O0 O. P9 O5 V1 ?7 G
    2)抢占式优先权调度算法 1 {5 q/ d  g  @
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    - [' h# S: Z* C; [1)静态优先权 ) F0 p: t0 x4 _& K; \* ~" ]
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    $ u% A1 B* s  T0 r" @' j

    2)动态优先权 " D7 A$ I# T# j9 M

    算法实现

    抢占式动态优先权:


    3 T7 X* w$ A! C# MPS:本人认为非抢占式静态优先权没有实际价值。


    • $ ?2 ?5 p8 ~) A9 R& h

      . U, F% @# L6 b3 D#include <stdio.h> 0 s( ~# z, l" |5 ^9 U" a2 a

      8 ?3 P+ {% ?2 F' K

    • * }* z4 ]& [* u; {5 a
      4 b! W  {" ]6 K7 b9 F$ J
      #include <stdlib.h>  3 u7 h' k" w, `

      4 m1 M; l. l* T1 C! @" h7 R, X

    • 2 w+ j- ?: M: q1 x5 [% Z

      ; |8 \- ?# w* Z( f1 k#include <string.h>  ; R4 r- W/ w& z( X/ t& ]) t

      8 ~+ H6 Y& u: k/ J/ m" `
    • 8 a9 y5 D5 @7 A5 J/ D
      ( O5 _, R/ W( N" I
      typedef struct node  
      & g% @, ^, z( `

      1 _5 N, Y% u. z  D7 S

    • . i# h) ]! i8 c2 V+ K

      $ ^/ y, o5 \+ v  W{  
      , s" A  `) _3 L* [" E
      ) `3 ?8 p: O6 F
    • + D3 _: n8 ^% F2 ~$ ]
      # J) F' U4 w& V1 O
         char name[10];  /*进程标识符*/  + e0 u1 O- G. k# \, c
      - R5 \  R2 i4 f, T& T* ?
    • ! u1 D& x& ^7 u5 j
      8 a! v$ c. u4 Y3 b. ^
         int prio;   /*进程优先数*/  % B% i5 l+ K4 i

      , Q: u* V8 `/ T- X# s; C
    • * Y  s2 t! ^/ O7 e

      4 F: g0 I* e& {$ b' T! K0 W   int round;  /*进程时间轮转时间片*/  ) J2 t4 @2 u. z$ c% ?2 z
      , H$ F- G4 R( s6 k4 R* `

    • 7 ~9 Z; a5 ~. I6 \
      3 F! V  U, Q" P' F; t
         int cputime; /*进程占用CPU时间*/  $ b4 `4 t: F. G. g; Z+ B% g

      / f$ j) d& i7 r$ P! w9 _+ U

    • 0 O7 J' A! U& G% a! J
      / t9 @% {, t2 X% J* w
         int needtime; /*进程到完成还要的时间*/  , f( E0 ^8 s8 M/ ?

      " b- }) [3 |/ p* }) K

    • ( ?6 N0 T$ I2 w! E) H& G  @  l- P$ {

      ( z9 N' }, [/ ]) q   int count;  /*计数器*/  ( H* v2 @: Y% g, y

      6 e" x0 p$ d# Q+ K
    • # S) M7 P  k& Y1 P3 j

      6 @% c/ ?! t0 O/ t/ q   char state; /*进程的状态*/  
      % `+ ]% _& Q' x5 L1 F' [2 j
      % \# M, O6 Z& s0 Z$ v7 b/ G! f0 s

    • / }- x! P9 k7 E$ Y- ~2 a
      / u5 N! V8 l: E
         struct node *next; /*链指针*/  7 r$ t/ l8 f3 ?* g* q2 {
      + f# l2 H- O8 h. x4 a
    • 9 O! N2 F4 ?3 f! M1 P  P* I1 S/ S

      5 v5 X9 C$ T6 O}PCB;  
      * t; F0 L6 q, f0 [7 M& A& }
      ( g* e# n2 _* K$ ?$ }0 n% c
    • * i% Z( U% h0 X  e' G
      0 l% g: K( Y5 a% N+ s: G
      PCB *finish,*ready,*tail,*run; /*队列指针*/  3 r- T9 A' K) k

      ; G  t0 Q3 y/ u/ T, J( u

    • ; _4 O2 h. g% r7 e

      6 X& t. h! Z! y% Gint N; /*进程数*/  / V5 {  w& N# G

      3 X0 u9 b. v6 v0 T, t
    • 3 J9 b3 d+ ~3 B6 e4 U

      9 F2 ~( e* m: v+ J4 y! I/*将就绪队列中的第一个进程投入运行*/  
      8 R/ q$ [6 r( l

      & v& l  J3 {0 }# e) N- e

    • , z, V, i' U$ T) M+ q

      / m5 ~, p' h& N; k) P6 i! Vfirstin()  
      0 T) l$ ?  U. v& A+ n1 V& G, B
      " }, z; f( R! D, {* R* }, e
    • ; e" E1 n; `/ r' j

      ) o0 z: Z8 H0 i& |{  7 k6 z. T! G4 d& R
      9 [7 M. f+ U" P

    • : x2 S6 G& x$ ]) L6 p7 V. \
      * ?! W; d8 q( s% Y! H" Y6 O
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      3 W) S# s/ k- v/ Y$ \' z
      $ D+ Z8 l* g5 E% ?

    • 7 u/ n! n5 }8 u' x

      & r' ~' z0 N5 b: Q, j0 H2 _2 E   run->state='R';   /*进程状态变为运行态*/  , s9 H3 f+ `' u0 c& ^# ^% |
      9 I$ b0 t9 v6 w/ {9 C' U

    • $ F2 P  i; s7 A& C  s: E
      , C9 J0 k& E; Z, S/ H* c
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  ; l* U6 p& s6 k2 P2 f. I+ Q& O
      $ K- ^- I, M: J7 E
    • ! T! u3 c3 p7 [* I" r8 {; Q
      + q' N1 r1 g& O
      }  
      ; n) q7 T  [0 R& h+ y/ Q( c8 Z
      % C1 w3 u  u* B- i/ d

    • - ^1 F5 g) u9 D
      $ [; K7 U! [7 c" l8 Y; c
      /*标题输出函数*/  5 h7 e) Z7 v6 }' ?6 h5 y+ o0 G: c
      0 ?3 }" P; k4 b( B3 P2 U
    • , G: D: C: K: L2 g6 F- O" r- a
      4 ]. R- Z0 u/ U
      void prt1(char a)  
      ) j$ j9 w4 s* V1 C
      - i3 t0 Q/ x* P1 s  n) e
    • % l: o. }6 g7 r9 l
      2 E' F. D( z0 D& j
      {  ; [8 L& W  Q5 L6 Q& `

      % T! B" j# F$ }# m% R- U

    • - k+ M, L/ ?  F

      + S- F2 {% F8 F; E  h0 \   if(toupper(a)=='P') /*优先数法*/  
      0 S/ o' P* `3 w9 k* B+ j3 V

      # k' u. j3 R7 \! Y/ Y
    • 9 U8 {, ^/ {4 @+ N; y2 i

      ( E$ J7 M: a9 ?& T# A- V! N      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      . M; [. X  ?# u" s6 B7 C
      ! p7 S9 Y* L% H3 ?
    • & V7 r& N: x6 ~$ X0 C$ P

      3 P) v8 [# m" l" I4 g   else  
      # t! t+ j* Q  }9 I* R1 L4 X

      ; ~5 D8 o( C2 O4 M0 F; |. o

    • : S2 ?; n5 Q; G4 r

      $ x% D3 h( }+ c; C) k4 V- ]      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      / p0 f: H" A4 w1 J  C

      ; m" _4 _$ s2 ?. i# j  h4 U) T9 L* D
    • : V) {5 F6 Q8 W4 h8 Z* f/ P

      ! ]' {2 _; P, n}  ) V. e: e* ]! F6 ^7 J8 }
      6 R: K( k- K9 g5 b: |
    • 1 X& [0 z& S2 _6 c4 y6 u
      - K" U# x, U& E7 H5 G( @5 r6 d
      /*进程PCB输出*/  
      : ^: d- y3 h# }0 D% e
      & B$ C& ^1 l* Z
    • . T& H3 j7 _  }

      6 P# h5 _( B6 \& Pvoid prt2(char a,PCB *q)  1 ^- E: z  \% Y  o7 _8 a9 D7 D2 U) a0 Y

        N( ]# H' ]( p/ }. }8 K
    • % u4 @/ n, O. V% |" \
      ! c: P4 b( @0 y- _% D
      {  ! v2 _6 i4 e2 L8 i" f6 K; Z

      & [- [  T$ Q, N  ~! o
    • 8 r- c0 P9 O) _. Z: @5 n" M( {
      3 D  M$ u) v" H  b$ J9 o  }
         if(toupper(a)=='P')  /*优先数法的输出*/  
      * p( r" z4 y% q; ~7 i. j9 y& U

      * H; `$ R# \8 ?4 [; u! {8 D
    • & T; r& k0 R0 F$ G6 r& m7 J
      $ ^2 \" D& |6 g) k
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      * L' I- e: E( \& K6 ?

      6 E0 K3 e  \; e" j! |- g
    • ; i( R) T) D% o' e+ ]8 h
      . G! ?4 ^9 w  a9 i5 k3 o  ?( C
             q->cputime,q->needtime,q->prio,q->state);  0 R* U- g. [. b2 L% @

      ' M  J/ ]* ]0 n& N
    • ; p' V  n) w6 P2 p8 i8 _  w

        B0 P- J( \1 O, q) k" f+ ]8 v   else/*轮转法的输出*/  
      7 q+ p! T8 n: ]: Y: J3 J

      ; _- q; _$ l$ u
    • - D- X7 d+ d/ A# L

      " G3 Z6 m+ S# D, F      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      ; r' J0 c9 ^# a- k
      ) q7 j( J) i& F: ~& C) q& w
    • # {# z- u: a& J' p; U4 P8 {

      , G( T1 V  a! M- g       q->cputime,q->needtime,q->count,q->round,q->state);  
      ) ~2 T0 B$ P7 I0 g

      $ M  g3 `( x" v
    • 0 i+ r& w6 u1 B- a

      . [/ a& k6 g! [7 L5 s& V! B- y}  
      1 T, T. ]3 N0 D8 k

      & b* A) Y; ~( ]) u% Z
    • % M8 G) c8 J% B

      " u. [+ [7 z' z" `% x/*输出函数*/    F6 s3 h5 O7 c! @
      2 M/ v2 J( l4 }& a- ?

    • , ?7 a6 @* k0 E" ]9 \/ |  M
      4 Z( [* O7 x: Q/ H/ ~( q
      void prt(char algo)  ' X! s. N) `5 ~+ J
      * u* O( k- R! o+ d- t) x& l  h5 ]
    • 9 {% |# V7 r9 g) {! N+ Y5 ^: _, \& G

      " T  [; d6 [+ e{  * S4 [1 c. P) [2 n( a5 l4 F( ]

      . S) d" J5 O' d2 G: q

    • 4 c6 I9 ?* h% |8 Z
      + A* p& {! |0 ^* T7 G5 o
         PCB *p;  
      3 ]' _8 F0 O' O# W

      4 q/ K5 n: q' Q6 S4 S" U

    • 7 l8 H* W) l6 h5 K+ U

      0 m, O6 v8 B! y4 \- w4 z   prt1(algo);  /*输出标题*/  / U0 v% m8 a: q: l. L. @

      $ j2 v( O  M1 r6 M! L
    • 4 f( D1 L6 A% W; S! D% o

      + F3 d( f" m+ q! g   if(run!=NULL) /*如果运行指针不空*/  
      $ ^% N8 d0 @6 T
        ~' U$ J8 }$ d/ `9 _: v9 b

    • 4 j: O& T! o# }$ c

      8 R0 ]- F( l- t. H6 f4 F      prt2(algo,run); /*输出当前正在运行的PCB*/  9 W# u8 V, w- s& I

      + M% ?( F8 K/ h% O: J

    • ' F& M$ |. k: l$ X* l3 V. H7 u

      0 O' \- |$ i' }4 H) L7 V- u& H1 z   p=ready;  /*输出就绪队列PCB*/  
      0 A: S: ^  k0 k2 f' v5 u9 z6 n" I6 o. f
      6 o; k3 O: t# B0 ]3 i5 M# S

    • 7 t$ P* `( s3 U3 B* A7 o
      0 A9 j: V5 {5 U  y: q
         while(p!=NULL)  
      ( N1 C& S9 ?5 E; F4 b2 Q+ t9 _
        F, p6 m+ k& ]! p+ @) \) x, U

    • 5 o& H. N+ `2 T4 k

      8 S5 x/ Q' a" z; o9 Z% c3 b9 R4 P8 q   {  ! p- g3 W! W8 ^
        e' q. r1 x8 ^; j! f& K, @( S

    • 7 s% B" ]9 ]) e9 e! M" c% O
      ) F# }) g5 Q" \( u& e
            prt2(algo,p);  ( g6 X& d  R& S, X1 }1 a
      ! [: p  |! E1 T. A6 V

    •   C- b+ G% ?, r6 q0 P8 O/ z

      % g8 t9 b& p  m- r- q* _5 Z# r      p=p->next;  # |4 _6 j' ?  m) P
      2 h! y* Y# j, E" F5 b/ a5 p# X: `. y
    • " T& ]+ I- [9 c6 ?/ F/ c$ X

      + m5 I; Q' x. D% Q   }  1 G; O5 j" f0 i: i+ g
      0 h% d. J2 o) _$ |% e
    • / @/ {1 x9 P) k- E
      6 E  k! ]/ S& R4 c+ [
         p=finish;  /*输出完成队列的PCB*/  ; ]# m$ U) J7 L8 [  @3 ~
      / W& P0 M) a! o- q7 S9 q

    • , A& L* b2 _$ c6 ~
      5 y( P  [! [& V3 L  V
         while(p!=NULL)  . s$ }+ b; ?: ]/ o# y* w: [6 ~, e

      - r! c7 C0 K, J
    • 0 q0 u/ _3 U' |" T" J9 @

        i/ |. ?9 w, e8 O, F5 q   {  
      - Y+ P# h4 @4 Y, @1 C+ m9 O) U
      0 Y1 o4 @7 ~5 n$ `7 |4 d6 D3 v: G6 k2 H

    • & U. k- p. @3 c( s; W

      8 d+ E$ w# _) ^2 G, |. H      prt2(algo,p);  * U% U& r; g( m7 l$ B

      / a8 o2 Z4 E( E7 a8 ]! F# x6 s/ l

    • $ y4 L- }# u% @: m

      3 {. t  o) o7 s7 N0 e4 x3 f2 Z      p=p->next;  : n9 m# \' [6 H' F2 e

      - c! h4 s/ X" l. P: k- i
    • 1 S% A/ [4 V7 w5 U. b
      7 @1 _8 ^. K1 @- z
         }  / ?6 x1 U6 R4 U+ A' T

      ) y3 E' }/ T1 [( `: e% l% Y
    • 5 z0 p  p- v1 Y4 {* s
      ) ?; r$ c9 p8 f4 I6 n6 h1 A# a6 N' o
         getchar();  /*压任意键继续*/  : N4 e% C  _7 s, e
      ' |2 h/ b* y1 B; b; P. M

    • * b; G* v6 ]* _  o+ w
      % X( N# \( |" e& f
      }  
      0 }: d/ r( V$ H# k* Z1 E
      , v/ M8 [: e5 V5 L
    • + d5 F0 }4 n* l# w( q! I
      ! g3 s* \# P( x$ @' J) h
      /*优先数的插入算法*/  6 D$ m: L  Q1 P  D5 A, M  `; f  g

      0 [+ \0 H* H/ Z, k0 a. L3 z

    • ) G/ j. a& |; d- e9 @: F6 H* z

      5 J- O9 c, w" ~, ainsert1(PCB *q)  6 F' C/ S3 Q' \
      6 ?( E$ v8 g3 m, j# v3 ~

    • ; A- o( e% u: s! r2 o' e& K

      $ q$ K8 ]: u4 |8 l  ]{  # v3 w# O8 ~' C  f. N2 ^8 e4 y1 B

      # E" V% H/ t" H1 A, k7 ]( R/ k( _! j

    • & E& w8 s, h* O+ M7 q8 O

      5 h7 s- b8 V. k   PCB *p1,*s,*r;  
        O4 z7 y  z/ X/ B. {& P
      + ?) S6 J" i/ D7 b
    • $ c2 p9 f9 F7 [% P

      - ?' ~, h& L, H   int b;  
      * v* n; U9 x  _: a; l9 \

      # v& w' v9 j3 l7 W6 E
    •   y( A1 ?$ N' U5 B; @2 z
      7 p/ U$ C; C( z& K- C
         s=q;  /*待插入的PCB指针*/  
      & O: a* f2 N% V" `& O, N2 z

      1 H5 d8 }  V0 {3 v* M4 n
    • 9 [+ W' |! ]: q# L' H. B! k

      ' ]6 w$ L6 y/ p   p1=ready; /*就绪队列头指针*/    v: }1 C! Y. A+ s2 @% f6 s
      2 ?( l% G8 t7 C# k, z( L; t" {4 ]
    •   h& O: ?0 E; w& t  d. d

      , @; r4 j: F& [& e: p8 g. [- ~% H/ O   r=p1; /*r做p1的前驱指针*/  
      : l8 z' u1 O  [8 x- Y

      6 K2 ^/ m1 V# Y' [
    • 7 D' |1 h# V7 A- n( t8 W, m

      8 U1 U# ~. u' r3 F: ^0 v; u   b=1;  3 y6 q5 w- G, v0 X- Q0 L

      , n/ M# r6 O7 R, {
    • 8 \# r# j9 Z; Y( L, }/ F
      3 l8 w6 B: U3 B' M8 [
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  0 v  Z8 ^! i2 x& T
      + R' O4 M$ }/ c" E' Z6 |7 A4 R  V

    • + B9 i" S7 K& M- n) W$ s

      4 Z  O" Y* P- r8 F' X      if(p1->prio>=s->prio)  ; t6 c8 \6 s" b. t" g+ b0 ?- {
      " A& L% r% N, Z) S
    • 4 e8 P$ B" e1 }- @, V: O1 k/ T

      3 \& r1 r, o# b5 q1 L* Y      {  
      0 Z2 W4 Q6 U$ e

      1 E7 p) q4 x# X6 C
    • ) \5 M! ?4 j1 b

      1 U1 j4 S: [! e; t     r=p1;  
      1 u9 j" h5 [" {; |  F

      ' v- c- b' b3 ?' v& v  l; Z

    • . f! j$ b  j, r( `: q2 _0 W

      : \6 k* L$ N+ D/ J1 U2 L     p1=p1->next;  
      - v; E- @9 m9 G1 D  z
      + W& K. D' C1 R' ~8 Q) N
    • 2 N; }% z& K! f) e9 c# n
      / w8 q" y8 X. a8 X2 e6 H5 E: q
            }  ' L7 W3 O* N; O6 ?5 v% S2 Y; D

      1 b  ~: H$ T% k( _0 j% w
    • 4 X+ @; z2 t1 q

      9 Y; G$ H/ a  O8 R4 v$ V, m      else  
      ( l9 ?3 r" V5 g& I# r

      1 K$ s; Z( o, u! p2 b

    • ! q2 F0 `3 T6 ~: M  E
      : n3 t. I0 P% Z" N6 A) x3 l8 J6 v
           b=0;  
      & ~: L$ [6 Y# J- e

      ( q7 F3 t0 r  E$ U' x3 }

    • & A1 z. `' n# X- F4 ^- q9 l
      # @) T; Z( }9 a6 F  Y% }
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  5 S4 A3 \4 x7 r+ J) y2 ]) K

      . H- P* Q0 R9 o' \7 V5 a

    • 8 r( f* A3 A$ D' O. A9 Z) R  k
      0 m( H; T7 V  j7 d1 ^
         {  * p& Y/ T/ ?& z" k0 n! ^, U
      - R' e! V- {1 c. H* V* M( M
    •   W. r) t5 Y1 ]; R( c# Q  o
      * B. K8 a% W, ]1 ]5 A" G
            r->next=s;  - M! @$ n* a1 Z
      . _" n! p0 ], ~( W+ D$ s
    • . M" J8 C: k' U7 X. A. C! G9 Q

      - P7 p6 a1 ~7 [4 T  k      s->next=p1;  
      9 x5 E5 n( B# F/ w

      1 A6 u) g1 n( B% [9 j1 J
    • - t. V" e$ z- w; Y; c

      ! X7 ?! n- f4 H, q4 ^$ z9 n   }  
      & ?  s1 q0 A" v. \( ]' k4 \

      9 r. Y5 l, v6 M  h  V
    • 3 O6 J" q  d& E1 r1 d1 E
      + w/ w( X1 |% w
         else  
      ; ^5 l9 }: R& ?/ \" E) S+ F

        K& y) r6 [6 ]
    • & \+ N/ O2 f% g" g3 n2 H7 w7 C9 B
      5 U+ J) z: h2 L/ z, u4 O9 Z
         {  # O( o  j3 ?7 K$ t5 ]
      ( [2 v: B. g, a" }( n
    •   ^2 {) E+ g9 H+ E' v( z

      : \1 F1 R8 R3 g5 A! E8 m$ a* ?      s->next=p1;  /*否则插入在就绪队列的头*/  
      / [1 ~+ C$ y! a, o, R
      4 e( @! e4 y" v. k; t

    • 9 f2 m1 l% B: A  [  @% e! @
      - H. N$ ^5 U( \8 T4 x: J+ X( r
            ready=s;  
      . }; C4 O  w  c, h( P: Y

      3 [2 `, U' I0 Q
    • ( x! c7 P, G6 {  H2 {' n
      . t% f% c- P- U$ S' Q3 f
         }  ! s) C$ Z  p- O- j  j5 _

      / R4 l+ k. \1 u7 R7 N
    • - L( i- P1 |- ~+ N+ v2 w4 n- G, n$ Q! O

      # F' w+ |/ X+ b( t, p}  
      6 E: T1 x9 _* U. t  o+ |9 A
      2 d6 k( x& E* j- |+ i

    • 2 {. O$ t" ]! Q1 W

      % h8 ?0 X, P/ B/ g) J: M/*优先数创建初始PCB信息*/  
      % o  Q0 P: m! V% z8 ?8 U

      2 R0 B7 W( h- S) ?! h) `2 c

    • 3 p: p8 x% R$ @: c( E- a4 Z

      * B" l3 M0 |5 s; e+ G4 Avoid create(char alg)  $ C, A' @$ `) G; s6 b  P; b9 C+ B
      ; p- f- ]! x( i( A
    • " O8 m6 B' S1 G! A! A4 u

      7 }% ?& ]0 Q+ n3 m( }2 t{  3 a5 H) k! W. W7 i7 j5 t# w1 r
      - I7 J6 I# N8 b
    • 9 H4 ^4 A1 y9 D: \- z/ s4 y

      $ G6 N" Q. R( U0 I   PCB *p;  7 s7 r8 K0 L5 D* V0 m1 C
      ( d$ `: r5 a# _( K1 Q
    • 0 R$ Q( A, J$ N- A( M5 w

      9 T; y2 f+ L2 O# X3 S8 Z   int i,time;  0 K/ a' h. d8 C  t5 h

      & V1 I4 Z( J" W. E( K- b0 H3 a

    • # n/ y8 n9 f! P: L0 e
      8 k* [, \8 d; Z# a- l, c) T- @# M
         char na[10];  
      " T1 C1 M" q( W; @, n7 u9 f: |
      , H; @* D; I" q+ G1 L

    • ) m  u7 ~3 A7 n
      / w) r8 \  `9 e. O! K$ M: b) P
         ready=NULL; /*就绪队列头指针*/  1 z; ^1 k5 r% K2 w5 n8 K' M* w
      ; H6 J8 M3 w+ D) z: {3 [3 ]: d

    • ; o* Z* [$ }+ S: D, C4 B0 s, D" B) A

      3 Z, s1 X: C9 J# d* O/ k. @   finish=NULL;  /*完成队列头指针*/  9 @' Z. l- e/ v$ T
      : X9 z+ t! M" x
    • 1 R4 i( i  M1 h* {: |
      % a4 I0 G& @# M+ x7 U7 G% ?6 F+ K
         run=NULL; /*运行队列指针*/  
      + F( n% M, |7 y  l- M! ^

      ; w: g# @8 K/ @0 O1 x2 p

    • , y* |& _& p  y) m; |
      / @8 q/ I3 ^- T
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      7 h$ ?: j" a/ f, @5 O
        d1 k! F  b. s, A: P* L6 O% [
    • : R2 o0 T: Y7 d. M& Q0 Y3 }6 m

      % ?1 I" ]5 I  C* C" Q7 Y   for(i=1;i<=N;i++)  
      7 S7 O8 V' c" L) _! }  H) k
      / s5 k1 X4 x  ~% Z$ y

    • 7 M0 d+ h( |- J
      7 ~2 J% s: Z- d" _7 N* s' I/ z  {
         {  
      7 Q" s5 c9 C7 s/ Z& x: t: c) K

      + W3 r2 p# N8 q, K" J& g# T
    • ! f7 j' `$ D2 n& D- Q* O: k- F1 \

      ) L0 N9 I* x5 U      p=(PCB *)malloc(sizeof(PCB));  $ f0 a, I1 `9 i2 L7 ^* r

      0 A' E7 D- h+ b5 B8 l" Y
    • ' c! J$ e# W1 w6 w

      1 \9 |" V# n2 i& ^      scanf("%s",na);  1 l6 u: j5 {) ~' e0 e9 M* n
      / v* K) M! W" I

    • # T3 v3 d+ o4 m( |  e; i. N" O4 Q

      , ^$ d$ v& U( Y! {+ @$ ?! A      scanf("%d",&time);  
      & u' j3 `% ~1 ~$ |( z
      : }  u# ]! C* y% @: t- i( s9 ~& p

    • $ I! x# J, [3 d: ?
      0 u0 ]8 ]' j& o( V
            strcpy(p->name,na);  ' |% ]1 u9 u4 J5 x
      6 v6 E" h- T: `! G7 i( n' J/ f8 K

    • $ s. t7 b( c0 S. l; b1 M* i; w+ W4 S
      ; d# S- ~( x' H& w4 _9 Y1 P9 L
            p->cputime=0;  
      6 T: f' a1 q& _
      + Z0 S* `8 T9 U

    • + O- L4 P: A- T+ F- T) M( w) r7 M

      7 {+ T. l7 b1 h# d      p->needtime=time;  
      # b4 r5 I8 k' r) g& ]$ i+ s, Q
      2 v  m  |( M9 \( _4 o
    • ( n9 i+ S) k. ?) e% i& R2 F

      1 n2 {9 F% n. [% l      p->state='w';  
      $ k9 E" y9 P0 u  n: o

      ! N( O. I; r* q
    • 5 m' I" [% d! C" M& Z

      8 h& c/ m4 K) M! |      p->prio=50-time;  
      % |$ K# h' e) B$ i3 p1 M* G8 {1 x
      3 V; B0 B" n* p5 ^; E9 i( D

    • % H% q2 e& k- K. T

      ( ^' v+ ~. h/ |      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      + z# b: f, c4 U' d# R" N

      . F+ q) C* Z- N# ~* y3 s

    • 0 t! o2 c( O6 U. }! J

      " c  k. C, A6 U9 {3 j2 k3 P     insert1(p);  
      8 j  p/ s& U: k/ B
      3 @6 m. b- a: N6 o! c! K

    • # }8 N0 S# N4 z# U5 i8 j" x
      6 U" \' q( }, c* \3 [; l
            else  " R% J, ]$ w( V2 S
      . O: b# W& u/ o! K4 b
    • 5 k. b, i) f- I7 P, r

      # q) c( Z1 ]  ~/ t! l6 Z  c2 l      {  
      6 W+ Q% ]( D$ {
      - _  y. f' c  X- \1 m

    • . B  ^4 ]' Y/ B- K  h

      - c( \- y' H1 T. @0 a     p->next=ready; /*创建就绪队列的第一个PCB*/  6 K6 K* W8 u* D$ X2 m( a* X
      : u, f4 L7 B7 i" _( y& v. K" Q9 ]

    • 3 b1 v2 h8 t6 p' Y6 g
      7 G" b; `4 n- n+ G
           ready=p;  
      ! j. A. i: D. ]) y- `5 P
      . ]& r/ G/ ^  Q7 B, Z
    • . s; M9 w' Y% I6 @$ Z+ i

      . X* ~6 v2 d8 H7 h4 ~- a8 I      }  
      4 g& S. }$ Y" o" U. |# H/ x% e$ {
        m! n& o. f0 u

    • 8 |' c# L. I' ^

      / H; t* u3 _% u, @- B# o* ]" ?   }  ! X0 V$ x% f6 q. T/ \

      ( I) k8 y7 n- o' `' `; {1 f1 [1 E  h
    • 3 v6 I% p$ V8 N/ e6 L- _7 ~
      ! `5 P* y' Y' O! ~# S! c
         printf("          优先数算法输出信息:\n");  
      5 |8 ~2 I: r( D2 d& K/ Q' Q

      3 U# M" o* S  L9 s! ~0 [, w' e3 q$ s2 M
    • # E3 q8 `% u4 W
      ! ?/ X+ ], K9 ?9 T1 j
         printf("************************************************\n");  % ?5 \5 a9 M% v0 ?

      ) p7 k* r" u1 p/ n# m

    • / V- P* s/ ]7 F6 k

      " m/ B, L5 e4 ~% i   prt(alg);  /*输出进程PCB信息*/  1 l1 w3 I  ~% O  M- s8 m' ^

      5 G5 s4 C9 x* S

    • 2 ]1 s) h4 ^" ^5 J, p
      3 z1 p3 @1 G! W) J6 n/ D3 D0 V( Y- h
         run=ready; /*将就绪队列的第一个进程投入运行*/  - G; k7 ^) O  j( Z* A2 o0 G& v

      - O* q& G; h) k

    • + S3 |8 g/ D3 q& u! C2 C3 M

      6 O, i! f0 l; H" l   ready=ready->next;  
      ( o5 }0 o9 j9 a* ~

      2 H) ]/ \4 T# `( g) [, C- \/ b

    • ; }8 K# P' O; U) w* M
      / J8 ?" H! p  ]$ S5 ^6 }+ L
         run->state='R';  
      / U# q0 [; P9 ^. f# h2 T! |
      0 d. u: a5 H3 X8 s1 i7 I5 H

    • % M7 E/ @" ?# p/ K2 B/ s7 o
      : p/ c8 L8 r4 I
      }  , n5 Y# V& f. b# Q2 j+ E

      6 {5 R6 p- N7 Y) Q4 L+ v3 y
    • " U/ {/ @, E, o( w) c& Q
      1 f- Z& U) T1 c. S0 [% W
      /*优先数调度算法*/  
      . }  \+ ]7 x$ M6 @
      5 f0 N8 Y/ t5 p9 }/ [: V& w, ?

    • 8 W8 s9 `% P" N: {6 {9 E1 l

      8 I) E) A! W& T7 I/ d+ _priority(char alg)  
      . k3 [' e; \  y' E$ V; G$ _6 q

      9 |- z% o3 `0 q* Q; V( R

    • $ `+ I+ {, g. z* z8 n8 b4 l, t

      8 N' {. a, t" {7 z# s" C  E{  
      0 R& M9 N+ C$ C1 {. q9 q6 ^  q
      & C  L; z* e0 e: }" r8 W1 x
    • % Q! \6 b: D) T- |8 k% {8 Z: Z
      3 y9 R$ q: o% l( w, a, [
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  : s9 k4 [! ^4 ?3 M/ C; H# @0 y. v
      * B: I3 f* v5 j2 ?% b3 g

    • : M, k) `, V9 j/ `+ @0 s

      2 |/ P) I" i2 ^0 g3 u: U- m, K   {  2 h: l7 K8 }6 d/ f% _& \' ^# a* Y: I* ^
      , r; S) k( A2 {" f+ x2 v* ]
    • : Z( t8 N# E4 m. K; d

      ) D6 k- a. w1 M* K7 L      run->cputime=run->cputime+1;  . K2 L! m% G# E! K0 r) k
      6 _) w& `6 u& N: F
    • 1 W$ o1 j0 @- c% O8 ~
      : i4 e; d6 J' w3 m3 X$ [: I
            run->needtime=run->needtime-1;  ! g  ?, Y8 F' m  E* O& t

      ) B% D1 H& h$ R
    • 4 [) X0 _3 v4 G) z! f- o( N$ V

      ( ^( u. J4 g* p6 y6 t7 Y+ G      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      # l8 D' ~7 ^" ~4 k- n) u) `- t9 l

      ' L2 c1 {4 I2 ~2 V. r! ^. G
    • ! F5 T9 r# s! y3 w. P8 N2 V
      & Z9 H+ t+ c0 H0 A9 ]+ ^
            PCB *p;
      / q4 s2 Q  `' Z2 f6 B
      9 }. h  H, w# A
    • 1 a; m  f6 F, }& f! K5 j
      5 h+ N) T9 u7 j) Q. X) x- ~
            p=ready;7 e( t% x4 b! J. A. N" ~

      ( p' V2 r! m% D2 w# f- e. p: \/ m
    • ' h" a2 Y! t: G* O' y

      8 D5 O- r. E* |! F, w      while(p!=NULL)  
      * `5 g8 F& S* F) Y# r+ W

      $ @4 Q0 \2 T) _) R5 {' E
    • 7 u& Q* E  [  K

      8 R: r. I9 X, A7 n. h. Q      {  , z- c1 i' b& n0 L3 D

      " k. q1 X- _/ W
    • 7 f  ?% y2 _3 s
      * S; s& s3 R8 [% f" r4 m0 G+ p
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    5 N& C8 X4 k  h; b8 y" Y9 V
      - L( h8 W( E5 D+ {/ ?, g) i! }; J6 B

    • : I5 `0 Y$ c0 {9 G' P3 w' m

      / Z5 N6 m9 [  q4 E          p=p->next;  
      4 b: w1 W+ ]' `/ a5 f% y/ ^) I- F

      6 K2 q. E, ~6 m6 h  Z* ~/ C7 Q

    • / l" E) J5 x. T

      + Z$ b4 c( J7 X* Y8 [      }  
      1 d* [9 M2 I7 k

      7 V# e- w7 k- r

    • ' P7 S  T! z+ y* {. h

      2 B9 {% m) Y: M7 G$ P      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      ; h, w* p/ v3 L" j, D8 v# A; K
      . C& c# l9 o3 S" l3 H6 c

    • : z7 {# J% t# I" e8 ^

      ! F, z- J1 ~! z2 J' Q- {& R      {  
      0 g. I' o+ R: N1 p* }$ F

      * l. @2 f. H% S4 ^! K0 h6 N
    • 0 ~# V4 H  x, w: q
      3 P* h* _* v6 j$ ~7 J: h
               run->next=finish;  6 a- g7 X1 j5 Q/ e0 B
      0 L1 J8 c: @/ J9 d8 H

    • 7 ?  U" a( t, b" }/ X
      % D* L& \; k( F- i3 G! b
               finish=run;  ( W& u# X' `; Q. `
      1 J- G1 d1 a* x7 T3 j* [
    • 7 O7 i: `0 ^7 E

      5 C* g2 M0 w2 e$ h) ]         run->state='F';  /*置状态为完成态*/  
      ; P4 ~) Z5 ^8 D, V9 s
      , ^/ n8 w" R( M, j

    • 5 \4 T, ]/ M- b0 ~- v3 I
      % d# }3 o! p+ q1 c; n
               run=NULL;  /*运行队列头指针为空*/  " i/ Y+ t% W; }0 q( b' D
      , c/ v. N9 g  V5 @

    • " f! l3 e' H% c, G" E

      * l3 D; o1 X8 L3 w2 M& g$ d/ B         if(ready!=NULL) /*如就绪队列不空*/ . A" J0 i3 P  @( v
      8 t1 o* v! @! X0 g
    • % A+ h; R5 L1 V& d* Q- J
      . Y) J! D! S4 ~
               {  9 Y4 z# I( @; o/ y& w
        ?) N- E! D  B) \" G
    • / r, [# S. J- O, S; x6 ^2 @0 n

      . \5 i1 T" C9 r$ r& N/ h4 s' e            firstin(); /*将就绪对列的第一个进程投入运行*/  ' d& T, ^* e3 L! }3 h6 M
      # J& W& H- r/ ^: ~
    • ( K( z" T  U3 X1 @, w
      9 J5 h* N/ k: ~1 Y  ~: p0 ^
               }  b7 N& c( }+ A3 ]

      : }3 k' H; g4 g- U8 H; c

    • + r- a8 G3 M) g& ?5 ~& \5 C
      , v0 }& z2 `& W7 T/ r! d
            }  5 U. p1 u! r0 T% e' X# |2 J. G

      0 l3 e9 R8 C' H
    • - [- [5 @5 m$ U- \' @( z
      0 @$ x( ]+ U( v* L
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  ) I5 ]1 U0 Q6 ^# G8 k$ m( J" ]

      % S. T9 e  _5 W/ G& {4 @; C

    • 0 K# K5 c) |+ ]9 o% n6 f9 v- \( q

      4 z- a1 U8 r/ c/ P& r4 ]     if((ready!=NULL)&&(run->prio<ready->prio))  3 p  n: s$ n1 ?% y% e0 M
      0 i2 Y6 S2 g% D- P/ z8 F

    • + {/ n6 m% f5 \; r9 x

      8 G% b3 a1 N, v1 T3 F/ d" V     {  
      0 J! g  C* u# K$ |% ^# X3 {9 p& R

      8 ]3 c4 D# X6 K

    • 2 T- s+ I$ a- ]4 _  \
      ! T( ~! d8 j" l3 f( G
              run->state='W';  
      . V2 f$ \+ C! F; y2 r8 [% Q4 t

      : P* w- Z4 O4 w& O
    • : v2 o' d# j3 ?6 w

      5 i  ?' E- q0 H/ c1 _/ g9 I        insert1(run);  
      ( @; c! p$ p% Q  A2 G
      ; Y1 y* n5 C- @  `
    • 7 e( N2 {  K! }

      7 P, s8 B7 x6 q* U! }        firstin(); /*将就绪队列的第一个进程投入运行*/  ! \* V5 Z7 D3 ]: D2 W, k! C

      1 Z" k  l! p9 f! d5 L
    • - V4 u, x  I) Z( n1 l& z9 O

      . `; @# W# z" R1 `$ V2 ?3 z     }  
      * Y  ^8 P: i3 x5 @

      0 q5 Z5 E7 I3 o* l

    • / @2 L5 {" J7 C+ A! U8 K$ f6 D

      ) `* W; p- h: `- \4 |      prt(alg); /*输出进程PCB信息*/  , `+ l* m$ ?& w2 B3 R4 J! A

      , }4 o" |5 q, |0 v& g, v
    • # l% h- T+ t; g$ o$ g2 u

      : o- ~2 t5 J% l: |   }  
      & F# S! w$ {4 ]
      ) v2 \( D1 Y8 \% Q
    • 9 B6 H# e5 C3 Z$ C. t" D

      5 j3 g5 ?% r7 W4 d0 i' w7 T$ C}  : c9 [4 R; g0 F6 G" a  n4 e
      4 P( R5 \8 c+ R5 n, I

    • , Q9 A$ J6 r( Q) T' r1 L; M
      # }2 u6 }% T+ a/ m. j7 T1 @; |% H
      /*主函数*/  $ k  g; O3 [  t. }

      6 R0 D3 g+ K; L5 g7 t5 V4 V
    • 8 P. A# _8 V  R9 L

      - j( V+ d- ~- G0 ^1 K1 i. ?main()  
      & q4 q# F! L( b: t$ c

      $ N7 W* G  ?& [  d  x, v0 M

    • 1 r; ~# e4 ?% m, _
      7 R8 D& W! k: _3 M! c
      {  3 n/ e* a- `; D) Z8 i
      3 a6 B) ]$ M6 ^
    • ; Q7 _/ ^9 \  K

      8 v9 w( l( v' Z6 D: r   char algo;  /*算法标记*/  2 y! {1 ]' z/ D9 ~: I9 @  }1 r
      ! k/ F$ ~6 J$ M. J  u( U* c( [% s

    • 4 }7 p1 T% n* |5 ]9 Q  q7 A

      4 r9 n3 P6 N  F1 c   printf("输入P确定算法:优先数算法\n");  
      " M" B# s$ j: }& d" `+ h
      1 Y4 z8 m5 w0 |) _+ a7 Z
    • ' [5 G( J, J! J( ?/ K, h

      , q3 q- K9 t! ^) W+ U3 L# `   scanf("%c",&algo); /*输入字符确定算法*/  3 G9 Y) T( d' R; O3 x0 u
      " W( K; U) Z; ~* N/ u
    • , Z1 k1 a# _: J

      1 K7 f* T" j, t3 {   printf("输入进程数:\n");  
      1 Q$ D- U3 c, _3 s( F

      1 `1 N/ {: ]# n2 t0 O
    • " [: k& t, ~( R: }
      9 K0 v  z% _) A; N  Z  q; l! D
         scanf("%d",&N); /*输入进程数*/  - t8 S1 P1 O, l
        o5 N* }# L$ H8 w4 h: f  j: J: g
    •   \+ e* k) @  }8 \; f; o! j

      $ t* l8 I9 n; Z   if(algo=='P'||algo=='p')  
      ; y8 A& _% T5 [  T! @; X- B
      ) E4 T& ]5 a: e2 z% U5 C9 k. v5 @

    • 5 `+ E1 z/ j- t/ B( P. R8 x
      2 Y9 h- k; U0 r: o
         {  
      - `8 a% ]  V8 [

      2 R& @! u  X) E' u2 ?

    • ! D; I4 n3 r2 i# a+ Y
      % J; T% |1 Z" U' W6 c4 `
            create(algo); /*优先数法*/  
      , K' u: W- P7 N0 U

      " e; f% ^7 ?+ f1 F+ V5 H4 z

    • ! t7 Y' _# e/ L+ t% B9 ~1 K
      7 Z& t  R" O+ F8 [  b3 ]% w
            priority(algo);  7 ?' X) e* q3 v6 ]/ n) [; O4 x
      % \* y6 T4 t+ m

    • / P; R9 {1 [- E. Q. T8 D
      : T2 c! E4 l( H, F% C" s  ^$ ~9 Q4 w
         }
      4 E# Y! b$ `3 s: d8 V+ e0 [  L4 v

      0 a! B4 T5 T+ C) \
    • $ R' @4 H. [7 C) u; D' c
      " D0 b' C1 H1 c+ j+ A+ K7 {6 f
      }# B% n8 E9 K  u& q# l4 R$ @
      ( |8 r1 J' x$ H& g2 w( G' E9 Q

      ; J5 z. }! Y: @' S# f

    - |2 U# Q+ S0 f3 q6 S
    输出结果:
    " e% r# ?& l" N7 E5 `

    ) E# {0 e5 w0 }& X6 ^4 x* Y* T9 {
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    3 Z2 P! k! E4 }  u! m7 C0 N$ f* Y2 A* C- C# g' _# U( N
    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-6-9 16:50 , Processed in 0.510324 second(s), 50 queries .

    回顶部