QQ登录

只需要一步,快速开始

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

    & {6 \- ~0 _7 M4 c& I! b优先级调度算法) `$ |4 G0 x" N4 N

    算法介绍
    , v! l$ x( i$ H& n5 U优先调度算法的类型(用于作业调度)! m9 s8 |' a) H- N/ Z4 U( i
    1)非抢占式优先权调度算法 * R; p5 K* j$ A( |; j3 ]6 `/ K# ^
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 9 ~8 ~+ }9 O& \8 c
    2)抢占式优先权调度算法
    ( a, v: C# X3 [. |" ~只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型0 b+ O, Q9 W  z) X$ p1 e: t
    1)静态优先权
    0 B2 X4 W' Y3 _! U9 H静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。  Q- N: Y' @) E$ Q( G

    2)动态优先权
    * m. L. K' C0 C( \

    算法实现

    抢占式动态优先权:


    6 c: C" a4 G( OPS:本人认为非抢占式静态优先权没有实际价值。


    • / ^4 X% k& o- ~6 Q; {1 ]" @3 d
      ( C5 |  T8 b' J- c( F) C( p
      #include <stdio.h>
      0 n6 o. M2 ?& k  _; x
      " y4 y: }1 f! i0 t
    • , ^( w+ m' \6 ?& s3 j& w
      9 R! g. K" t2 |
      #include <stdlib.h>  8 Q* Y' i$ g% E" |/ ^
      ( }' N) `. c4 X6 o2 Y: ~

    • $ H! Q2 G( H" w. f: T
      3 W4 T0 J! x, k, _7 H7 h
      #include <string.h>  9 C/ L7 m9 j1 k0 d4 X& N" I+ W/ T
      # K% b1 _! k: T9 j
    • 3 ?& m/ d; M+ I$ i; Z

      6 J+ f2 ]) c9 Z+ S8 ltypedef struct node  - _& K7 e+ j- M6 P' ^

      + Q; c9 y: P' a4 Y7 ^
    • 2 K9 }, ^* _) a6 z# w" X+ ]+ G8 g

        y  x8 Y* x3 C3 a/ @{  
      2 ]: j" \; m( ]$ J' h: k2 N) T% I: M

        i, G. l* ]9 W3 x. j1 L  e

    • & [8 x9 B0 X' F+ l
      2 R, {6 ^* P; Z; l$ J
         char name[10];  /*进程标识符*/  , u. S. `7 O  J0 k1 z
      $ X) q! I! f& _( b
    • $ T5 T$ E, \: @

      . u6 }2 P. l: T2 [% U   int prio;   /*进程优先数*/  + e7 t3 |7 j4 v
      5 I- ]5 V" h3 K' ~
    • 1 P2 Z) _0 X1 a" o4 O

      2 r5 T' Z3 [  l   int round;  /*进程时间轮转时间片*/  3 Z! m% }3 r6 N' L: j/ Z; D8 w

      % V8 a6 ?% ~# k, D6 g- R2 o

    • % Y( C* O. ?7 J/ Q

      6 q* @: E" O# C: m, c- X5 O1 Z2 G7 l2 Z; Q   int cputime; /*进程占用CPU时间*/  
      9 v2 _( ~+ L# f3 M3 O
      : |! C- r1 F& z+ M
    • * s1 o! I8 {& v& w. O
      * M9 z( q( t' h! c
         int needtime; /*进程到完成还要的时间*/  
      ) u# t9 d, X; B+ k4 i4 d( C
      2 ?  J! }" e2 J6 {- V' }% U% w- y! a4 A

    • * Q2 e8 P) B$ a3 B
      + ]( A. k2 p! H) u& ?* L" m* T
         int count;  /*计数器*/  
      9 E) B5 x+ q/ j2 W/ D( `

      4 e* g9 G* l2 [7 F: V1 t
    • . w. N  {$ f. K! f2 b
      7 p) V0 @+ L0 X8 a: h6 B
         char state; /*进程的状态*/  
      9 Z6 d0 b8 z1 n7 ^2 h

      2 Q7 `8 ~% c/ f3 p  I
    • 0 A1 A4 p! R/ u& f3 A

      + G8 E5 c: w5 o# p- `8 E" G  g   struct node *next; /*链指针*/  
      9 J! [  z+ F0 J, }- f9 D' A, r
      7 N) B7 g! N( Q# o+ S

    • + E* t1 W" ?, R- G. m

      . u. P" m& n/ q" f}PCB;  
      - V9 Q% V, P* R6 u

      ; p" |) i' J, X
    • 6 c6 R1 i# \0 ~

      $ {4 q4 x( y/ A5 u/ M1 F/ cPCB *finish,*ready,*tail,*run; /*队列指针*/  
      $ j5 Q% `+ J1 N- Z

      : d* f8 b, O! ~7 O, G+ [

    • 7 H5 x$ O% V5 s: }) P
      ) t7 u1 r" ?/ D+ w
      int N; /*进程数*/  # F) [. T3 Z8 _
      8 U$ I* Q$ I- \) g  M. l; I1 Z  g
    • . c* E) H0 ~' z3 H$ B6 V3 ~9 g
      + T) h, l' B' y5 `
      /*将就绪队列中的第一个进程投入运行*/  
      / s$ q. U1 C9 [* O: i; p
      5 q2 ^; ~' w4 m! y( q7 l) ^
    • 9 v$ v8 G  e6 ~/ K6 U0 N

      ; N' w+ _& y7 K0 k9 Nfirstin()  
      ) B2 F6 a1 e, s7 n" Q
      1 U' B% o+ n' R. V) e# S7 i3 t3 @
    • 2 B# v! _  g* M6 ^& P# {( T, P
      7 ~2 N, c6 r' e; V9 E
      {  4 q. E5 \7 i* H7 `" S7 D

      " m' o! a" E4 j0 K$ V2 C

    • ! k" G! `2 {# R
      9 v1 x7 @* A% C, N5 i& T
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      8 C# v6 f. @2 ?
      , s- V+ f2 F% t- K+ k3 k' U8 L

    • " K: I; N& {& K

      / U" e1 w" h% X% M, K   run->state='R';   /*进程状态变为运行态*/  
      - x- ?' _1 X. l' j: z5 U- N+ F6 o
        [7 Z! ~5 a% H: [% k4 `4 Y/ d

    • $ R3 Q! _- U  q

      + F9 j/ |; f! D9 p3 m8 x   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  ) z! g7 v2 [3 ]- C9 O

      0 K2 L0 ]3 C) g* @' ~* Y
    • ; |: z4 ^/ ?3 u1 p

      3 f) Y/ C; Z. _$ ]1 U}  
      + b  e' R- I  B* J1 d

      8 \/ M/ x9 Z! z) _. |
    • - A( V6 T7 `$ z) @4 O

      , A5 v1 `6 [: y7 Q8 l7 L3 K/ |/*标题输出函数*/  
        g. }2 K) N* o1 K9 O9 a* l
      & [; J+ i0 q" T
    • 1 g, f' O5 }! a( s2 l

      ( Y, W- \2 u1 Z! J/ L& h5 pvoid prt1(char a)  
      3 i( t6 [& a6 a/ W! ~
      8 ^6 b, l0 Q7 y1 y8 E: B

    • 3 @1 @5 u: F# n

      3 e3 C* z8 P! i) z; ?6 R9 t3 n{  
      7 T& x; r3 ]& N. R) ]
      ( V  s) ~0 j4 x: g$ s9 w
    • ) Y' O  t) r# _/ r  C6 r9 O& v9 I
      5 M8 k! d- [, g2 ~" g- x
         if(toupper(a)=='P') /*优先数法*/  
      & Z9 h9 R2 T0 ~3 T$ T
      % Z. G4 N5 G. y$ J' v+ U

    • " J- ^" @0 e  D3 R: U5 c# s
      # k9 Y+ D8 z& V/ n
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  " w) T, _; i7 d7 g9 n
      : k, g* F3 [% z& M3 q$ d6 F

    • ) Q9 Y! ]: g4 D' v  \8 |
      . {# V3 x; y, l# }7 t
         else  
      ' L& `7 W3 g) x) B
      & q% p2 w  o/ P) X

    • , i4 _' Q: ^4 |# I1 U% z1 ]2 G
      ; ^4 g% B2 s; k+ Z2 X# [
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      ! P: c( J7 m" w. Y6 |4 O
      , q0 n" R- H0 y7 m5 c
    • ) p# b( M$ s, ~; q) N4 v2 l

      1 m+ a2 B. O$ O" f1 T9 r}  
        Y2 Y# r1 }; w+ P" p; L$ _$ {
      # V/ A3 I: R- G% B3 M

    • ' i9 u$ |9 e2 w$ Z2 L* G8 L

      0 Z; Z8 s1 y# |: Z# g( u/*进程PCB输出*/  + r/ z& C' c: W9 _

      3 D- I' h! h  j+ N- j) v% B/ e

    • " {# j5 V$ u' _& _2 f3 M8 r
      * {% T) [( t& v# Y& G9 a* y
      void prt2(char a,PCB *q)  
      9 W3 m! N9 b' {: `" n

      : t, r9 U9 }3 I6 _

    • ) C% M: F5 I  J4 m& |0 b: `
      ! K$ I1 L* Z- a' r
      {  9 @# j+ F) W; R! j. o

      " K9 [$ R! ], m+ @0 s" n2 g3 z& Q
    • - c+ S2 \/ X: L3 P' h( X2 c* P

      6 Y( X5 v' g: j8 c   if(toupper(a)=='P')  /*优先数法的输出*/  0 q( m/ Q3 N+ N* r6 }/ B0 Q

      # I: ~! c! ~- U$ N. j+ K! X0 R: B
    •   r* Y4 E: E3 b6 u; \: b

      4 P# U5 d6 U9 v8 B6 _      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      ) B3 U7 Q: r7 w. R0 @0 W  o

      ( J# |! t, l! l2 i4 }
    • ' `; ]6 Z$ V% x
      ! X4 ~( W1 V# x+ A  ?% J
             q->cputime,q->needtime,q->prio,q->state);  ( F5 C* w' y/ f+ c' z" a! ]

      + a: K& [* {2 @& S( X2 \: P# q) m
    • / Z4 [& }5 e2 H
      9 }1 O7 ?, N  w* d5 i
         else/*轮转法的输出*/  & p1 ^. }% N* h3 m2 t1 J

      . N# `3 S4 y* \

    • ) J; [/ X. ^; y1 Q" _. f

      $ ?) M) [! e0 O8 M% s      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,    J8 M" G. q8 w  f) t

      9 [6 c" M4 j* y0 \

    • " J8 A! |9 f" D" f8 R

      ( b! o( T* q, P5 y! i       q->cputime,q->needtime,q->count,q->round,q->state);  
      7 T1 N2 E! P! F! T- Q

      % m, @7 u! a- u$ e( ]
    • 9 s0 `1 ^+ z1 R' x

      ) a. a: Z' C$ c}  
      - s8 s0 _7 V2 Y6 q* c* c& B* y  K

      / ?, [2 `1 e# S# W
    • 0 P1 o7 r! v) o/ x4 _
      # R. K2 C. A* \. o$ V9 M
      /*输出函数*/  
      ! p7 C% Y, w: |  O! C
      3 l/ V" X8 i3 x6 N3 {

    • : r) a7 v8 C# }5 H

      " {1 Y, U; H+ W' w! lvoid prt(char algo)  9 I  e6 {& A  L' \: e

      % e3 O% ^3 _- \0 z- k' B  o
    • 9 s) l; ~) X/ I( H0 C. d6 w$ e# @0 U) ]

      1 V* j8 X; H# q# [8 g2 A{  - D& W' n# u! H* E; `

      # [  o% _" L8 N: H3 [" e+ k7 Z2 G" J* b9 h

    • ; c. _2 n  h7 [" r9 y7 ?5 I

      ! J/ O+ K* C  q8 t6 Y   PCB *p;  
        I. s. m. p0 @( U
      3 x& m/ S  |9 C( A
    • 6 K& p8 }* _! H6 Z, T
        H( S) v3 B) p. c; O; P+ q
         prt1(algo);  /*输出标题*/  ; T5 r2 ?5 ?+ v. d7 q& ]* @0 |

      6 \: e6 W3 f7 i* ^7 z6 M7 _
    • # ?1 @  d% R0 u, K. {: R' H
      0 d3 |& q0 N6 k( r9 D5 I1 ^* r0 ~
         if(run!=NULL) /*如果运行指针不空*/  
      * }+ r" z# C, H$ e, K, |! j8 |& j( _

      - t8 `0 b* S% W) X% D4 y0 K: W
    • 2 E! n1 C8 j# _/ k" f4 V

      % x; m4 L7 x5 I; w0 o3 t  U      prt2(algo,run); /*输出当前正在运行的PCB*/  
      & o: B" _1 ~$ A2 `) ^5 H

      * r7 a* }5 f2 K! C- t/ v$ k) F
    • 2 R8 z* E) M9 [1 q- j+ W
      # [3 j2 r3 a4 w, G8 l5 ^
         p=ready;  /*输出就绪队列PCB*/  
      0 l! z% {% H) t4 y' C

      8 H# _4 O7 a: t

    • 8 P, W/ T' ]4 v/ t& M
      * W4 x5 o, _' }- N8 u/ H1 I0 m
         while(p!=NULL)  
      ( q8 ]$ g. ]8 X4 W
      3 ?, m/ h" ~3 Y$ l$ R& \4 x' D
    • ! {0 y: ^7 j+ `# m
      9 H# B$ u6 ?3 ~4 q) d
         {  
      , S( q3 N- o' c

      2 V- Z' {: c, b% x( ^6 E5 k: @! Y  B8 t$ A
    • # F1 f8 o: k4 e, v

      . j1 [: J8 J! E2 ^+ c      prt2(algo,p);  
      7 M8 }, [% D5 x; c3 l. i; v/ D4 ^! b+ H

      2 h3 D  F" X3 `6 o5 D9 F/ Z0 b
    •   W; _2 E  w+ V7 _5 _

      9 r2 J; {7 @8 m/ d8 y8 _+ m      p=p->next;    Z/ }$ T5 L0 @4 {* Z( s/ [

      1 h9 ^& V; J8 @. m. ?6 d1 \

    • ) c" F8 C! ~6 b9 ]9 S! D6 F
      7 }) b1 I! I( D' c- O+ z( }
         }  
      / \, Y1 Q( G7 b# e$ V
      / `# e* Z  l. ^7 b/ f, b% v9 j
    • 5 E6 u6 A- Q; S; g

      , S( K2 A) u: y0 V# N( k4 v   p=finish;  /*输出完成队列的PCB*/  
      : n8 b5 Y3 {( U& ^. H
      0 X: ^1 l" u5 Z9 @* N) x7 g/ E" t
    • ; R, j, \. T( N+ A  r! k+ f' ]
      * t- [2 k- X' k3 K# T$ R
         while(p!=NULL)  
      ( ^8 g/ g! c5 K  R+ D

      5 Q5 A! |. A: A8 Y

    • : r# N& t9 `  P" J, z: _3 Y
      6 Q( v" Z/ j* y" O3 |. A6 W7 B
         {  0 O9 [+ W/ Q$ \1 _% W( s2 |

      * S, A* l* l& d, H$ m4 u# {7 @5 E; M
    • & c. W) R1 H7 y# E% {4 J# n5 U
      $ I# s& @  p* x9 F2 V
            prt2(algo,p);  
      ; h" R0 l2 F2 K; ]+ z# _! k* M

      8 d& V& W+ ~5 l; x' F7 W6 `( N

    • $ \- A3 E# R5 D1 Y
      ( Y: ~( B. F5 q* u3 _1 k5 \
            p=p->next;  # [% j5 E1 `" f: J/ I9 `9 ?& t
      0 b6 J" j/ I4 G2 i# R* o
    • , g2 E6 h( e: V

      - l# j6 v8 K# D  g& x   }  
      + u" q0 Q' \: E5 u6 l

      4 ?) x1 A: ?+ A3 K* X

    • : b  w/ n( t2 R: Y0 U( i8 `. q) m

      1 ^' }) \& G! v9 h" L   getchar();  /*压任意键继续*/  1 n- C$ k& v& j. U& G

      4 e$ J* s: w. _4 o, V  R
    • " T* U# m; n9 R: \  i2 E$ S

      8 S) w1 Y7 G- {! F: K2 |* S}  ( b* [7 ^5 |8 ^8 W
      + `, G* ~) X4 M6 K3 D4 z

    • ; `9 O7 B$ A# M/ h. i

      ) |5 W/ z/ ~0 J: ~# q' ?& q9 E/*优先数的插入算法*/  3 b0 C1 G& ]0 ]" d" P+ c
      ; m# D' `/ w+ y% _
    • 5 ?% x: R" ^8 X* I; K
      - l+ x8 ^  ~" [  R: j
      insert1(PCB *q)  3 y! T8 T2 g; b5 [1 M: ]

      8 e% z' x; E" }* r

    • 7 B. R: N3 d; K

      " L" J5 M4 Z* ?{  
      0 z* P6 O! c& b

      ' g8 j+ G! W- p1 p' [5 \

    • % C2 c5 G; k* F" F! r

      ( x) w2 y0 ^7 V/ W0 @1 y+ m' r3 i# z' X   PCB *p1,*s,*r;  4 [0 l2 g' [5 w  g
        S- c% j# w3 e2 m; U. `
    • 2 T$ h8 K+ Z# t% a: `

      ( M# W& ^& B* g9 r/ @) p   int b;  1 q# h0 o2 {! V( k  b& ^

      4 {1 [, L7 P- s
    • * Z/ }" |7 b) S! j* N5 m

      7 ]0 z' _" r- u& J0 u% @4 p   s=q;  /*待插入的PCB指针*/  
      ' }  E3 w& H# [! |# @  m

      . Y. q7 S. W% O4 Y3 ]% y

    • 3 w0 S4 Z( y/ ^! e# Y
      8 v2 [- i/ s0 b
         p1=ready; /*就绪队列头指针*/  ) \) F" ]) G3 Y* A0 Z$ T

        C0 |  v- b* {6 l

    • 6 ~# O; z2 g+ h3 c' N

      / ~$ N0 u1 M# m5 j! k+ U9 I3 u2 L   r=p1; /*r做p1的前驱指针*/  ! B: Z! h  u: C, j, q
      7 m9 l( z9 W' `. c3 \

    • 0 k4 K! P( [  P% z3 A' G: r
      2 H) ]1 q/ q8 B3 o6 i4 f
         b=1;  ; C5 t6 S. Y: d' F8 X
      8 J  i. U' V% w# o/ q" m1 R7 s
    • & `. u% r, N5 }
      1 M8 t5 [) V' C$ v) y/ G  K
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  , S* E; n( |" V" o2 |  m' j( }1 o

      4 v0 k( j$ Q3 J. T' B+ C" [5 h
    • 9 F! D% Q3 D" C' W4 X- a& X
      * `7 E" W' ^, m% w, n
            if(p1->prio>=s->prio)  - r& i! Y- Z( Z
      ! K+ V: _! r' A( b. M

    • ( I+ e1 g+ A+ c1 a1 |
      & J& N8 {! J" Z+ [  O; r9 X
            {  ! B- \8 K; r8 C
      ) K* }7 G+ }/ o8 D' K

    • 7 r! Q/ ^8 k/ p8 `/ n: P
      ) y9 _; L! o6 c* w. a8 C0 j6 c) s
           r=p1;  
      % @/ T5 C/ z; f- t+ P
      # {# L* \' _- I" @) s7 M' y; \
    • 7 h) x1 X* V( h  _) {: s) b

      9 b9 _. g1 e% z& N; ^  K     p1=p1->next;  
      3 m7 `! N8 s0 O% L8 t

      $ m5 T4 W5 p0 S* [

    • 1 V% r3 I* F6 T% X3 n! c9 {2 J7 `
      ; P6 F2 W* r. t- a% }  b: z
            }  
      5 C: h5 _- S5 _: n' T, e

      3 p" D8 v/ x+ {7 ~$ a0 U  I
    • 4 d! G& W! s( h1 [. w: C
      ! b7 B) P1 p* |8 `0 c+ Y$ B& ~/ u0 a% U
            else  
      7 \4 J/ W7 m  J! W

      ! g& j/ a! A% e
    • ( b! `( c+ ^9 |
      ' Z7 E$ ^* t' }% k; R: t
           b=0;  ' s0 e" R' T4 O* q* S6 {
      9 C7 g% r# T# W* t+ E6 d
    • 8 [+ Q/ R9 V# E
      ) n6 a7 U8 i* c" {
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      0 T9 T2 Y( `! A* N! K

      # A1 d& k5 ~% H! U

    • & X8 a% n+ v2 Z+ v

      ( ?$ Q# ?- C( e2 Z" e1 _4 I: x- p   {  
      / t, D# t$ X4 |3 l
      $ m" T  m1 t+ G. c
    • & o, z, s5 Q/ T+ n7 e5 e

      8 X6 u) |5 o" o1 I      r->next=s;  
      0 k7 ]* p6 `! [" x6 |) V$ {$ I

      , ]4 }3 s$ X' [' ^/ ^. D8 N4 V

    • & U! D. L5 p& d, u

      . M1 s2 U- ~0 e1 m      s->next=p1;  
      7 e7 e* \0 K$ |
      1 [: m; X' L! J# r
    • . \) D0 {0 n8 W( f' Y
      1 {( L5 J  n% N7 F; W
         }  
      . _5 |/ W, O9 |+ }

      $ R5 x% T$ D8 B6 }
    • & U6 c# e( G& I9 Z
      0 W7 o0 I4 U& j. y
         else  
      % w5 M, U8 d: W7 [
      8 [6 s- ?% M2 n1 a, s+ |, l7 U) M

    • . @  y; m; }; y: |& V
      0 H: n4 \* V+ T, P* @0 m  v* j; P
         {  
        P. W% d# }7 m, b; o1 I
      # f+ ~  _, a$ W. T: _" Q2 ~
    • ( W. W6 X" t+ W, x

      ( ^7 s8 _9 Z5 a& ?5 b      s->next=p1;  /*否则插入在就绪队列的头*/  
      ) i! b5 n- E6 i9 i9 K
      : a+ [& r+ Q- d8 K0 {

    • # ~3 T; p* z0 x6 }4 v0 R/ @1 \

        D2 e( [+ p  U. t+ Z      ready=s;  
      % D: `4 @, a  l2 Q$ p/ U; s& @# n# b

      1 C' @  _, t7 j- R, e

    • 7 P$ P: {5 [' m

      " \+ |' L- a1 R9 _   }  5 v. e8 d, S8 D+ Q6 t" x
      ! }0 z: \) @- H0 {% x, }
    • * I! ?  b1 T/ i4 z7 y
      8 \8 t7 ]" m% l# Z% O" [
      }  
      ( F# V3 L* e- D+ K' P

      ' T6 E9 ^5 G5 c1 O* w, v$ P

    • 2 g$ \+ o/ g2 W3 i7 f( w1 r
      0 Z; u# c- _) @$ l8 o  W3 Y% K! }& g
      /*优先数创建初始PCB信息*/  ; g) w3 D$ I: E# O7 D8 ?5 B0 Z* I

      ' M. ]% E4 A4 {2 m) H+ R7 \1 `

    • : O4 w# v; w5 n+ z
      # A% ~" V# K$ _/ d. ~/ T
      void create(char alg)  
      : ]+ c" v9 Z% H2 K8 @# g

      # ~7 l- v! F. d% H

    • " h" |: r& X1 b9 [
      4 ?' W4 p& h  j  q
      {  3 H9 }- {0 C. s7 j6 s

      & G$ Y0 |7 }8 l5 ^0 v

    • 4 i7 }4 r( ~) Z1 Q, ?$ r, L  u

      ) Y8 I8 x: M  j, b" y0 n3 J/ F   PCB *p;  
      * x" @6 [* N6 `4 M* e% T, E
      * {7 a/ y: i8 _2 w

    • 6 F6 ?1 L+ Q! K
      $ v+ R- r% Q6 v$ t5 L
         int i,time;  " P# _, i6 h7 Q. {

      8 a2 m6 J+ [- Y, z  W7 D% G; D
    • 6 K" m) P, u, a; ]
      ! V! _( a  k2 ?
         char na[10];  
      4 R' i# x+ s$ l; N8 G# D  R' T

      " o) w' u# ~( W4 V& [4 [

    • ; \! v( W6 I. p7 v% [8 l! K6 y
      ; f7 U, X% B! d+ a
         ready=NULL; /*就绪队列头指针*/  
      ' U5 r3 C0 t; n! s. {! v

      4 b0 f. @6 [: \+ q* `$ m
    • 2 T: I6 [2 U, a, Y# ?1 @! H6 R3 M

      & E! P- f3 Q; P& g0 [8 i   finish=NULL;  /*完成队列头指针*/  
      0 F& o1 u  ~, ~1 n8 K( Q8 Q

      2 ?' d' u* j' |# S
    • # m" j+ Q0 p* q; F- D% G
      ' }* s* W9 U; \$ `) D
         run=NULL; /*运行队列指针*/  9 H, w% |0 a) G0 z
        m- q* |/ Q" W% x& K5 }! y! ?

    • 6 E$ A$ q( l. V+ b0 |# |& T5 S
      - F* ]7 u$ T0 \, \; M% |  Y% p
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      & E0 d6 n1 i; R: [; ~- W

      ' B6 q1 |' Z/ C) V. E, d
    • 8 f2 t1 ^4 l; P* l- @; y7 U& ^5 h" W
        j6 ^7 e9 S% ^4 ]. N* v1 A& S# e
         for(i=1;i<=N;i++)  
      ; X/ b8 d" x$ V0 `
      * Z; V8 Z+ ^- O7 u9 g

    • 5 I" c+ h5 Q( G2 z- u
      3 y- c! c$ F  W$ m' {0 A
         {  2 ^8 y3 c* b. h* l
      ' A/ k# C+ A1 ^8 r

    • - e$ q# Z0 [8 F; @9 A: K! Z) P& }5 k9 g* R
      ; k( u# Y- K3 H" k0 J$ V. ^
            p=(PCB *)malloc(sizeof(PCB));  , L7 T# j4 o7 E5 v

      - a4 A, V4 I5 k$ V' c
    • 8 s. e5 T2 k, Y0 F( L. X
      , x- F+ J2 S- g, l7 p5 y8 J2 H4 Q) ^
            scanf("%s",na);  & f- l8 v" v( G# [( m( O

      8 M6 g0 z( k( {
    • + e6 ~" O4 p6 G

      0 m0 `; q1 `' m, I7 [# p. y, {2 ~      scanf("%d",&time);  % Q& F, N, Y: n

      + I) J- m) }' K) s% m
    • + z+ N! L$ m3 e. H4 c
      ! f8 M0 k* t/ n: E0 s" [$ E
            strcpy(p->name,na);  
      - x9 i2 O! e  ^' `- Z

      : B$ o" S  S. _6 q" T

    • 9 v: ]5 v8 F" K7 r8 f6 l

      4 d; g' b/ a3 y$ W      p->cputime=0;  
        a- A& c* ^  ?4 N! g
      - s  q' |/ m& E8 f2 Q" ]0 z5 B
    • & e, K% ]+ I2 J/ ?9 ?
      ) A0 T' D7 G$ M3 W0 g  B4 q
            p->needtime=time;  
      & d, g; [/ f1 T+ L5 F

      ) l* v+ l6 b' r9 ?$ Q$ d  H+ V
    • 3 ~( ?% O' P5 P. V) \3 _

      2 ?% ]2 T# b  O      p->state='w';  
      + N$ }1 i3 |! f3 O! X

      - ?7 Q" r5 u& W. E
    • . @5 k! d# K1 Q0 ]' z8 u
      % d2 F7 P6 P9 c3 f1 M4 N
            p->prio=50-time;  
        J  Q, I7 u9 a$ k, J
      $ ]! `4 a9 I& J$ |  c3 O: w$ u
    • % ~6 k# Y$ ?5 K/ E9 S
      % D# @$ s, ~' Q9 o
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      & j/ n; w, ]& q% o6 |& |6 ~3 O

      2 e1 W* B9 r( I  [$ x5 `/ H- ]' R

    •   d4 U$ ]$ z3 ?  O. K: h
      " k% x+ a" `- y- A
           insert1(p);  
      / j% n: J) |: r+ T+ L

      % c8 E6 c4 o  b0 ^6 V
    • 6 F. ^# l: o. ~+ V+ |
      ) G4 ]" W8 r5 Z( |
            else  5 h( N4 M$ c: A/ O- Y

      " I% [/ l6 Y/ Q8 T0 A  {' L  E" e
    • 7 T* _- A1 g: K3 O) o: s
      & L/ m$ s  ?$ }! G" g! j; o7 Z6 t3 T
            {  4 S9 C2 n3 Y6 e9 V% z! V; P

      / |4 Y5 C/ w3 D( H

    • 5 X, N( q5 _* ]& l. o' L+ K2 w

      $ O1 p. _: S+ F& N2 G( v6 ?  a     p->next=ready; /*创建就绪队列的第一个PCB*/  
        v) n' E0 P# x
      4 f$ o6 H( T) f8 p

    • ( G9 E- T' `# L  R

      # d/ O( \" k, v4 i     ready=p;  5 _" q' F. `8 J7 m' P

      5 {6 H3 I* `6 p3 R
    • ( v8 @+ Y1 |8 x0 Y3 J$ c( H

      : W$ u9 d; k% r% e6 w& F6 Y7 x( F- P      }  . ~% y2 B, z8 F! A& A8 E

      : H( A1 @0 _7 f

    • 9 p) O! Z- ~& D: S4 v

      " V- V, H* D  A* {8 j   }  
      1 w+ e! _: a) B. J

      ! t1 k; q& F; v) z+ |$ Q7 V/ T" y
    • : @: i; }7 L2 e8 V  [5 I
      7 u1 H0 g3 S0 x1 u
         printf("          优先数算法输出信息:\n");  2 h4 V. _& B, b6 [

      4 }) q; u+ J3 o) v$ O
    • 1 c* e3 S) _0 k& r1 J$ M
      3 e# S0 n. e& N
         printf("************************************************\n");  + S( K# h4 h- `+ ^* f
      * `* j8 a  `$ c
    • : K0 u4 t3 j4 i

      4 G/ ^5 f% O$ m' J, Y& a5 y   prt(alg);  /*输出进程PCB信息*/  
      . F" K- a2 G  v9 d+ @# C& H3 m

      9 @8 ~/ |( Y) p+ ^  C3 l5 V% M; v
    • ; u6 {% ]& E6 c% \+ K

      7 {5 C) b. w2 n% U7 a   run=ready; /*将就绪队列的第一个进程投入运行*/  ! E  ^1 `. q6 X# X- u( z/ h+ L$ b

      ' c' S' j! k& \, l( M, l

    • # n- k8 u+ q* |8 P, B4 d% A

      6 y1 J; c; Y/ ]5 D% ], q1 b+ f   ready=ready->next;  ' L6 M& [- Q5 C

      , d7 Q$ a/ R  J9 |) n& n7 S

    • 3 ?$ t3 N. ~. L7 U! l* l/ Z
      0 n' K8 N# k8 d. l& N
         run->state='R';  
      . Y0 `1 A6 O7 x+ j# W5 l3 G8 s6 Z

      ( @6 A' @8 D  b. @
    • " B1 w3 P5 G5 B% x

      " o: O" F2 m4 n3 z- }}  
      ( G6 p, k2 X6 T' N
      . M+ f3 N7 d2 k: K

    • & s9 `3 ?9 R0 D- K- s/ B' a
      8 f% A1 O5 N- X, t9 g
      /*优先数调度算法*/  
      , Q+ |  }- ~1 n# c  [9 ~3 O
      $ l7 C" N& ?7 }+ U" y/ r% G; S; R
    • $ d. \( |" G5 B# j0 E% j
      : L* H1 e( {7 J3 e$ k
      priority(char alg)  
      : M- ~* K" @  F, ^) A
      , U" z# U7 A. d
    • % T. f7 M4 D& M
      2 j2 v4 X8 k6 n( K" _
      {  - {. F5 E. X  Z; Q

      3 Q- k8 h2 o4 F3 w, a

    • # p2 E- N+ |* _& b0 n+ o

      9 n  l; ]: Z4 @" N# c3 a   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      6 C, O! @- Y% E( i
      ( A1 z" P; @7 v
    • 8 k, `2 d/ i! Z9 {  x$ o7 K4 @2 ?/ u

      ( f3 R$ A$ e; A1 Y5 M1 t   {  3 z. t3 Y/ `3 {7 f

      - d' e8 E5 e9 `( A4 p4 R5 C
    • $ G2 p* J8 C& ?/ _/ }  a2 P9 S

      1 B# r7 w2 _0 H- N( H: W& j      run->cputime=run->cputime+1;  
      1 X( N4 T. G* j2 S
      & m5 v+ X  D1 R5 P  @  w7 s0 t6 r

    • 8 ?6 a9 `4 E( D

      8 Z) {& b' S& G+ U) O0 \      run->needtime=run->needtime-1;    G! `) D( A/ F. L2 ~( {! V# G

      3 n0 h) U- E: c& D5 G. s$ ]
    • ( u  u) J* g/ [; m" G  a" x& h
      , r* s4 l- z9 n! K0 {
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      : `; x- a" l4 b6 K) y6 Q% A
      - h( H1 B1 E7 x" c; k8 q5 E

    • ! D. B! r9 o9 A! c! y; }# ^) w

      ! K7 h' _: t% U3 x/ `7 g8 p' T      PCB *p;6 m; e" X  q* y/ D7 x  M
      , Q9 Z/ q: y5 D. |' O. J
    • 8 a/ ]" D( y5 i: V& x) w
      # ?5 L5 S; T( I: t1 D
            p=ready;
      5 ^2 F! }: y( I: V( O( h

      ) L. M+ w8 h# p2 C/ d, c* r9 F+ B) M

    • 4 e: v( a( |9 m) B5 g* d5 H

      * T! A3 \/ H+ }2 k- ^$ [- C      while(p!=NULL)  2 z* w1 A( n) P, |0 g2 l6 O5 t

      / V) i, H4 G' N: O- r/ A. @# R
    • - k8 @! X1 H+ k/ z& ~3 b
      1 E* ?8 r& z& F8 D5 N
            {  
      ; d. P' O. I. u

      9 ]7 s) X# M  ?: S1 s
    • # [' P  f1 p' W' i2 H
      # m# ~5 W& Q; o
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    * }  t5 D# i- i8 T: H) _9 ?( o

      9 v. C  }7 D* P9 Y5 P! L
    • % I0 C* T$ H; R0 D" I9 A

      # D5 j5 ?4 q. i  V, |/ x2 |0 g% z+ f& X          p=p->next;  $ V; y1 K: H, ~0 z; E. k: c

      " _* j% h9 n3 U

    • 0 P0 h4 }, f9 P9 I4 M% c
      $ g2 I6 N- h) k4 W8 D' U
            }  
      - A% |0 {; ~* d+ m
      . s# G& |& i; U# s

    • ! r+ ]! a) p& ]8 U

      1 |4 Z3 r( p1 K* ^, @      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      6 U' b. r/ c/ R8 g  I
      0 ^; ?6 B! K" J7 z6 g# U% E, d& h

    • 8 r1 J1 H& N1 d+ R1 D6 M3 j

      , F2 \0 h$ _3 M  ~      {  
      ; G5 i  Z: H1 i& Y+ C3 `9 k
      5 p; z7 A4 ^$ S+ n6 J
    • " ~0 M" @9 w+ o# A! Y

      % Q6 y; E& ]: M! T$ H" a) N         run->next=finish;  ' r* x9 b$ ^1 \0 j7 t% g

        A4 O5 ]& G: Q

    • ) f0 k6 i) |3 ^% K; n

      ( u: w: Q1 ^2 `3 }  \1 c' ^$ {         finish=run;  , K) p# m! K: n' a6 [

      ; m7 Y: {& i) d5 v& b; Y$ _9 @

    • ; F& v8 |4 j) i1 I3 R; E, {
      : C$ c$ G6 z" \1 M  l: o
               run->state='F';  /*置状态为完成态*/  ! q- g. m: u9 X2 a

      ! v0 ?7 w% o0 v6 u* V
    • 0 ~) F& g3 Q5 p, A  ]" ?, l6 w
      6 e  e2 n7 B* q' _4 X6 u3 _4 |- M
               run=NULL;  /*运行队列头指针为空*/  
      ( ?4 G( ^+ L. p. R2 O( J2 x) k

      ) S# i+ N+ ^( o9 z

    • - z2 K% V; x3 C) K

      2 M5 C  `: H9 c' T. C# t. C         if(ready!=NULL) /*如就绪队列不空*/ & H: d& L! I- u, ~7 @1 F; C

      ( e$ V2 i$ X) m7 m; j% i
    • 7 Y" y3 Q* F) K  J
      5 E; F0 X2 k/ j8 J9 w: o5 s5 P
               {  
      ) k8 C( \& J) C0 ]
      0 V" w4 f8 J3 z
    • % f1 v$ W; O2 c; M8 |

      6 P! K  ~( _- _            firstin(); /*将就绪对列的第一个进程投入运行*/  ! H$ F0 X2 |, J0 S, R" {' {; W* x

      8 Q9 m4 N3 v7 M7 g! h* U; ~9 [3 ~
    • 2 ?" _- t# @* L- a% u; a5 K
      # K9 x$ w* F! j# a# C. G
               }& @) u+ }4 C& J* ]. V
      4 ~% P5 x% k  l8 x
    • & i1 d5 G) y" l) E* S' A

      $ R. Q" S! F' ]3 f$ P      }  
      3 R$ g: d' I3 A6 b( [
      % G9 I# U( ]: C& n7 ^# f# Z* @

    • 1 k: V) w' g: Y5 Z: H7 k# ~
      0 E; U) M: q/ ~- o! ^: t4 ~4 E
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      ! v$ T9 C2 l1 x5 s# n0 C8 C

      " ~6 L/ s$ O1 ^9 P# a
    • % B0 i/ r5 {3 K2 l0 h1 s3 Y% o% c

      0 Q0 q% `4 G/ v5 |     if((ready!=NULL)&&(run->prio<ready->prio))  
      % `" O6 w. }9 h, c, U+ Z$ s

      7 X$ ~8 o% e6 ]5 S! `7 n
    • . }6 T8 A4 g6 v4 C

      1 |2 v$ h) ]/ g' V# j2 w* \     {  
      ( w, u2 j/ m$ i3 B, r

      $ G2 `; C1 i3 _* P" x7 y8 R7 O9 P
    • / i; l+ Q9 s. |1 c1 x" N
      $ [2 w% \1 m' W/ H# X8 e3 Y
              run->state='W';  ( D6 y4 a" v+ {& J! U- |, ]3 B

      ! M* q3 X; b- y5 W1 h) J; A
    • * t' {& ?/ h+ D) K; U% Y
      2 p1 P# D/ a2 H4 p4 h
              insert1(run);  
        D. E7 i7 X# `: {5 m
      " N* W2 u  d) |4 @6 v7 [7 O

    •   z- a# d3 Z! y6 K; m& H
      ! s. H$ r! X0 i* r% z& S% }+ u
              firstin(); /*将就绪队列的第一个进程投入运行*/  " Q% A2 v  D3 v. f
      + f, n4 W* n6 p; `8 h( o' Q0 s

    • 2 n5 ^9 `4 O% i, `6 B* Y  C6 e" ]4 H

      ! X1 r( o' z) _     }  
      * {6 F5 K9 P% A) _$ q. v% M

      4 c8 i% D- A6 C7 b( J% }8 Y' I$ z. a
    • ! v- e* R2 g  s2 J3 G! D

      + L: S8 C; B# C5 F2 T# _3 c- M* @      prt(alg); /*输出进程PCB信息*/  + k# {, I" X: A
      $ E6 |. P9 U' T" B; u& Y
    • & p; o' u9 y  l+ W& n. n; e, _: ?
      8 H6 [) }) q3 d5 C# ^) Y2 b8 [! U
         }  
      $ L9 K2 T2 q$ M. I+ a

      0 @" E/ ~; u2 h6 E, s$ ?
    • 8 S' h  ?. w1 x& X' `

      9 R+ I: G( k8 ?6 r, {}  ) ^% u1 {/ S: U% k5 I* v9 D

      & c2 \! i. S* A5 W3 }1 w- N

    • / t: a% M8 J% t

      - `4 I8 i- d8 Z$ e  u+ G/*主函数*/  : ?" C/ Z+ w# q' z3 ?6 u
      ! d8 h% V6 [9 U2 h8 E. m' K

    • + J/ `2 Q+ u. G3 H7 `* h0 s6 t
      ! f& a! `8 A0 i* T
      main()  
      ) i% @: E( ]4 g8 ~" g: F2 ?

      5 I1 r4 j5 K! M. ]0 N
    • 3 P/ \. b. T" l2 U" ~, O6 r4 X7 B- F2 a
        m& v0 w+ F/ u5 @8 b! T
      {  : ]& R7 V4 }" B- Z$ ^2 s
      ; W. ?4 ^' _6 F9 k& g7 Y. Q

    • ; N- D( Z8 p# ~- \) ~8 p2 x; S
      - n8 P. p. w( b0 c/ t, L
         char algo;  /*算法标记*/  & `/ S! K7 b9 a
      " [1 ^, T; k  A

    • ) d4 B3 J, ~) K7 k# ?' j, Z
      . `; y, R9 u* C- Y& L0 X
         printf("输入P确定算法:优先数算法\n");  * V, `7 z/ W* U) a0 U8 e- r

      - a6 o; t0 F) C9 Z4 l: F1 b
    • : B: G  H$ E7 b  h: ?% |

      6 V8 o. Z/ ~- R  H0 _   scanf("%c",&algo); /*输入字符确定算法*/  
      6 i8 n) m  U7 l

      . x, f4 {% Y( U; E# e
    • % Q3 k8 Y* a& y! |, L1 F' I

      , O8 v  y" h: }) q   printf("输入进程数:\n");  
      - V: K; i0 J3 t" w

      + w+ q. W$ l- u- J! e
    • $ w1 U& y: k3 |; x4 f: T
      1 u& b% q# q: ?/ F
         scanf("%d",&N); /*输入进程数*/  7 @6 Q7 f5 J  u3 Q0 I

      ( V, u7 Y5 M+ `5 ]7 p. F1 f. E

    • 6 ]. P2 q, H/ X6 F+ T4 u

      & i- Y' o( M- R9 A  v; m* H   if(algo=='P'||algo=='p')  3 c1 F; R: F6 k% L& I

      * V$ y# Z# w6 K/ T+ X2 i  B

    • , ~+ ]1 |. t: {0 R9 t& d
      7 X/ y+ @6 k5 s) |
         {  , R# g% V; B& P$ v! \
      0 e2 s# ]- S) `' m1 x7 p4 }5 l
    • 5 E7 M3 [" B1 o  U
      . }) J6 p& ?# w! {- O$ k' J
            create(algo); /*优先数法*/  
      5 A+ B( `" E$ q+ a3 b
      1 w' c3 o( W/ J1 h6 W% Y
    • ) Z) U5 Z# ]' q/ _% v

      - D, V6 {, A. `1 _# ]0 O4 R      priority(algo);  
      8 L* K  ], O6 C2 b! Q5 b
      $ o- J5 O: J8 c2 k$ K: ~  A
    • , k& S& ^" C# r1 L% U

      ' l, S( C, m: g3 P' l5 ^9 {3 O1 q* G   } ' {# A; H' M) M3 w% V# V$ L+ s- n: a
      - @' y0 Y; E1 v) `/ s2 N
    • 0 t% f  G; F. l# L2 w- c4 S/ l
      1 j! f( S9 \' j, P- ]* \
      }  {' \* k8 a" U$ J  o4 O8 A+ b
      , i* K/ i. K) ?: t, N- a6 w) z

      , d/ s0 y$ l$ G1 E  _; ~; y

    / ?8 k) _: H! X& T" ~, a
    输出结果:
    + F3 K! D, O6 f" |6 k# K0 c


    9 [6 t: H8 Q8 @7 ~" ?原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    8 c9 G. p( r3 d9 N+ R6 z
    ! k8 _* M1 l/ `
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-11-1 16:05 , Processed in 0.312804 second(s), 51 queries .

    回顶部