QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3158|回复: 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
    ' C7 c  w/ S3 R) p; l; S. C9 O* K
    优先级调度算法
    . [. ~1 |( v! K1 u& ^

    算法介绍6 e  W6 K, E7 z# N* c% n
    优先调度算法的类型(用于作业调度)
    - V! V" \5 P1 g% y% r( y* d1)非抢占式优先权调度算法 # p! D8 v7 [# ]4 g2 r3 S7 E/ {6 d
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    . Y; M( y/ }" |/ ]$ q( p9 @) m0 Y2)抢占式优先权调度算法 5 E4 e; f7 F6 v* |+ r
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型( T$ o+ r. a# g' d( C# Q7 V
    1)静态优先权
    $ ~' ~' N" i, o7 M静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。6 U+ ?- Q9 r  A3 q$ _3 G$ L8 c7 N  g' ]

    2)动态优先权
    8 I; x5 M! d$ F! n

    算法实现

    抢占式动态优先权:

    - Q8 x4 d4 m8 p, i' @  B. b" A
    PS:本人认为非抢占式静态优先权没有实际价值。

    • ( R  J6 s% G3 r$ F4 @
      + t! P: [( t  M9 r
      #include <stdio.h> ; f3 c- P! g# z. o1 r

      * L7 ^5 Y5 S. ?! ~+ Z. o
    • ( \$ L$ K9 @* p5 q) ?. P; [

        {+ f# j- v, [* O8 y8 S/ B#include <stdlib.h>  ! w- i+ p7 F! h

      8 ^1 r5 z$ D1 G9 y7 e! o
    • 7 a, \# s3 p! V8 R1 F
      5 V0 C8 B5 K5 u. D) q) Q/ u( `8 M% O. L
      #include <string.h>  : K- i% O' P& R% f  ?
      % G9 M+ S# F9 \! b. V

    • ( L0 O2 i6 _+ c
      * o8 a7 W! o6 A2 r8 |3 n
      typedef struct node  : `. @2 P# u/ h7 p! W% f
      $ f( z* S. T. u& B, |" t
    • $ R+ N5 p" O0 o. r* h* w
      " ]* t" j! n3 E) R1 s
      {  , J; N4 ?0 v) }4 x4 u

      ( @. W, R9 l, p
    • & D* R: c8 x9 b" Q
      ) F  m  h, |# L" _, B2 W! V; \8 T5 C* n# V
         char name[10];  /*进程标识符*/  ! f0 V: p. f7 p" n, ]' O

      7 G9 V9 ?" h9 X" H

    • " s" s' x: Z- ]+ G! C2 j; }, e6 p

      5 r& g* `% K# c4 @/ }, \, L+ F: o   int prio;   /*进程优先数*/  4 r5 F8 W# N2 G6 M6 w. U2 f, y& h, C/ Z

      " [' }- J/ A$ Z+ R0 j3 ]# [( u0 D8 k

    • ( ^! O; y6 ~' R- F; U

      4 T7 Z- z; K9 X, M   int round;  /*进程时间轮转时间片*/  
      ! s) A4 R" v8 u4 I7 p
      1 t, ~  U5 r' T. m% A8 S. E$ }( P

    • % g# {3 p) Y. g$ B2 y) _! ~; J5 U: u

      % O% C5 T2 Y2 T/ U   int cputime; /*进程占用CPU时间*/  
      6 D/ I, _0 {1 ^% n" t

      1 ~" J! i; |+ P
    • $ n: `! v  H7 @2 X; M7 S
      - G% V7 Y; }9 V- I
         int needtime; /*进程到完成还要的时间*/  
      5 W; d3 d3 q' m- P  e2 S# w* t

      * A* |6 j& A) ]  }/ H. ^; Y

    • ) G; u, V" ^5 ]7 h$ P0 q  [

      * z  J' I7 j" Z( i   int count;  /*计数器*/  
        j& H. y3 O4 [) L6 o

      4 {4 V( E: t+ W$ s' t: e: u
    • 1 V' {, T6 w$ Q9 A0 M3 s

      : f( N; |! }; N# p   char state; /*进程的状态*/  
      ( E4 `, Y+ [) o3 x: O, d
      + _$ l: I7 `; s
    • ( U2 o$ ^0 u" q2 J1 h
        g5 p8 r+ O+ P! J7 ]4 j( v6 p
         struct node *next; /*链指针*/  8 D7 g/ l, P5 t2 L9 l. u% |) R
      2 d: k6 }( }/ T  u' x- x; i! X

    • $ ~9 u! L% `% X; U. P- S
      6 P) R# {" z2 k( |# s
      }PCB;  - Z; e) E% |2 k! l" r, O# T$ P. F: i
      2 M* D6 H  X1 V$ o. w0 c

    • 3 Q& d# W$ u0 q9 j  F* R

      - ]! A& V, Q' f8 XPCB *finish,*ready,*tail,*run; /*队列指针*/  2 n6 X1 U4 i; I% y2 m
      1 }8 i; n( W# a; V
    • 6 i0 G5 Z6 V2 [: n

      ! x6 O0 N4 X! H4 @int N; /*进程数*/  
      6 r# s* u, \7 Z- e6 ~( Y: \4 M

      ' [% d/ q4 `) I5 I4 _( O

    • $ H+ p* m% N) T- _+ E+ ?: a
      ; }, ]  L3 P9 D  g& _
      /*将就绪队列中的第一个进程投入运行*/  
      : _/ p5 V- X: N
      * b+ `. `. G: ~# A

    • . ~0 s) m* M: ]7 l4 v0 g& a

      % H( a2 N, V* Y# q. M. p/ Afirstin()  + `/ O1 K4 {; o/ R
      ; \$ n4 }" B5 m' l5 v9 U% K" l
    • " B6 g# i7 l. P& P2 F+ T: ~

      + H5 Z5 c; D& a7 K: k! X{  % e) V5 e- E5 Z5 \" y

      ( W; N2 \5 J" N. U3 r

    • & o* U: Q" @5 }% x+ p- m/ G

      / D2 S6 x3 Z5 W3 g   run=ready;   /*就绪队列头指针赋值给运行头指针*/  % x8 E' n0 R9 u& k+ \1 K+ |
      6 G* X" u& [; k* z% P5 Z0 W, l5 C, v
    • , n/ E8 D% D# w

      : b) ~$ a7 s8 i$ f; D: F! G   run->state='R';   /*进程状态变为运行态*/  
      % w: c1 @- _0 l

      2 S# W! N" Z: h7 e$ T6 S
    • 6 P! [% {3 j5 U7 d( ], Q) p
      % _; t6 n7 |' Q6 [% R
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      ( `% A+ Z* ^3 e/ k3 s% ?% Q, H1 c

      3 ~. B& d, p: S7 e, u
    • ! T1 i: K+ ]4 k" f/ @! u

      & z2 o7 g7 E' [' t' P* w3 S. b$ q}  
      ( z6 l# U. d& ~( x* `! `+ o4 u4 E

      / v3 a% w( |, @- ?8 ~
    • 8 F8 [5 d) T9 d& U4 y) l

      8 d; u5 y, |4 k/*标题输出函数*/  5 ^2 Q& y* l" p: `2 ]% `
      3 _0 p4 |* @1 u3 _" g$ W4 o+ J

    • + n7 G+ ?$ c5 g

      " y2 l; o( f4 D$ G' d2 n" Jvoid prt1(char a)  * [$ X7 F4 G2 C$ G5 S2 J
      - m* G( C( {- u  z* `# j! Q. }1 D) G
    • 8 M9 e, _4 {  `5 u

      # k# b' s7 C8 I- _1 z' X/ P/ Z{  / T7 O, G! i* D3 P( t8 _

      $ E: \! B7 d( j
    • : W) V" @$ m- c. l3 ~

      ! l9 C! x2 [7 J   if(toupper(a)=='P') /*优先数法*/  ) t1 v( Q8 B4 G3 X
      $ ]( C: j' g% u' J( d" Y

    • ! K8 w9 L/ g7 Z

      ) T: M+ Q3 B' v1 i3 D& V) V* Y      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  ; w( W, c  Y! B8 B- `7 j8 k
      6 l7 }+ i9 r. Y6 X8 Z: v1 e: K
    • 1 `- M+ N$ h% Z7 ^2 I: k
      4 z7 u4 {* W$ v( {1 z$ t
         else  " Y. x- }/ o9 h5 l, ]7 g3 C& p: v
      / u# ^5 N! P! [! {- U! |& I

    • + B. A$ D' p3 r2 d
      6 v( V: v' [5 Y$ {; o
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  ' D& u5 t7 F8 }& l$ y5 ~, c7 B
      ( B; ?: M8 k0 L
    • ' n# V* Z" X: T- t

      8 a+ F7 w# u& Y}    {, j  V) X" Z
      : Z0 \2 w; g# R7 \
    • ( a& y7 [3 R4 u2 {/ l9 s5 Y* \( G

      & w1 i. o. x* w2 p3 K* T/*进程PCB输出*/  8 X  N2 k5 P3 s: l8 B2 ]2 L

      ) L; b  _% ~0 A" O
    • 2 o' j5 f3 m; a( m9 P

      " @8 |. Z" m" c' j: H/ c, j/ E4 _void prt2(char a,PCB *q)  7 o! M+ D, n( d- i* [. u

      5 G& A. e% n* m' B0 w0 \

    • * y3 L1 r0 H7 _: |

      7 I# I2 @' E/ u  i# R& u3 [{  
      ; ^% T; t4 `4 U7 N0 i% Y& x

      4 Y# G( i5 y; E+ l( {  r$ `( W. ]
    • 3 ^& U  h1 c' `3 J  U5 |

      8 ?/ O/ ~4 j# y, ~6 j. }& L/ F2 c   if(toupper(a)=='P')  /*优先数法的输出*/  
      5 J& H# U. A! D3 B
      $ e. ^- S; z( O9 S

    • 8 \+ q7 ]( B6 [& c, F
      7 K+ J5 _. C& v, x  R2 }& g, z, G
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  & v4 _- L, v1 P+ W
      ) E3 H; Q2 R! c$ f' _& c$ s9 {8 {. q
    • ) H5 N0 e' r, @) a# B+ Q# O

      ; i$ M8 N( Z; P; j% t, g/ R       q->cputime,q->needtime,q->prio,q->state);  
      " f6 _6 I! ^$ f% ^, H5 H
      4 f, L4 S; u$ ~
    • # D4 d6 r/ z) ^: n$ F4 W  n

      ; A" l0 H$ c5 o/ i6 Q  `   else/*轮转法的输出*/  9 U+ t7 x: i- S$ R, `

      & X4 |" C$ t- Y* j& l  {

    • ; \- K& I7 t% B+ s5 c

        h2 S1 U4 Y0 B9 ]% h8 c      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  ) k' h; C" q% H6 q! j# b7 h
      7 B% ?% ~, E2 g9 }' }

    • ) a+ b1 Q$ _3 ^( X
      ' i5 ?8 E& e% \
             q->cputime,q->needtime,q->count,q->round,q->state);  ! ?, U3 f0 E. I. {; L  t& j

      4 A2 ]. [0 e* p# ]% g) a

    • 6 T: D& E) ?) T* Y9 S: @
      : X' W  O& S3 _* @! Y  z
      }  
      5 R6 [* m! @* P( Q! Q

      . Y& d& @- ?5 }( r: L$ r1 m

    • 7 ?; g% S# |# s
      * h( R* `$ i* N& Y3 a
      /*输出函数*/  
      " W2 ~8 @. C- C

      ' S  U- g- I: B  q. v

    • 1 H6 h$ r+ o" S6 S" l
      3 D" s, C: [) Z6 S6 `
      void prt(char algo)  / {3 `) X2 I/ S  _3 }
      % y+ h7 |, f  C
    • 0 M  ~  {$ B( ^

      6 {6 R. R6 j2 R4 `( G+ a6 X4 V$ D" g5 O9 i& l{  6 T" p+ U  V! h( `. E

      - i- n+ H/ ^8 q9 c' ]0 u; l3 l
    • , \  Q- M# v1 h7 p2 v6 T' M9 U

      ) b7 v1 }0 k4 G   PCB *p;  . e; ?$ n. d: S$ W
      6 A+ E' c* E, K3 m

    • / q+ I) u! \" L. ?2 O

        S5 h9 I/ N1 N- ]" V   prt1(algo);  /*输出标题*/  
      % |0 P: x/ c) T' _6 l
      & h/ W5 b, S5 Z$ O6 J/ a. \
    • ( U+ P7 z% v3 U7 p  P- s+ {! o
      6 n+ ]; L5 t: e4 l. W# O
         if(run!=NULL) /*如果运行指针不空*/  " b, D4 T3 ?9 Q* J3 y
      , J6 F& L0 d' [; z  L2 W! n
    • 8 l/ o& \% _3 X' D# h. c
      . H+ d% `8 k2 G5 S
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      0 R. w1 o9 m" v4 Q
      $ R" D% y9 s" }# L
    • ) P. G2 ]# P; r$ S1 I) o

      % C5 N+ Y5 \7 B& E# L, I   p=ready;  /*输出就绪队列PCB*/  
      " b# S- k: ^% s

      % u1 y1 C, Z% j

    • - a3 I8 Q, A! U1 X$ p. m8 f- D# d

      8 c7 D- V! [0 q% c( s$ u7 i* e6 X+ u. d! C   while(p!=NULL)  ; \- S; ]; f  k8 K, i

      1 Q- a" V5 I" }* X, x3 j1 D

    • 6 P5 o! y7 K6 b
      5 s) n6 W# \* `' i( R6 D+ a# D
         {  
      : s+ E3 X% ]9 P# `5 B$ t
      1 A2 }' A# Q* Q+ }/ g9 h$ O
    • / q. @5 k( \. ?) q+ ~  F0 }
      5 s' n1 [# h) `" G. w
            prt2(algo,p);  
      ! x2 |$ u- ~! L) F7 e) t
      8 |4 G, C7 k& [5 R, Q

    • & g" n, m1 x$ [

      ) }& _1 q- ^! T$ |0 V2 _9 P      p=p->next;  
      4 J0 _9 m( e" {8 h. e6 p

      / y5 w0 H; E: ^# \

    • ( L; }0 ^. V, r9 Q2 B* X
      % }/ A- S7 A, O- I1 y& c$ p. S5 t
         }  ' \9 n6 F3 a7 ~2 h3 s1 z
      ! |7 n; T3 _# m; W
    • , K1 }1 Z. G" ]; B

      9 N7 J" |/ C# G' ?$ i  I   p=finish;  /*输出完成队列的PCB*/  3 N. u5 w0 n# e
      + \9 f8 I2 S' J$ Z/ b6 I

    • ) R& Y  l# v" g8 @6 h" B

      : l, x, |' c# S   while(p!=NULL)  9 Q3 o" X/ N! ~( d: Q% Z
      0 p* O# i: ?* `9 G" S7 G

    • ; e3 g1 I! a( o/ L. B

      ' s9 z1 `: i& a3 x* b   {  + e0 @1 t* R& X+ z: O9 r# a9 ]: @0 Z
      " u- ~2 P. p, |# {9 O+ P0 z2 K4 }
    • / ~0 K/ z: H: q( Y6 m7 A; N

      " B; l) ]& }) H6 `, N      prt2(algo,p);  
      # ~& _' i2 j3 R: p) \1 v/ }- c
      2 Y" C8 ]8 @+ X6 ?
    • 6 [6 Q! L; v2 l$ F
      . U5 i+ X7 y9 Z
            p=p->next;  
      & l) \- ~; O' @) J0 B7 R3 a: i
      ; o7 [" b9 f6 M/ R0 v

    • ' d5 f$ p' r4 C% I4 `7 g6 x
      ; [! ?& D$ P0 Z" f
         }  
      , `% a- A" R9 W6 |
      . P9 d( i& N& K

    • 3 t% m5 \: b0 Q3 l% s5 C+ D

      ( E9 I- Y- }, t; i4 I; s   getchar();  /*压任意键继续*/  
      ( {* R+ t$ I+ c) o- A
      : t# s3 h& f, f. _
    • & e. p5 E, N# z; r7 u! ?
      6 X3 M1 e- \+ a8 R
      }  
      : ^+ V2 z' B! l

      , F$ C" o# a7 J' Y( G
    • ( O6 m- m3 J% }. g; _6 N
      8 R3 n& ?- M/ U" C/ M& I
      /*优先数的插入算法*/  ! F& w3 p0 v0 H% [, {, J
      % t' _. b0 @$ C% G  m0 P

    • # _- _- v( @  B9 h: p1 `. b
      9 @8 M+ Z( O2 _) G& j% l
      insert1(PCB *q)  
      - ^# D1 ^" C7 K6 p" D
      # t  J# m; i8 `) }
    • % C: [, O9 n5 z1 G' W( b
      . B% P/ c& l! F
      {  % s$ C' s$ q  b" M. G/ b

        `1 q$ @# W9 X  a

    • 5 u: g: \$ s9 o
      ! P! J! Y- |  M; a! j5 y
         PCB *p1,*s,*r;  
      6 E& W2 u' E; M% ~* U/ O- j" D
      4 |7 X" H. Y+ ?0 t8 f0 S+ J

    • $ S. |7 l7 ~0 O' B; C  H

      * M  [. h! P1 W6 b* Q, I. Y5 R   int b;  
      4 b! d/ \2 i; y' K( K2 ~

      2 @; S8 e4 ?: X) j9 ~8 c- z
    • , E' X" Q2 G3 p, j0 ?* o: A" q

      0 {* c$ K6 X8 |0 v' O4 W   s=q;  /*待插入的PCB指针*/  & O4 ^2 I( u7 m# S& b6 X) B
      7 h* E' t1 z, v8 Z
    • + O5 I  T5 G% P, y& D$ ]
      2 ~* i& G7 F; N
         p1=ready; /*就绪队列头指针*/  
      / ?5 j8 g" N" p! r( D, q" ?6 p

        u. s/ [- A: w$ ^1 C! S8 c
    • 0 g5 k3 @: q# j3 \/ m: t' N9 Q
      ! T- w# t2 p/ e! L! G
         r=p1; /*r做p1的前驱指针*/  
      ' H& x' L$ D) E  {; z

      " @& y& L. s8 M, }/ \5 J

    • 3 k. \, R0 E$ _: y0 g+ Y. V
      1 y  S  x7 z- K. F7 @- e! L
         b=1;  7 ?( I) d% Y0 m* g
      & A/ M. b1 n' J" J; H' f

    • ' ]4 \4 R4 Q/ i
      ( d7 T& e' t- q5 t/ s/ Y
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      . Q4 \) G5 ~% I2 C0 F: k, v
      # A1 T$ b$ M% Q$ [

    • + p9 j; e8 w6 U' y3 D% P
      ! g6 @+ h' s' W, V% \
            if(p1->prio>=s->prio)  
      ' }' c/ f7 n% ^/ {8 P; W# N1 N0 S6 e: y

      4 z, l( a% {, K* a6 J( m

    • . @% J5 T7 E! S0 ~/ b
      0 U* ^6 d4 \$ |  h5 l. @
            {  ; A9 @. n% V  Y. I( k

      $ l/ ^& c, K& F( B1 D

    • ( [) g# l/ {4 R( d
      ) m; g0 I% _9 ]& Q6 a; D! j- S8 E" C
           r=p1;  
      4 T- A/ K# G$ _" u$ ?
      % l) ]1 H6 a3 v# L! b

    • ! J' f+ x$ V" C; @, U" a

      * K  M' b# R% j2 X- q     p1=p1->next;  
      . u! v  ^# K* \, K( C

      / D0 ~1 t, G! k  q' k0 ~
    • ( @) t+ ]6 T6 r4 W

      - z; h8 r2 ?" G% N9 G: Z) _0 k      }  
      ' v2 E( d8 n! j' A; j# f: D
      ; o& l$ Z9 D% R, ?
    •   H" [* a1 N8 ?; x% y* h/ N

      ) e; O, p* q, N4 |0 w+ m      else  
      + |( X( x: [% |

      % Y7 q# w9 d0 E, Z& z5 _
    • # n# w  m1 }8 Y* s  i$ D( x
      6 U& X5 B7 A) ^
           b=0;  4 e, S: }" i4 s' J1 f
      * Y* k9 Q/ [6 m  L* N

    • ( p! r" C; q( V1 I* @0 f+ t% Y
      % m1 c1 U- i! K% X6 k7 Y
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  5 e! t; \& p, B' k) u7 ]9 S$ Q' r9 w

      0 `6 ^2 \0 J) |
    • , V, P. w! H7 n3 _' x

      * Q& N0 Q# B/ S) T! y, e   {  
      2 g! s9 M" K. u

      2 }- U. d" r4 a

    • ( {# a4 m2 v; Q1 S# W
      , n2 C) Q0 x- H2 }
            r->next=s;  + ^( T3 z+ x2 @& f; G7 [
      $ W5 r2 U' ]) A. E1 v0 r- L4 F) f

    • - b0 [9 r) `$ J# ~
      + o: B$ d% n3 s6 f
            s->next=p1;  
      ; B' m, o* L. l9 I: b( D7 O
      - N& I" t, Z8 Y* F: ~6 f
    • 4 U1 B0 N. X) |# o$ w% g1 x
      # H3 _7 E; u/ `! O+ q: N
         }  * a% A  b/ E2 b* N

      % Q  S' l4 s- {8 x0 o
    • ) y) i3 h, i. O# _

      3 t+ ~6 o; A8 {& K   else  : X* ~5 i% Z% g/ z3 r/ o
      + {$ D6 K* ]2 ~8 w4 l1 o
    • % S" N' ?  k  D' ^5 i' p( F

      5 Z8 Q. K3 C- O" a1 R" ~   {  
      5 M! m" _0 P: v- q4 D5 H
      / r" X" J. X- J+ f0 F* m

    • 6 I; m$ q, A, e# ], z4 \
      $ ^1 X% _& `9 D9 p, B
            s->next=p1;  /*否则插入在就绪队列的头*/  5 H7 ?3 e' P3 u+ b# k8 ~, u; P
      $ T& M. ?2 l$ Q6 ^1 W2 ?$ m4 B
    • : c4 w1 B9 _9 K

      ! m4 J$ \5 G+ M. J: s$ o! N# A  m" C      ready=s;  
      ; W8 T: X1 G7 r% B; C9 h& ]0 a
      ( e( r+ u) h: n# z% T

    • 0 q& z2 U6 v, }! t, s3 w/ r7 \

      + m0 \) A9 F2 Z3 ~! R5 @   }  
      $ `: \/ y" N+ B* ^* k
      % C: t9 N/ I: o2 H" }
    • , T& ?* ~6 v4 }2 ]) m* r; |
      5 s( f. M9 p* x  r& K3 p
      }  0 J/ S8 e& {2 q
      ) ?. w- @9 G2 A* Q3 d$ d# `
    • $ S, I4 B. Y% T" z6 {
      ' h# M! w$ S9 a3 W' h, X! h- y+ ^
      /*优先数创建初始PCB信息*/  
      8 N* {# }& F+ Q
      0 `, v* {6 ?' k# A+ `* I
    • ; X: \/ r% X- B2 O
      & C' r2 l, n$ s' v
      void create(char alg)  
      , U  [0 ]1 L* @" }1 c4 O& Y% n
      9 ?" }! w0 D9 I
    • & B  b& \7 F+ z0 g$ A* Z" ~% Z' E. k1 L

      - k6 N5 G$ D4 X{  2 Y) s2 ]2 w+ v

      1 y& O. m0 {6 v8 z0 [2 |) w

    • / p9 u' q! t0 l6 K: X

      % {% r) p. F1 t- |% @! ]/ N   PCB *p;  
      ( l" V( _( x6 N# k
        K4 i5 _& f/ ~. [

    • - T) q, o- ]3 j& I- u
      7 p. o" |* b& p) {$ q
         int i,time;  % _5 x# O5 u6 X' j) }3 L$ S

      ; H* Z/ C7 P) g3 v5 o  W, v; r5 v$ f
    • * P, t* W& u  z# R) Q

      " V- ?* r/ ]" r% o# k6 @   char na[10];  # G* I  ]" ]. ?# [$ B0 w" R$ Y

      5 ?  S' \& f3 {! u: v& @8 e% J
    • ; S; t" @% Z8 n9 j) k5 S/ O4 r- O

        Y+ d5 e! Z9 @/ I( U: s- }   ready=NULL; /*就绪队列头指针*/    _8 p, }4 l9 k/ T2 i4 s& U

      6 E" s; i1 o9 ~

    • : v9 v/ V1 Z# h7 `% Z# S
      5 q3 q& S- F0 X9 j9 y7 W) ]# w
         finish=NULL;  /*完成队列头指针*/  1 D2 `0 M5 p# J- u

      1 S$ Y/ E$ \5 F5 U  E

    • . z/ _( ^+ c' z# i9 y
      2 m: ^% l1 |; {; j# H5 h
         run=NULL; /*运行队列指针*/  
      ; l5 D* e9 A( n' R/ T: h! R7 q
      4 {, j/ I, o# m% g
    • 5 d6 S+ R9 n/ Z
      3 |% Q8 K6 K  o! v1 @
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      - L* u+ p6 E. h
      8 C" L4 T& V* U4 Z
    • " d! S6 A4 ]& D# V4 v

      . ^+ W$ K) n/ x8 j' E   for(i=1;i<=N;i++)  
      5 ?. t) }' f9 ]& Z" N" w+ j

      : g1 p( m$ r2 a! |
    • " a' @6 i6 S+ f

      " F+ Y2 i  Z* u4 \   {  ! s" u3 P9 S: Q2 _' [
      $ h; I0 t7 `0 @: P8 y- s
    • $ o& \. l: m$ j) H# S/ H! o

      ( q2 ^3 v. Z% u2 @( W8 z2 f      p=(PCB *)malloc(sizeof(PCB));  
      : |! G; f" s( k, z% X3 j& s

      2 B6 d6 f* V3 k# U- }  A" ?" c

    • 8 A3 o* c% L; M, Y  r; b1 X

      2 N  U5 @& |+ s. X" T9 X0 j9 q      scanf("%s",na);  ( V4 s. P/ R: d* G; J8 L
      2 e7 t& X  L" O5 M* K# ~& Z- j

    • 7 c( ~! [/ {7 B* G$ C( J; `4 F" K

      ; }3 {3 z" e4 Z; k" v" X. c      scanf("%d",&time);  % N8 q. ^/ Z$ [

      4 G# S0 l& [4 K- B- @
    •   C0 A( H0 Q; C5 u3 m1 g4 Q4 }* g
      / D1 x* n! y. f
            strcpy(p->name,na);  
      + F+ z8 ]# y. t: E5 Z
      % u  G3 ]3 t% D' P: t

    • 1 O$ t2 y$ L7 ^2 ?, G+ [! f
      * N7 }. V5 i3 L7 p
            p->cputime=0;  0 I. _) K& K) L# _: ]
      " k0 a4 W# z$ s# D9 b- K

    • 7 g0 _4 \& V; C. W) `
      % y. y, s0 O) X8 d- F
            p->needtime=time;  ' u* t* t# \, F0 x
      ) e# |  B6 G; i# n( b' v7 w; ^

    • , v, p9 q4 ~: t

      4 ]$ D# G5 b0 R      p->state='w';  ) b3 f: S1 r, E0 u6 [4 d( E# U

      ' s% E" L5 K) k- z
    • / u) O( c8 @3 e9 E1 x+ o$ O
      ( |( w1 Q2 s" Q& i. F
            p->prio=50-time;  
      0 x/ \2 q, [5 ]2 q6 @# k6 {
      ; w, n: M* j1 R- w
    • 3 ]& T% y9 s+ J* ?3 u

      2 E; E4 q( K3 P3 b6 ?+ k3 O/ P      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  1 Y* V' l( e& c- O. D

      ( V8 F$ Q1 ]$ q* F+ O

    • 5 q* A; M  O( s4 h$ a% J7 F5 _7 R
      / R$ j' v8 ^+ C6 g3 m  I, p
           insert1(p);  " P9 v7 K  ~) y* ~
      - o, K/ A1 `' a9 R2 R5 t( r$ b
    • ) H7 D4 r) ~  c; @" }5 O
      3 E7 R  ]% Y8 m; C$ }
            else  ' ?9 Y" P- S3 \  _2 u
      & p2 K7 s1 T! z+ b  {1 M  ?; t
    • ) E. d# _; m! [  Z% u

        U! i5 t0 _0 `3 n0 q      {  
      3 E" r( B1 \- T& b; E0 P
      ! x5 L' w% r4 g

    • # X( c% ]& R5 @+ V) }# ~9 z& t
      & a2 T( ]: H! ~, q
           p->next=ready; /*创建就绪队列的第一个PCB*/  
      : W' b7 s/ n! C( b$ m; G. [3 Y
      1 W6 _8 d7 n2 R/ s
    • : I6 F) t3 b# A9 i

      % N% X% {" q6 U. D3 i     ready=p;  
      & C5 {! l! m1 O% R

      " d6 u1 x# I8 G/ z* u: ^
    • 7 ]+ s, j+ D5 E' W! J4 k
      ) I' L1 P* n5 J: \3 d/ C
            }    \% b8 ^) |7 M! }8 U

      4 [4 K5 K$ Z  I7 m
    • ) B: T' B9 c% s" o% n; L

        V! T1 L  p" \. |7 P5 g8 i   }  $ }( s2 |' O9 I. V- t. @$ C

      ! Z" ?( y+ l' Z1 i- C( d
    • / P" X6 X5 T# G

      2 Z7 [: ~2 D5 p1 X  ~" Z   printf("          优先数算法输出信息:\n");  
        U0 X: O0 u& h1 ~& d
      ; W. l4 m" ]& M4 l

    • 9 o! m$ J- ~& h: Y

      . N: X6 M6 [! g0 g0 t   printf("************************************************\n");  : o/ r" }7 s5 h: M8 N0 |0 ^0 `  w
      - O/ H( a* f7 n7 u

    • 0 R+ [: x+ V0 b% i. ~
      , u2 x) ?  Z8 w; J' M
         prt(alg);  /*输出进程PCB信息*/  
      ( v6 P- C9 _* K( B4 o
      . m* ^& \0 q. }3 N

    • / L) y( y+ j) C& B3 ]2 D0 _
      / d/ P. i8 u6 m& z( n
         run=ready; /*将就绪队列的第一个进程投入运行*/  ; f! Y8 B* s7 s: Y+ ]

      7 P% t2 j0 Z) ]4 }& C. w0 Q

    • ; \, j( @* C3 `9 h6 ?$ f
      7 w! m2 r6 z/ _9 V% z# Z' f
         ready=ready->next;  + ^2 _5 \# C2 D0 x  @

      " m' b: u: F- m! m4 {' X) {9 T
    • 3 `4 I. j  A' a7 u) t  @9 S

      2 L+ j3 G& \9 r6 m   run->state='R';  
      - Y' Q: F: \5 m6 V8 w& c

      2 `4 v" z; W4 P: J6 t* v1 P& d. T
    • 7 Z7 I1 J$ d$ O0 L) p* `; J% s
      , Z1 E- M; ~7 O* ]
      }  & z9 |9 F2 c' e' ]# r
      7 e( _) t( j9 O, @' y5 F0 `# p) M- c% w

    • * E6 t, G4 G7 ?! M8 e) v7 p5 A* R

        W; Q, q7 W  y, T) J; \/*优先数调度算法*/  
      # ^5 P) X- B  f$ y) Q

      % q; O" w3 g2 W2 U$ ]
    • 3 i; U# n& q; o, J* Q
      # q0 W" x& K) p3 F
      priority(char alg)  
      6 P3 f; P8 o" h+ [5 A; Y. Y, Y

      2 d. B: N0 p0 y# m
    • 9 c9 Q7 s5 d$ w
      & j0 b# L6 N9 b
      {  6 ~* D$ s' ~& u. d
      : ?$ }1 q9 w' e. Q/ p

    • # X5 _, G" j3 M" ?+ v! p

      5 [- K' s. D6 A( X* s9 l   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      : f1 C/ L8 s; P

      ! t8 q/ D/ \, L) i
    • ! A2 J; U! ]3 j; c2 t4 W6 |" a
      5 R5 p" H! e6 U
         {  
      * u, c' j& E# {6 ?
      # ]& Z. b% o8 E% E% i+ q
    • 5 t7 E* u) K8 w2 `  _8 k

      ( j4 _! M- y) j# \+ b      run->cputime=run->cputime+1;  
      9 \* o/ K+ Q9 O3 V- U4 \7 m

      7 @. k( I+ U9 @2 r# }
    • 6 e, ]; }3 {$ S4 H- x) p1 {
      8 w1 E8 L/ N# ^( J! i
            run->needtime=run->needtime-1;  8 l9 ^: B. f( B7 G
      ' `0 b. h* B) N

    • 7 ~7 X- z! J. r. P; H# e- f/ p2 I

      / i( O1 \. E6 H) f8 b7 Q      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  # g5 [8 t2 }, n0 [, Z$ {% b

      # a, P6 L; |5 P$ e9 X; V
    •   C- W. U* L0 _. d

      8 A$ ?$ k9 _. L1 ^      PCB *p;7 R# t( q, w! m
      + W( ~' f. R7 _4 R2 I

    • 2 W& n, K7 d$ q5 b7 d. F# R! n1 ^

      : s7 S5 }! Z, ]      p=ready;& X) m" \! o2 m5 I! H% g6 Y6 ~
        b/ m- K$ T5 p; o6 Z2 G1 p
    • 2 X4 A! q9 u9 G1 }  o& b% l3 o2 t
      ' |0 m, L- \  H# ~9 R0 ]
            while(p!=NULL)  0 F% k, q6 `: O1 i: W0 w
      % G! w* J4 O) V3 G+ y
    • ) M1 I) B, V) M/ e

      $ Z- L5 n" e) y9 n* b$ y      {  / R4 t" m, X8 [* Q0 c5 ?& X! t

      ' [( D& f  C, L! A7 \5 b

    • 9 n+ o& z" m! g" N
      + r( z6 k/ O+ V4 Y+ C4 m
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      % m. u/ H, N8 Z+ F7 s
      ( ~! K2 \" Y$ @
    • ) ]( }1 v8 s1 d" L
      ' Y" G; u3 P. x  B& b; J
                p=p->next;  6 T$ [6 U$ p" S7 e% N8 t1 Q- N1 J
      ; g, n' c: y* m& H3 R+ t

    •   t  a3 I( ^/ S
      ( w3 M( q2 i/ n9 \
            }  - a. k2 E# U' c" t% V1 W
      1 t8 F0 S/ x7 j( R  p- P# ]) _

    • ) u% ~" c9 f8 R6 n8 ]' k6 |
      7 G7 x% l4 `; _: M+ ]+ j% T3 m3 L& N
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  2 B  e- |' {; _3 m! ~4 v& ~

      , }0 Q& c& ^* x7 A  X

    • 8 P9 `: r: K1 R/ H# b3 O

      8 D" h. B' g) T$ V; |      {  
      3 I6 [. n( @( g& ^3 g- l
      ; {6 v  ?9 W3 C! \0 ~

    • 4 ], m4 {9 d" M" n. G
      , ?5 q6 t, h3 M) w0 C1 s; b
               run->next=finish;  , }- t$ C/ J& F% S9 ]# R
      - W& A3 R' t, u+ G+ `" Z

    • ' H, D' h2 c) ]- Z) x6 [4 ?: X, s4 j

      $ t0 |0 L6 W, q+ Y3 }% s         finish=run;  
      2 }% o: M) }7 B8 T% ~0 h

      ! q6 ]% k$ k$ G2 o

    • 7 W! o9 a2 @) `$ T/ z

      + E; C5 ?% w5 S) Q/ b! m& u- i) v2 d         run->state='F';  /*置状态为完成态*/  3 F6 M$ |& v0 r% n
      " b9 G$ r6 O( A* Z

    • 3 \9 v4 C4 V% T" @* e# ]
      " U: b- r$ Q3 w4 }9 M  H6 P2 ^
               run=NULL;  /*运行队列头指针为空*/  . B& j' _1 `% y1 L

      / N& c5 h2 E5 ]' x

    • ' x4 L) h# Y& n, u6 b+ _; M

      9 Y2 k9 C  J+ a/ e! N         if(ready!=NULL) /*如就绪队列不空*/
      ; c! m# f2 e  a; E! g
      " n4 ?+ ~# i  [5 o/ x8 j
    • " @3 Z2 e/ M, l$ s& S* N
      8 W! \2 n4 m0 L
               {  " p0 ^) w0 W) W9 R0 i6 c8 b" S* `
      ; s8 b$ l7 t% W; {8 C

    • 3 z" t  v. F2 t( L
      . x. X( z  j3 _, t: g1 y0 A
                  firstin(); /*将就绪对列的第一个进程投入运行*/  4 f6 k1 K! d1 u  a/ S

      - [) W5 l# t' P5 `2 Z+ y

    • * B4 d) z) _7 O1 H

        x% D0 ?! R5 e1 C5 l" X# T         }# v* Z6 V; B3 p, b# l. p) t8 r
      8 y" ^% G! J; d5 R$ Y
    • 2 W$ z0 `9 v0 S7 q
      0 J! ^6 Q) H- Z% z  t1 m" O
            }  
      ! J% T, j9 v* R3 Z' y5 b+ z8 F
      ; R3 t2 t: p  c* ?/ L, g) m

    • ; [! X5 \: p6 r- A: ]& n$ f; o* S

      9 g7 o& ?  S0 E4 G8 {4 x$ v$ y% y      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      / L% }- |! l" J( N9 u, Y
      ! C* z" ^, J$ ?2 _

    • 9 D, E8 D2 t2 D5 E7 w# X( y; q
      ( c0 B) G% x# W+ b
           if((ready!=NULL)&&(run->prio<ready->prio))  * O% K5 a& l# N% L3 z
      1 c$ f) e( F0 g3 F/ q
    • 5 u7 K1 K! ]# O
      ! N5 E% r, s6 M+ L3 @% G; Z
           {  . i# q" R: w4 e- V7 W. k: J
      7 J  _- [' T3 ?# e) R+ v) }  I$ i

    • 8 I% \& P' M7 g) h

      , `# W. A. D4 H3 L: u6 s/ V9 J        run->state='W';  7 ^9 p9 {. C3 J1 \; L

      # l, Q- P# ^; f+ [/ Y3 D
    • 5 r: }& c' J" q7 r
      3 @; d8 ^/ r% C+ ^; \
              insert1(run);  
      8 N& N3 t7 j# c2 @

      ( |2 ^4 S" |0 I, r

    • 4 _( h8 `8 @$ C9 M- [

      7 e! |) J* V' y0 F! y" R" m. k        firstin(); /*将就绪队列的第一个进程投入运行*/  . m' K, L! G% m! F' @) G
      6 z  U+ [$ A8 t% {- R
    • - h* {% z( Y6 {
      7 G, l9 u% ?9 }1 J) A
           }  
      5 u7 z- [' u  `# K/ j" V* J$ e
      ; j- m  V' h/ T( i2 X5 R9 I- I/ e1 `

    • . S, |3 L. H. [7 t1 z; X8 i

      6 W% o! ~& R7 L      prt(alg); /*输出进程PCB信息*/  
      5 l# V4 S6 H; J; m. Q4 P

      " B# a( t2 T4 G. ?6 A, n

    • 2 p% |1 G) `& V* g+ E
      $ @# P% [: u$ G6 Z# _
         }  
      / c, `1 [4 l: s; H$ F% U" f! O
        B# \2 }3 V/ M$ s' p  N5 e0 `

    • 2 j) F- e' E( c
      * F* z, x7 x' o# \7 F
      }  
      + a7 [' ]9 J) P: y8 y3 a

      # k* ^: b# p. K9 P: ^  S

    • ; M3 }' X" \9 d' X

      # I" }' R) J3 r, K: r" ^: ]/*主函数*/  0 s- O/ ^, |$ S. v' \: m* R# H

        f& Q( R0 _$ M  p

    • 0 q  D8 V0 K- b( w  v

      6 [) O- F1 J9 I. K4 D3 _main()  
      / M  ~3 d, X7 C7 Y; `

      ( _* [$ k% `9 d) k, J- K

    • 7 M1 z% V" F$ Z' P
      : v5 U: h) L) L' X% J( i
      {  % J# ]) _8 V. g+ Q7 w1 m
      ' M/ i% f# `! e7 @/ q- h1 K. T

    • 5 w3 k2 R- g' w4 f$ i* n0 ^3 K

      ! Z' `8 {  c4 t9 q. ?; G2 u   char algo;  /*算法标记*/  ( i- V- V7 z+ `# A, ^

      7 J- S: ^: {, `: \& Y4 E' B

    • ; U# g" ?0 Q2 g1 t4 m+ W9 J
      6 G+ L+ v7 G4 J  n8 M7 ]2 H/ T
         printf("输入P确定算法:优先数算法\n");  1 x. y: w  _8 m  @+ f' j2 g4 Y

      / C- b" D. q/ _- F" |! I; S

    • ; {' ~2 d' W; F1 l- L# A! Q
      8 v: s: H- Y: I  {" D
         scanf("%c",&algo); /*输入字符确定算法*/  
      0 k1 v8 ]8 e. s; |: K

      # a8 M; y$ N& h: K/ p/ A

    • + f- x+ C. u$ k8 v

      $ E6 p5 Q2 v+ m7 H. [# S2 X+ R   printf("输入进程数:\n");  4 h0 u* H  f2 z. }, o
      , Y4 d+ e2 k1 G( t! \4 q! A
    • ! [  ]  o0 t) x" O7 ]
      - Y- Y. d# I. G1 _1 F% e3 j( G
         scanf("%d",&N); /*输入进程数*/  
      & h8 i4 T2 j% E5 M' A

      , [* Z3 R7 L& S1 ^" _

    • ' g4 G9 q( f" ~/ i
      4 @/ r8 o, L7 G" M/ }
         if(algo=='P'||algo=='p')  ( g0 @  f: P4 w" T
      2 Q% u( K* D+ X( d% Q0 \9 B

    • " H5 `/ l, S* a9 Z

      3 w* O% h) n$ B2 P   {  
      3 s) z. h2 l; Q3 ^& K; Y1 R

      ) R3 T( I0 U; m% _9 T

    • & k& A" C, L5 r0 v/ i
      7 ~1 S7 T; Z3 R! @
            create(algo); /*优先数法*/  ; v) _+ Y6 o; }" w* [9 v* F

      ! @2 R6 G6 u$ R7 X' k, }
    • 7 \/ G0 K8 [1 s8 i9 t6 }% s5 ~
      0 z# z; E$ C. w0 b! U5 a
            priority(algo);  
      ' v8 q) j; t7 ]) l& ^
      9 |9 a% a3 Y5 e% `7 r% v
    • 0 k: N+ p1 N, x

        c7 `& h3 t: v! n4 ]   }
      ' v. B% k5 r( t. O
      ! k. f+ [' s# T

    • 5 p& S" ?- C8 o! m% M8 o% W( |

      / w  c. R8 Y% Q% Q0 ]' p}( E! D! ]7 @+ z4 _7 {/ @: Y: }

      , h( p+ O+ _8 n4 Y! x4 v& w" L0 N. b6 d" {9 ~2 h+ {: F

    6 L1 O* C( ^2 G
    输出结果:1 C8 j6 R8 z8 E: h- Z2 R1 M* k7 `


    ) X0 T! B% h5 t; b原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    1 X) d4 w- e; ]8 A$ h7 |7 Q& |
    2 G. N2 _4 i  z4 m+ t" R
    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-4-21 20:10 , Processed in 0.431350 second(s), 51 queries .

    回顶部