QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3176|回复: 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
    ( l7 [- y8 O$ i3 _3 e% K
    优先级调度算法) E8 c, q* T" ^

    算法介绍% \( y( n! r, E8 P
    优先调度算法的类型(用于作业调度)
    ( H, Q0 Q5 @. o1)非抢占式优先权调度算法
    + k' G' `. A- Z1 ~系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    1 ~- W. O! i) s4 B- o. m2)抢占式优先权调度算法
    " y9 g9 H1 d; y8 S% z$ B! X, B3 u) B只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型* `8 T* x6 j5 k! t/ N3 [& v: F
    1)静态优先权 . F# W- z9 ^& x% @
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。$ j% [4 w4 \. A- R5 \

    2)动态优先权 4 k" v5 d6 M3 D4 E" G% D

    算法实现

    抢占式动态优先权:


    8 _0 e0 r( w; u  @- EPS:本人认为非抢占式静态优先权没有实际价值。


    • / F% u6 ]  [/ @+ F, E4 z

      * q- U8 @0 L/ _8 u#include <stdio.h> 3 ]) i& a3 \( C0 Y  s8 S# I4 U1 U2 ^

      $ ]( ^9 t  s/ Q9 _( Y7 }) N- ?

    • & S8 m- P/ O" V. p
      9 A* m- D9 T! ^7 p
      #include <stdlib.h>  ; @7 {% T! `; D4 G3 z

      6 L* x  r. }8 W9 _9 o
    • ; u* E+ o2 T  j  f1 M/ t8 O

      ; l8 `  P3 @0 ^8 ~% [0 _#include <string.h>  2 t2 d* O8 K5 A
      8 l$ J1 I8 `* a) k9 H' [6 T

    • ; H' }: i' B, O2 s

      1 R4 ?) e1 ~) t( xtypedef struct node  
      : \6 x0 S& g/ K/ a- m- U; W' f* F: E# m

      7 l- e# G" r+ ]: Y0 u$ t" v
    • 9 ^! A  |. [3 a6 g+ y

      % \  O# ]# W" h* Y8 R9 X2 G& ]{  
      3 Y# W+ [4 Q& P& W; Z1 p
      + t, b" Q) Q" O, e( z* _* B
    • 6 ?9 Q. M, R; V: `6 m+ p5 Z

      8 t0 q! X% h9 b2 i   char name[10];  /*进程标识符*/  $ c9 C) I9 k2 L4 U% o& k
      & B8 L; f5 d7 S, k

    • 9 ~4 X. l( @- V  z5 F  t* i- V" E
      . t! [) a3 `! E2 K  @
         int prio;   /*进程优先数*/  7 J4 v$ V. f$ b7 ?7 O8 C  h
      % Z: }" e9 N7 Y( E' `* d

    • & h$ q( N9 d2 d  r

      7 D0 _6 C7 E2 ?   int round;  /*进程时间轮转时间片*/  5 A, X( m% J1 W- J6 x# S
      3 H0 x" A' X( @) `

    • 6 `( k3 j! d7 F* y% j2 A/ h5 E* f* {
      * G6 E* Z2 _5 u, I
         int cputime; /*进程占用CPU时间*/  
      9 o$ H' U1 O+ Q( ^

      ! J. }' w& W6 T$ W7 w6 x5 u
    • . j: Q8 F  k  w1 C$ T7 V
      : F6 F- c  ^" ^5 \: T) m" s
         int needtime; /*进程到完成还要的时间*/  , ?# R. L3 ?9 l" L' w& t

      5 K* H/ C  u. w# n9 `* W( ?" `
    • 7 m5 i1 z/ P6 F2 \  x9 x; d

      7 p7 @" c" x( C! ^6 l' n. q! x   int count;  /*计数器*/  0 M7 M5 I! W" C' E& y
      . w' z+ s7 a- T7 z
    • " E4 L" L- u0 C; c+ D+ p5 L

      ' f8 [9 @9 ~* G1 y% A3 U* u   char state; /*进程的状态*/  ; j3 O0 v& \. P# N& k8 w( x
      ( @& t1 n( k0 a
    • ! J1 E6 H6 p/ U
        b: P+ p) I2 P5 m$ E( J
         struct node *next; /*链指针*/  
      $ J! W# _: F0 {3 x& y

      1 @! `! _) K( F$ O
    • ! _, P' g' |# F! i5 c+ K
      * x( a: t, e8 Z0 p* z. m9 ]
      }PCB;  
      5 q3 u6 B( V$ y2 R+ r  [/ i
      ) u! P8 c! L; X& K8 d$ f
    • * e. f2 n. i, b" B  v$ d$ @
      : {$ _* S5 K5 P2 D2 K9 i
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      1 P+ I& p! m1 E- f* E. y7 z# f
      # e' p' T3 x& W. g: b9 \

    • 2 B$ L0 w1 i* y& I5 D

      8 P! S5 j9 T) _! q* a4 Gint N; /*进程数*/  
      7 d% a- O/ }* b* o  Q, G; M
      $ `4 P$ e" o% I0 Z% C! @. c
    • $ {# M5 s, M. Y& d% p

      7 T, o- F6 O* L- H, U5 `/*将就绪队列中的第一个进程投入运行*/  , F" u% x5 g& ?% e% x
      2 I1 |2 z1 F( L( G  ~7 H0 Q

    • 8 s7 }0 t4 ]9 B# e; |+ D
      6 o2 |! P9 E# O  q) P7 P  d! i
      firstin()  
      + o1 M4 T2 [$ W0 k3 R* H2 Q$ t0 {

      & p- N& i/ @3 N5 e, _

    • & f( Y% k/ a: C/ m2 f

      / E( |8 ]5 o' m# P  F+ s{  + \8 a& g7 W+ [7 c# o7 ]$ x0 }

      , U& X! `3 n0 t. B0 j. c/ X: h5 c

    • ' Q0 G2 }) D0 m5 `

        }" \) m( Q- C- N$ p   run=ready;   /*就绪队列头指针赋值给运行头指针*/    F$ [8 r/ A0 k: v% O* D

      ) R% r/ N9 S0 H0 p+ U

    • / a- g  w9 v8 ?* W
      . `4 v' {1 [+ `, J- C1 I. g
         run->state='R';   /*进程状态变为运行态*/  
      & T% U  l9 g5 W0 v9 [
      + }# l3 W! ]2 x9 R  `/ N
    • ! o, x5 y' C5 M6 a
      6 s/ _# F3 H, ^8 |1 P) f
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      * s2 D( A' g6 C% e" m+ Y7 d
      9 I, _( O: u8 Z9 ~
    • + v; n5 ]( u0 P9 B# x1 l) h, i

      & `/ K( ~  I$ i0 d0 X. M* |}  
      ! L- T2 _: Y! H+ D- s

        w1 E7 G& S! s( K) X
    • 1 v. S7 A' [' b' l
      & b' F% a' Z  Y
      /*标题输出函数*/  
      4 v& ^5 _9 w( M5 f7 g
      : S+ {6 l5 x7 l0 k

    • ) g9 P7 g: O; y; l+ ?

      ! q! }4 y+ f) o' nvoid prt1(char a)  1 i  V4 e8 q; E1 E; _- R* ]! c
      " [/ K0 t" B8 n1 m4 G- E! ^3 f
    • ( Z9 }+ J4 T# X  D$ q

      3 l! q3 R3 [+ ^3 y+ v* T{  
      : C" q! M6 W+ M, W" ?' r
      # U1 m8 l# t4 A9 g

    • , K: o) L. ?$ l" {# s

      . d0 M- K$ |' t1 n   if(toupper(a)=='P') /*优先数法*/  
      8 q9 w9 J4 R# s9 z
      0 Y4 z& b: _% t2 P9 \

    • 3 m5 D2 U2 B% C* B+ g5 s
      2 r1 E, L1 A' v
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  ( k' _1 K) d; {/ H+ w0 ?
      5 k9 N1 y& O2 d1 V% E
    • . p3 R3 C% J- O6 Y

      ' a0 z+ r( [* o2 s  v' t   else  
      6 |6 g2 H5 A+ ?) k
      3 X, R( ~' Y% Y6 n6 A
    • ; g' [9 Q: u4 z* c) I7 h8 ~- B0 w
      5 s: @7 l+ i6 j, c
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      3 @, w" ^% w  k' k0 T
      ( h% L' g) S( W. e% h

    • + J; a" z: i9 h$ @; D3 P

      4 P8 B6 M+ w9 ^# ^4 m}  
      . [+ k+ P" [" F1 I) x0 \2 @, C
      : T- e: r5 I4 E. x
    • 1 R# [& v  @7 ?9 K1 j
      4 _; f$ T* Q: b" J8 x/ S
      /*进程PCB输出*/  
      $ |4 o2 E, S! }
      & J! r$ ~2 _5 H  ^  y

    • + c2 x, m6 O& a  I% E$ z

      8 o! P6 v% W$ K' vvoid prt2(char a,PCB *q)  
      # t- H! v( d' z0 k" R
      2 D: y8 b0 A# e. O1 M# i2 f
    • - C, |" C: @% L. P. L

      ) q2 b% L/ C& ]$ F8 ^  k{  
      " U* N* F; |5 M7 J6 x8 U  z. x
      * `1 |. G* a& o1 {: o  `' L; k2 Y

    • % h* w# ?+ w! A" L

      2 }3 u3 r' V) k; j! R- h9 l# _, O   if(toupper(a)=='P')  /*优先数法的输出*/  0 x1 |# ?' K/ i9 I6 u" G% o8 m4 ~
      ) M% g) ?; a" ^" L( [8 ^

    • , S4 U. i& q4 S1 U8 `

      * l, q" z" J- V+ c0 N; p, ]* O4 p- M      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  9 `& B- z' a9 X. f) T. J7 u

      6 w  w6 t( I6 H
    • $ Y2 f( u' `4 B& k5 D
      9 [" Y' A' i" E! V% u7 G, ]
             q->cputime,q->needtime,q->prio,q->state);  
      ! F+ d  {6 i( o0 Z
      ; |0 h# ]0 p2 D  h2 W5 u8 [" w4 ?" E

    • ( i9 W& C4 w; b

      1 w- R: E1 X! `9 U  n% M   else/*轮转法的输出*/  ) [# ]& i- y; _0 s, w
      : X2 H3 k$ ?4 e( J4 R

    •   j5 R4 o: t+ ?+ G/ C$ F
      - J& C1 A& Y. Y, u" L) `8 c' [
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  1 [" j: N4 }$ M3 A# d8 e
      ( Q6 O, g2 i, R
    • * `; s6 m) M3 M  G1 g

      9 c4 f- r6 w! `" b% L       q->cputime,q->needtime,q->count,q->round,q->state);  5 D; S" K4 Y" p, d) M! x) N+ B

      ( \9 _2 [6 Q& t) Z! s/ h# k

    • ; T# x2 ~9 u6 I- P* w% i7 c* J

      5 Z( S( d( S6 H  ?& Q0 V/ `}  
      : V8 a2 }' o: O" R3 b

      # f& ]4 I8 x* p; k* j" C
    • $ y' b$ A% j: Q! E, N! h% ?4 n
      0 _; ?; L9 ^% E3 X; w
      /*输出函数*/  
      1 y% e) u: p( n. T" o5 k1 o

      7 }" N, P) r4 {' l) d
    • ' U- h  w* i6 M8 H+ H: H
      ( T7 W0 @. E5 a& P' Z1 H
      void prt(char algo)  
      ' F( s1 d6 A6 O' z# H

      8 x" I6 L( x7 \: J
    • 5 R* O  O8 J" d9 l1 x+ C' s

      8 u8 }9 n+ I4 l# O0 ~: z% H! S{  6 p$ x! R& `7 S" x

      - F/ p" C, w& y% N! m

    • ' a1 |- Z; ~- w9 H% R3 w" t) ^

      & l& a, g3 {& U5 o   PCB *p;  
      6 I4 p) @0 L' ]5 Z9 y
      ) H8 J2 W: B" w5 f5 K) X# F

    • - J/ {" {" y- ^7 F+ Y4 A
      : O. O4 q# b# D* e/ Z
         prt1(algo);  /*输出标题*/  + B! u1 R0 T; l# |' o
      ( ^( I; P6 G6 B# P/ r$ b

    • 9 e0 l% F) `# |5 r# ]; Q% V" q
      ; C) R( ?" P# P1 g* O
         if(run!=NULL) /*如果运行指针不空*/  8 ]6 O4 Z4 Y1 J$ M) i' {

      ) ~# W$ y+ E9 J/ i

    • # `: [" z! p7 k
      $ p5 A5 g3 b( Y/ h' G- M
            prt2(algo,run); /*输出当前正在运行的PCB*/  7 R$ l6 L# G8 Q' M1 F4 c1 N

        y8 V4 f7 h8 E5 H$ C

    • 7 [$ k; c8 L) w2 J; B/ G: B3 v) @

      1 E; l9 c( ?# x0 ~/ x* x   p=ready;  /*输出就绪队列PCB*/  . Z+ F2 X3 C4 o

      4 r  Y: P( o) N# r, g3 q

    • * o5 {# Q$ Q, Q) F

      : ~. K9 q$ o5 g2 v! d   while(p!=NULL)  4 S% Y* Y: |1 ], B

      ; n+ C1 C1 O0 M
    • ; r8 x/ |6 j7 O. V8 X! e2 |% P0 p, [" p

      * j- v* H) l+ g$ O: v6 w   {  
        z- w( e1 M" r
      ; P. O1 f8 a5 A! M
    • 7 S0 L) z, s5 B" w6 {0 L8 I
        B$ D  o; v; }1 j& ], S1 C# W) q7 Z
            prt2(algo,p);  
      9 v8 I2 p" ~. z9 y
      / I& D3 [: Y% q/ |$ u
    •   p1 n9 h9 Q7 U% d; _! ^
      0 l! P9 v) e6 k8 o  l1 E
            p=p->next;  ; n; Z* V+ O+ X" ]3 y
      9 c4 X8 u+ `1 t. ^) v

    • 9 V* K" I& r, B- S0 }+ c% u. k

      " P5 t" _& a8 F. A( p+ e+ Q0 J   }  
      0 O1 Y) e7 Z( Z

      9 A+ g/ x$ K" b1 M( I" {

    • " h6 o2 b! N( d

      2 ?- o+ J& b. {   p=finish;  /*输出完成队列的PCB*/  ! Z; N' p- `6 x- m, W6 Q  c

      + s: E0 T4 q3 u! k! I5 i7 x9 M  q: ^
    • 9 M0 }% ^6 r2 O, O/ C
      % i: q" R$ v  k' B3 ?
         while(p!=NULL)  
      $ V( D9 j3 c0 i- _" k, x" X+ [
      # J8 e2 c1 R0 v% ~8 r: t9 z4 s

    • * w5 J5 z' @* U8 D' ?

      * w/ }. {; K) Q6 j   {  $ z5 ^6 m# ~2 P3 u  C

      / x( }9 ~& O7 k$ R* q' O  d
    • ( Q! r/ t7 \0 A$ O( G$ \$ K  m" ^
      ! ~# l7 v& ?  _/ T4 a
            prt2(algo,p);    U( U, h& i( V% E

      ( K* K/ t- z. Q& ~" H$ I9 E
    •   [: Z  O1 i7 K1 W. d9 \% k

      7 A% r6 t2 B2 A- g      p=p->next;  9 t: g, D" z5 w' [- {7 t
      8 s8 m6 ]( h2 n3 q2 Q

    • . G7 b7 {) r$ {

      3 O) i: h& Y' D8 ^+ a* q   }  * F% b7 j3 F" n
      $ s) s6 n; D  R- ^& T

    • / i+ i7 O3 v' C3 W, E! T

      " }: g# w( a. g6 _   getchar();  /*压任意键继续*/  
      4 l2 l$ u% h  D$ J3 d  l

      2 h  v" y/ a* F' f) Q! }6 T8 }. B
    • 7 e/ }! e! {$ Q- _5 _4 {
      " V  r9 y8 I" t+ y1 ]5 Z9 L2 V  k0 E
      }    l& B; f! ?$ u: K7 _3 G  h
      0 j) P) {/ P; s" E& {

    • 9 T6 T! c% j! x
      5 O3 u9 [: r* O7 g9 N7 p: |
      /*优先数的插入算法*/  
      8 c! A5 i9 n* y  j  x% k" ~/ J

      3 K1 I" W+ S4 f( _9 B) X# _. e
    • 8 e* q% F! }( i$ B' V' \

      % t/ l/ N0 Z- n( ?' O5 Z) |+ iinsert1(PCB *q)  
      8 [* j. G1 R, j5 R

      5 M6 B, R/ B! X: j! e, [
    • : f; _2 N8 d7 c% c% _
      & _1 Y2 ^" k7 i* c
      {  ( h/ K7 P9 }0 F7 Y; c1 C0 n! \

      ) ]9 ^- j0 v; L) Q$ S) W7 G, y

    •   b8 [0 t5 f$ j: h2 L& P

      % G2 E* A# M$ d   PCB *p1,*s,*r;  7 D& o2 I' Y6 Z' [
      3 }: L; w+ S! @3 k: f$ G
    • 6 D! \+ h' p) F

      ' [/ q/ Z1 G" w   int b;  : C4 @( Y! K' S0 k* b0 _' @
      ( Y7 F- I6 t8 f$ N

    • & C2 `( |  J" Z9 F9 B) t2 A4 W

      6 ?& j* Y% |+ q. r8 U   s=q;  /*待插入的PCB指针*/  5 z$ Q- M3 Q$ r2 X; n+ z; H

      8 e/ F( s. }; C/ H: n" U/ p

    • * `, Y) S6 U$ s- M

      " ~- w( K, O' s  s/ n   p1=ready; /*就绪队列头指针*/  
      * p& x' T6 j, G% Z; A. N

      8 l% w& Q8 _0 o1 L: q5 M

    • 6 t" t+ ], G# Y, O9 f: \( F

      ; W: G* {9 E6 X$ F( m   r=p1; /*r做p1的前驱指针*/  : I! p4 e) l( S; _5 i0 a# c
      + y- T8 A5 v3 p  z

    • ( {8 X% V3 i6 o! Q& J
      * I) g' G7 b" s3 R: a/ j9 l
         b=1;  ! \! Y* G. Z+ o+ i2 x1 H* O) L3 e
      ) h, A2 n9 c0 U
    • 0 M2 ]& b1 U. R2 X
      2 y" @1 t9 X" E: M" z  }
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  % s- X9 J% t  `/ E% E7 E

      % t3 J0 R' c$ Y0 ?8 L
    • 6 n0 k4 X8 o3 G6 C, v

      7 z6 _( o' \# H& @$ U, d$ S      if(p1->prio>=s->prio)  ! O+ Z5 @8 J1 X  Z8 l  j
      4 d. a4 U$ d% Z
    • 5 _/ N' U" Z8 J9 d( g) L

      - Y' M4 M! S( X0 m      {  
      ( k" x5 x2 Q# ~
      : Q" w! u, H0 x( i# |7 R+ F

    • - J1 }4 @  e% N

      . L  {' [) u* i3 w  {: ~     r=p1;  
      . W' D1 O2 R4 J" P6 b' ]7 B% {

        j4 U( S( |+ S
    • " c+ B) p2 b/ y9 b& ?' O2 @

      2 y; R4 V# Q! Q& B' o' m2 ]# x! g     p1=p1->next;  
      3 z9 ^& m' P  G: {9 Y

      ( H4 F% t9 o% T. A4 T

    • ' @1 w! [/ X* |5 D# K; j

      . M  D4 t& z7 c% t, D  H9 P$ f      }  0 U  t6 i. w4 n: j# L- H3 ?) u
      . S! G* m3 v( J9 Q/ |0 ?; Z8 m+ z

    • / ~5 g) }# z: X& b: h& e( B- y

      8 h7 |( O0 O4 W6 c5 I- q6 G$ ^' e* J3 z      else  # T2 }" y9 }& Z  G

      8 s+ O( O6 }( L+ k, s. j, Q

    • , G9 K' T* B% @% R2 T9 k" [

      " w  D+ m* s' a$ x1 b: Y     b=0;  
      $ B0 y) k# E& Z* p8 X( |, ]0 K  \
      0 V2 y0 j& n$ O! i

    • 2 v) a5 x1 ~4 y' x' G; J0 U* I9 ]* w

      : k) v4 h/ L7 x, K# N  l9 G) S   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  + [* l  f8 f, S. {" X5 b
      ) f7 s( l' G: `* v, Y
    • , G9 Y7 q) I( N! p9 Y0 O7 Z# S7 e4 n: r
      ; H# @, [2 L& d; d' M
         {    I+ f$ o& \# r- O
      ; Q9 F- f3 O: t! ]1 L
    • 7 o2 B- g$ i+ O8 W9 P# Z

      8 H( Q( \( [$ ~5 N2 Z! I* R- N& q, }      r->next=s;  
      4 ^- r: y6 Y$ `8 Z2 T

      ' Z2 _0 d! Y1 y' S- u1 n# s, X
    • ; R9 w0 o6 T, i7 m0 b1 h
      ) @/ O+ W# }& p( A+ @( d
            s->next=p1;  
      $ j1 r5 Q1 E  U* g- o. y

      * @, j9 p. |5 ?) I

    • . ^. R: }+ a/ M& W( j

      8 m! G* h* w$ y3 f   }  " v* w; u4 K8 J/ i0 r6 q

      7 s- \& f7 A+ K! F2 R5 V$ z

    • % ]1 n" g' C3 M3 L, }8 K

      ( O' M: H! z* k: H6 s1 T   else  9 \5 V  ?7 E8 z- R: ?( a
      # d( G3 m3 {/ {$ a) [
    • . D5 ^, y% l5 k3 |, i4 R9 V1 ?

      ) t8 E" U3 j* U   {  
      " M6 ]2 x2 K! d7 Y0 X# U
      : {1 P& y% z0 T

    • 9 L9 @7 N6 M; r! ?- {
      3 n- {- J: E' S  n: _& h
            s->next=p1;  /*否则插入在就绪队列的头*/  
      % ]% v+ v" U  e6 I/ U+ _! |

        h0 V2 E& I5 ~& A4 a+ r

    • " v9 j5 C; }: K3 o2 A* w* q
      8 Y% L* I( w* m7 @: b
            ready=s;  
      * V! y9 v9 Y* b, U

      7 _/ s1 E) p$ I: }7 X& k- H
    • ) P& q" H0 I* l! B# }

      ) E: |$ G, C% Q$ f0 r5 A   }  : I8 w3 R6 t8 I8 _; r
      : x3 O- g& f: z0 ?1 A$ j3 R0 @/ d
    • / _  e* L+ s' c5 _7 ^# }. o
      " b" x6 O  v& M8 ?6 ]" q
      }  
      / g2 z4 L, ^; I2 [5 N

      ) U6 d/ c+ D( |5 f- @$ c

    • : H% N2 @- Z/ G& e& `0 `
      # `9 K0 T' E6 H9 P
      /*优先数创建初始PCB信息*/  0 s* H2 G. h* `( N* y1 B. x5 b/ X

      * h& j( u1 V' K5 V: m. B

    • % ~- N4 {* p6 C3 I
      # }/ x) l( O5 y; j5 K
      void create(char alg)  
      % A6 T7 z3 [: Z! i

      / {9 @# ?( q' P$ q
    • * H, G8 r9 s2 O1 D( b

      " l. s+ b  S3 n# W' D/ A) A8 p{    p9 H  E2 P+ R: t, b
      / {2 [; K7 d+ Z" Z- d, f  N5 W: F
    • 5 M' M, ?" ~5 a# D) s1 s$ [$ b0 }
      / j9 B! e! E7 S- O5 d  r8 h: E
         PCB *p;    V/ b" i  A2 x; T( i4 U5 U( |" f

      7 B) {: v, t# L3 S3 l! V0 n

    • 4 `) M9 \# p/ B( `1 R8 Z
      ' q6 {/ o* @, |- _+ L
         int i,time;  & j3 @9 @! t0 F, F9 ]& j- ?1 b

      ; S3 b' o2 j5 L! w

    • ; G; ^. f# C& e9 `( W8 D8 s  L

      . J2 A% I+ R: D, V" s   char na[10];  9 F; x* c9 R- O  U/ z0 H

      $ ~. g$ F# D/ O' |; Y7 a
    • + C7 n% y9 g  y" s) ]7 {8 }
      8 G# ~4 n9 y) R; t% d
         ready=NULL; /*就绪队列头指针*/  
      " w1 \  _& E. M2 D
      $ r2 F- E) n3 @5 J( t( u. |
    • . D9 E$ L6 _/ j" E$ t' t: `1 `6 L  j

      & ?! j7 y$ w: y$ `" p( M/ R   finish=NULL;  /*完成队列头指针*/  ; _7 B, r+ x, Y( T0 q, ]

      # g& ?: A: ^, e$ c
    • 6 G" |7 t) A% u# c, X
      $ e4 U; f  _1 ~$ Z5 D- l
         run=NULL; /*运行队列指针*/  
      ( R( l1 q: i/ H$ [

      5 U  C- O: ]5 l3 ]5 d% b2 G  q* z3 L
    • & f' S& A" @: z; F+ ~

      # a  Z& n8 |- p   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  6 l$ r! c+ p9 D4 ~
      9 F9 ~' j2 P( I6 e& S# j7 p  l$ {
    •   H8 H2 z/ R0 G2 E6 k# c0 x; g
      / O% X1 i2 B2 r1 h+ ~
         for(i=1;i<=N;i++)  
      6 e& _2 M" V) Y% f' b) f. I
      ! Y  I% j) c9 _! [; }
    • : B) o* W/ z. p, g* Y# U4 Q, ]
      & P1 h" v1 d! x
         {  3 M2 Q% ?4 L0 U' z

      2 x* h/ s2 }( N: q: W

    • 0 X  ~: {" G! {4 F7 J! K
      6 ?7 I* M+ b/ c: ^* k( H, S& i
            p=(PCB *)malloc(sizeof(PCB));  ( z$ a$ |2 i8 p

      8 y$ t1 K! M( [: t/ a/ N

    • * P+ T. q  e- u! x8 r: ~
      3 d6 r% |( ~# o# R1 H
            scanf("%s",na);  
      4 l3 ~1 x' c! t3 o8 h& X

      2 Y8 Z. X' _6 p+ A5 D0 G7 x  ^- o

    • 0 I$ D# Q; e9 M! @6 s: K8 i: o0 {
      / k; a) G4 C0 }( f7 h1 ]8 r7 S
            scanf("%d",&time);  
      5 K7 z! T! ]) Z% _$ Z; O6 t" b6 Q# t
      5 p( E" S4 d7 i- T: ?

    • 9 p$ K2 K. {  y- `' `

      2 f' }  x* e4 _1 h( W      strcpy(p->name,na);  
      2 B7 j( }+ [7 B9 i2 G4 e8 W
      9 d% T' j& k- b4 m, |

    • , `4 e0 t& ]1 X. M2 `$ [4 L% u
      7 G: i6 o2 V$ I! J1 @
            p->cputime=0;  
      ( `( N9 Q$ T% R5 [& D( F+ y2 ?
      1 L6 i0 T" }) _0 H9 K

    • ) z! u' s; S; C8 {* J0 |/ l- e) E

      3 ]1 j6 x! e! @4 ?# @) l      p->needtime=time;  
      3 k( s* r3 D, @- t/ e4 p# U: W  T

      5 Y+ {+ m( |" c. ~1 P4 y

    • ! N( I% Z9 h4 z7 K8 K& n
      - Z' \# ]7 V( Y- U3 I8 I9 Q* e; B
            p->state='w';  ' ], r1 D# S; x& c' `

      ( D$ B) _) Q( P) C4 m
    • 7 p( m- c4 J5 z8 r, ^

      ! V7 N: Q3 H( J; D$ L6 q: T& H# L      p->prio=50-time;  $ A6 i7 k$ A( J+ W# F. W
      1 f- s$ z2 j- d/ U9 j; a7 q- N

    • 2 n; W) n5 i* @' E
      & d* e; t$ F: j( t) y& {" ^9 F
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      8 r# [7 d7 q9 h. ~8 @) t

      " F6 W; h; R8 g2 h1 E9 O8 L/ a

    • % g4 v8 S+ u- a; T% ~7 g1 E

      8 M( Y+ E; s8 }0 g: ^1 Y     insert1(p);  
      1 z( n; ]8 d7 O; q' f  ?9 P
      & U  U9 X& ^  `

    • " n8 E8 C2 _) f5 g7 b) D$ R

      8 G9 B0 K* A9 A& T2 e5 L; X      else  
      3 W7 d8 ?- M) I! ^. J& `/ S

      5 Q$ i" @: `  y' E2 m+ S% l. e# Q
    • 8 l( c6 V' z% Y1 G! w1 K

      . S- x% M( u# B9 X/ X; E      {  
      0 N' y8 c, O* ?6 F

      ) i6 S6 u* F  D/ C7 B: e
    • 3 E* @7 T& \, ]

      ) O0 M" R9 ~. X. O$ I5 T     p->next=ready; /*创建就绪队列的第一个PCB*/  4 x4 W! f0 S  v3 |5 [1 O/ C' R* p
      & h/ `' }% m5 t/ }: D" S

    • - g" m0 P9 ?  w& Q7 ~' i0 Z

        o7 M" }4 t0 B3 B/ m3 [( {     ready=p;  
      + I* C! ]# ?4 q' |1 p% `

      0 W& O' h4 S, I5 r7 \; b' e
    • ) C# @: F" _9 S; p' q
      0 s6 s9 D- K7 L5 T
            }  
      7 v: Q/ T1 u, V1 G2 m, i9 s9 s

      7 y# q3 R! [1 m" l
    • & q) Z1 _( @# U$ [) ~
      " O; \. {$ {3 T* ?5 k2 b
         }  
      1 ^+ j8 S% ?) y0 E. ~3 k2 k
      " W" \; V7 z2 |- K9 f. n: K

    • ( c! i/ ?' d! i9 X5 P7 M( J
      6 p$ @3 r8 `+ }" o+ c+ O/ {# I  I
         printf("          优先数算法输出信息:\n");  
      - L2 v& j: V* v- H' P$ Z. e

      4 C. L5 o1 ?. }6 {

    • * B* ^. }; m  T" w" I6 z5 D

      $ B* C. N+ i+ C$ f( \   printf("************************************************\n");  
      # X% H/ x! }, L' h
      3 j8 U; [9 r. K3 ^4 m  x

    • 7 _5 T* a- b, ~4 q6 ^
      * P0 z9 |: R; }* {. s
         prt(alg);  /*输出进程PCB信息*/  ! H9 g1 t* t+ u" |

      , g4 v: q+ B! e$ [5 f7 q# @  J% i
    •   R. m) y; B( W: D

      & ^, |" \- _/ ^" ^9 R1 U/ N8 I* [; z' r4 I" M   run=ready; /*将就绪队列的第一个进程投入运行*/  
      - U, h0 ^/ a- v  H' u

      ! S$ i/ K& c3 t! s
    • . L$ G& w2 K- ]9 x. B- t: t

      0 W2 `6 G& M* ]  K- |/ V   ready=ready->next;  
      & ?0 W1 i" C  W7 L
      4 B) e# k1 H# ^" k

    • . G: s& Z* a' T* ^; X: i

      $ P: Z/ F# H6 k1 @: J   run->state='R';  
      - r8 z1 f% w" v6 w3 a6 y. |  ~2 J
      5 g9 z  v5 J/ ]2 V  F6 F! A

    • 7 Q" ]/ Q+ t4 Z8 D' W

      # W, [$ G8 f* ^* g/ k' E}  
      ) O/ {9 R* q. K4 \8 ?
      8 S" H- E2 B6 O% K

    • 5 ?9 ~  [( @- ]

      9 Y5 v; Y* Y2 H, v* I! Y/*优先数调度算法*/  : ?% z. n# z, H

      ( B$ o* N+ D1 `8 s) i9 A
    • / R: z7 @+ l. \% l! E9 V

      1 L9 }# h$ ~! {; y0 M9 r; k( E% wpriority(char alg)  
      & N# x! \( a. u8 s: n5 s0 o
      / i$ Y% A$ ?# W: C
    • , a5 P) a2 Q# C, p# ?, C
      0 N3 o" ]. c" q  J3 x# M. o
      {  8 [5 T4 I; H* S6 H  j6 x
      * u& J) c$ e% c) z, K) L

    • % R& n6 o3 h1 [% o& R5 r& b6 x1 S
      0 a* g2 W, z  T2 n2 |. C6 ]
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  6 t9 f" @$ }9 w! F1 A

      % ~$ g6 ~6 A# t; S

    •   w" W0 \! w, Q8 o: z& I
      8 h6 V& T4 m" n7 V1 `3 R
         {  
      * P4 e! S" W% c5 D  d
      + D3 h8 p5 V2 d' k

    • , ~/ T5 |0 \+ _% K8 k

      + w# O9 y( Q2 W  f2 \      run->cputime=run->cputime+1;  5 g3 \2 L4 f& h8 j! m

      6 l! u9 }2 h8 w/ p- x7 n5 @: E4 `

    • * D: P& I7 q$ W/ m; @. y2 `

      $ A0 j0 u" c, e( ^  \' h! A! f3 i8 d      run->needtime=run->needtime-1;  2 T; u  |. t! `! q1 @- s
      ( h, o+ s% h. B/ }7 o

    • 1 b; C$ M; I& N, n7 W6 S
      4 e" T. e8 I# N5 f4 T2 ^
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  9 F" S- \, j7 V  \$ u' r
      + ?( y$ n+ c0 B3 g& N5 `( y& m, H1 G

    • ' K5 G' ]* ~$ _! s5 n
      9 R8 L$ ^* B3 ?8 i8 p& [  W# f: Z
            PCB *p;5 |' \3 ?" ?, O. K, k
      # H  R! ]+ r" }( [0 U9 C& T. |

    • 1 {- j6 S$ [0 t9 H
      ) C7 E" Y+ Z2 Z& n7 ?
            p=ready;( p% L; E( e0 O+ k/ \

      ) x; ~5 N1 ]! k/ Q

    • : k! c1 B3 R5 {2 [4 d
      ! h+ \4 w) x0 @. R. K. @  j
            while(p!=NULL)  
      + c  f3 x  M- F

      # K5 {( @& \; {! t. x# f
    • : K2 A. d: m7 [4 N6 I9 `( z

      8 t- F3 q6 S& G      {  ! c2 m9 i5 d( C, y: K6 T

      1 r( {6 S$ `! Z  U% {

    • ! k) \$ x/ ?2 o" u! f4 s; u( o% p

      7 j; |( v  H8 B1 m% g( p          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    6 k9 m6 I  ^$ t' \. s: J
      : N5 g7 t0 g, X9 |3 b

    • + F8 w, {/ c4 g0 r# H
      ' c) U) ~; |5 U' {5 J
                p=p->next;  * M0 |- O' ~/ D+ S9 n
      ; F% z& Z- f' d' Z) b  g" f. [

    • ! T( T. z4 E8 r5 {
      3 i* Y/ {+ ]) _( z  x9 K) X# }
            }  
      / b0 D4 g# ~7 ?7 w" t7 |$ p

      1 q2 V, v) t3 x' k/ }
    • 4 u% U! T9 ~+ Z% k

      0 z5 y! J* w- P* \: E9 e      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  2 T4 l% z; I7 X6 ^8 V6 L, J

      , b2 i2 _: ~" s# y: u

    • $ X+ R1 K7 f5 f4 ~6 R# R; n

      % {( f( N( b1 a& t      {  ! v9 D" f/ k6 j6 c/ o! K
      ! c: T' B3 f% M# l. J' x) S
    • , q4 R* [1 \0 |8 }) X( K" P2 E3 Y

      $ z) L9 n* [; j$ y( T$ z/ B; W$ H         run->next=finish;  
      + `! B! P- S, W5 h8 l1 d9 u0 O
      $ u  P  V4 n4 H* S* r! W* b9 }

    • % D6 H( A% W/ H0 y: U: r+ e
      1 a0 Z5 ^! N! d+ C' u3 Y. G
               finish=run;  
      . d$ K) N) I7 A% I- O$ n
      8 B$ ~. O4 v" [# t/ l
    • ; w& z! k4 i, w+ Z: \

      # {. z: K8 q1 t6 F, a2 |* B% Q         run->state='F';  /*置状态为完成态*/  
      9 F. e# H; U) w+ F, g
      8 F. r5 A: L7 s( y3 s
    • $ I3 P3 L) z9 d) u

      5 b3 A$ _' U5 t9 P7 n         run=NULL;  /*运行队列头指针为空*/  * V. p3 O0 _/ C" R( }7 B
      0 w+ ?0 @/ i! s2 N' K" {

    • , Q: l' K0 x3 l, o

      " E) T5 J2 M) `         if(ready!=NULL) /*如就绪队列不空*/ " z' }8 [: \/ v7 T
      ) g1 |1 n% ?' L+ n* o0 `' {
    • 3 ]: a% C" y1 ]6 w% C6 T
      - E% g9 ~9 s' a
               {  
      3 a! a% \1 y3 p" G! m5 I) P3 g
      2 l, x, O6 d4 F8 y* D- d
    • & _2 G+ @: h# y1 F# J* V
      $ h- M0 p! q! |% H+ L  @+ F- q% ~) O
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
        K( t2 u5 ^, }

      ' j) a% u* N8 @! T0 ^+ |9 i

    • ; ^2 P! \4 A% C4 K) U+ C
      . M; C# `+ j# g$ G
               }' K  D* I9 F+ @$ z7 O5 _/ J( o
      9 d4 ]- m5 P0 t8 F  F5 W+ s
    • * k: m" S2 K; z) ^
      # |; I% @: J) L# B# r+ ?
            }  
      / o; e: l' u% s/ V+ p

      # H0 _0 s8 S% Q
    • ' J& l# A" N6 a: p. x( u3 a4 b

      " F, X$ ~& E4 U0 q7 s% P* ^- D      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      6 d6 B1 _. K3 p

      9 ^8 Z7 N# r5 k8 B4 @1 X8 R7 K

    •   _) @) G3 n7 w

      3 R- K. @" @5 c7 z2 v8 i     if((ready!=NULL)&&(run->prio<ready->prio))  
        r) X; z: x! D2 m+ n/ x9 t0 V

      9 @! s6 b" u. m( S7 s, @

    • 6 y/ ?8 _* q4 C& E8 C4 k; r
      * T" @8 ~+ z8 \, w2 d
           {  4 L+ t  r$ R$ l$ ^& k

      ! m2 e8 |+ O7 P& }& R' M5 f- C
    • 1 E+ J( U; X% c% T
      2 V: A5 Q* l# J, W0 @& ~
              run->state='W';  ' ^- a- c! X6 `7 O' _

      , f" h% n  k% I3 K# J+ C  ?# \
    • 7 u/ d8 s! e& P: `2 X- b

      8 _- E- p8 g7 ^4 D  |- H        insert1(run);  6 a1 ^% |/ Z9 s) `

      5 d6 e4 H; t* H$ T$ o

    • 8 U" Q& v0 t$ ^. P
      2 ]3 T  F1 _( _( C! H
              firstin(); /*将就绪队列的第一个进程投入运行*/  
      ) l) h4 J  b( w
      7 C% [! r" X4 b& S2 k' F- D& ^7 U# R
    •   r8 J8 D  a# {

      : h% g$ K( ^) t- a$ l- h$ q& `     }  
      - u0 k# T1 i7 b* r, t3 O

      4 z* Y) S: E/ p! V$ [( G2 p
    • 1 k- ?+ \( v0 m# C2 p/ C* H

      ' B2 {4 g9 C/ H9 t; {- n+ b      prt(alg); /*输出进程PCB信息*/  
      5 t. e* ]& x1 q1 _/ \) P

      - @# ~( E7 e3 ]( y' a% x4 Q

    • ; a5 b8 Y6 D1 n) f' x5 r* ]) n+ `

      % }3 s7 Y5 w8 ]5 p9 h6 z0 m   }  
      & C% K, b9 I. [/ i5 g
      " S! T8 ]9 U1 N4 e; \- h
    • 0 x0 o& P  E( a  K) x
      9 J; D: ^! |6 X/ f
      }  
      " q* M5 C1 g4 A& H& v

      # m8 [+ k! @! d/ s( M% k
    • 9 A8 N) Q1 ~# O8 Q4 R" F3 m$ n( V: c
      ) Z5 r$ X# o' v9 @* D
      /*主函数*/  
      / W  Z* `" S8 z5 U; \

      4 W* Q( j  E) I" m' W/ i
    • 0 z- ]. A9 N0 l5 ^  m

      % o- Y* X. d& C" bmain()  - L2 d, t8 |) j" s- W

      2 ^1 O! h9 x' t' s

    • . w6 S' L; h  H" s

      7 J! F9 W8 {# h, _, Z7 H{  " e: `7 ^, M8 |  A
      7 L9 q4 X! U/ u6 H4 |& t

    • " Y4 Y2 d1 V$ {( N0 N; g) G
        |2 Y6 H& M* Q' P! x) x% |
         char algo;  /*算法标记*/  # ^! e6 }' E& \# K& P) D6 J. ^
      6 M" J6 I' h! ^" {/ W" v# h0 S+ J
    • 0 R" F# N& Y7 ], {4 x" u1 p

      # N( m% i$ s  S7 }9 i   printf("输入P确定算法:优先数算法\n");  
      1 T' d2 x8 l: h( C: j) j6 H

      , ?- {6 u: j7 N2 m
    • # J5 _1 A/ A# @) G/ s. Y1 |& Q4 p0 x
      0 H+ V0 s3 o- C+ @1 q$ Y& _
         scanf("%c",&algo); /*输入字符确定算法*/  
      - W0 v( R: Z# a% O, Q$ A1 g
      : s, W, @$ `4 R$ }, {
    • ' [$ T6 P. X" q- f& g

      $ B; J9 r# s! ~& w   printf("输入进程数:\n");  
      2 R; _) i4 ~, _: G

      * A+ X5 w, g0 e, Q6 t4 E1 C1 M
    • ' J9 @% p0 B0 p
      6 I0 Y% e3 I' ?
         scanf("%d",&N); /*输入进程数*/  6 ~# s; H7 u0 b

      - ]% ]( M- l8 V$ B, [
    • 9 \7 K  Y$ K# c. p/ U( L

      # s5 a4 N$ x( r  D   if(algo=='P'||algo=='p')  3 M+ f  i' U( b* K; u

      0 L7 Z/ c( h2 S/ g' i6 B% }  h. X
    • 5 [$ i# \- W7 Z/ @8 b

      ; w' H# C) q$ j4 ]- u* w3 e$ E& X1 c   {  * w  I1 O# f% A  C1 l, M! ^$ u1 e

      ' N7 _$ Z' M% h) ~0 a+ x
    • 6 A$ b/ l4 T# f7 Z- W7 i

      $ q( F7 j; J$ C2 O4 o: E      create(algo); /*优先数法*/  
      - t6 @: j- ^  t( X; R

      6 V4 P2 F. G3 M
    • " Q7 n! W, w: }7 b( A

      2 ~- `. w0 t  i. ]/ q7 d* z3 T1 B      priority(algo);  
      / \! l0 I1 F0 }

      / g) i& y1 z; s7 Q, R7 m. Q" U
    • % F! l- S# y9 u$ F. m

      1 x2 L$ b) r" U6 k# t, p/ E- q/ d  }   } 1 r  y# a  r3 ?8 @: ^

      ) w7 n# S1 P" Q- x( n, A

    • 4 p( h2 I8 ^" l! e/ R' X

      ! M1 r; m8 ~" H4 `1 F}5 ^# |# J# B! }2 F; B
      % `, J! T6 z# M) i- _6 l
      * j0 B; G% T; R$ S

    4 _! M6 `. g8 I" A
    输出结果:
    5 @! m( h; E7 q

    4 k' K! Y' k# \/ Q
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    3 f4 w- n. X! r  q
    ! a! a  g# o3 ?
    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-10 01:52 , Processed in 0.681971 second(s), 50 queries .

    回顶部