QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3194|回复: 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
    ; Z' f% S! [2 l+ \" ^
    优先级调度算法7 ~8 }; ^3 m( M8 m" E9 D0 _0 N! n

    算法介绍
    , A( J/ Z; f: u5 \0 p6 U优先调度算法的类型(用于作业调度)
    ; N' F' K$ x( g& s2 W3 g1)非抢占式优先权调度算法
    0 I8 t4 y# _" L$ S8 h系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 $ B% v: C" W, T( T7 ?7 Y
    2)抢占式优先权调度算法
    # }4 @- n' P& Y" L% n# n只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型& W* J, @$ l" i- ^, S
    1)静态优先权 " c4 y! s6 o2 F& L" i  j
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    ( P4 z4 x( P, P0 A0 k4 Z

    2)动态优先权 3 r" ~0 B+ O+ V

    算法实现

    抢占式动态优先权:


    * P( _/ C" m+ V' s: i: w# lPS:本人认为非抢占式静态优先权没有实际价值。


    • / `, B1 g- @' _$ \% T9 r2 i: t
      6 d) O4 F# j$ A+ l  R- m
      #include <stdio.h>
      , s4 }' Q5 D& i& ^/ i1 F

      - ^5 Q3 G" q7 D' z

    • * i. w* c- D$ O2 u6 @" n: R; Y
      ! V5 g+ _. \. g3 n0 \% L. O
      #include <stdlib.h>  
        E! s6 I+ g- ]3 g) [- W* ]
      0 j0 a$ T% T; F& [2 v

    • ! U5 X0 D1 w2 D4 n) C
      ( a7 y6 _2 _# N: ]2 y
      #include <string.h>  $ j* i; ?; Z. j# O7 }
      , r7 N. w& d, G+ O

    • 5 s6 O) ?8 E4 [% t. r( B2 q* D
      2 D7 j4 A) ?) [8 y# o
      typedef struct node  
      % m" g  W5 s" y7 ^

      % K+ s& M2 l* j% w- e' @4 V8 A
    • # ^" l* s4 M) k5 `! ?

      1 K! C' ?, _# h# K( z5 P{  * D# A# {! f  b, y
      6 M) X8 M) K( S, v
    • 4 H  @1 |/ w' j' O* r* }4 [

      6 S; ?" O4 e/ t   char name[10];  /*进程标识符*/  8 T5 V0 Q. g; G9 M) Q+ c" B! c

      0 b7 {3 N/ U. M

    • , X+ o- X+ L9 o% L$ _; s9 R; p& Y

      3 [; ?; Z; L$ u9 ]   int prio;   /*进程优先数*/  
      6 w/ l4 C3 V8 h' {3 p$ X
      4 t6 s( R; T$ ^( S- l$ j4 P2 M% T

    • 1 l* S& |4 J( T- O

      $ o7 ^+ S  f% \' |$ b: y/ p% L& J" r   int round;  /*进程时间轮转时间片*/  
      % ]- ?; \- B- w: V1 |! b
      : V3 Z# I7 t" l, v  r1 s( p

    •   L( [! f: }8 r2 }4 z1 K

      # F# E8 z9 l2 Y, y6 e' l. [. A2 a0 E   int cputime; /*进程占用CPU时间*/  
      2 Y" ]. ]4 z* r+ ^

      & O3 O) e; ]; U8 T& v
    • 0 O* Q- c" r" X2 q) t: B. v
      ; x  `  s) n1 J/ |
         int needtime; /*进程到完成还要的时间*/  ) H; I$ l) ]# a# P

      4 n  Z" f- k5 O( U  v4 Z2 E

    • 7 s7 ]: X& i% e- g$ ?

      3 C# x& U4 Q% Y2 Z, U" a' l   int count;  /*计数器*/  
      - e7 Z1 c' L/ k& F3 O) H% t
      0 b1 c7 J) j' U0 ~: M6 L! ?4 h
    • 0 b! }& Z6 C2 |8 b, \2 @
      3 H$ @+ s' U$ V6 R; M
         char state; /*进程的状态*/  
      0 N/ F0 h' d9 W7 M! S
      $ r( F3 C) D1 H6 \# i; a8 B& M* m

    • + d( f6 h2 k5 G1 Z- e

      " i4 r2 \0 q4 h: f   struct node *next; /*链指针*/  4 w2 {, k& k, ^. C9 S

      : {3 [: m8 @  ]( s$ j
    • 0 C1 ]' p( {5 D" I) U  v3 v0 Y
      4 b# r( J5 s6 e6 }& I" E& r
      }PCB;  
      ; \" E! q: ~3 |: V  \4 T7 ?/ Q
      . ]0 @( g% [; d, [' a

    • $ g8 `+ X0 H5 a( Y6 K& U! V1 {
      , X+ `$ E' |0 {9 T' {% v) M/ g+ n9 S
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      , \$ S& c! z. ^( V; q1 _& b

      $ D% X) p/ }- V1 |( P) @- ^

    • , `2 \6 ?! B! l: w
      / ]5 |& W! h7 G9 @) e7 o& I$ Q2 [
      int N; /*进程数*/  " m' M7 x6 R/ M7 ]; ?

      9 f5 i( g' ^2 }3 I) ?! ^

    • & p$ K- I1 a- ~: L; k

      ; \- r0 Q" U' y6 ]0 w/*将就绪队列中的第一个进程投入运行*/  . f' j  y5 |% F+ X8 V

      8 {6 }- m/ Z2 S" Y+ l
    • $ C: D) t; w& v: u7 U2 f

      8 H3 y% f% T! }! _% g0 A2 y; m6 |firstin()  - j4 x: p+ g" N4 m" u% D. `
      : U) p/ Q# c0 c. x2 k) R. O
    •   i+ N( r" h3 N. k! `

      ( `& l# D# W) x0 Z$ e  y{  + K9 f; q5 V6 u

      , {% ~& a5 k( R- d2 G

    • 2 Y) b; P7 W6 l9 r) P0 V7 c5 b

      4 |' }- m6 m( F( o1 |% ^+ _   run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      ! E1 C8 N) A1 r3 K( s

      / S# V) [: @' u! d& I. e3 R

    • 3 m2 A, N( [& [/ X; g) r
      9 o( m& b. `1 [: F
         run->state='R';   /*进程状态变为运行态*/  
      : `( d# m) \  U. T" q$ N, N
      7 M9 t: Y" E7 G, G6 ^3 j, [
    • $ P- r, }8 v  N% e2 M- ?' z& \

      7 V/ S; l/ k9 Z) ^8 @4 L( H1 F9 V& A( @   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  ! D1 \+ R1 O6 Y
      + |7 h% }! W# w" Q  L. h& o& ^6 W

    • # E1 j9 j  f9 f
      ' C( n8 a0 F% W: Y1 h9 n
      }  $ h) H/ W$ {' `0 [7 a, ^
      - p+ X& M" u# U5 I; o1 g0 _0 f
    • 2 W( @, k5 C  U" G+ _" r
      % R0 [7 i7 \# v6 f, z2 A! `5 c5 }% D
      /*标题输出函数*/  $ H0 Q: w8 E5 d/ G

      9 m6 O: i* E' m
    • / m* a/ m- L& O/ S$ I3 K- u

      4 p; |' m" ?. P* v% X, U) J* qvoid prt1(char a)    D  M. w, ^7 j# d, M" P( }7 P, c4 z
      4 ]' R) m# J& M$ Q0 Z/ r' k

    • " w; S" R, c7 T( r4 y
      ' T+ `. x  \# K9 E
      {  & R! I& B% Z% h/ {

      8 t* N+ [! o& {& [3 `. n
    • * b" ]" |0 U2 P3 S6 p: V% F
      $ W" ~  M: k5 M2 a7 }) G
         if(toupper(a)=='P') /*优先数法*/  6 K& O3 V5 x* b9 `  H5 s& l

      3 ^9 w, Q: Y7 L& M$ }/ ~7 B+ L3 E
    • 2 _- x  B8 F0 J( z1 _; Y

      6 N; P0 d  K: _' h      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
        Z5 W+ a* }3 K2 [

      4 [. Y' A0 C* l" ~2 M3 x8 Z5 d

    • 2 J! [2 l$ S; V

      0 I) O) @8 F+ x+ b8 B   else  
      # {; h" H* Z8 N$ |
      2 B# ?( Q) [" F2 H! [% ?1 F

    • ! ~" q& E. E8 a2 y+ Z6 ~
      " Y, Q& C5 f' Y7 T+ r2 |% L0 c
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  8 ]* \. v: n& e; H* W" u2 \) Y$ y

      4 U/ `# [6 n/ w/ I0 c: Z9 S

    • $ ?; `& R# e9 g! ^/ L. x

      ! B2 H5 a4 b" m$ f2 ]  X. B}  ( q2 U8 b+ O: z. p+ |  k! V

      ; Q3 c0 [2 t; k- w: x" v$ N) F

    • - j/ g7 ?$ X6 w1 x1 i

      2 u! f1 @5 }8 Y- ^% R$ I/*进程PCB输出*/  
      4 ^+ c- h7 ?) z, t+ b( y, j
      : r9 b% Z% O5 i- B

    • . {8 Y9 ~5 V' ^6 R% M
      7 _: C. _9 S9 [) n; P% P
      void prt2(char a,PCB *q)  
      4 Z7 P9 L- a$ h) W7 O
      0 ]% f; U/ E' g' Z- g# R: d
    • 9 K- A! ?/ ~1 E/ Z- F5 x4 b: h4 a
      8 S  f4 p7 L0 q
      {  ! Q( k6 ~/ Q, u' ~9 B# r, s. c5 F+ \
      7 w4 D- n' M( p6 v8 w7 C

    • * X  n; t  N4 C3 o1 D3 y  T
      # [/ z; T) V' X9 i
         if(toupper(a)=='P')  /*优先数法的输出*/  : l, F: F* G$ q3 P! u
      / m# L& t9 d4 n+ o1 C

    • - `7 n, q, s+ I! ~$ v6 H
      1 f% I+ J' A) n; L
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      # h* l" @5 w4 K9 e# I# o6 U

      ! H; O2 W0 ]( e0 E5 s) y4 }
    • ) P# e% W6 I' z) ?4 V
      + ~- q, r- \% ~3 m; b
             q->cputime,q->needtime,q->prio,q->state);  $ b% S" w9 K1 F

      2 B, I3 i7 L/ m% G  o

    • ( I/ I) {9 H+ z
      ! T! j! d1 y$ `" S3 ~
         else/*轮转法的输出*/  
      3 B  Q# F! p# ]
      4 _; _) y+ H! ^' P

    • 2 P# D' b6 ~9 q) u8 |& q0 ~/ V

      ' ~, R) L; V8 d& o4 H      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      ' C: `: w: F  Y% o+ t# q) h
      , T: k1 [* h9 j3 G0 D! D4 r+ h
    • 0 j4 K* i1 [$ q
      0 [! ?1 Y, l  d& t) ?7 n+ Z! q
             q->cputime,q->needtime,q->count,q->round,q->state);  
      $ j' T$ G( E! u; l5 L3 L
      5 s0 v9 i2 D  l2 ]6 C9 |1 H3 v

    • " i1 P. G# T. z, }$ r2 Z
      & W+ q1 S3 \' k# R5 p& H1 G
      }  
      , G$ Z5 p: C2 I+ O$ D7 d  Q. N7 T
      3 F, c$ h2 a  i

    • / N% o* K# u  t7 `* D) ?; ]
      ' z+ f7 T/ G# C: s: T& C
      /*输出函数*/  
      . }* ?/ Y1 }6 v7 x. d
      6 I9 ^, i2 P! k5 T
    • " A  J0 z5 I. c: B: y- r8 f7 |
      , \- r# i" y% }3 }: L
      void prt(char algo)  % w3 _4 e2 k! l4 Q. t! ]

      . s+ Y( e7 ?. M: S  H& b4 Q
    • ; E7 H# F$ a* h/ P# L% ?0 j! @

      . D+ V+ J6 _, V, L" n: E$ r' U{  
      , q" v& v) e3 R/ _9 F
      / D% H/ s! b: J' l5 h; }

    • ( L5 u7 m, a. v3 o* J

      $ o6 W7 d; z+ F. j' c   PCB *p;  6 `; y- A5 K# h# J
      , \; r6 p8 U& q9 J( _
    • # {, ~( z' i  {$ v, ?' G+ h7 {

      0 _, [  [/ J3 d; F$ }0 v   prt1(algo);  /*输出标题*/  
      7 V. U2 ~+ g, O3 X2 l7 X, n

      ; w! U$ _5 K' y
    • + S" B0 K6 Q) b- ]+ G" v, N

      9 p" r0 I% @  X4 X* j2 ?   if(run!=NULL) /*如果运行指针不空*/  5 Y' r& ?  t% q$ W7 y
      7 ?  i; r$ N( l5 P/ O, F% ~2 R
    • 8 q) U1 E" m+ e1 Y2 L9 Z

      & j) w2 P4 \/ `      prt2(algo,run); /*输出当前正在运行的PCB*/  
      9 w* b5 w8 V4 e/ s4 M  N1 A
        o4 J! e$ z- B' u5 a, C! h( W6 a

    •   u! j6 {3 C) D+ @! E
        L# k7 h& [5 J* m  u" h9 F
         p=ready;  /*输出就绪队列PCB*/  2 N# `! a/ l  R! r6 [1 r- C
      ' r& v: s. L; D8 e2 y* v

    • ) ^& R: p8 ^+ ?, m

      ! T$ t* x) e# G) g   while(p!=NULL)  * `% e: `( t- z
      " ?3 w9 V, i* L
    •   g8 P2 q% G  Q

      ! W6 G3 m) W2 g   {  4 m- F4 T6 V. f/ \0 U. K
      6 w+ F; m1 a/ ?3 _! i  e3 j
    • 6 K3 ^9 q! }! Q  k
      ; h* ?. }8 }# p. J8 J; i4 G
            prt2(algo,p);  
      ' R) a: I8 g) g; z! ~1 S" J% j/ P- f
      ( r2 x, W6 m/ e8 M  n

    • 4 U) v+ Z3 T3 A: V$ M

      0 x0 f' U; _# |0 F3 z* n, D  E' d      p=p->next;  
      5 x, T9 z: E  P+ @

      ) e$ v% i% M9 f" g

    • / [5 n3 V8 K: c, ~7 K: P0 l

      7 d: j5 }( V- h% v   }  7 F4 @$ K! f5 l* P$ n3 S
      8 I% z9 r( J/ {8 H9 l& C: S

    • 7 p2 ?; F$ y0 @5 q  ]1 ^# f# A+ z

      / l  k3 r. L( l* x# e5 o6 B   p=finish;  /*输出完成队列的PCB*/  
      5 V, Q+ w. k/ \( {  B0 d

      4 K! F/ W! T9 ^5 b1 m
    • 4 z0 z. k7 S, I4 [5 z) p2 Q
      6 \# L, J: n; k+ i& c
         while(p!=NULL)  ; e5 L* x! y/ Z) h  ~) K0 R9 R7 ^) _1 U9 i

      3 ~3 ]; T% f  a( U( t  C7 M) ]: f* g

    • ) R4 r" n8 R) B7 z1 S( G

        n+ p( o7 I( f' w   {  
      ! q6 u; M5 j/ M  l$ N& g" t

      8 M) L: V0 r: _9 c% S
    • 6 C1 P8 k: @! g
      & j1 ?% I  r, j
            prt2(algo,p);  
      & F3 C2 H9 J# q8 B' g* R2 _# ~$ @

      3 C% {0 j. y; i# k7 c
    • ) L" s5 `! B. k  _& y8 {% X5 }' d, |
        Y$ A8 u3 i- `# S
            p=p->next;  9 X* G! ?$ J- C, U0 ^8 {6 w4 `

      ) y& o" Q2 Q" [0 N5 e+ i

    • : I  w" S4 d1 s0 D+ [1 M% Z9 f, ^
      : f! L" D& U- j! f  _0 r  `% }+ r
         }  
      3 w; f( q6 G; Q. q# \3 s
      , Y) d$ y8 W; @, c

    • # V1 }! z2 e/ O; s- z* ]4 n) R

      , C: w7 `2 K/ }- A- O( B$ ?   getchar();  /*压任意键继续*/  
      . }7 @7 q2 I1 Q. r7 h  ?! U# g

      & g9 M  o& M2 G, u
    • 4 Q. F# s1 q" `

      9 b1 P+ G; p; b; E" ?}  & H: G+ T: |* J3 D3 A. p

      " K$ y. ?8 U$ x* n( f2 {' D6 T

    • ( X7 X+ w! t4 l( B- K/ }6 L- \

      : a1 ^  B# i) ^0 w! @9 I/*优先数的插入算法*/  
      7 F! A4 F6 V2 t' i+ E" Z: e

      , i7 g; z3 w0 d- ^6 s* W2 Z( l
    • ( U, u$ m+ d2 O1 ~9 ?
      , j; h! x% G0 j. A
      insert1(PCB *q)  0 r9 M! F! c7 p. W3 V
      1 |, T: j4 x! o' s4 r7 E! W- h
    • 5 b" d6 _( j/ |9 |9 T; i# v' D

      ; Y2 a$ q+ `0 O* C, ]' Q3 a3 g: j{  
      ' T: q0 h, ]. `# r' f1 ~
      2 k" o+ `$ ~& p* X* z+ k2 I9 Z
    • 1 L' W: |; i5 C3 r1 j+ y
      , _! x& I. h5 y. m9 F. c; p: X
         PCB *p1,*s,*r;  
      % G! \, t* }0 v

      + w4 ~4 ?$ _, \2 Z3 Q# q+ i

    • 6 l5 d9 k7 k1 A; v' U9 B* Y
      . E1 X8 F2 C/ J  F, h
         int b;  3 F* \5 Q& [: |& f
      $ X* Q) O  [' ?( f! Y
    • : ?1 P$ G, j3 q3 F- `  o& L: M

      8 t! L/ X' ^; }1 ]" p6 x   s=q;  /*待插入的PCB指针*/  
      ' D' j4 @* g& ~5 y  i& c: W! |
      * h+ a( G9 {& o3 ?

    • * y1 H+ n& D7 h- Z

      5 |  P1 S# O+ N+ w  k# Z$ W   p1=ready; /*就绪队列头指针*/  
      # f7 I- x( s/ ]/ P0 l) y) e
      $ E- d+ H- T$ D
    • ' N) `0 D, V& A2 b5 O% n

      0 h# M) }+ z, t# n( V   r=p1; /*r做p1的前驱指针*/  
      5 a1 K% g7 z5 ~8 u8 L$ Q

      * @3 X, F1 o1 Y
    • + D* x/ [2 a2 H6 s* S1 k
      " [% |' X7 w8 N' C  A( e( Y
         b=1;  - @, }4 `" O% Q- R5 y% @4 y
      $ B8 m/ A- K; w7 z, w4 |9 l. [4 a

    • , G7 t9 f( z9 d( f& `

      ) }1 f3 ~: b7 E; y   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  ( A) r( I3 L" m& n: {2 W
      & ?+ F5 R: M% K* q2 Z
    • & o' ^8 z$ j( j0 o
      1 b- Y% M, Z5 N3 ]. q! `
            if(p1->prio>=s->prio)  
      / P. f: r& g+ B. ?$ u9 w8 x8 \! n

      $ @2 U: v, @* G1 N& d

    • ' v" @  ~2 Y; H- |. P2 e+ s
      8 V: X% a; _$ p% L5 O" y* j- Z0 V
            {  - ^% u$ Y1 {: b4 u1 _/ V

      - W- D' I  j2 o& @( W  W. S9 g

    • 3 ]% i) W/ c; f, h9 q
      " _2 o; U. @3 ^" d8 }8 c" |: V
           r=p1;  4 O- b* F1 O% G% U" S* ]+ X5 e

      ; B6 {- p8 ]3 D. _- `3 }, d* g

    • 2 Q! n# o9 p& l" X- Z; F5 K
      3 o- D! X0 p* c2 ^# w: j) b9 N
           p1=p1->next;  
      2 z' M  Q  _3 ^; L
      % @! D( S( q  p* I; l* H: U3 C

    • * G, h6 R# @  d  ?
      7 ^+ l. a* @7 x# F: L% h# F
            }  - w4 y6 B1 \4 o( d* n. N* V/ Y! i

      5 P: c0 ]0 b+ f; h! p6 u/ H9 L

    • 0 ?: m' a6 ~5 m1 I! \
      * B$ x& O; U" B( B1 Y
            else  0 O: n* o: A3 O( i

      8 Y& z/ P; t( s  H: `  h# B
    • & t8 U5 D4 D6 v
      3 y; g' t  u+ ^: C9 W6 k9 V. i
           b=0;  
      0 E" h& y" T% d

      6 {# m! ?% x, `9 c8 ]

    • ; e* Z! r9 q1 i. \3 \
      + W" s" I% o5 I2 v/ P& R7 C
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  + g! \0 j1 F3 L
      ! `+ q) i( s5 B8 a, T, O

    • 5 j4 b6 n% w, s. S; A* f1 K, [
      4 H& Q/ q" d, O0 L' ?! B
         {  
      . X( q- e8 C& y1 ]/ U8 A& D5 K
      & p9 X7 C* e/ h

    • 3 r* d4 t5 B% U/ [& D" p& F" j
      $ t: ], `. y' v) {/ g7 T( `7 e' Z( D+ o
            r->next=s;  " F2 {& h1 j* |
      ! P: G$ A$ p0 c  Q/ K
    • $ R3 [. _8 D0 g6 t+ D& K

      - [. ?! r! p8 a* ?; _) S' _" h      s->next=p1;  
      7 g- Q' P4 P2 n9 a& W
      ' r' Z. u/ D2 R2 m+ F/ c! y0 o8 \

    • ) [' _+ \8 M  ?1 c

      . N2 x6 V7 S. w. _3 ~+ w8 _" c   }  
      % ~' C4 b3 ^3 [/ g/ s: U
      0 H2 }2 c" V' V; h0 f- t
    • & \* t) Q. x2 w' [

      * R5 F# @6 R6 _& n4 a   else  & V# q6 U  f/ d

      7 ^+ I6 ?3 Y& M' I) {% o  e: [
    • . M! e2 Z8 a3 {: b! Z, @( q
      ' p9 k  U. L" {( R2 H% P
         {  # Y" c) }) ^% U( y

      8 w% X# f# Y. p; N5 S

    • : p' H4 k$ `9 S6 Z: R

      8 t5 r) @6 ?# o& z      s->next=p1;  /*否则插入在就绪队列的头*/  5 C' J! u* Y, a2 w8 y2 g
      ' m- s2 ~% D0 G+ g8 ]7 b
    • " z) W3 W2 M7 j
      / S4 ]1 x4 O( \' F8 I' p
            ready=s;  
      6 O0 h$ \0 I1 r( z; O
      ) n, R- _; p" v  f( h" ?" A' a
    • 6 e* o) z) Q( _) K

      , e; Y! M- H! M% h6 W3 e9 H   }  
      " j" L& y: y) A2 _/ S9 {& i

      6 I: ?6 g$ r* I5 q
    • + ?* G3 M, f1 p6 K
      8 t9 n& |( s3 B! H4 G+ j; O/ \* a
      }  7 J/ s* p0 p$ C
      / L/ y# q3 k1 X, j; {" R( v( n7 n. x

    • : ~" G" |* m: ~$ `$ h" S

      - i9 v* X0 P9 Y6 ^: w, e& M& K/*优先数创建初始PCB信息*/  
      3 r5 d) ^" Y- C
      ) t! b# t0 b% f$ a/ [3 x
    • 9 J, U4 }$ m6 S
      # t% K% E4 H) M$ t/ S# a5 _
      void create(char alg)  
      # j0 F) q% }" y5 Z4 U

      " v1 F' {& ^0 z$ H9 i

    • % c4 [2 s: n# Z# A

      / Z& X" K* ~; s. V% A! d% j{  
      . S; |. o8 K$ ]+ B/ D6 j
      ) S% {( z/ M7 j5 a3 O9 t& ~

    • 5 I2 g5 D0 u9 B" x) v0 B5 k
      ' {% W1 x3 c' U2 @( b$ q. ~0 h
         PCB *p;  
      4 c2 H" w* p9 G" s. Q- K% c
      & B$ @- |! V$ L+ P2 b2 N
    • 6 s7 ~- [8 _$ V- Q
      ( F  j, w  w! V5 s4 ^
         int i,time;  ; u9 i- ^' _4 _5 ^' v4 i
      , [7 j/ d# }$ x1 J5 O# w! ]

    • 2 e3 J% u6 Q9 W- \/ X' i; X  |" N

      ' h( x' Q9 \& \   char na[10];  
      : w/ N/ N4 g( V0 J/ V

      + ?/ a3 g. P" q2 e# o( l

    • % D, c) c( I! S! T$ _9 Y. E
        A% q0 d$ [# e& z  D2 i4 {1 A
         ready=NULL; /*就绪队列头指针*/  
        ]/ X7 |! r4 i3 C. F/ c* n
      6 V" X0 i0 o! Z

    • ' U( D; b9 c) `2 B. c6 t) T) G( j. r
      % @1 e/ D; [5 y! J  k$ i
         finish=NULL;  /*完成队列头指针*/  
      . {$ J+ G6 i4 {
      % ~( V  Y2 I! ^1 R0 B
    • % N/ C# q; A, c+ f1 {- X6 d1 {* J1 U
      1 m3 K* _4 ?/ k4 K9 q, F
         run=NULL; /*运行队列指针*/  9 X& y3 V1 S! C' K

      + F% O" D& z, @( S' w
    • - ~6 J3 j& t. t7 F1 W

      " |& c6 A: X7 I2 g, G( s5 e   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  2 Y. q* V6 h, F/ q

      8 t7 C1 S3 v; u

    • 4 K5 d8 ^4 i5 G
      . U. y$ g: e4 N0 u/ e) C, b7 J, n
         for(i=1;i<=N;i++)  
      4 C! a* Y8 t: ]
      & N( S6 b" a8 Y$ G2 e. o: s# N

    • . K0 [4 L" B5 o9 c

      6 V/ R. ^" s0 V   {  
      $ S: i  C7 H: X) H' n. D
      9 s; N+ C# k6 {& p1 o" f& ^

    • ' W# s, g: `. {7 x* {; q% k

      0 ~. s0 R0 M3 ]% {- r* h; T; C      p=(PCB *)malloc(sizeof(PCB));  
      ; e" b* c: s6 _# `7 C
      ( k+ i9 U4 a6 P
    • . p& z) G& }) {4 V- M& ]
      2 L% n& w6 J& f5 M
            scanf("%s",na);  ) P% l5 X% D: X5 p% Q! s( u
      * r, X- o! w, }7 a" y
    • ' K5 T6 h" L" t( z! i

      ; N( I) G8 {- I5 N9 [" X      scanf("%d",&time);  
      ' y9 N3 d4 |1 X
      0 W( ]# M5 X- z0 C9 A8 }/ X# {1 q) Y4 {
    • 9 v& }1 g( Z( \1 Y7 w
      : b& n$ `3 C- w/ v
            strcpy(p->name,na);  3 d8 a0 u: A8 j

      0 A8 L; S+ c- V1 [" N2 K
    • * i, p) g2 F6 s/ b7 {( j
      8 \; d* O$ G0 n. \+ i# _
            p->cputime=0;  * I% u' Y5 \5 m2 g% q- Y% T5 A! s
      5 t1 n1 s4 d% P" B$ p2 X$ n
    • . R5 g5 o& p: T! u/ p9 f( U1 Y" F+ e

      4 v  F! ?4 B8 \& @: b& |& H      p->needtime=time;  3 L1 |+ w2 ^) t) l: V! f, f

      4 W! \5 m! c, b" [1 I

    • ! _0 M0 D. i( t$ _
      - G9 c% u+ G! Q
            p->state='w';  : @( e& {6 O/ [  F3 {+ U
        [, B$ g/ @9 G+ Y

    • 0 o) b+ @9 ]# u* }$ _% R2 ?

      " \; s, R9 W! h# r* \      p->prio=50-time;  
      ( i' A6 p* `) {5 Z
      ) `( ^% [4 S$ ~" Y5 r
    • / i6 b6 C8 S( b9 C

      ' b  N" H- t* D8 b- @7 d      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      & H% l/ k/ x" L* }5 X. i
        r: U# m) p/ X% {+ g, f6 M
    • * E. s, t0 ]6 T6 b9 ~: A/ K+ T# H
        ^& |" D. G  @4 D$ G" T% |$ u7 ]
           insert1(p);  5 @6 t$ A; `" k6 J  `3 S4 m; C

      . n( E+ f& o+ N9 }  M
    • ; |# ^9 x+ E6 [5 W8 V
      9 H& K2 r# {+ `* Z# X
            else  + w% ?# }* X3 b2 k- ~2 N

      # n$ g" _! p. L

    • ; \/ {, |6 j4 _) E# {" l# T
      2 C  f1 r" g, m
            {  
      ; k: m) r! x* {: m# g% C4 u

      ( M# d& ~+ i) _  G% R

    • 2 o$ z9 E+ c! j1 K9 t9 o( i

      ! u( E7 \1 V  a+ P# W: q, y; w7 A" h5 I     p->next=ready; /*创建就绪队列的第一个PCB*/  4 @$ `' N/ j6 _8 h% w

      7 M  A1 D) u* t

    • 1 h) `; h: s9 b, C9 \$ x# A
      0 t% R+ G. D! a5 \& X8 _. j' y6 @
           ready=p;  
      ( B& X5 h1 X* i  Z

      + [- C* f6 S/ I) ?# R/ L

    • & F; I& Z! O# H# f7 u: u! A. N
      1 H0 @+ o$ z0 ^  Q1 \) A5 f
            }  
      ; y- g5 j5 n2 \5 L7 L# V! g, N: ~- \
      % t* `( p' S! `, g0 d6 \

    • 7 J/ B/ Q9 f/ g3 [9 s

      ) k% c0 q" R0 j: c; ], C  H" m   }  
      : Y+ S" {" ~* B4 u2 N9 Y& a# D) x
      0 ]- n& R* T) L# y9 \
    •   ]! r: J0 ]! Q( q+ O' X' q  E0 a
      % ?) @  E  a: A7 ~  R
         printf("          优先数算法输出信息:\n");  2 }) f4 R  f# \
        _4 l$ G2 t. R5 D. O& C1 V& Y
    • 9 C* I  e2 H1 W5 \; ]7 c/ B
      ' o$ I) Y' p; j8 S! u$ ]  I: F: d
         printf("************************************************\n");  3 u+ s. ~5 g- F8 l1 x1 F

      # |$ q. q, ~6 b8 V! O2 l
    • % d. E5 s7 `! ^& p3 S$ _- Q
      6 D" C7 W1 B  K8 A  A
         prt(alg);  /*输出进程PCB信息*/  
      8 r9 T$ o. y0 |. y

      : |3 f. r7 z$ j
    • 6 u9 d6 N3 D8 i" t$ z1 B8 i

      * U% _" g, X4 B   run=ready; /*将就绪队列的第一个进程投入运行*/  
      7 r" Q( `; d# u

      ' q3 o4 T1 [" I7 }

    • 6 M# K) Q  Z( c9 o  l6 B8 Y

      5 ]# \5 M$ N, K0 y+ E( t) h$ D, E& j   ready=ready->next;  
      5 `1 L  ]0 D- w/ b! c

      2 M, z6 I4 S1 I( H) d3 J* |% U

    • " ~0 Z9 Q7 P- C" c1 q; e
      * C  ]# I6 p- Q6 w- t6 s3 {7 H7 b
         run->state='R';  $ W( [- t2 P8 Y4 [# K& q4 @0 O6 b1 i
      # w# [: j, O, X% P% D+ X

    • ; N3 J* F8 @: S' q

      4 X( @9 C3 n: u/ L0 C}  
      & d+ E; R3 X$ V5 A

      " W8 Y: s1 |" p/ t
    • ( N1 ?6 m- ]2 C' `# G$ ^  c* S
      ) l. l% _" D6 f
      /*优先数调度算法*/  + ]* m9 X" p7 [" _) S% A4 m% q
      5 T3 [9 B( |' g3 a6 C# s2 W
    • : Y; W! }, c9 C1 Y8 _% ]) N% u  F
      0 Y8 P6 D6 b- J8 Z- X. ?
      priority(char alg)  & L+ p  i" x  n) c* N0 @7 M; f4 e, ^

      8 g# A$ r: u  ^- U7 I
    • , k# d3 a! ?4 f. G+ m

      ' k$ E/ Z) h& Y9 h8 @+ n- l  s9 f{  " D- g2 o- S) B2 ]8 F" |* p
      0 O0 P( u; B+ {2 t' }9 e
    • 2 ^( Y; n3 P* G+ X  H0 s2 W
      % x2 t# k5 P# {7 ~& r
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  $ }' p; v4 W  J/ A4 u! [. C% q
      8 ^6 I# \9 Q' B5 m6 Y2 k
    • % j% Z! {& T6 Q8 e* E, ?# \2 a
      0 P, Q0 J) B2 A1 f
         {  6 z6 D6 x* X  N; [

      % l6 U$ o( R0 `" y- a

    • ; A* i$ [4 H# @5 e- g" e& n

      ! e) R! E! G, D  x" G* u; M      run->cputime=run->cputime+1;  
      " q' r) ], @. s6 }& D
      # C0 G/ o3 d+ m" f) ^' O
    • $ H; x9 p* w7 t- m. _4 L
      - o5 i) T, g( ]& _7 o# F8 A  A
            run->needtime=run->needtime-1;  
      $ C! ?+ M  U* ^
      - a" g: I# m8 M
    • 5 s6 @+ `( V, c, j9 r; q! x; J5 W
      + E8 d: v  a( Y% v
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  . G2 g% t) a; _, ^: _9 D6 Z" [1 v5 z

      ' Y" _( U  j, p) |  i6 {1 m; r
    • / `/ q# n! g4 U
      4 Q& S" I/ g4 T! G2 ^
            PCB *p;
      ) O4 F' C/ A# s) p3 y/ _% _% l
      % z( m9 J7 ^' z, M5 P! [% p

    • 5 V  b4 g3 U" d8 \" _6 {

      & q1 y: f, j! n1 E7 @      p=ready;
      ' N$ _- S5 J6 J+ _- \

      8 s7 ]. v; l: J

    • . B. J2 e* @$ Z' p4 ?
      - G1 s7 F1 D$ U# ^8 ^! D' k
            while(p!=NULL)  
      * j8 M' j5 ~, [0 @

      ; k  a; Z( |- y& C+ @

    • 7 A( W5 _  O/ w. v& N
      % V3 X( [1 Q/ f7 C5 I
            {  
      7 c6 I" c9 C- u

      : o3 V, p9 T6 T

    • ' v. R& n; g& z& _4 `; h
      , F5 @" e2 S) _/ q0 A
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    6 @0 `7 K5 f7 s

      7 f9 {% C5 e% n$ J* J# k' r, P1 p
    • ( \, R0 A0 x: u0 `$ ~$ c! P" X
      : P( Z- n0 i' m( i6 W
                p=p->next;  
      3 O; [+ }8 f/ \8 C1 R+ k! r2 t5 q
      4 e9 Z7 C! e" l% Y$ w& h. q0 C
    • + M$ J" |4 [: q+ n

      6 }/ y/ I) L6 i! a, ^7 h& {- G      }  
      , Y5 z  D' P7 B9 z. G8 s- @% r' q

        y  O' V" O0 N5 x

    • 4 v! Q( ~6 v3 ?$ |" F2 ?! O

      - J5 t; I/ Q+ S( H% U+ b7 y      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      / C: a0 h* H3 W8 R: h6 a  V, f
      9 R0 q& b. m. E9 _
    • ( J3 e% h/ W, U8 _4 _7 j+ K  }
      8 p2 ~4 @- X* g% f: D# _* x" m9 r
            {  7 O! H5 w8 J2 w* T9 Q7 c
      ; b0 p0 q" P$ L* l0 y% I
    • 0 g" w- ], Q. w# T! U

      0 Q/ F2 Q2 P: u6 q  |         run->next=finish;  
      9 D. g$ W* K& ^5 y; ]( r

      5 ~5 p) `4 k. t: w. t( x

    • ' _$ x0 p! K- m

      0 D. E! p2 I6 f9 P& x/ l         finish=run;  
      6 B" l( i) d! w7 A
      0 Z, |# k- M  l. a# V3 c" t

    • ( }! Z$ y' K" B' C& i1 _; B
      ! d1 j: X  M" p6 v
               run->state='F';  /*置状态为完成态*/  - _% M( T+ W/ y# [8 |( `: t3 Z
      6 F" m8 N) Q" y+ i  E' U8 U& z1 e

    • ; }6 z6 L! m9 U- P0 W- Y6 A
      1 ~* I5 h9 k, h' v0 M
               run=NULL;  /*运行队列头指针为空*/  
      9 i  f% F6 ?  E& G4 @

      " h& S0 O2 L6 _
    • % [$ H' W! V8 [5 k
      0 y, J0 b9 D! {
               if(ready!=NULL) /*如就绪队列不空*/ 9 M* C' a* v+ r: ~9 U! ^5 s' C9 T! k' V

      * b. c1 z# f% w" F" L: v. q

    • 5 N' s  R3 v: S1 D0 S, c
      1 z* a0 E" a9 @' g$ E
               {  / s- `' ]+ L$ q9 {' }3 T4 f1 F
      , e( I# b0 T) b3 N6 x

    • : w7 d* A! ?' F: D; B) h" |

      % \+ c, k' p) A) Q- c            firstin(); /*将就绪对列的第一个进程投入运行*/  9 y- w2 n' D9 E$ Y1 V

      / S# R/ ^! Z# a0 F8 D
    • : K2 y& a, i2 w2 d9 J) q4 v/ N1 ^
      8 s9 @( Z1 K& n- @
               }
      " a8 m7 T# K3 F5 Z
      ; E9 Z7 e0 e" I0 ?
    • ! E/ e' ~: b" a; }) A, i! @

      9 Y9 h4 u5 M( \+ _      }  " f8 J9 g. `2 g$ M
      : k9 N' }& G0 O$ T; q
    • / N" V9 K7 N1 @2 s7 x: R1 F

      8 B* y' x5 L2 T/ E) C      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      0 G+ b+ h8 P. X

      $ s. f1 E4 D: s5 y7 x

    • ! d4 k& k* R! K: M6 @, s
      1 K& T5 E' l% h9 \' G. o+ X2 s
           if((ready!=NULL)&&(run->prio<ready->prio))  % y% A/ r( j, b8 D- @/ H

      ( ^' V+ e9 W* ?' h4 g7 f! A. w+ `; W

    • 6 k4 f. d6 X! B) W9 L' S4 A6 h

      $ i$ `. Z& ^+ Z/ }+ m6 U     {  
      8 P, _- U) c5 {: @7 ?9 ]) c, v
      ) l1 ~$ N: {- e+ Q! ?. x

    • 4 ]9 `% O% O5 E! t) U: e
      9 S7 Q, [& ~" F& R' ^% M
              run->state='W';  
      5 ]$ x* T) y. `: k+ E! L  k
      ( E! I3 }5 i  i6 e

    • * |9 v2 p  c2 O+ E

      - I7 n8 \* N. R8 m        insert1(run);  
      8 J- l+ G9 \3 s1 Z5 r) n
      5 W! \; c0 b) R
    • 5 g, [- N: v- f9 m+ n! Z

      ' |4 K( n# C/ _% E5 g1 P, d        firstin(); /*将就绪队列的第一个进程投入运行*/  
      + o+ m+ l( R  P% W8 S
      7 T6 R! e# s& K/ }) L" X
    • ! i* C' b5 X! w6 L9 b+ ~: `& ], `1 S
      3 ~6 q5 O6 o9 Z) P1 |
           }  
      ( f' l( O; C% J6 z1 P
      ' l+ S/ l( j+ a) s1 ~0 Z
    • $ V3 p# f/ f- c; R+ ^+ K/ S4 H2 i
      ) A6 R2 p0 ?& ]6 U
            prt(alg); /*输出进程PCB信息*/  
      . M7 q- i+ }0 I1 M

      4 R" a7 J& P1 G
    • . @: w7 {/ f0 J. P" q  ^
      0 \8 |6 f$ m( @& u2 A/ n0 Q6 t
         }  % x. z1 ~+ z* Q+ ]+ \. T/ P

      7 Q2 X* Y/ p1 K- s2 e$ K. [+ P) J
    •   J$ u: D0 |3 x
      + z& Z$ ]1 p% \+ ?% ^
      }  
      & f7 Y& M, L5 M1 x) y' D
      - [1 V. p/ T0 Y
    • - m1 i& G# p' j" c; M/ y

      5 x1 ^  ^" w- {) a# ^7 ^/*主函数*/  
      9 D9 S# M% A5 w- a# Y% n

      7 H9 p. F* ~- d6 }# }6 H

    • : Z- k- c0 n7 r- y( Z9 {

      6 U6 x/ q5 c3 m5 }1 K* K0 qmain()  * Q+ d: `6 c% t; R8 s

      4 c1 V/ P! @4 m

    • 9 a) |# }3 [. f! G

      ; h0 K$ K; E4 V9 Q* d  l6 D{  # ]0 I  V4 y, P) a

      : ~4 ]- i" J! i) H

    • , k7 k1 E! ^5 h! R7 q
      % n# a8 t1 v5 ^4 j2 Q4 t
         char algo;  /*算法标记*/  . E* t$ t; R8 |* k# j
      ) U* m( r! i: y! Q' N  P8 o6 |* A  P
    • ( k5 U/ d1 a" b5 ]' M9 U/ s9 ~9 a
      1 t! }, }3 l4 o( q* Q
         printf("输入P确定算法:优先数算法\n");  ' p, q4 t- w! y  T8 H9 }4 W

      $ J0 V9 a+ d- j- z8 `# S6 b
    • $ Y0 R1 d9 ?$ A& v& h
      & ]& P! r2 {2 Y  G5 V
         scanf("%c",&algo); /*输入字符确定算法*/  
      4 }4 c! y6 T: Q  ^5 W8 V

      " }! A  {' h2 Y; x8 O+ k5 Y
    • 9 O. ^  n  h4 i! a
      4 f, G. [/ O9 N8 t4 [3 ]! d
         printf("输入进程数:\n");  7 K2 z) {3 d. P/ z3 Y+ o

      + o& f% V. \) M. k& |' W
    • 5 S$ B) p. {% O# ~) y  d
      0 v% L3 ~5 z  r, I
         scanf("%d",&N); /*输入进程数*/  
      & C$ {7 L; z0 G  e, p% f/ P- I
      : p: E: X2 @) E

    • 3 o) ^; R: s/ ?9 }- W# T

      & X7 S# }! h7 ~   if(algo=='P'||algo=='p')  
      " _# {% S* n! X0 \0 U" [+ \
      - ~* t4 \7 f$ X! ?" Y# \
    • 2 l4 N. f5 r4 x/ ]7 [
      6 G; ]! S4 l4 t; @# m
         {  
      8 r; ]) |; m/ s; W
      * l7 i7 y" m/ b, H

    • 9 f4 l' O: g! o- |! \  S' _
      1 _0 s4 O9 a7 D. q3 G2 I) @
            create(algo); /*优先数法*/  & u* f# _/ P5 e2 c" N2 H' z3 a2 k& k

      0 W! H6 _9 \9 A8 S
    • 1 h9 l- L" G- w* F* J: _( m
      9 v( A' B, h/ X! \- k2 u
            priority(algo);  
      - R2 r8 `! Z) Y" l5 X, ^, h; M
      $ u' k- [3 o! X6 Z

    • 2 w& n" _% y. S( d* `

      % r$ x+ s; W! I# f: {" ?. c0 ^   } 3 v: G# ?; i$ o1 H/ V& G8 Q
      ' q, @8 L% @; ?2 l6 D4 L

    • % r# E' ?; |6 ?) c- Q
      8 D/ Z6 N, k5 ^3 o/ `' N( y  h
      }
      2 C: M6 o0 n  j$ ~# J8 `
      . a$ J) e: X3 I- i. Z% f: _' p: t
      % F. Q# [( O$ Q1 Q


    3 A8 @; [* H- K6 t输出结果:: e' ~/ }8 s& T2 W9 j


    ) u% X% a5 b; r1 w5 g. \- b% z原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    , u: s9 K9 F  ?5 A
    , p6 M) `1 x, |) v( A
    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-7-25 07:12 , Processed in 0.327331 second(s), 51 queries .

    回顶部