QQ登录

只需要一步,快速开始

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

    & X! z. I3 t1 G( A优先级调度算法
    1 r' p  Y+ f- Q2 z9 T

    算法介绍
    8 y$ g% c7 p0 X: q8 l* c; b  G优先调度算法的类型(用于作业调度)0 f* ^, n. j0 S* Q$ T
    1)非抢占式优先权调度算法 5 h  @1 ?- c% k- _; H& t; _
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 ) ]7 {% n2 @. y: k# M6 x" D
    2)抢占式优先权调度算法
    + M# v7 }2 u1 p5 P" G$ P+ |只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型/ `  P- t( Z; I
    1)静态优先权
    ( q8 C  ^* X$ q* o. J2 H静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。$ h  I& q# F$ ^9 r% ?

    2)动态优先权 8 e. c; W+ n/ g! e

    算法实现

    抢占式动态优先权:

    4 Q8 c  U7 w2 `
    PS:本人认为非抢占式静态优先权没有实际价值。

    • ; s- U# p" H* Y' t& h
      : d  G' Q+ _: d2 ?9 Q6 }% P  h, f6 F
      #include <stdio.h> / |4 e: M% o; X3 a$ T

      9 f. c: C  i1 Y( `$ p9 ~- j

    • 6 V5 R- `& n" X- X) `

      # y. @( P% b3 C* k7 J; A# H#include <stdlib.h>  
      ; `3 ^) j/ p7 y+ K
      * m( h4 p- O, `* Y' q% n& N

    • - _) S) }: \3 }& _% s1 ]$ r
      2 H+ `& C* `$ _) Y0 G0 w: n, E
      #include <string.h>  6 Y* @  k# Q6 J  W9 n7 g: V
      / h, `. C; {8 O' [

    • 5 M1 j  j$ `1 e9 s

      % B) z& H$ Q, x" w" mtypedef struct node  ; ^- B( O/ S* s4 ?1 I

      2 Z% X' l0 `: ~7 p! P
    • 0 c/ `7 n6 R9 Y8 Q/ v+ O
      6 S7 a1 w" r- J- P
      {  
      ! S7 g; c% A% f- G, a" F) y7 S0 g1 J

      " ~6 r- a, W8 R& }. N! j  U6 l
    • 2 N4 ~1 e; H2 w. c; H

      : m( O, ^+ v9 U$ d3 ~# y   char name[10];  /*进程标识符*/    Y9 X( L8 {2 n6 P# X; N# _' }. m
      ) S) {7 R: x# v; F. u

    • " y. r, M9 [, l) F0 h
      + [* z; O. ]3 u) N, `; n
         int prio;   /*进程优先数*/  
      2 u# F) g* t" Y4 r3 I# R
      ' v' Z, O9 O* Z( t
    • + a) p7 P6 c5 y8 [+ r. F  H5 x

      , ?, H- r7 c2 J   int round;  /*进程时间轮转时间片*/  
      2 u9 J  X% {& Z2 g8 l+ T7 R# T: D
      " D$ H$ j. C/ `( ~; k

    •   M- \! k: y& I

      ( L/ P3 x4 D  j4 h   int cputime; /*进程占用CPU时间*/  ( u: q4 s: c* t( ]; Y
      - c5 J2 Q3 g- w9 Y+ ]& g2 p
    • $ t/ A8 u8 ^5 A) Z( t
      + J% H2 C' x2 U# |5 b
         int needtime; /*进程到完成还要的时间*/  5 E/ Z$ Q8 _  w/ s1 t9 U% f

      " J, ^% k" t4 M' l

    • 6 m0 c# \- W; r3 ?
      & K. J# k& V: Y+ H* E3 O2 V. M/ k
         int count;  /*计数器*/  1 b- J  p! z; E6 P( d. \/ b8 I8 E
      8 w* u1 S) t, H" a9 f

    • - b. \+ J/ Z7 A

      & }5 O7 P- N. J2 W   char state; /*进程的状态*/  
      % q. b5 ?) O$ c7 v

      1 q7 {' V: z+ f$ Z

    • ; C7 E5 z) @% z+ M- `/ P& u
      ! U- _. N2 Q1 e
         struct node *next; /*链指针*/  
      1 |! _% e) }1 |( Q, s! {/ |

      / z" k( `4 c# b0 ~
    • ) M! u3 E9 M* L0 N% @
      ) F/ z: g; Y6 `- Y
      }PCB;  
        a1 C5 _- \5 Y; M

      + |/ |, N! e4 q7 }

    • 5 [: x' \! F' P( W

      : _5 ~9 z5 x! w4 @" z' RPCB *finish,*ready,*tail,*run; /*队列指针*/  
      * b4 ^7 ?) b4 Y* c- t" G$ Z
      # H. I  W7 a+ ~6 _

    • 6 z$ D6 W3 {- S' [8 ~
      3 F9 K% ~3 i6 B) `2 W
      int N; /*进程数*/  / h: O* @& i$ R$ q- e) E) @+ O
      : M, q+ M5 d/ v; C
    • - E  p# |* ]0 R& v8 o! [6 b8 O) T1 L

      + w& S8 C# v' z2 I8 T/*将就绪队列中的第一个进程投入运行*/  , u1 R' K* h. R6 H# Q

      % @4 w; S' E) a& q0 m* D

    • % q1 q( v% r9 C& }- D

      5 `- v: i6 n' S! g7 v& cfirstin()  # i9 y" z" e6 p; |6 g1 h; x* _
      1 ^8 X* _, S( M$ o0 [) M: ^$ _8 B* B
    • . t6 n, [; o9 d1 E3 L" E4 L' V0 @+ d
      9 r- g  J- y6 V) e9 x& T
      {  - C' s' L5 H( l, F1 A5 G+ n2 R* U

      % P7 P& f: }  \3 _; v$ X: ^" ?

    • 3 T! h/ y! z' @1 H2 _
      3 t$ j! u( V) c) k. @/ y
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      % f4 {' r. {1 g- Q
      ' q- `# C5 m9 c

    • 5 y* H# W& g1 B( t3 U0 [
      " p4 e2 c" Z  N$ n8 \9 g; N
         run->state='R';   /*进程状态变为运行态*/  ( F' ]* g5 t: A* d; R& _' p; X4 {

      1 j' r3 l/ c3 e% ?' \7 u  W
    • ( @& @; a7 e- y  Q. ~$ B  |

      1 D- b$ }6 u$ q0 Y- S# T1 a) ]   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  6 K; u. o' a. n8 C) |7 y9 e

      . E$ @$ X- r$ S

    • : |$ H8 c% P- D9 N& j! {5 \
      % |/ h% ~8 a& j
      }  ) u8 l* `- N& J
      $ c- b9 |/ }5 p+ \' P' ]" y

    •   m/ S! \& R  S0 J( i0 ]

      2 h+ O3 |2 T; U5 Z  R1 h& h/*标题输出函数*/  
      ' v; b' J" {$ {9 j5 B- K& u& Z
      3 x0 H2 V* J/ m: H; r2 {9 }+ U
    • : v1 Q" ]/ F* @

      ( l% i+ v/ v) L3 k; x* r) [void prt1(char a)  8 S+ W! V) s% @' H7 R% [5 S- T
      - W6 Y2 Z) O! U- r
    •   P$ V7 g/ f! H: U" F" h5 n* b. \

      , U3 h- b2 l; \2 b{  ; t- _: B- {) P& y) e, D
      6 K  w+ d/ D2 T0 A

    • 5 K9 j/ S( H5 _2 e$ ?7 X4 b4 V

      ' ]$ s6 @- v; R1 B9 q6 U( \$ H5 `   if(toupper(a)=='P') /*优先数法*/  
      2 [* N- d5 v+ V" l! Y- x- `' M! N

      2 Y# c2 k) r3 K2 `3 h6 N) Q
    • ; L( a. Q, O3 k" |/ v3 w% W! B

      7 n2 W9 S, Y- P      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  1 `6 G% N2 R' {% p7 T

      ! _# [4 j, x- u7 r

    • 1 y- h2 ?; Q6 y, F
      % `5 I/ l- E* M& `( O  g% N
         else  
      3 e2 `; G' C/ W' i
      : P; b6 Y2 e2 G/ b/ j. |! S: M2 b
    • / ]' Q6 n5 T% s9 L. H

      # N' k' Y6 {+ s! }* I      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  , W/ g8 E6 A0 r
        L3 o" ^8 D7 U4 ~

    • - e3 O0 H* Z; r4 h* Z) R
      3 v. z9 {' R; \. q+ L; w, ]6 K
      }  
      # c, q( Q# c% C5 S$ x# n6 W5 N* z
      ; j2 k( e" F' d

    • , I6 z; D5 x$ R0 W# b. [$ }+ u1 }8 i
      / N! ]* l- p4 X7 n% Z
      /*进程PCB输出*/  " F/ Q, s2 M# ?( `( Z! J
      8 N) p% h6 Z0 q. o  z

    • % t3 p) z4 |9 u( H2 t, i
      2 _2 ]% K# e+ K$ U& @8 g/ A2 N
      void prt2(char a,PCB *q)  
      2 K9 n* E- d( A4 B  L; ?/ ~; w

      4 L3 J8 N, |+ w9 i$ ?

    • ' @9 x4 i1 p9 A6 l* j' @

      ' p4 Z/ w0 J5 c* m6 u  e{  
      ; r0 F7 u" z- n/ i* {
      6 }0 ]( r7 ?0 j" d

    • ' k- C' _2 Z. ]' I$ x9 o9 i* y# r6 c# P0 `

      0 w6 M' }. P! {' R7 I, Y, c   if(toupper(a)=='P')  /*优先数法的输出*/  # j3 X1 ?* ?9 t
        Q4 G2 k9 G  L$ c) `, k( I9 P! Z
    • ( d& h+ r; E5 q0 V
      5 k+ n! I1 ]; W! n1 o
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  3 @( F4 Q# ]1 p7 y3 d

      / G5 n( ~; v: Q3 _; d0 |$ l9 u

    • 4 U) Z% P% A' X0 o- X4 T5 i% O" T
      8 r/ @+ B4 z4 \, s; r
             q->cputime,q->needtime,q->prio,q->state);  
      " p0 w8 K9 p) ^3 G/ N5 O

      # Z% n, \3 F' ~
    •   K% w* [, X5 C$ w+ j0 q6 a

      # S- w9 Y1 e( k: q  f0 G   else/*轮转法的输出*/  
      ( d8 k9 l: g3 e8 |

      ( F% `0 M5 J# h4 Z6 L& o' L

    • ! ?  a% h3 A4 K! Q2 u
      ; {1 J8 H# k+ |
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  5 F. q& s# N. z1 G1 q2 j; I
      # ^# B# q7 ~3 E$ X+ z& U

    • % b* L+ i' p+ D# ]' H' @
      ; y: G$ t) W3 d5 j. s* t7 [8 U
             q->cputime,q->needtime,q->count,q->round,q->state);  # d1 i; \( `! z' B, W7 y- e
      4 R8 M% n  e# i3 `- b3 ^7 Y

    • 3 G5 C: I0 W9 H# L
      0 o7 c# }  A1 b( b) c# Q; E% h, F
      }  7 N/ J( ^; B& M* [$ s. f

      1 t9 l" Z, F* ~+ v4 O
    • ' h: H+ t4 ^5 x9 ~3 e3 x
      ' j# z% K& j, f9 w0 A
      /*输出函数*/  
      1 e( W7 B" I. m( @! b

      9 H' U* O  G' X3 \% Y
    • . X2 ?+ M$ |3 f
      6 G7 N3 K5 a7 [6 H
      void prt(char algo)  + e0 |5 ]# y4 k* B- m
      8 Q8 d" i/ F" Y) S' O& y' x
    • " b5 I. F$ i4 A/ g" n
      6 d) G+ R7 g/ N3 V, [
      {  * |( x: F# ~$ J

      5 e" L% f- U0 A0 Q. `! x$ A
    • 8 Y  o# Y+ a" n4 _! ^$ _
      4 V8 b0 g" }: H' m
         PCB *p;  " e& O. `9 Z( J4 i9 O1 ~

      $ i; p/ {5 w0 `8 |+ F7 q

    • 7 `' w( q& ?9 i0 V9 W

      # L5 T. y: j5 ]3 a3 ^   prt1(algo);  /*输出标题*/  
      & J0 [" U: o  m- E7 ^8 d

      1 _- a$ c# Q7 P/ ~9 V/ i

    • 8 D: ^3 x  Y2 F; g! S  T1 N0 r) w5 ]
      # _. M4 G- t, X5 M
         if(run!=NULL) /*如果运行指针不空*/  
      " q- @0 ?/ q$ l+ E' |, @- y

      " u% X1 n4 h% o

    • - a( C3 ]# F6 N/ b! a1 b

      3 T( o; J2 B5 ?7 ]; B& r3 a      prt2(algo,run); /*输出当前正在运行的PCB*/  
      , \: _1 P1 T( W% `# k
      4 ]& v- Q; X/ H. I8 n

    • ! u% Z+ V' {9 k
      % x" }1 y# }: Y& Y
         p=ready;  /*输出就绪队列PCB*/  2 E+ N( q4 V# }1 f5 M
      . n; ~# X7 l( r/ d' s% j/ c

    • % v; ^" ?$ j6 o* L' f6 k

      2 u( l( a, q# U* K   while(p!=NULL)  2 z6 J) ?5 n  w2 n9 M
      3 a# I% h9 D: d" C1 X  G

    • , w. K; a1 f( b" M3 ]$ H

      8 j  W1 f6 ^3 r" X   {  # t/ J, |, G) @' z8 k% W5 d5 i6 b

      & V; _+ h1 U7 X3 e/ }
    • 2 c- D$ B, T+ {& T" s
      4 I7 A" [. {  O2 t
            prt2(algo,p);  
      6 A; \6 a4 G# L" C+ U% ?: x
      - s# K; x) C/ a7 f* d1 @0 \/ u

    • # `( G4 l' K# e- }

      ' O3 [4 q$ {; e      p=p->next;  
      : r: Q3 {  R% C+ |7 n* D
      : N) U0 _5 i( ]& U9 q
    • # Q6 N6 ~3 v- e3 E
      : T( J" X, j, }4 |- c
         }  
      6 A3 O0 P- p6 f) e( c3 x$ _% p

      8 i0 f' A. a8 p" Z9 d2 \* _! }
    • " C+ ^- D& Z# F# e

      9 w# `9 `, C4 j; o+ W! ^   p=finish;  /*输出完成队列的PCB*/  ) O/ f5 A- \# c" y# i

      8 ~0 Z' \8 W- M7 B" K# J2 G

    • ' C) D: j. w, e& e3 s
      5 M5 D8 Z( T) g. S
         while(p!=NULL)  
      / Z+ i9 ~" k8 ~  Y) J5 }" G
      ) E! _' \6 [$ W% j

    • + x' w) A0 a- }8 `. \8 T& M' L

      6 G" A1 |# z: z   {  
      ! {1 t8 d. F5 W, }5 a, p1 C; x

      3 [0 |6 B/ C- v0 R4 G" o! W4 x
    •   B# Y* y8 k/ D9 V5 ?+ h$ l7 {

      1 A. @% z4 V* f/ V. L( t      prt2(algo,p);  
      ( b: c6 B# G7 ~" t2 A

      ' H$ j& x+ Y. ~1 a% I* Z# M2 A8 S
    • 6 x! O7 X. @1 P' U0 q+ ^0 T

      2 O3 `( M& Q- w( S( ^! k; A      p=p->next;  $ j* o6 R5 O  m; A% a+ {

      % O& R* H( S( ]" T8 M

    • " @2 i  W8 t8 ?) K3 q: N
      $ n- `2 Z& k* _4 @+ h- S- m# ^
         }  2 S6 M3 f+ U7 x9 T8 l# g) h

      , ~+ G3 S8 X9 |) r# s* s

    • # J$ d# P' i7 n3 B
      + I; B: W* n) `$ M6 H3 C
         getchar();  /*压任意键继续*/  
      7 j' J4 ]5 O8 J& U6 O. g
      # G: {# p# `8 P6 W5 b5 L, B
    • & D( b9 t; b; u( p

      * b% P$ ~% l* T/ n3 m}  ! Z5 l; ~! n6 t/ ]5 C. l
      + C9 G6 d+ ]# ]5 i( }( t, F

    • 5 m0 A: U) O! L0 m' T; C6 X

      6 ?& h( s$ t7 J: a" |7 Z% C6 V/*优先数的插入算法*/  
      + T* g; R; e3 U% f  e
      ( r6 T/ n3 l9 h. x

    • ( }6 V: L  q& g- q9 \, S
      : @7 L/ Y1 ]" ~8 [
      insert1(PCB *q)  
      ' S$ y' r/ p. ~1 n
      " t& M4 C- d5 H7 C2 K
    • * p9 f% w# S: a/ Q
      % H4 E( P# S: d) y8 m, X
      {  
      2 i* w- p& L6 Z) @; ~8 S6 Q- K
      1 {4 M, _9 E3 H3 s4 C

    •   X$ h# ~# n- D

      & j2 Q0 _2 D1 H; P   PCB *p1,*s,*r;  # A/ J' a1 J! ?- h* K- p

      & |) ?8 {. D" P. {+ k

    • 8 C1 [# @. @+ r7 w
      9 }6 J( r5 _+ H
         int b;  2 t: i  l) d# ~0 M3 K+ a
      1 a  d& ^! H% r- B. n3 I  \

    • 3 ?. U( O: |- p5 t

      ( y5 A: o0 T2 c" X; f  {   s=q;  /*待插入的PCB指针*/    D! \- Y' l6 k0 C) V
      8 ~. z/ H$ G: y6 Z5 g: V
    • ( X) j1 r: {' z+ r) t

        C, E- ~+ x6 _0 B; u) Y4 g- A. Z   p1=ready; /*就绪队列头指针*/  , b6 B: u) J/ [4 Q! x8 N
      ) y, e6 F4 J( L4 f, T& L0 h( f

    • $ G( v7 U# {$ R( o
      , F3 y6 ]- s; ?6 x- O4 D
         r=p1; /*r做p1的前驱指针*/  
      $ q3 s' p4 I; g1 N/ J! }' b/ B

      # ^3 d- d- m  {& X) T

    • 7 q6 D! U! |  J* v0 X2 f

      ( F0 i! N# s0 o% G8 Z   b=1;  & H6 Z2 y. o% R

      & e( f! [1 Q0 v" a) S# i) [

    • 3 J) h/ U+ c1 }* ?" @$ `5 I% {; |

      6 ^: O# v1 A" G2 C; r* [$ e% h& U   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      5 I% k2 J7 P' T' l

      9 w6 X) T% l0 W
    • . W5 P+ A2 }8 ~$ b+ O

      1 L( ]4 o4 D4 f  [% N      if(p1->prio>=s->prio)  
      . ?: l6 j9 p: T9 @1 d8 b' `
      # c1 a' c2 G$ Y. {$ r& U6 S! p$ V
    • ( g0 N! y! S, @: H5 F, O( h

      ' F1 D# K+ X% N, K9 l6 @3 }" _0 A, v      {    R7 d; d3 b9 r" n4 r: T$ i, _9 [
      ' Q  U, Y5 J: |

    • . [- L1 W# l9 I) h4 B! \1 W3 J% O# U
      1 I& }* {  J  q% ^7 \
           r=p1;  
      " p5 [) k5 P1 o- W+ p1 m; j, H
      ( S$ }! I7 m" N* J

    • 8 y7 C; B, H0 B  ^" \
      7 [% V! P3 p/ S+ V- i- \, {
           p1=p1->next;  7 Q% ~+ b' s- l" P) p: x
      / K6 I; S6 x! `; ]

    • ' h: U: m* {! Q% C9 s5 k, ?* c" Q
      3 w6 y% N, F9 G
            }  . M: \( }2 Y* O4 a9 {+ p0 {1 E5 J% N

      9 L; f0 C% R6 T- ?

    • ! @  F  N1 p  _) u0 g/ O& U8 x" c
      * Y; _: w! j' G4 f5 T
            else  4 n7 ~( S  J$ A! R+ N

      0 j  ?% _" t4 L: z4 ~# N. t! ~3 A
    • - N6 l' D, d+ i

      * O) [9 M1 V0 x. W- {% D     b=0;  , x0 t% b. O. K0 u0 G

      & `+ k8 g2 S* v$ a0 J2 b, ?
    •   E( }" `; @' `

      & l5 u6 t+ d% Q" ~% M   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      & m& |1 H% x9 I4 C- m( |

      ' j) t& P/ o# U3 y( Z
    • , r" Y' E6 h( F

      + d5 D5 p/ k& i2 A1 N* E6 C   {  ; P: E$ ^' B0 U1 z) h" T  V

      0 \$ I6 b4 m0 i0 C

    • & z; N$ F1 f1 t! x. X; \* m
      0 Z& K: c) W3 O+ d+ p
            r->next=s;  
      0 U' R9 {) _/ c( y6 l

      , D' s$ q/ l' r6 G; A4 p. i: s
    • / L  P7 ~3 x6 y/ M' _

      0 V& M5 H# s% ?! {1 ]  L      s->next=p1;  
      1 E* \- |: R0 U0 l7 q0 |& `

      , u: M5 {. G+ r, G; m$ J
    • 3 `: [  q$ E) b" t

      3 k% d1 z: z# m3 b' I   }  0 C0 i9 u! w4 V+ C7 I1 {" y

      1 B9 D6 X% _- y( m

    • % k4 K0 Q# d2 q; e( {% ]

      : h; ~% z% A4 M7 J# j' v   else  
      . M6 U) G4 g. i5 s: J, v. B
      9 [; h2 n/ g8 u; t  E. _3 p8 ]

    • / n2 f& Y7 _0 S2 f1 S- x! D+ s
      ' e6 L9 Z! r: F7 J) Y1 N1 l
         {  2 K5 b- l3 ?/ K9 \* d
      7 X; S5 T  C9 x

    • 9 ]) y, y" u- v; _0 U& [
      / I, m! C4 S0 F1 [: Z1 s. Y
            s->next=p1;  /*否则插入在就绪队列的头*/  7 }/ y- i7 \- K9 A4 c, ^

      , Q7 F& I" C; w: j

    • # n# q& e) M: p' ~* [4 _% M9 ^5 q
      - @" M1 {6 K3 H' @4 x
            ready=s;  
      ( q' }; \# @' B0 ?( l5 G+ A
      0 K' v  q% K6 g% G: C6 L) |

    • & [" p' l" p* Q3 g) `) i9 E

      * i6 ?) ~  S3 x* }   }  * t9 {0 `% w2 [) z, {8 M2 G4 D
      ) G9 R0 z% v9 A3 ~- M8 ~  y

    • 8 G, |0 t9 T0 ~# N$ _" G1 C
      - ?+ q% h& n3 {& X! D+ i
      }  5 \/ G+ b3 E1 [0 n+ v" }
      5 K1 j- f; |' n

    • 1 w- ]9 {! G6 T

      & J: ~' j, i, V0 b; p/*优先数创建初始PCB信息*/  ( k" p4 y+ w; q9 |2 M7 ?

      & p! S* o! \; |8 T7 z

    •   [1 J  z- e9 A& }: O7 [
      : O' j1 T: R6 Z6 p% a# X% n" U
      void create(char alg)  8 ]6 e" |) I- H0 i

      + R4 T7 g0 `. z. s; ?! Q+ W
    • ' E* m9 T7 W+ T0 B9 U, G2 @
      ; W3 v. ]* X* O  S: Z, n4 [+ j
      {  & ?) t3 B" a$ e3 i( X% N
      + G1 `: Q! x5 ~
    • 8 n3 C7 v4 h/ B9 I* c% z
      / X4 P9 `0 K  G9 e' A9 Y
         PCB *p;  - B9 `0 M+ {2 Z- Y! m" @
      ; D) L1 n; W8 H/ r$ X7 ?
    • : H% h: D1 a% X- k3 l. B

      ' E- C% c2 D  ~! G0 c   int i,time;  5 i+ Y' t3 s: j

      1 g( B! c1 M; d% H

    • 0 C: o& u: l- p5 {1 M

      1 k# M- p' p6 k5 [! n8 s; ~5 G   char na[10];    p/ B, s4 H2 N# D( i4 Y* D
      4 ?8 K4 @+ g4 J3 f* s
    • 9 s* Q* X: A8 v1 v5 D

      # u0 ]+ p: p% L% a   ready=NULL; /*就绪队列头指针*/  
      * M/ S; c% {2 L! Q* p9 E5 l

      1 Z: d* i" g/ p3 L
    • ) q; Z" g  U6 g! R/ c: l" w2 ~
      6 L6 S4 s8 E6 |: X- }. J
         finish=NULL;  /*完成队列头指针*/  
      ! u  t+ W# e+ P3 ]  w! h9 T( H: `
      ) f& K. i5 Y/ ^# ?

    • 6 z* L( q% y, z! i) f

      7 H  x3 u0 D$ E/ g$ y. L& V   run=NULL; /*运行队列指针*/  * e# e% S; [7 Q) o2 A8 l
      ! M+ c! r3 g7 R  q' U

    • ) A& `! V* F7 w6 P4 a) b
      6 p2 p1 _: k  G1 x1 r" \
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      ) U# y# K* X- Y; D
      ) x% ~+ \! z$ {7 P6 i- A
    •   t; }3 {$ t% p4 t3 W0 O& |* e
      # F7 I  j. ?- ^2 Q! b9 V
         for(i=1;i<=N;i++)  ) p+ r; [: v. l9 ]2 @; s
      . Q9 b; w5 ^, |( _& J. G$ p4 m
    •   M3 W% [0 s  Q+ L8 {
      6 b6 E  t; T/ d8 D- g
         {  
        V' w6 b0 g' Z
      ) X3 g0 e  x* f7 h8 u; c# u3 Z) s

    • $ U7 c2 [9 b5 S) n+ K- ]
      3 \  h) {  Z+ B) ^& a. }& `
            p=(PCB *)malloc(sizeof(PCB));  . u1 N; B2 _3 W- B2 f8 A) A% j

      8 D( G. B' |  T' U# d8 e; W7 n/ g

    • + Y9 n5 k# H% P# f) c% J) z
      ! @8 m# U% x+ B: s$ a& Q
            scanf("%s",na);  : e& @; F/ q* D9 E' k
      + {, p( l! a, U

    • # W5 P( u: v+ A

      " j6 P7 V, R" U$ M  _      scanf("%d",&time);  
      8 q/ Z% i8 l  n3 H( s7 S6 r  A3 n
      7 {! c0 I1 X0 Y- }8 w  f

    • 7 F" S8 d1 j" H. N! W
      - P1 u0 Z7 H2 b9 s4 Y
            strcpy(p->name,na);  
      7 i# z2 i" J- K* I2 `& K
      9 Z9 X5 k4 p3 i5 G3 t5 H5 e
    • ! G2 S' [" U  M: f5 H

      9 u1 P$ e) {( e3 f  n- L      p->cputime=0;  ) L, ~) i9 S& `* S' _6 w

      0 Y0 |9 `  b' O  M6 Z4 D

    • 5 Z& h  z# A. {7 C- f
      ! \- x* L+ u5 ]
            p->needtime=time;  
      / n( ~5 H; o7 z9 B& R0 N
      ) Z6 n, w. K& Z( z; B# S8 g' k
    • 8 }1 x* `7 P/ R" R& C

      $ ?) c' L( I  w5 d- F$ s. W6 U      p->state='w';  
      0 C" M, r  l: w$ r

      $ V$ _$ w7 j3 o) ?6 T1 C; V

    •   J6 P. ?4 x8 c7 P
      0 i; E1 [- L8 }6 y
            p->prio=50-time;  
      " G9 R* J0 z# N- g
      / J' R1 ~' G: _. Q# O+ ^1 }

    • 8 v1 Q; y, l$ t( I6 X' G: Q$ R& s

      # o3 ~3 t" S1 R. ^2 D, d      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      ; O0 m. `. G5 ~( j2 {7 r; {  m
      " ~( F; ^! J! L
    • / b; f0 w" F% l* J/ }
      8 @6 U  O  _/ s
           insert1(p);  7 J1 o5 _8 q$ i  c

      ) \' x9 d7 S. a" n3 z1 E

    • ) C3 l0 }8 X4 v' S9 C( F

      6 F9 r# g8 B! L3 N0 d- t( U      else    U3 ~6 O( _6 r) g& U

      3 i  D, e2 t, a9 |6 ]

    • - {5 {: ~& b3 |+ e( F$ P
      ) O1 D: H5 y2 k2 @
            {  9 h! O! D7 X! X* L( d
      7 K; B: I" Z5 J

    • 8 u3 g! T; S6 p7 n! u9 X" U' |

      1 v  Z% L  @" H1 B6 Z$ W/ R     p->next=ready; /*创建就绪队列的第一个PCB*/  
      , c. X% h0 ]- i: _7 U

      7 u( Z  r1 H2 ?$ }$ N4 Y$ C
    • ! ?5 V. Y1 n0 }2 r% ]

      ( H0 s2 Y1 \' P* w: h, A% M! H# u     ready=p;  . f% C/ h7 |" Z- z

      5 C& @" Q& K4 u( k
    • ' F: r  N  z- S! _+ S8 g$ K- R

      ) D# g) @5 C* s+ ?  J! a: C0 l! t      }  & w1 y. K" ?) c1 D

      % _- R$ e! S; s7 B
    • , ]% ]& }. U8 g0 I0 c
      , U* L4 ^4 q0 a0 Y
         }  4 N- U, l, J) I; I6 l6 |# C

      ( O6 @7 u( m; a+ m

    • " D* {  S2 s, u$ L# D4 M: [
      5 ^2 a4 h. B% V- G+ F
         printf("          优先数算法输出信息:\n");  
      6 X' H- e; j+ k% l

      4 ~) e1 S, X* s

    • ; O% _/ y) Z: y
      0 g8 _8 r) h+ i3 Q
         printf("************************************************\n");  
      ! `6 c' d4 v; V* p3 a- d5 {

      * J' j* a/ s1 C3 ?# X: U1 o3 G" H+ S
    • ) W0 I. n+ k, R" f! i- Y
      ! s8 d! k* X3 k  h; n- L1 C1 A9 X
         prt(alg);  /*输出进程PCB信息*/  
      6 G9 Z4 ~6 i) T2 Q  x! o

      ( m& }' C! v4 s8 k, |: \9 N
    • 8 x) |/ }4 w/ V/ V- {# ~

      , b0 A0 d& g  F& V   run=ready; /*将就绪队列的第一个进程投入运行*/  
      + F/ j& ]$ s# [! ^& i7 f! A: Y

      " m6 ~& J( V6 Y3 t: u* f
    • , m4 U7 D0 u% {

      ; A0 |0 O; c+ a1 G   ready=ready->next;  
      3 q" q" n& W2 i9 r1 F' ]
      ) j0 M) ^5 ]3 ^. J4 V% q
    • # V, x+ J2 s3 h" d4 G2 ^8 t$ @
      7 a  ~0 A7 Y; m  o+ k; q
         run->state='R';  ( U9 ^- a1 i, Q) ?& i; y; z

      * z( `( a/ _, F% O
    • ( x( g: N5 p; `/ Z4 C, `7 K( K
      + \, K% R4 d4 B/ J6 T/ G  G+ r
      }  
      ( k; o, d) [& J4 |. @

      3 z! |. `7 }# S; @$ L
    • 1 v& o1 `6 L/ ]0 Z

      * T$ E4 o" D5 c+ L/*优先数调度算法*/  
      ( V6 F( V3 _; X4 k2 ~: ~

      & y6 X' P9 x/ e9 K" e
    • 7 V; v, A3 ]5 R+ J; c1 I; _
      % g- {( T4 @. O4 p- p2 d2 W
      priority(char alg)  
      4 L. j8 ^* E' l, u' Q" F

      ( V# N5 Y) S0 }- }& n
    • 1 y5 W# {! E  E0 B6 ?& I# \  W

      ( r% U* t# v" K  u/ P, K{  
      - R, A7 Y# K( X3 z4 \1 ^

      + D# v* ]8 P; j& ^" {

    • & l& K# B4 Q0 h9 S! T
      * P- T2 ~: C1 G+ B" O# ?$ B5 [% s
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      ) }, K6 @1 r( Q  R. |3 ]+ N: ?

      9 U8 A3 c1 ~3 X1 o( h0 P* Z4 G/ W
    • & Q; q! N1 W. v9 ~' ^; H6 c$ b

      1 W, n7 ]# m* @; S   {  
      9 |. e  j9 `9 x- r! x& `% n

      - }* r6 F3 [: W6 v

    • ; C" a) x% `4 B! e
      ! e. E. n0 D# q
            run->cputime=run->cputime+1;  5 Y3 j3 Z4 X1 b1 K2 B2 ^; P! J
      5 e  ^' t. K3 n: s- R
    • $ Q$ W3 L( e- g/ l
      / @& _) z, t5 B% G  g
            run->needtime=run->needtime-1;  
      3 D  `) ]1 u2 q, p5 I1 ^9 h
      ! D- j! A, K: u

    • % L8 K0 i! o/ `" }$ f! Q
      , X$ v0 H: o9 L' U8 J5 v
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  ; x) ^4 B8 G' L+ U) b7 p  `

      ) o. O3 L+ r. n/ @% E
    •   ?( y' h! c& T( |9 f0 s+ J: L

      1 P$ a* l8 w2 i) G) \/ z      PCB *p;& V3 ~+ P1 I8 j9 H+ O8 L
      4 b) C! ]+ I" f+ k1 R

    • , t8 x7 K& o- t' b8 W. i

      " n, j4 N' L. V. W7 V      p=ready;
      - X. E7 a3 |1 d/ S9 a0 L* R

      . @8 }$ x6 d7 @- z/ }0 c( ?' @1 `0 L

    • ; k( S9 x  e/ b. f  O5 f

      ; f, l6 ~! t0 j; y      while(p!=NULL)  
      9 k6 ~4 E0 H0 o0 C
      % k2 P' E/ N5 V

    • # R4 X2 b( z4 M/ }6 o/ H2 ]
      1 f3 t; u+ o8 \
            {  $ s1 R9 p0 H# n0 Y* T
      # n) _* d3 i6 V) J
    •   l: q% C( ^8 S9 f

      " P8 h# b6 N9 f+ [0 W6 M' C          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    ) J+ I  c' S( ?5 x$ R3 F

      2 M4 |) W! A' b0 Q: b3 n' B1 }

    • - F  L1 L$ q% G  b3 |

      8 V: Q. H2 f- i- C0 t) t; g4 N% a  }6 r          p=p->next;  
      6 o: z' r& s1 o) V

      ! @: a. c- ~  ^9 ]' J
    • : ]( T& i  u1 N( f; g2 q

      6 S/ }5 @8 k' m! F      }  . p2 D" S2 a% l8 d5 I* p1 N6 V3 }
      ) I3 b9 {3 p( \+ f
    • & Z# U3 S; h6 O9 k. }0 u) }
      % u  v+ i% @9 m( \
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  5 O2 T* m7 n' i8 B" |7 o
      ( \; B+ H( D* h1 \& U' k2 J

    • % n! e+ _) Y1 ~* H  }

      6 K8 q- b# n7 y4 c: e- Q$ L) p& _. ~      {  " i$ s  u5 }8 u6 {% k. N

      9 z" O( q, e4 s1 Z1 y. J

    • 7 j3 b& {, C: F0 f
      6 _5 \% e* n% N! Y" S
               run->next=finish;  
      0 C, V- a. f' e% N- }% \$ y6 o9 D" h" @

      & x0 v. N& u/ O/ Y
    • ( p) a' x3 h; c' @. X
      1 K0 x, C6 N/ B3 E' G
               finish=run;  
      / `/ m3 b! l" t

      $ F* l! z! Y% {. {+ S0 C5 N/ f

    • 9 Y" E1 b2 j' ~& k. J9 p
      ; Q4 L4 x4 Q7 S! D' S1 U2 \% w
               run->state='F';  /*置状态为完成态*/  
      + q! b2 Y. W, O1 w' V+ r
      + `+ a4 u  [; H7 x& p8 B! B6 y4 |

    • ; [( B9 d( A2 A) ?
      1 W& w. x3 R7 I4 T# P8 Q
               run=NULL;  /*运行队列头指针为空*/  
      + y1 f7 ?4 Z$ ]6 d) X3 ^6 w9 W9 Y

      : U! ]0 g  \: T! Z
    • * D. `: D9 u% X( V/ _# }( k

      6 ]* h2 K" [# v% Y& O3 ?         if(ready!=NULL) /*如就绪队列不空*/ 7 B9 y* Q( S# j4 X

      ( I1 ~: S- W4 q
    • ' Q" |( N* ^& J# a

      ; I; h- ~$ H' b. I* u# D4 Q         {  & _7 d7 \7 f' Z, a7 [7 a

      ) O) D# M/ \& {! B2 X( P8 r

    • ) w$ h8 ?1 |. e. s% B
      5 h2 |# P4 u2 V- h
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      $ ^! V; s0 Z# D
      % L/ f; k6 c, u5 h
    • / o3 F7 c* b. C2 m# I" [

      3 A, H' H3 q8 r8 @4 o) y: K5 }$ V, ?         }) d4 R3 I( Q) C7 _

      . R# E" s9 o: S$ \
    • - K& B$ k: j. M: W) {- `6 F

      , d1 |$ q+ S) u* l      }  
      ( p7 S7 Q* l; z# g: {* B
      ' T) T( \; E5 t3 [6 U8 ~
    • : A* B7 U- F0 v% A, x4 _: h* ?

      # o! g0 q  u$ y6 S0 j* A" ~5 p2 H* B      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      7 g8 x8 m+ k+ Q2 J5 s- k
      " a8 l. y/ H( [! D9 t9 P

    • 7 z+ G4 A" ?4 ]6 n
      6 u) c9 C) O& ^9 F
           if((ready!=NULL)&&(run->prio<ready->prio))  " E) T2 G; J+ G7 r

      + m0 t' }3 P3 {
    •   Z; e/ p' s# d& _2 w5 \( V

      ) E0 q. @0 ]1 l( f, R3 ?     {  ) Q6 S. U/ B8 p7 V' F$ p3 x  L
      5 W: h# i8 Y, O/ `

    • 1 H, s& l* |3 o! @" ]7 w
      ) b% C* W* F6 h! b
              run->state='W';  5 V0 F+ n2 j: p  D" L5 t
      ; j4 I* F1 ?- C0 K$ q. ?8 i9 ?% f
    • 6 v" M* x! k0 G8 [6 t" t
      6 B. `/ f8 |4 x  q& `* \
              insert1(run);  $ }3 v! D, Y2 j: Z# o9 y

      4 j3 [, b. x6 c# b
    • 5 p$ z3 _0 d- q  V. ~6 t; \

      4 ]" z/ I% W8 k, c" P- v        firstin(); /*将就绪队列的第一个进程投入运行*/  5 W/ ^1 e* s9 s
      & G8 Q# W6 H0 Q( q- m& B

    • & f0 P* k. c" {( S! z. n! h9 ]2 o
      1 r# Z! d: ^2 O& w3 e8 N! s( [# K
           }  - H1 p9 q. z( I4 [% W/ D' I
      8 \. L/ \& \0 x. Z
    • + V3 s. F) }" f! k6 r

      3 W3 L' q9 m4 S8 E- {& ]      prt(alg); /*输出进程PCB信息*/  % }  w7 ?% L' ^% Y% r" j

      ' u1 `) r" c/ u, y1 h# W
    • + P. d. b( e6 E/ }
      , }+ d2 o9 T8 O2 c
         }  
      ; F5 A  {  H; e0 [, p8 j* O

      " s# v6 N# Z6 g# m$ ?0 Z% {* X$ t

    • : u) h0 H/ `2 v4 ]
      : X2 ]) e" L/ ~0 b5 A
      }  
      * F1 A$ J8 b% Q; b

      & N. u* `8 f4 N& c/ G: J

    • ) r- ^" V. w5 D& _
      & i& n0 x( N+ z# B" R) i
      /*主函数*/  
      * \3 Y3 A6 `$ A$ m  A! G
      # M+ V6 y7 Z: Q; y4 w5 ]

    • 0 D/ B* {% l$ h( W
      ) O2 w9 o. Y! G2 Y- j" P6 k
      main()  1 g2 q* x8 w  u8 ]
      " }% o) p% O4 W. |

    • 5 y) [2 H, S/ \" e# b% D1 u) S3 w
      ! a* a+ n) M4 T$ O+ d
      {  
      - l  n0 q/ i% W5 Y( X

      6 {& y: I( n: l* z

    • - \9 ~! d6 L+ n

      & S! A3 U  a5 Z$ f+ v- q   char algo;  /*算法标记*/  # b8 |% g$ m* H; [+ n# Q, X

      $ z7 P$ t" F& L- J% a
    • & ~2 Y( I7 u5 y

      * f. s) E$ `7 F6 W6 U9 V   printf("输入P确定算法:优先数算法\n");  / O" w) n8 ]! v, s! F
      ) i' l0 A0 r  i9 g8 \) H8 c+ @

    • 9 W: M4 C8 L8 P' ~- Y* q
      8 o6 F5 O! |4 n% F" G6 S( X
         scanf("%c",&algo); /*输入字符确定算法*/  
      % E# m& \) y% i9 F
      + h+ S. j6 J* P$ d
    • 8 o* h. j* t& T
      3 O( S, G( O, s# P- w8 W. V) k/ B* f) @
         printf("输入进程数:\n");  
      ' S& J( _+ L0 W" p

      . s% V7 j# h" z  h% ^" g1 V" Z

    • % {, }; P( m5 H+ @3 G& j
      : c, D& @$ P* q+ _7 C
         scanf("%d",&N); /*输入进程数*/  9 m" w/ k4 O9 l; H

      # w4 q4 A+ n1 \2 R

    • 3 n7 W! x; ^+ J8 G

      5 U1 L- v4 H+ N   if(algo=='P'||algo=='p')  
      0 f% R) x& y, D, r
      * s$ K: f6 r9 W- f+ P
    • ; H  T3 i+ l: u& f; M* d% f" \
      2 ?4 A" z3 }; g% Y" |; i5 P& y
         {  0 x; k1 O5 \+ F5 y
      9 T% N( J' r8 z0 q- A. L# q' n
    • ( |8 Y5 m% k. }/ k# G" E

      $ |2 r6 b; }4 R+ n/ m/ Q- b      create(algo); /*优先数法*/  
      4 r( k; `: n+ I- Z

      " y" S5 }5 r: [- g
    • * J4 K9 h& D5 p& E4 Y
      9 s8 c5 M3 E( ?1 l0 s
            priority(algo);  2 z* y( g! ]- p. E

      " U, }/ f3 J/ J' J0 _. }& v/ S; O' ~: C
    • ; W+ V' P( h& `) L, _: t
      * ?6 d9 T. [& `5 r. i! V
         } 8 d4 w, b! i' X: j
      + }0 j0 W; A$ @+ @4 Y  ^( U# g! R

    • 8 e# n. v, y* R4 E  `: ~

      ! @# e9 u+ v: x2 ]% i2 D. u}
      ! i8 g2 T$ R0 g* Q" G" U% T2 r$ M
      + |/ p7 T/ E& V/ x* |: ?

      * f6 z2 m' n# I. x9 e+ G& @' \) k

    . ^5 n5 S1 }  S
    输出结果:
    " Y: B  M  ^; R

    " h; ?' O+ F7 c9 J
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    ) t. `1 Q8 d& M& B7 ~& w# I
    5 m& `* Y! s* p. K
    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-10-31 22:55 , Processed in 0.208273 second(s), 50 queries .

    回顶部