QQ登录

只需要一步,快速开始

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

    + a" q$ V8 E+ D3 r/ B优先级调度算法7 F" m2 ?! n0 @

    算法介绍
    . Q  t; y& q- P* O1 L  t优先调度算法的类型(用于作业调度)
    * q9 {/ ]# L' r$ I& J4 j1)非抢占式优先权调度算法
    ( x" z5 M) ^& y系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    ( S' C( D* q2 P( p( ]- C2 K% a2)抢占式优先权调度算法 % ^7 ^) N1 O! Q4 R
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型1 ~6 I. a5 c! x
    1)静态优先权
    , Z( M: }& ], B1 n" |( |, x静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    ' z! O, I" y  Q* n* A% O6 }

    2)动态优先权 ! F1 W& f% l6 o0 n

    算法实现

    抢占式动态优先权:

    & l* c# t! P6 R- z
    PS:本人认为非抢占式静态优先权没有实际价值。


    • 6 \( q# R. @) P8 k- r

      & R. C( Y$ j8 }+ v! f3 n#include <stdio.h> & p' @8 _4 S% {/ T: Z* ]: [% |

      & c6 }6 b" ~5 T
    • - b' z: h) R: u# V
      7 J, r7 `0 K. m9 d* F# z6 f! N
      #include <stdlib.h>  
      : I3 j+ E5 x6 I

      5 s, _/ S( q) {( G- S
    • * t* f; Z! ^; D, C
      ! ]; V9 K2 ~' @
      #include <string.h>  % Z; V! w6 H8 @3 [
      ( ^& |2 I: i' e; q% ^7 N
    • + V: j$ C+ `- Q* G, ]5 Q

      9 J" l0 ^( b9 P7 Ttypedef struct node  
      ) Q4 c0 O( w' C! p- p0 n4 m
      2 q7 I+ f2 V0 a- V+ v' }0 k& u) p

    • ( _. a- v8 W  w9 H
      8 p2 l! r( O: q- N
      {  7 N6 u1 d, o7 c7 t5 H' W/ ]

      ; v& D7 U: r+ T  H) m

    • 6 R: e, W3 C3 B1 s  o

      3 x) M) T- V9 y  ^9 }' M8 k% u   char name[10];  /*进程标识符*/  
      1 l- l3 h- g9 |% U! W# e- A
      + _+ Y- i: ?: _3 F1 F3 p

    • # ?: w- B+ d3 _% c( @0 `/ _3 M" f' B* }% v/ @

      5 X/ ^0 b1 b% {8 b, z. M6 P   int prio;   /*进程优先数*/  
      ) T8 r* u1 N, x3 C9 ^

      9 F+ _5 E$ r- ^( ~0 Q5 y; b
    • ( y0 j5 X. R( D

      , W7 S9 x, R9 G   int round;  /*进程时间轮转时间片*/  
      * h6 V5 F( r4 C
      8 q) q8 x* d4 Y: X# U5 [
    • 2 q8 v7 Z8 P0 B5 F) ~5 \

      7 u  j4 W0 f# b# D! l6 F   int cputime; /*进程占用CPU时间*/  
      ; x" Z$ w( q& L5 T6 I$ N. a

      ) `+ q7 l' N: u6 n& H
    • 7 Y6 s0 {) T, q0 E. G
      3 h" l; u5 g, K
         int needtime; /*进程到完成还要的时间*/  " J! H3 ~* u" `

      , X- R4 T% \4 Q6 }- T' N
    • 8 K6 g( A& ^2 q
      5 O) O8 Q+ W" L' a  z5 b. ?- d" y4 [
         int count;  /*计数器*/  
      % B9 w) m; D5 z9 Y/ b/ E- O
      2 u7 D: W. O- [" x1 m! n: w1 {! P0 e

    • & n. q/ S) F; A* @2 D# G

      - \( H! i+ @' N7 `! N, `   char state; /*进程的状态*/  . ~  }8 j& G; k  l- l6 z
      , w+ `7 M& p, x+ X' o
    • 8 K' c  G7 @) F) [+ }1 Y% B

      1 u. g( h/ F# K, i   struct node *next; /*链指针*/  
      : q# F# m+ \% l* P4 Y
      & W; ~& _5 W+ m  Q4 J( r/ z
    • 4 N- {, f) _! x! i
      1 Z2 M6 z, U$ f8 z* V
      }PCB;  
      # l' X* Z# R; `

      0 Z- ^' L# q# N" ~/ j

    • % W4 C; S- v" r0 y

      ! e9 ^+ _; E; i" V: pPCB *finish,*ready,*tail,*run; /*队列指针*/  # ?5 D5 s% {+ ~7 L  n- c$ s5 S

      " V4 h: a" y7 T# G0 `4 c! x9 u

    • . z' L. k& b$ m! d  U
      1 c7 _* i4 S0 V$ w+ I( x
      int N; /*进程数*/  ' I/ m9 F1 f6 `* C- \, b
      3 N4 v+ T3 q5 W0 |4 u+ W% w8 w* m
    • * I: \& S6 d/ C

      * {; V/ {. S/ `0 b: ]: E/*将就绪队列中的第一个进程投入运行*/  " v/ S, a+ D, N9 y5 U% |

      ; @' i! Z  l5 n' w7 g# S
    • 4 m5 c6 Y( M$ F; d/ n

      * L! ]: J* o% ^* G5 I9 d4 pfirstin()  
      * \5 E$ ~9 j& c  O  a- c

      ( a- I: Y+ }, Y; e4 S- N) x7 C2 G

    • ; q4 S, z) w5 q; a/ T- k( t
      7 d% @6 Y+ K3 B) Y, A" M) C
      {  
      7 d; O8 X4 _$ T( b) @" j, o

      6 _. q5 P1 \: A8 L$ x+ s. V8 [
    • # O3 |4 [3 Z$ I& t/ y, [8 K
      8 }5 L5 T8 J! X; P" j$ p
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  4 d# G% q. D; D( i( x- o6 R

      9 |# H- E$ {: F$ t7 b9 O, o

    • , M' d, Q% F6 W+ J/ @2 l% n

      6 k& P1 _$ i/ a- s9 |   run->state='R';   /*进程状态变为运行态*/    _) ]7 `; U7 b3 F

      & L/ H1 l4 N. I

    • # v; b" a) j0 {5 _

      9 F* W7 I# j7 o. b" B$ r   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      0 I7 T  ?' U) |/ }2 m

        A) c' t. o8 Q
    • ; G4 r+ X3 _1 ^
      - `1 G- \2 T! o
      }  
      ( H0 ]) E( B0 u" E
      ( A4 o" c# d' V- _: C* p

    • - L' N2 c- C6 g
      2 ]4 A$ W, Q) B
      /*标题输出函数*/  ( {! I$ ]+ s! X$ k/ j: D3 h

      3 Q# n" C: Q) O) g7 d

    • 3 j+ f- |( Q( Y# }
      ( |7 v7 h& ~+ g
      void prt1(char a)  : C0 b: |/ g* \1 n" K

      : V  u, N  e4 I" L% w
    • & W% @& w3 J" G2 N

      ! p( x& I0 \# f3 G, b+ Q{  ( A0 G+ ]2 D- L. |: }5 T4 c
      ! x8 o7 s9 \' f( P3 b# a
    • 1 q/ c6 H4 b+ f: {4 H6 I" d
      % h* I4 q4 O' D; _- l& W* a
         if(toupper(a)=='P') /*优先数法*/  
      / ], L3 T6 d! k# O9 T0 ^
      6 m8 ?9 [- z/ E, q+ j

    • 6 d2 l, `# A' X

      + B9 m$ |* u9 i      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  / F$ C3 V( w) r; m
      4 b& k& X3 D& f/ S6 \& l+ Z# Q

    • 7 D8 v; ]6 z0 i; V

      1 q2 N& t: O) j4 j5 K! w   else  2 x% Y  k9 A" w3 d8 J& F& j* V

      3 d) n5 T* d- A9 F
    • 2 M) a: v9 n8 R+ L
      4 _1 I) ?: V# @( ?3 G+ z
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      : I# P+ c/ h! Y6 K" G7 \) Q

      + L; W/ q8 M* f6 [% n" b! T8 L

    • : Q3 c: s! Y6 N5 A% a, R) a8 ]

      . j* |0 T/ B# S! a}  ' Y+ X0 X' e0 K1 E8 g
      $ N. h, R9 b8 M" e+ c! s6 u9 V
    • % t: d' w. V: o( h! h) ?0 x
        ~! g% m9 q  q/ Q  ]0 P! C, o
      /*进程PCB输出*/  
      ; l% ?' U  N- M0 d1 n3 H7 U4 A
      + U7 O% X6 V1 n1 m, m% H
    • ' k2 W) A7 u; A
      - y8 d( J; Y8 g
      void prt2(char a,PCB *q)  5 T: S* d7 k+ |' L: j! l
      6 }5 D: H8 J9 Z+ X$ y  B; @$ N. [4 I7 m

    • 1 p' {  d5 s/ h1 p$ P4 F2 j7 e

        e5 w, y- h" E% g4 w" B4 v{  
      ' g& i( e7 W6 X* e+ ]8 M

      ) O0 Q" m% N" N' l) T4 u

    • / T. V+ L& t( W! W! p1 {* T

      6 w( Y' L1 V# y   if(toupper(a)=='P')  /*优先数法的输出*/  
      / u* z  X: E2 [% j! Q

      - c; }+ I: v" ~% K( n) l$ n
    • + `7 W& c5 r  R" x) N' O
        U/ m$ r2 b9 v( Y  z& V
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  . l& W% }. P! l% U5 H" W
        K/ \  H/ q* v; }, V

    • / U7 M4 n' M" [7 S5 o8 {

      ( _/ s1 r8 @6 b3 e% Q- ?0 c       q->cputime,q->needtime,q->prio,q->state);  - z2 J2 J3 d- C( U4 X

      . @& n) X2 F& i+ q) ~% o% {

    • $ v, b5 d) Q: i# [+ Q" ~1 C
      ) u4 O1 t( n% x( ^; l
         else/*轮转法的输出*/  
      $ y1 T+ I: v9 J/ h% {7 [9 {
      5 @1 z( y- Q+ h: Y- p8 b+ W0 L/ D
    • + a. F8 l7 `" j2 c3 m
      : e( }3 F+ W- n, }1 U
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      4 t7 N3 s% |4 w- l5 P
      % ~# Q" a& a6 A/ t
    • $ F* X1 V" G1 M5 N, [6 o  W  S

      7 J% |* S- O0 c+ B. }( |/ c       q->cputime,q->needtime,q->count,q->round,q->state);  / K$ R! N5 d& l, t' p. I3 F

      9 w) t# K7 X& q& b; Z8 Z
    • # _8 J% Z5 A7 H# @
      ! ^- C. W& M: q. b1 `, ~( F
      }    R2 U: Y6 n4 V
      ( U& L; o) |" \, A, m3 V
    • ( g3 Y+ J( G' y0 R% e. F7 R

      1 S) r+ }4 h: O5 n3 ]# |/*输出函数*/  
      3 |. S1 p- ?8 c2 ^; ?+ T
      / I& M5 [+ Z3 V& Y) t+ j" ]6 B
    • ' W/ _0 R" H& L. m% [  K; x7 m

      4 Y! u4 p; }& _& V3 X7 Qvoid prt(char algo)  & C4 I. P, `7 m: h8 @- `! s

      $ S8 ~) o# S: C' G! G" W4 z
    • # A- f) I7 |- F- r) F) M1 O4 c
        _2 d5 w7 c0 m3 b# ]
      {  
      : G* G) H# z1 g9 V( _

      8 i& Z- R: b, G7 a1 k

    • % a( u( q" l3 S* K* @0 P  s6 R
      9 z& @  {$ |" v. u) n! r6 \' P" k
         PCB *p;  
      6 `9 K6 P' N2 s1 T, w

        {- }5 f# x  J$ l* T' ~7 Q
    • * d5 u  G7 z3 L: c2 A6 T

      ! G+ s, P+ g. V! K, O+ h   prt1(algo);  /*输出标题*/  8 J8 _5 p. J7 K
      ! m+ a4 u- H; j5 R2 }* c% y$ I9 n
    •   p) k$ v# Q1 W. g# b5 K
      8 i" H# D" B. b1 I6 B
         if(run!=NULL) /*如果运行指针不空*/  ) p+ i0 D- Y1 @+ D

      / Z4 ]: n" w; @. S3 N

    • 5 R; E2 c8 C' \

      9 y- d5 h1 _! M* ]3 f7 S+ H      prt2(algo,run); /*输出当前正在运行的PCB*/  : I4 X- ?6 [; \
      ; u- {0 K) k8 |( u) g9 d
    • 1 a2 R9 ]4 O+ w6 @; R, L. m
      ; J; _6 z& o- J$ Z; C, }
         p=ready;  /*输出就绪队列PCB*/  5 Q2 |  F; [9 k; @8 r; Q: ?  @
      3 R6 z5 y/ S5 x- ?0 s

    • : T5 B" a8 m! l: j) @  H4 t9 }

      3 Q& D, q6 F  @   while(p!=NULL)  
      / d4 k3 q4 K& @5 {5 s5 C

      ) r- d0 [* F; e. A4 ?! ~0 o
    • ( ^6 N6 z3 `2 D. C3 \7 M$ m. i, }
      & ~  r  R, m* l- r
         {  8 B8 D" E( [/ [5 X- D3 N/ U% N/ _
      " r; F, Y' P" d! E2 d

    • / E# G* j( c0 i; q4 Y3 \
        m: T' K- X. S. V! a$ w
            prt2(algo,p);  
      8 [# N& C  c/ T  R) V- w3 W
      % V- Q. M. ]2 x; f) `: C
    • ) `) ^) }! l: d. |0 i
      " p- t0 ^  O6 g3 a! c+ a
            p=p->next;  3 O  G  d+ m3 y9 z# e2 Y
      3 L; u4 q. Z( m

    • " W' {8 Z( ?5 _. D7 r' Y1 [

      ; R# D  {4 g  r0 Q0 K( s7 P   }  ( ^" c- |# y, ]

      4 I! O2 @; B; C7 x6 Z" U3 B
    • # T& Z3 r0 a  f) d% R5 v% X' G

      ( s2 E7 Y  O; j   p=finish;  /*输出完成队列的PCB*/  
      * g0 F/ H5 Q. ^+ L% `$ K, l& F
      ; F9 p1 o1 i# m

    • * A6 y* i; Z3 f# l  I: m+ r/ r3 K# E
      ( C3 M" ~7 a3 b+ R& l  j6 p
         while(p!=NULL)  3 j4 D, J+ B  F* R% l3 x" X+ s
      1 |0 w  v  p. [8 ?3 c: g/ X0 m. a
    • ) r, a, E' W, j$ S8 F" f* z' Z8 Q4 l% I
      6 l" G4 T+ ~8 {! w
         {  3 _7 d3 {& C. J% `% A% O3 L6 o
      * ~8 @" v* x( ~5 _+ i
    • 8 v# n0 W7 ~* f3 ?3 Z0 X- a
      # g6 S' c8 y+ o! y! b5 Z2 p% j
            prt2(algo,p);  
        f- c3 E  \+ M. R: ]0 {/ `, S
      ; B; X! O5 d) L  N4 E, Z6 n+ q
    • ) X" B% x+ s, L1 J- T6 r

      4 l9 P) M3 v" f& v! \      p=p->next;  . @: W$ R* Z3 F/ B( v" ~+ k

      $ |4 j  c: q5 X8 }! E+ T

    • & {* t  ]$ t5 |

      / u/ ?) Y7 j" B' i   }  
      ! m$ J( O5 A0 j+ Z
      1 X& o  i# A* T" R7 S4 f+ B

    • 9 g- W' ?; u4 l' o* x6 S
      6 {4 x& \2 h6 @7 Z* s# V/ y0 [
         getchar();  /*压任意键继续*/  & |0 N6 x8 z: ~' D: N. b

      7 k! {5 z$ r( A2 I" m2 a
    • ( v# N: h9 W' m6 O( g

      & B5 Z& R* Z8 E}  1 k9 k" j+ u2 \

      - n6 l( t/ R2 {3 K' I7 R) P

    • - X- ~' u  G1 ~2 C
      $ h; S9 B7 l0 `- w; D! Q3 r
      /*优先数的插入算法*/  
      6 j) }# e. l% L5 }: X1 u5 Q
      5 m! @3 n  v: d9 o2 Y

    • ) z, g1 R6 ^$ B! P2 k) J

      " E! u0 U  ]4 K* x2 Einsert1(PCB *q)  # N4 `( e' Q! H& i

      0 j2 h# j0 c, W* u3 e: v
    • 5 n% D* l8 c. H. h) A

      # t" R- L9 y- o{  2 `6 N$ o) O) H, g- R; f& `) J

      9 a; o# Y: @# R6 s' I( Z

    • 3 U/ \# a, z3 s+ ]" L& Z
      7 Q, H$ c7 r. H$ p
         PCB *p1,*s,*r;  
      ! A% A) F) s4 x
      4 h7 ]1 `% F- f' w& r
    • 0 p7 t7 _. q, t6 u6 H
      . ]# h9 `+ \+ W0 K; v
         int b;  
      , C  h) r2 [5 V. I' o3 Q
      9 p) a4 Y5 ~! A

    • & }4 ]  s) U/ C( a
      3 g; N8 T4 M: s' Q3 k4 J
         s=q;  /*待插入的PCB指针*/  
      ! `- o7 G. {6 r

      . W3 d% k0 m  [& |
    • * r" s3 d0 k* b$ A4 k) c

      # \/ C, H' I0 B/ |. D$ |0 T  v0 M   p1=ready; /*就绪队列头指针*/  
      7 ?' _" C) h; ]2 E: c$ l+ O
      ) g2 C. q. p5 |1 [) V) N$ W, E

    • ' l6 x1 \, n- A% e3 B9 \( `( u

      / Z2 L/ X9 G6 `1 K1 B   r=p1; /*r做p1的前驱指针*/  
      3 ]" d& J# W# z& i! F5 d3 C

      ) N. \% T: z" S' B, X

    •   G7 H8 b5 @2 x( K
      8 o! R  T4 Q3 u; e8 L) e
         b=1;  ; U: u, D4 @% i( G6 I

      & }1 g/ t7 q: F9 i3 v

    • / `. {% O0 }5 U$ z

      5 a8 X9 y6 ~- ~   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      # [4 W( I2 y4 e: Q& `
      , V) x; L# f* b
    • ! S- O8 t8 w* X

      ! I* C. Y" S; x$ ^$ D      if(p1->prio>=s->prio)  
      & E7 a6 M+ @3 h0 m7 V) M

      & x# s8 @% c3 ~- M& x0 n6 F

    • / U/ B; Z) O* g( w: J/ d

      # T$ `6 Q% K$ |' N+ F0 @) C- g/ x      {  / b# f  Z& y( {# w$ h# l* V: U' x
      $ y1 j$ U1 n. o0 K

    • 1 J7 e% m' @* }
      4 i1 Q5 I; w8 x3 Z9 u+ S9 ^
           r=p1;  - {, ^) D( B) B/ m. c) u
      ( S1 J, s( o( a2 J( x  i
    • 8 c% s" U" @2 N7 }
      ( A+ p$ L1 I, l, Z* u. Z
           p1=p1->next;  
      4 R8 \/ z7 o& {3 U5 O2 ]

      : _( x/ ^2 J5 K; K  v3 x4 r+ O
    • / P- j- f: ?" _: |6 S- l# E+ E* Y

      4 N' R1 V" b& B      }  0 m* y+ l7 Z' P( w* _) o4 A
      " D5 F$ _- C5 O* J2 r7 o, l" I
    • ' k% h4 r! }2 `2 B' `- P' c7 j4 l

      $ W$ [1 e; X1 W5 r) D      else  
      " t% {* B5 N0 k1 a

      / M! _0 o* `. V

    • * a0 Y# l9 F& z% q$ d6 @: T
      # Z$ J: R3 N+ Y3 F
           b=0;  4 }# D) m# Q5 {/ _/ l9 N9 n5 Y6 `0 t
      : v& E2 w' C  ?6 P* n
    • ) A/ ]2 M* H) `5 ~
      ; @& N' O$ T, `9 O3 k
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      " e0 o! \( }9 }4 E8 e

      2 U" Y* F( t8 X7 c
    • 1 S0 {9 H+ J: O# d" Q

      8 {  @" U2 q  {+ x( J   {  * P0 ?* ?1 Q) M. T% [' J5 _  B# R
      0 g- I8 n: {& f; G$ _! N
    • + A8 Q0 `9 P* B$ a
      1 t2 i9 Z* h, E0 j/ `
            r->next=s;  
      & n' W! q, `8 J! |8 i5 }! v

      + T7 @, h5 M  i: n" a5 u

    • 8 o8 v2 N" Y! F: @  [( n6 B* F

      " S, [2 i" p5 d+ w' h& K' }      s->next=p1;  ; [0 e9 c0 U9 n( g
      % Z  z% b3 X* A
    • " Q- L* f3 m) b' [$ \( C# q

      ; V# m% t4 e* J4 Y   }  ( E4 Z# S- ]( B6 [" a
      4 [% v. S9 e2 V% x, T, f  p
    • 1 ]" m& F8 ~  \. {

      - l# f2 z( H; A# a   else  2 t+ A! ]9 t5 ^8 t  o; d

      & i) h& M: w0 c$ J2 i

    • ( `: k4 `; |: R
      ( v" M6 U5 x( o7 [$ a
         {  
      5 Y2 N6 E% ?$ o% ^5 f4 c- |
      7 F+ V# l0 B' e5 C! D
    • 8 R: ~# e5 i8 B$ \
      + r# `( G6 u. ~! H, x
            s->next=p1;  /*否则插入在就绪队列的头*/  
      0 R8 A6 F9 r6 D% S0 s; D  a0 d
      ' K# {1 w1 p1 v- v+ B

    • / C# R, A9 d; q
      ) L# K! z1 T& Y  Y3 m' [
            ready=s;  8 F7 G5 V: ~: w; G

      , \3 P! T( }1 k9 Y
    • # y8 \1 |1 q; k: O  Y
      $ R  G+ q/ p! K0 p% i9 ^6 C
         }  
      0 N( N! C* S- p* l  W7 s

      & j1 A7 B& x- k5 j) g
    • & s# Z" F% S. W, l
      + S5 R- m1 M4 _: Z4 S/ J! `
      }  - ?7 F5 ?. w& a& ^: B
      - b5 T' C) f' X3 L; Y  ?

    • % J! P% q: Q8 I4 ^* D4 }, Y6 G
      ; D  r% }* c& K' R
      /*优先数创建初始PCB信息*/  
      ' u' J! c4 u3 A3 k+ [

      ) q% h/ F: E/ \0 ^; @9 ]+ V
    • 2 j* i  J% s" d: e
      6 I" I. }- w. ]
      void create(char alg)  - E# X1 H+ q, E

      # M) _) }% o8 c$ s- @

    • - {/ f( J8 d3 A; I- g3 L" x8 W

      % f' q8 n. w! s{  
      ) v! {* t( ]" C7 q6 E# _

      ) h) S2 ^- q$ a, Z7 F: n! N. o
    • 3 m5 w" V4 B" t' g

      ) g& C" u2 |+ _; S- ^: H   PCB *p;  ' b, Z* L; q$ W0 F, I* \* @
      7 x7 {; m; g. t7 e# w
    • * |! B5 Q- ^) j$ g2 a  u2 W* K

      * ?: M- I5 z! V: c/ O   int i,time;  8 l  K3 R2 U2 k1 o- r* k
      2 ~/ r2 `3 A# {" ]
    • " V5 q$ p' g# P

      % J7 F2 j0 V1 s0 g   char na[10];  + N. |8 l1 J  h1 N8 n) t- u
        G% P- f/ o  e( @8 n
    • 9 s4 n$ x1 J( }: E  ~  V0 O0 z
      , b" }0 }5 }0 s2 Y
         ready=NULL; /*就绪队列头指针*/  
      4 d& \3 G7 k5 k0 }
      3 c; o4 P. |5 z

    • 8 \2 W% i% e2 A! i+ H

      / v  P5 J9 Z6 c' R; M/ P   finish=NULL;  /*完成队列头指针*/    E- I' u" J' g4 W; b
      ( q3 ^) ?6 m" I# Q# Z) }: K& M

    • ; l7 ?7 o$ F: i- j
      + o! z1 q# e0 u; _1 a. }- o
         run=NULL; /*运行队列指针*/  
      3 G1 Y$ v1 q' ]. e) w& p. v

      7 ~3 B5 L* T) R5 }8 V* p
    • % x5 S" D6 _3 m/ z0 s. q
      6 h; J# ?# o1 \3 b& j
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      + y5 F! t) T9 L4 e3 z3 g: P

      $ D- p7 a6 ~) v

    • $ r! ?2 [+ {# s: h; O9 t$ K

      9 v# ~3 {0 [6 r   for(i=1;i<=N;i++)  # J0 f6 Q; t9 d1 G) q

      6 k9 e9 d7 N- G) M" d; `

    • 3 u! o/ O# Z* S+ u# `9 \# F
      $ t/ x; K8 M7 M; J; A/ N" x
         {  
      # ^3 W6 s- v5 v% F3 m% a5 e

      7 e- D/ e+ y4 L! \! ]8 E+ O6 w

    • 7 a6 Z3 C5 p/ P, e

      - g3 M3 O0 ^, U1 _1 T      p=(PCB *)malloc(sizeof(PCB));  
      - m! m9 ^8 f( M* S* Y
      4 t, }- ]# |% [, C* ^- _
    • % P) g2 N. B  W7 C6 L5 y

      ' J) ?2 G. j# t# E      scanf("%s",na);  6 h# R" E* h! e" E, |( J) D
      8 U- S3 L- b$ `+ c
    • ' j, v2 T% r3 O/ Z( ^
      + A5 ?( {' Z- e
            scanf("%d",&time);  
      % n2 T/ s9 G" W  K

      ; h/ h$ H7 ?! v' H2 ~* O
    • 7 r* l' q/ t3 n! w5 {# V$ D
      / I% a6 l) L& d  A
            strcpy(p->name,na);  - [) C, ^8 b0 ~" ?5 B
      7 G8 I& Z! T$ m& V9 V& i% T

    • ) {9 O6 d5 [: P8 m

      : L+ `0 s9 M2 `( E' E  n      p->cputime=0;  
      ( D1 k* M1 p5 ^- L5 _  h
      % C. F5 w& F. K: Q8 Z' b

    • 0 z2 x; Y. P+ d6 T4 T. X
      7 x& C, D; w  I0 P) g% r$ C2 G
            p->needtime=time;  9 k* G  S+ q* u3 K( ~
      1 ~' D8 a6 C* X5 w+ r
    • ) N  x: A0 h* J: o! x3 [
      5 \" o5 R  m- q9 M
            p->state='w';  . T0 {! |& `% \7 }; w  Z  P8 |& r

      9 n% R: k0 H( o$ \/ @3 o

    • ; v- v0 T& e& Q7 c2 Y& B

      ) |# u$ P$ N1 @/ l7 i      p->prio=50-time;  
      ( B9 `% Q" x- D! S) }; W7 Z
      3 T7 s; I* _( j' _  K8 X. `
    • 5 o" Q8 y. \5 U) {+ w9 {! |
      1 O: D9 y* d# P1 ]8 n" h5 b. q7 x; Q
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  / n9 ?1 {2 p& E( c! o

      & e8 R. L3 G" g

    • ) ^# Q$ f1 D. }; E
      / n- i+ n7 u7 ], F$ s% c8 g  ]
           insert1(p);  
      ( T8 n$ [' j! U9 K1 l$ n: F

      8 T2 B! z/ {) R+ i4 n" B, s% Y7 H
    • 3 _* `( F$ [$ v& H7 T
      , C8 ]& r; V. W
            else  
      ! l, [* k2 e# w+ P  B9 w4 T% }; y8 E

      8 @/ r4 s6 j: |: O. e/ E

    • 8 ~  V5 B6 H; R& J: ]

      # Y2 U# t; ]% \; K      {  & O1 Q, c+ T; F2 Z

      - m: E4 q1 q: d2 ~4 s6 H( i% H

    • + S; T% e% k$ a9 o" s7 H" e, H) g

      & ?1 W5 S, m$ u3 q     p->next=ready; /*创建就绪队列的第一个PCB*/  
      ; J) {+ L4 b0 R

      7 r! d& D  |5 ?" _( h
    • ) x# E' X7 v/ u6 u% H- d4 {+ s
      3 U& j! u- g  H
           ready=p;  " @8 u2 M- M  {8 [: f
      4 O# x& B- D) _! R
    • $ a. b. s0 H$ C3 J
      5 h; S, w$ i! n; I# b/ L8 n
            }  , \" x& Y! {- a9 T
      & M: B$ v& J, J6 x: O: b, [

    • # Z7 N6 u" G; N
      - @, ~( ?! r* ?+ d9 H
         }  3 g: f" \) P8 Y
      7 p9 b* w5 t" D. Y

    • ( R, {- |& H! z' p# o+ d% D% O

      $ F0 ]" \' [% C" T+ i+ k; q! A) y  o/ `   printf("          优先数算法输出信息:\n");  
      & ]' e+ E; T+ F* q
      % t& d! K+ a/ k# o* O0 x, d

    • ) Y0 B: p% k6 ^% g7 R
      # T! j0 t, d/ X, O1 U
         printf("************************************************\n");  
      . k9 O- L) B! @4 p
      ; G/ k3 D7 M( N7 ?3 J
    • 2 o( B( t$ |6 M- P4 O& u
      5 C# d# a1 U" f9 M7 f4 c& U5 f
         prt(alg);  /*输出进程PCB信息*/  
      ; X9 c" J2 ^, u' U0 n0 d+ o
      , n/ @9 j9 M' f3 T* d

    • + I. Z/ @( r& p5 s+ R

      9 Y7 G9 S/ E. o   run=ready; /*将就绪队列的第一个进程投入运行*/  * o0 m  C$ Q% _
      ( D) N$ p, n# t. H' P
    • . \' Q  v) H. r
      2 J+ v! h* m5 N8 B+ E4 M* j  y( P
         ready=ready->next;  
      9 a/ W- _3 z6 l& ?! l" x8 S

      4 X% n" U8 U% F

    • # ?5 F% w4 c. L: p6 s
      % _  ?* j& s0 ?  l# y
         run->state='R';  7 w; m5 J1 I! f0 p9 V: e
      * Y& `3 H6 j( L6 a7 ^7 T. K

    • # C9 ]1 B, L! N8 K
      * X3 x) j8 `- H! i! Y
      }  
      4 s! Y; Y" p* T, j* M2 P; t: i

      & j  b! }5 P; a, ^( @& g

    • ' U9 C- P7 t6 J. y( [' L
        ^2 e) F5 H* c& m1 ^' D3 q
      /*优先数调度算法*/  + d. }6 A. y. O2 q' I* `, E- a

      3 C; i# U' z$ H

    • : I5 b2 |0 s1 C: y. J
      . @' [$ m, [/ H5 `
      priority(char alg)  / V# S- e9 ~6 v

      ! w7 I7 i% B: [' X# \
    • 6 M! ~3 A8 R8 I2 B- E+ o% N

      ! F& b- X9 g8 g0 g6 ?6 L{  
      % K) z) R6 v0 R9 F

      + b  O0 }5 C; U7 A7 c3 C7 n; M

    • 3 n4 ?" t( l8 i
      $ R6 g$ W) y8 I$ s' }
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  , s6 X, ?: a( ?& a
      0 C. ~4 ^$ O- ?5 r

    • ' |1 e8 x7 o1 Y

      & d' U; d0 G% w$ ]( P+ ^& ~   {  
      ( g) p, Y3 t$ b
      + f" F( z5 m/ Q2 X2 S' M

    • + _7 n( p; S4 i1 Q4 T0 B

      & i* t) _! G3 U  O$ K( V      run->cputime=run->cputime+1;  
      3 K% t! l* A; B9 D

      ' e5 N0 }# d0 ~2 l5 s2 U2 {; x

    • % O8 C. l. G0 z* Q, G

      ; f) S$ ^6 S8 z      run->needtime=run->needtime-1;  
      + g+ T' g, Q5 N2 l; p" r

      . H3 x( s$ e% }& C) s8 m

    • - ~) w7 s" P4 D- V  J  a1 B* g$ [: r
      & m- L9 ^% F! D5 d4 Q
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      , T, d, ^$ J1 b2 }0 O7 h

      5 \0 B6 T8 a* l5 {2 ]
    •   Z/ d/ W8 s' }' X! l
      6 t7 Z1 ?( F8 O$ F6 X! [7 c$ W
            PCB *p;/ ~- E* Q8 K% x! I) y4 T  Z

      / Y4 K8 q" ?( o4 |

    • 6 X* d4 }7 ]' ]( k: [
      6 w) Z- n/ g! J
            p=ready;  c: Z$ j" Q& n$ I

      ( a% u6 \0 u6 s* j- f- ?6 ^

    • 0 h; p+ ?$ o% C
      & Q* W" P4 S' o2 q* }& }
            while(p!=NULL)  
      . L7 i/ a) q; J. d' l
      # H) r; l1 E8 t9 a) {' v, M

    • ! D  g4 x' p' e( f! r( C6 X8 c
      3 N/ w4 L; k- e% f  t& I1 n+ s: x
            {  " K% _( M) d  ]4 X$ z
      * S+ X- C; f( J" Q
    • 8 l7 \% }7 v, t9 \$ \: x* G

      8 {) g& r; Z. e% w' ^9 c          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    9 Z. x4 ?, x3 T- o$ y% b

      , X; j! v; ^/ R* t* `+ L1 I

    • 7 E0 g, Y+ R  t& y, N' N5 S

      $ D8 G, J) ?" c$ ]' O7 m( J          p=p->next;  4 y/ m: y! R3 B6 E( U
      & y4 ]& {5 i2 P8 E9 O6 p

    • - E7 r+ p" M( f* e" v/ b
      % J/ \3 L( _; R; G$ c0 i
            }  : ]- Z* ~8 z6 |# N# Q% V6 l- `
      $ j6 `1 C5 x! Q& M+ s: m
    • , a+ X7 c$ ^/ p9 @  A. i
      $ D& i8 w: l/ L% Q8 E$ x7 g
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      $ b7 C3 ^  @* \/ d* I

      : c% n- [% n$ f( y" n9 d9 X
    • : ]1 Y1 N7 D  N, P  x7 N7 M

      ) @3 \3 m% u: M! @# W; x      {  8 X: b5 D: \  x9 R% g$ ^
      % u+ C5 B8 C3 }% \( O: [: V9 {+ P
    • ' Q) `' |' _" t9 b$ {! B
      8 p1 ?+ t4 e+ S; c9 l3 k+ [
               run->next=finish;  
      6 U: i0 z  `, D" I7 G+ l$ x2 ]
      $ n1 _- d; }7 K5 s
    • ; ~# W6 f; B" y* i

      # T5 s7 T0 b9 v         finish=run;  
      $ B) p& A' R6 G) @7 @% W
      / W5 w# r* P; @/ m

    • $ A% C$ R, T- x; N. \2 t

        Q2 c6 G+ X! J) ~( T* `         run->state='F';  /*置状态为完成态*/  4 X: O& M" @9 `5 Q$ {

      / L; `# t6 W( u+ y1 f6 A
    • $ }5 w, N* l9 }- ^, A/ R

      + _4 I0 y% j/ r. w( b- L$ ]0 m& L! T         run=NULL;  /*运行队列头指针为空*/  4 I+ G6 ~" A9 K: H- `* D

        @! G* q: O( h% d: v$ N
    • 7 Z$ P4 o' {: g
      , `, y/ @! m4 v' T
               if(ready!=NULL) /*如就绪队列不空*/ , y! u2 T8 d+ J4 v. N
      0 M2 E$ X$ M# A' h  q5 N4 m
    • ' Z% b0 K& t, V5 s

      5 I/ u! |0 g# D( `% e9 C         {  
      , E7 A! ~1 u8 e, ?: }

      " y6 H3 q: G( j% f
    • 5 c1 d' E, x. V; u6 }( i" _* E. V
      # w' D0 N: x" n7 m
                  firstin(); /*将就绪对列的第一个进程投入运行*/  8 {) R( ~9 u+ ^' d0 ~$ P

      5 q. A9 t5 s2 c2 d8 c

    • - `5 I5 v; K& L* w& k9 }+ r# p

      / c' P4 v: l$ B/ d7 R1 w9 O: q         }6 I; L. t* R/ n  r
      + z& p1 v* M8 ]$ ^) t# x  |% |
    • 9 v2 V2 R" R( M- N

      7 v1 Q, U: P( e5 [      }  % l( Z1 h3 O8 G4 L  s

      * r5 g/ v$ }* D# R2 M

    • 7 Z' h! W; g$ r" S

      # b8 G# m$ v7 A% u5 G: w9 Q      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  % @$ L$ U& }9 ?, @. W( ^  _+ D

      " S6 n' F3 n5 N. y6 q/ G

    • 9 H; y$ V: Y: E6 F- e9 P$ J

        y1 }" ?+ U; e1 x+ j     if((ready!=NULL)&&(run->prio<ready->prio))  
      6 [- A: b  e3 T" F. [  u

      . b1 i5 t: M* V" @3 {
    • # |: t$ d2 y  i' I# |4 ^3 v5 [

      ) r6 B* u/ u# m     {  . m/ c" z. j4 T) F' v
      , S+ D2 |: y; k: L# ^$ X; j
    • * m: G) h9 c: K# t

        N$ S; o8 Z( V1 \        run->state='W';  2 \, V& O) G8 y9 C/ j
      ! ~& x$ D& @  ^- N- M; M0 ~  m

    • . d+ Y+ C! {0 D" t2 m
      7 q' P8 _( I0 E: M# M
              insert1(run);  
      % m3 O6 h; B/ c% X0 K) P
      ( S9 q2 f6 j, }) _- ?' ^
    • : f/ c/ a6 g* T1 w! e
      & ]/ z$ [, e: I5 A* O' ~) t$ w
              firstin(); /*将就绪队列的第一个进程投入运行*/  ; Z6 ?! f' r7 l/ O" C5 `7 m% V

      & V; z; |" \. p0 v7 W4 r; e
    • . F. I7 e; M! e
      - s; P+ t. ~$ n+ U
           }  
        N: s, b; S# P) W

        m, N! P- J) q: w! B2 j
    • + \8 T: [# ^! u5 l2 |

      . m5 [2 d7 {: l& U! C2 I/ ?      prt(alg); /*输出进程PCB信息*/  4 j0 v7 C# `/ Z! Q9 B3 Z

      2 A' ?4 x+ W' g
    • - _# P* n4 _  \. Z/ n' S- l5 ^

      9 U, Z3 N, C. P2 Z   }  
      3 }+ Z% q9 H& O6 P

      + Y5 l- b/ w1 H' h

    • ! @; A+ q# V& |! P) o
      2 ?, i0 j5 T0 h% S6 p
      }  * W" p- F5 \3 R3 J

      6 u. d$ t" J+ W0 }. T" G
    •   x! H7 x  d( _2 I
      5 B6 q# t0 K! P0 ^3 g+ T
      /*主函数*/  
      * T  H' x1 M, H7 V, a, g8 s
      1 |2 ~  c: X) U" a2 h0 L% k
    • . ]5 I2 v- C9 p! x7 x1 F

      6 [9 j6 i! a% w# c5 @$ \main()  & g; B! I  c7 o
      ! g# A* i* Q0 Y7 i% u! ^* j9 P
    • 4 a- a! Q& v  l

      7 q) l+ |4 j. K' c' ?* ]{  . o2 q7 Z8 Q% H" o5 r- d2 U

      $ u$ k6 q% w0 Z& o1 A
    • ( O( R& I% i0 _6 v6 R

      : G8 K. R: k) `! \( Y* H0 X! R   char algo;  /*算法标记*/  
      9 x: G. n$ N# u6 T: q

      ( _2 P7 q6 _  v/ a  r7 I' [4 K

    • ( g0 l+ H( t% A- d

      8 e2 |6 u0 C2 ]) f/ g9 T: e   printf("输入P确定算法:优先数算法\n");  
      7 F8 `# k& L8 R& a  U

      ' R' o/ M2 R. N! U2 \3 B" g

    • + d4 f5 ~$ Z% `+ A

      / ~. J1 Z4 _( E) }5 t- _6 U   scanf("%c",&algo); /*输入字符确定算法*/  - H2 M6 M# ], E" k, s4 S
      * U4 R3 [! C' K# @% l

    • ) h) A$ i- E; |. \4 j% P
      3 P2 Y4 M9 e, e. {3 _. Z& n9 p
         printf("输入进程数:\n");  # w5 \8 H5 J2 A) z
      3 |/ t3 k: z1 z+ o6 l

    • ' V& w9 r8 y* D) H9 y/ D

      . o7 P5 X) b% ]+ T5 e   scanf("%d",&N); /*输入进程数*/  
      9 m3 ^# `7 d3 C

      8 I3 d. X" y* J+ Y8 I9 v

    • 8 ^# x, k* r1 L/ [8 m2 Y

      : |5 [( j: h3 B: e* \" `   if(algo=='P'||algo=='p')  
      ( a& `4 I, R, t9 p& Z% i+ K0 x

      ' y: h5 X3 p/ a% l/ V& M# c% a

    • ' \) J8 v; X: V( q
      & H, ^  _$ H% [4 Y" R- U
         {  ! P! i" }! T7 H+ h1 v

      # a3 [( O3 k$ g7 u
    • ' F+ t" t0 `: ]: l- ?$ g

      $ {( A5 C: {4 i+ G      create(algo); /*优先数法*/  
      1 Q5 o/ G& t2 Y0 }0 U" l
      8 F4 `, h- o0 P8 w0 C& A
    • " |+ W) Z% r7 A3 ?" _8 V" i

      $ q$ D1 i$ D* B      priority(algo);  
      6 b. I/ x% X# j) X1 N- {& F

      : l: V' Y! U) _

    • . p0 A3 w; W( l" I# e; N

      & o) B; R3 G7 s* j) h( k3 L4 x   } $ f8 C1 ^$ N) ~8 G4 _4 i
      ' s# q: B1 z( @" ^
    • ' T- ]6 W6 o8 \2 K- E4 [
      $ t/ L0 m- ~; d; A
      }
      5 c% R( ^: k- q' E0 G7 _" U
      2 x4 ]) O9 A5 y
      6 U2 P( [3 g: |0 B+ d% r; s

    / G8 s( A* |7 C# S$ k
    输出结果:
    4 c% d0 k' W  T4 l


    ; U/ Q, d$ e8 m& p3 P原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    6 M5 Y+ t  O5 i! y$ {+ n! \
    * r" O2 i8 R4 `
    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-9-9 14:32 , Processed in 0.573686 second(s), 51 queries .

    回顶部