QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3191|回复: 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 V$ F% V5 Q3 v优先级调度算法& U) k9 V/ u$ q2 i; k

    算法介绍
    ! i4 j' `, r. {7 b$ s优先调度算法的类型(用于作业调度)
    $ E# A$ z* T4 e& x( q# }* ~! I1)非抢占式优先权调度算法 4 U3 j5 v1 a* @
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    + j8 Z: K( w! V6 i* H2)抢占式优先权调度算法
    & ?# c  h% d$ C' c只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型7 L3 g% p' t  D2 B8 i3 a
    1)静态优先权
    ; M' s( c0 l% g) \7 V7 M: p$ w9 r静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。0 E7 O) L4 Q3 ~" ]' X, h

    2)动态优先权
    & l; o; |+ f4 P( C# T% \! U

    算法实现

    抢占式动态优先权:

    0 E2 E" I, e7 H, F! M
    PS:本人认为非抢占式静态优先权没有实际价值。


    • ) S% i: J# d. {4 a7 k  t

      4 q* X2 m1 L3 ?# v$ b/ n; ]. r#include <stdio.h>
      # L* y0 {+ x8 b2 ?' h% d

      ; m7 R& F- U' `$ L1 x
    • : X5 c6 i& M/ \0 [) ~& ^" \, H
      ' a& M3 I8 A: i1 u& `9 z
      #include <stdlib.h>  
      % O( i( u- l) _( m3 S, H0 [% R6 l, c

      7 L5 X# p1 P7 ?, r% F

    • 2 h& {, k- r" U8 s3 E

      ' d5 v0 v- h" l- g#include <string.h>  
      ! U& `' P' P9 v+ F0 q! m$ d( }

      8 \3 b2 w; y" N  S

    • , @' b6 G5 ~3 Z+ ~5 t

      $ \# s: `3 N5 C: c2 E$ Wtypedef struct node  
      $ C: Y8 T6 Z* l% u& _8 c
      6 J+ }% r) w& M7 M( m7 D- b
    • - _: S! ~6 Q2 A0 Z' I7 [

      4 V, N1 V% G# m% q{  ( c+ g: N7 Y0 H+ a' _

      " q5 ?$ I' U5 S

    • + H$ a8 l2 i+ e. m: a1 Z* _
      3 q. G# p) m' a/ y- ]
         char name[10];  /*进程标识符*/  5 i! O$ Z+ {! m' D6 L5 y! L

      0 Z* P1 H( W, J0 l6 ?3 K
    • 0 p2 n6 O( m, u) \& C. I

      , T* h4 d$ Y3 i   int prio;   /*进程优先数*/  
      ' B/ S; D+ L, W% d, J5 G. Q. T
      % b5 Q4 i5 j' x3 |. q# o( a

    • 7 e+ `. W5 _1 y; Q9 i

      ) r% h5 f; S$ K. n   int round;  /*进程时间轮转时间片*/  7 g$ r" t5 v2 s' k4 j. `! B
      & B( ^9 `+ f# v' G& k

    • - I7 J, }8 L; z( N/ K

      - @9 K) p! A# L: Y" a. u) @, g+ y   int cputime; /*进程占用CPU时间*/  ! j8 \& O, O( q* z2 h2 i  t
      / ], C: x* g8 g" r

    • : U& r# ^$ \3 j

      ( x/ W/ ~; v2 b0 q4 u, B" u0 d   int needtime; /*进程到完成还要的时间*/  * D  m7 Z, K& j; [6 h3 d
      " i- z2 K7 D0 `) r' T8 S
    • " T# L, v7 K, C4 v4 f& y
      * ?4 C& _: N9 i9 D1 y2 u  ~
         int count;  /*计数器*/  
        E8 R5 d& h6 i3 Y8 S- A
      7 U8 G# n: l) C+ \- P* o8 B

    • - w6 X6 b" ~7 E& V; V2 C; |

      : b8 b% S" P0 n9 B: \" U   char state; /*进程的状态*/  
      " \" @, H* p3 V$ \" C6 A
      , [! k) K0 O! @

    • ( g+ H* J5 O( h1 I& U+ N/ N

      . S1 g8 w5 d! x) Y' D1 W   struct node *next; /*链指针*/  
      * w7 {- J' y+ x0 Z) V

      " m- ]0 X6 E0 t1 x8 ]& Q2 a  n
    • 1 `/ F% X6 p" I9 W; u; j

      ) J6 h  z9 N2 l0 i- m" t/ Z& ]}PCB;  
      : b0 a4 m( R6 K$ ?: h% W# {

      / C! i) C$ a; c7 O4 O

    •   {) Q+ ~) q, g8 O4 q% v3 K" T

      / _4 k3 q) i+ L  a  G' }% c8 F% RPCB *finish,*ready,*tail,*run; /*队列指针*/  
      % p2 l9 @" q. k- j$ ~3 q
      2 K0 j1 z  J2 B, t- Z* u# k
    • ; J( a& Y8 B2 T( `2 K

      3 g  |2 b9 a$ m, Oint N; /*进程数*/  : V- W* m4 C0 e9 f0 N6 B* r

      9 W& y4 Q$ K3 V3 V

    • ! S+ x0 E. `) g9 l
      * H, D+ J; M& s3 ]
      /*将就绪队列中的第一个进程投入运行*/  
      . t& w. v2 M1 m+ J# R5 p
      * ^0 `" f8 D% i
    • # `: U; W* x* ~& \
      ; p- m7 @* C: S! ^
      firstin()  1 P! p5 l* R& W0 ~
      ) @+ }6 O9 E+ B( X+ A* K
    • / t' ]- n1 @/ w4 [/ `

      8 R2 F! B5 j) y9 @{  
      . D% R0 E( M2 p3 R! t% K
      ; W" b$ U0 Z2 Q
    • * i9 {# p* L+ I3 J% P  p" @4 q, ~

      1 ]" |' i+ x/ U! R1 [0 h3 H   run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      - B0 X" j' T- s) f+ U- v
      9 i; k  k% `6 z/ ?

    • / k( ~1 H5 \' r& }
      0 K4 Q# @% I" o) f* ~
         run->state='R';   /*进程状态变为运行态*/  
      / u; d2 R$ B( J8 l8 H% \

      : |# p  K2 L4 h+ M& [: S8 p
    • $ y! U+ E+ T) a2 E( d1 q& ?

      " R* _& \; X1 J* c   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  * @* f- R- y" U6 v! f/ e3 @

      8 k; c7 a) X, ^% e6 E

    • # S- S. H$ L# p! k8 e1 y; S1 x

      - q( j. T! @1 i$ u8 Q6 t* _}  
      ! ^2 c* F7 k* T$ ~% k

      $ ?: }1 x- }5 [3 y5 Q1 f7 F

    • 4 Z6 ?3 K! V( ~3 h

        e6 }# J! X5 U# Y/ W/*标题输出函数*/  9 h( }( K; f! k+ G; Q
      5 V6 b$ ?! L9 a3 h4 s  D
    • # a; ^5 E5 p3 A5 Q; J
      ) r' b. q# I+ V# S1 \1 o$ s, q
      void prt1(char a)  9 S$ J) H7 C  t7 y7 Y
      7 Z  \1 @/ z) z% I! i' E% r: y

    •   ~/ O) C# N" ?0 E' s
      : o* V+ z  w* z( m, z0 F0 M
      {  
      / D# E- C" _7 W, V. s
      & V9 B* q! {6 H  v) Q9 i' s

    • . e0 P1 z% u9 z$ a+ X
      9 q2 K" r. a2 e6 J) J; ^; i
         if(toupper(a)=='P') /*优先数法*/  ! G1 |# }! X& i1 M' w) n. G2 y  |
      5 I+ J$ v3 u) Z/ G4 b
    • 4 U: X& _0 s' k5 O4 A$ v( r! }" a
      ( `5 C# {  S5 e2 k: e! q; Z% N$ F' S
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      . Y/ j$ C6 a+ P" r! o
      0 F+ A  t+ g9 [' E( h' a
    • ) n7 g: o* X: I

      & g; ~2 O- }' d0 n1 A. ?  ]) l' @4 ^   else  
      7 [' C" o7 a1 Y3 Q  A) {$ K  i

      4 T* A0 r0 C2 M" @& _( I, p

    • ! ?4 J1 x- z; Z& v( e/ p7 d8 M8 a3 H
      / G$ W# g) N/ D! x: S
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      . k/ ?7 y' j. S

      5 `# T# ^2 {$ H
    •   t- i1 c0 t3 T1 M
      ! J6 _; X7 q' p* @
      }  % @5 c$ C! f# E/ ?
      8 V. ~: T) P8 I# M5 B, _+ F
    • % k8 l5 e  M" @3 }  T* Z
      5 @6 _7 y9 {/ a, R9 Z& i9 o/ n% v
      /*进程PCB输出*/  1 q1 V$ m! y* N" @9 @" X) R
      4 O+ M% M" \4 a) h2 U9 s' e( B
    • 5 v5 T' a8 a" `) K% U

      ' l$ s; b0 k* Q; hvoid prt2(char a,PCB *q)  6 X. z$ S- q+ w

      ; Z# t: n/ m' Q, z" d. o

    • 7 I, S! b, N0 o, N

        F) P+ o( j( `/ V# f! B- |/ O{  4 B3 M+ f4 e0 q6 a; z
      1 A8 C& `& {) j6 H
    • 7 \% U6 j3 l. V' t" D; v4 m
      * k" P: E$ N4 w3 f, ~
         if(toupper(a)=='P')  /*优先数法的输出*/  * Z' Z: u% F& T1 A7 a
      & ^& ?0 N- e8 D/ S3 H5 n1 H
    • # i$ v9 A5 ^' P6 g& r, x4 Q
      1 q. c) Z; a; Y' M
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      ) b" T; L" \( F
      * f  _. s. D# k2 w
    • 8 U0 {; A# N3 i9 b! ?
      ( C0 G+ j# ~; J
             q->cputime,q->needtime,q->prio,q->state);  5 w. `* Z2 X, F& v5 }

      5 o0 }, f$ E* g$ i

    • 4 B2 v1 t/ t; g& f) l+ m4 ]8 d0 ]
      6 ]8 o7 Q8 o" V" S& p& @1 i
         else/*轮转法的输出*/  ) {3 H6 @& [+ f$ K, j/ R5 A* ?

      4 B- m2 Z+ T! @
    •   d5 q. J+ E8 d/ F
      " X4 @  I0 y# ~$ {% M) T
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  3 q4 p8 O. V3 P3 b
      + X: l9 e( s0 \& \/ P- n
    • , N! \! q6 A; b: K( c

      # A7 K4 X5 h. r       q->cputime,q->needtime,q->count,q->round,q->state);  
        c" l# c3 E6 I9 J8 U( \2 N
      ' z* c, c1 P! O! D. n# f; B$ S

    • 4 t( a# F$ r) }4 P

      + Q0 G( }8 Y9 N}  ( ]6 T0 _7 _; G, |! ?! N

      5 w7 O8 \! i% f; Q! [- F" D. ]# p

    • ) {. ~% s4 S. I; A/ s) X4 N# u4 @
      ; s% I* f( t( {8 @# L: X5 G
      /*输出函数*/  
      ( l( O9 V  q' N: o2 A& G6 S* Y- N
      % v  p8 g9 w9 B, C  o- P/ Y

    • 5 Q+ r9 i- ]; N# r$ D
      $ `: L7 \* \  A  g7 u
      void prt(char algo)  7 g* V; Z# v. w( J0 q

        H: ^8 v' k- L/ G0 B' Q' F) ]: H

    • 3 j+ j! i8 z/ }

      ) j# }& u4 M0 D{  $ Z% e: ?) c/ O. ?
      & ^! I: s4 ~1 T# Y; R7 j0 C* T
    • + A: {# v9 E4 h" O* k$ I( V
      3 `1 u, v; f  e
         PCB *p;  4 \0 |0 l; b* f, D, j, Y

      " o1 h, i& t! Q6 z$ Y2 ]9 Q5 y

    • 7 O$ t9 \, h% I- g% e* [
      ; _4 @1 B& I1 [
         prt1(algo);  /*输出标题*/  3 q8 @" k2 b+ f! h" {

      ! {' E* |% ^! s$ j6 I3 E
    • 7 ~  w4 [& d6 N

      # j- V& X" q) g; C   if(run!=NULL) /*如果运行指针不空*/  
      & @0 a5 W6 x3 N, ]2 E4 `' N

      : X+ B0 l& q5 l
    • * K' {8 p) ]4 o0 s6 E) H

        _! p4 R: |* S( q1 H* y7 H4 [8 H      prt2(algo,run); /*输出当前正在运行的PCB*/  $ b6 J# I$ v0 N; o- f9 w( G

      " U! J( l; j, U+ u# r; W# f0 m! V
    • 5 ]  N8 t, O6 U7 ?

      6 o* Y& d' P& V( [   p=ready;  /*输出就绪队列PCB*/    W: D9 p; r( `; X  F

      - v6 b3 d+ I- L2 ], [  t7 a: p' A
    • 5 y* I  d' H& K* p

      : Y1 t1 y$ r2 i$ Z  R   while(p!=NULL)  
      2 v" ]1 C7 X8 o

      : F0 q" ^% M7 ?; E/ r* g
    • 5 A6 |* L5 L8 e% F3 Q
      1 B: w4 t% \& t: k( I3 l# J
         {  
      1 E% o- H- V& `- C' o1 Y
      ) [9 _2 |7 @2 S1 Z4 W. H

    • + g9 |5 _* F% |2 g4 Y( O7 f6 C" _

      % ~( F  t3 ~# M+ T      prt2(algo,p);  & E) v- {; J; w9 |$ i8 m  M$ \; Y
      # x1 I7 c% P1 r6 W" v! w  F; X2 ]& d

    • 6 L* l6 P9 d/ ^3 e- i3 r
      ; S' ^! z  X  C; T
            p=p->next;  % m  V4 _+ Z% Y! k/ G  p
      % D4 s8 i# X" d9 l
    • 6 \8 R: `8 d4 L5 R6 ]! D
      $ D8 `" j; R" j! A  m/ C
         }  
      $ G3 `$ a# \3 ~9 [! s
      8 p, Z% A0 R# Y; }7 ~
    • 5 S/ G. @$ N7 T* S& q1 M; L

      * ?, ]7 z8 c. u: C* w$ ^! n   p=finish;  /*输出完成队列的PCB*/  & ]/ J5 B/ ^  ~+ o

      # M0 s: u( \9 e& E7 \
    • 2 P, N6 E& ?  I8 R0 v. H

        N' y# Z; E% w0 \   while(p!=NULL)  
      , z" R7 W- f, \: H
      $ e& r: K" @" Y/ i% D! k

    • 6 d( j+ d$ t- d! U9 ~7 b- L

      / [! M" w2 w: V   {  6 S2 l! K! S- C. T* i! {7 L
      " C0 a# M" u' r0 T' ~* W
    • 3 @$ C1 k3 g) G/ I7 h0 {

      * s+ i8 c) w* E9 ^( W$ C5 U      prt2(algo,p);  
      ! A2 ]  J0 [& \% e' c

      * O$ ]0 A4 L4 i6 E6 T& W

    • ( a$ g( C! G/ w6 Z0 T" T1 E

      . p6 ^9 |; Q$ R" A+ d) d8 h* F5 \      p=p->next;  % a. @4 h0 q6 w
      5 s) P/ W# {+ r. T4 f  C8 L

    • 2 A; {+ w, S: l, z

      , X; z# r& j, l. K: F1 [   }  5 H6 I4 P% x" A
      + P% c! X) Z1 ^" y+ Q/ U* K* n

    • 5 y" _  @8 m3 L; H4 Z$ m9 \
      " H# q: G5 \9 ~" v
         getchar();  /*压任意键继续*/  8 a3 n' N* ]5 ]
      $ N1 O7 @: ~8 \

    • 4 g& O; W6 C6 a4 ^' d  G1 a

      : i, m) z1 g+ b3 J$ z8 P8 [2 z}  
      , \/ ?* h+ g+ n! W& x) R% C
      7 |3 L7 K9 H' F+ v9 w# j+ q
    • * ]! b: f  K' H

      ' X' M8 g8 I1 Q" X/*优先数的插入算法*/  
      $ N! C4 r) D- X5 Z
      2 q( M8 t2 Q. i% b( i6 q
    • * ]* a; k) B9 r$ O
      ! P# Y8 R' l. M" j7 N' E
      insert1(PCB *q)  5 e) c: }/ @) R+ J
      * x" A# p8 W! P1 I* \; Y
    • , [1 m4 a- |% N% C- ~" d
      + n9 t0 D4 i! ?# y0 u) M/ B$ H
      {  
      , e( Y8 A: F2 L9 ~" t) _

      ' j& [/ s3 ?0 B6 H* O' D

    • 0 b! S- n( y! U& X

      $ x! @2 s: O( k, n5 ?. z* k9 j" W   PCB *p1,*s,*r;  7 y# R3 u( \+ A

      : V/ J9 }9 _/ ?- c+ `! V; y) K

    • 1 j- K0 u. F7 m, ^2 C

      ' o1 Q3 L8 \/ T   int b;  
      4 Y7 J' `  c) t1 `- J& w% L: g
      ' [1 T2 [7 r8 B: E
    • 5 z2 ?+ }# E) k, F5 q

      : B- k( f7 }* e% T3 }   s=q;  /*待插入的PCB指针*/  
      ) u/ N  l$ \. p/ |9 v

        M" g6 e, }3 f& }" h/ x
    • " p, n- b+ h- p. e1 T8 t
      7 \. ^4 `3 {: F  }, |
         p1=ready; /*就绪队列头指针*/  
      $ ]" [, g+ C- N' y, X

      3 x% G# p0 e. |& C

    • 4 W" N# G* u# }7 x5 z9 s2 r

      0 }% R( ?; S5 X( h. V! [   r=p1; /*r做p1的前驱指针*/  2 O+ Z% |6 {: q* y  J- ^8 }! {
      8 R( E" w9 Q  A' b1 N
    • 5 T" P3 t6 y& B7 h. _/ e2 P2 [4 f
      3 D- N9 O* W1 J5 {4 g9 ~
         b=1;  
      # s0 L' {* B; J, S

        x9 S. y4 p0 R1 N& R1 Z, V) {! n
    • 2 g) ]- Y' V) \# M: J! U( Y
      : ]9 G8 y( G( R% h! n2 C
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      8 o& q4 Y! D! G+ {/ s) q  q1 ?

      0 r* |+ J9 t' {9 H9 R5 z  N. E( O

    • ' ~( c: U  ?2 D' L1 O4 n- A

      / T' _  S( M; [' |" b0 D8 Q$ y      if(p1->prio>=s->prio)  & g3 G6 i/ m; |; m

      1 ?9 Q$ K2 d, {

    • 4 i. j; R- s1 O- u! _# b2 ?

      6 ?8 R/ u1 M( r+ Y% q% f      {  4 F8 I  e" o, a6 p

      0 Z/ I0 n$ ~4 u: i1 ]
    • + h* I6 S; q% M" b

      4 Z/ W& L( }' s( l     r=p1;  : g# x5 x: H) R3 {

      $ D( d. p+ ?& |) O; A

    • ( i2 K2 m+ j5 j9 z
      % I  L# u  O! a% M
           p1=p1->next;  
      ! H! S7 a' U, b. G- r' q; v

      - B: U; \8 I; M

    • % {# R' O% z8 l1 ]/ V; x5 u% w2 S+ e
      ( S, I7 x" \! N, @- ], k  n
            }  
      * t* y6 h/ D8 v" t
      , T& K  z+ `  p( _
    • % N, Z$ t4 q$ a: ~/ d3 z; j" o

      ! E; m+ l0 A' b      else  
      5 o# l* C% N; ?3 {; X' T4 P

      9 T! H# I" f4 Y; z

    • : _5 v0 Z0 g) l# `1 Y2 ~$ {
        J3 ~% y& a  L5 U; a6 ?! r; N
           b=0;  ; r! G# o! @4 R1 p

      ' i5 P) j( E4 T" k$ q: C

    • 7 w+ r" r7 \% F+ B' h

      & |) N& S( I& X: n8 ]   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  7 v7 u" i% ^8 l7 x" Y
      + C0 M& R9 F# m4 h% E

    • ) N/ z# u7 K. \* {! q

      5 g1 u+ @, d7 V   {  
      " e2 K; ]/ Y9 A; o( R# \; z
      , d7 Y: Y9 h, h, ~8 Z
    • 1 U- t- f' T7 p! I" B, ]" a1 w4 e( z
      ) J9 |' W3 S9 y1 z' E3 f  O
            r->next=s;  ! M2 P* o, X6 z/ r) ]
      & s: s' b, i  I+ r0 a' Y8 c8 h3 W
    • / u0 O6 C) o8 X% u$ c

      3 y) v3 }, \- s8 h0 v3 O; e      s->next=p1;  9 V* s- _( C& p0 G: V
      1 T4 }4 N; k/ ]  Z( _

    • : {9 U. G/ F. K' ^

      5 ~, _* Y1 ?" Y% L   }  
      ; r$ J/ S! D- a: }

      9 Q( h+ j1 {8 N! A4 [

    • - ^8 n: z4 |5 S$ N) q6 B

      / }) j4 w; H- I   else  ) G& J+ y' R3 l* H

      ! x# Y- }1 y  v# L3 a+ j; @) [
    • / \: T1 |  w0 C  V
      + c* b: j* e3 p5 N
         {  + `. C. h& t7 O

      # T" W# A6 P+ S6 ^; ?
    • ' K$ N4 ~/ ^. A: w# ~, s  `- o( D
      & r7 i: ^, |8 K* n% S, F
            s->next=p1;  /*否则插入在就绪队列的头*/  ! m& I) h# h% G6 w
      % `1 u; {( @/ x

    • + e) o- ^" _) D. O

      5 X+ X# Y3 q6 t, d2 W$ c- v/ g      ready=s;  5 ]" ^7 a5 E% U% f/ U

      . d1 ^' |8 }4 P( _5 n
    • 2 S6 m- C1 N& C5 {! ]7 }

      6 w0 }3 b* j5 r* u5 G" [7 Z% o; K   }  0 N3 n4 _; l5 w) V* E
      ' O2 r- N2 b/ e0 }6 ^; X+ U

    • ! d, [- q6 ]) A; T
      5 z3 k4 ^  v( O5 z! u
      }  % a9 W# k9 D8 h# ?2 H$ Y: `9 f) v7 |7 b
      8 J" a# B1 j% }  d6 Z
    • 3 ^: }! j, e6 G3 K! H! b0 V

      - v3 e7 t" M# ?* s/*优先数创建初始PCB信息*/  1 s" k) l& t6 }9 z8 v+ o

      3 }* B# @9 D3 A* H# o* |
    • % x+ K# p9 s4 h$ z8 ]# `
      ( o" {6 D% V- S$ e
      void create(char alg)  
      1 \3 C& ~' Z# f+ i

      7 V1 C& x1 ?5 u. L

    • 0 T2 i* t! H4 G1 P- V% S/ ~: W

      & g! c5 j6 G- T* g) T{  
      ! s* H" M9 K% a$ L  j# X

      6 i' r; y/ w, w8 |+ t2 Z1 i0 }
    • % W$ u! t" x, s* F- c. z

      8 g& \; j8 [2 u% V7 O+ c* M   PCB *p;  ) I1 ?1 r5 }, \8 \* w
      $ d% z% k7 z4 i. w# S! \  ]

    • 3 L6 K$ G2 y" e. U$ J/ q

      # E  m; |5 x+ f  n1 l# p* D8 V$ s   int i,time;  ' Z9 z6 R5 @1 p! T9 d5 i. c
      ; }& W! Y8 O- `  L7 @# z  G( n* j

    • 0 L4 I. ^+ R, p( ?
      / P& N, @/ ]  I! \1 F
         char na[10];  # O8 n; p/ {; @

      , W! w* _: l& N! h: c/ d

    • . |, j% J3 l3 ^1 b7 f

      3 c( Z8 ~6 w& X8 D# d   ready=NULL; /*就绪队列头指针*/  
      ' }7 T  O# @3 I; @7 g3 i$ B% c, U
      3 _" z% z1 ~9 ]

    • 8 `% |3 c: E- }! z" S! C) M* S
      ; I0 l4 A1 }3 W% X( q
         finish=NULL;  /*完成队列头指针*/  / ~4 A' x) }3 S+ D

      $ E/ j9 j. ~0 ^+ j

    • , _! z* j! p2 ^' v9 x$ `, _

      + z4 z; d6 r( a3 K9 b3 ?4 m6 P   run=NULL; /*运行队列指针*/  
      , _& K& j! T1 H+ |" ^. {# Z4 f% z
      $ d% Y# R! `" h, f' z: }: e

    • . t0 S. |# j! u6 p# ^- u9 c& ~
      0 ?# L; {0 D) \7 ]
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  & h' C) k0 Y  j9 y$ j

      . C% o9 M! T! U* u2 d5 }
    • " ^7 R+ C" `2 n" P) A

      9 ?* c1 V0 H$ u3 e5 i   for(i=1;i<=N;i++)  $ G; h* `( l9 R" V
      " ?$ N* }# u9 C% I& d* r2 e2 Z

    • " `3 f! X9 V  H- }! x
      8 O  b' [; R% k5 ?
         {  
      1 m" A. X5 q# s8 I1 d

      5 K( N* ^8 Z" X9 ?( ~  Z

    • ( ^9 A% B" r2 g' P4 l+ i
        e: Y  t0 J3 c1 ?+ I
            p=(PCB *)malloc(sizeof(PCB));  
      4 t+ Y6 f% `% `$ N. d

      9 f" b: o( [  m' \2 r
    • 3 w6 E* T( @0 Y' e( P

      ; n+ c- {2 W- ^( s3 G1 s( D      scanf("%s",na);  
      9 Q6 G; T* r% w6 m

        O0 |0 S% T( U3 ~
    • ; y, W$ F* p2 X% x% k* e8 [: e& _$ T* |

      9 M& ?% G* ~) ?/ r      scanf("%d",&time);  ; F; s( H! |: R$ u8 V, h/ d* v

      ) W7 H9 H9 m( L2 a
    • 4 ^2 z) I$ W, y0 J! u

      + z6 ?# b/ C) o0 Z: s1 ?/ D) j) ]5 @( e      strcpy(p->name,na);  " ]6 c; j5 @, w+ M" ^
      $ |6 P) N3 }. r9 M% {7 l. v) Z
    • 9 F# ^3 z+ Y/ c: O

      ; U9 p6 b- F9 l0 X4 p      p->cputime=0;  * z' L, v: y8 Y8 \1 Q

      1 ]. s8 }$ n- n, |8 W
    • $ p8 u9 O" g+ ]; V& Y  ?5 b
      ) _9 `; ]  f/ M% H& V& P! q& c
            p->needtime=time;  2 H" a# J* I) }' h5 B: o9 E

      3 }% q  [1 o) ^( A
    • $ Y5 d& `3 Z/ c% D  H
      ' l: a3 A& q; T. R( `
            p->state='w';    d3 I6 z$ A7 P4 a! A+ L
      . o+ [% F2 r$ ]/ r0 u
    • % ]8 x! ]* ~; D1 W

      " F0 o4 K$ M# f8 T      p->prio=50-time;  
      0 Y/ I2 y1 a( g. V' {! `
      9 E0 D" k; o8 ?- ^8 {# ~9 w* C8 y

    • $ q; O: O$ l0 \) p. u- f

      ) h& k" E8 ?% W  D) z1 h      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  ( z3 }# O! S& ~
      8 S: g6 C* Q1 f  E  N, z" E
    • & z* U  m- k+ p, ~# w
      # X7 }8 U* h( }6 t/ L/ l! @1 |
           insert1(p);  " V- P/ e  ?3 |1 B7 s% C2 n
      9 m/ O2 @% z% _1 H7 t, `2 Q

    • * r+ W7 @2 k1 t' L" A3 r

      " a; [& R' J- p: r/ Z      else  1 p( O7 q2 p7 _! `1 r% m( w0 t

        J4 u, M; q/ _8 O' x
    • 4 c7 n: k' w% H" A
      1 Q' M8 j- E" v4 O  ~) n3 P! a5 e
            {  
      % ~) h% e& j  h( f" |2 O
      ! v8 c2 p; ?  T. t) r; M& d4 B  u
    • 9 Z8 s/ p, _+ c$ s9 q' Q1 b

      - a& R1 N' C& a# i4 Q4 g! w     p->next=ready; /*创建就绪队列的第一个PCB*/  " J' @! ^2 v! C6 X* b0 x
      + N2 }3 }" o% G2 m/ O8 I7 l' m

    • 1 G' F* h( C, B! S7 i5 }7 H# }
      % N! L' v& w. V  j' D/ C8 a8 Y. Q
           ready=p;  
        h: _/ I* X  a5 w3 y3 z
      3 |; z% E3 i7 T+ }

    • 5 f: i$ A9 j2 `$ y( s

      : r0 A5 U' t+ a- {" \      }  
      & T2 }! c! o- o( i

      # Z& ?9 ^4 |7 S

    • 8 ?7 g+ I0 v) j7 s

      ) s& S6 q8 z( c& Y- u   }  ' \  @- D6 B6 N6 i4 F

      2 J3 t0 X) |9 w, G1 w3 Z
    • 8 p* j6 H3 f) w5 p9 U% U
      / ]! _1 l1 [- I9 h+ V
         printf("          优先数算法输出信息:\n");  ; E$ u  \) z* ]6 e1 q! B. X

      / H0 h8 z$ I# Q5 S
    • ) h/ m! w0 Q, g6 k$ s

      * ]8 I% Q: \. l6 r   printf("************************************************\n");  
      5 `; y; @1 |3 W1 J( F& K0 R( w

      ! A6 E8 _% W) V4 N

    • ; y* Z/ E. _$ a- G( M0 `9 f0 N

      ! N1 [: |& T9 F1 z  Z   prt(alg);  /*输出进程PCB信息*/  
      1 j( E- E8 p+ G& {( N

      4 Y- A" r0 L1 G/ [& d" B

    • & j4 v- M/ U0 J) c# x

      9 u" [/ C" S( i& D5 U: p  O   run=ready; /*将就绪队列的第一个进程投入运行*/  
      ' p' }& E4 H; j

      # x5 T6 `! H" w5 {3 p
    • , y  g2 @2 W! M" O
      , F9 K9 m. C& g* q# n
         ready=ready->next;  : r! U! Y3 M' R) g* z/ ~6 M+ P1 u5 A
      7 F' X! r1 F0 a8 _3 k& n/ K1 s

    • 3 ]9 Y; j/ H$ ~4 _  d- U  K4 r

      , O+ F$ Z  K4 E3 M   run->state='R';  
      ' X& O9 Q/ R! v" ~9 S5 h

      " ~9 e) \( ~1 ?
    • # y% W! v# U" ^" {% ]# Q8 O

      2 k9 c) U% K! l0 ]* Z}  0 R; U6 t+ q3 p" f( X, n( c

      8 ]. K6 ?* K: W  x9 r. T
    • & ~1 d/ }0 O; a2 z/ m, n9 ~

        X% K% M3 Y$ H, L/*优先数调度算法*/  
      3 c5 c$ A, L7 v  `, H7 d

      / H0 h3 B7 d/ Y
    • 8 T2 F3 \1 A$ V  X/ H; H

      2 c: h: {. w" F' h1 _priority(char alg)  * t/ k6 |9 X5 {8 Z- T. y) ?% M

      + D1 ~1 b* u' x! H7 ]- ~. A

    • $ r$ u( }- ~9 S9 X
      6 t! h2 i5 |9 W- X$ X! B& ]0 f5 F) c
      {  
      0 L8 ^! a  [! z; E: U
      6 H" q, P; X* b! p( ?  j4 J
    • - q( q, M! j6 }" V' v

      3 y5 b7 J% [6 z1 V0 _   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  5 @' h2 a$ R6 _# C, ^

        v' m5 i" b& g, G8 E
    • . G' I6 V5 l! X' r

        L" w# o9 i; g   {  ; u6 w/ h8 c- D; P5 Y% v+ a9 u4 n
      $ L) R! C. ^  J' |! o# f5 W9 Y

    • ) J! G" f" J2 v* ~' w( H* N+ D, y
      7 \/ o3 ~* q1 l! T* X% B" a0 \
            run->cputime=run->cputime+1;  & l$ ^3 h9 n; e% o4 i  ]8 [

      : H$ C% D  y* j- z

    • * g2 a- p( N, |* @- G) Z. _
      : _$ f& p% ^1 x' E  D: j
            run->needtime=run->needtime-1;  
      2 O# _) J6 X- t: Y  i) _5 v- d

      ; ?& O( ]0 B6 y; e$ f0 B0 f1 }1 b

    • 4 ~: x) u9 l$ J, w: c0 n

      6 X. B9 z% G5 U' S+ u      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      * T* ]7 A$ @2 Q! }7 O3 b+ x& p0 U
      + t+ h8 K$ c3 \7 h
    • 8 o% d( {" N" B2 d; |9 z
      6 v! e; w6 n. x: D$ B
            PCB *p;
      2 h' b3 ]  p1 Z& B
      . _7 G; r. i4 y4 i& y! Z: i

    • , o/ @" d9 p& P% F3 a6 V3 j
      8 U. b- b# A- I' Q. _1 N' b
            p=ready;, t" b7 }- t; P8 D1 d
      : f( n: p7 }% e, S# {; a( N" ]2 ]

    • 1 q# n- ~# N# X8 v6 Y* ^6 S

      ' s7 @2 I7 B: B- e# |      while(p!=NULL)  : V5 A  \' N: q# O
      : A( A" n' F) E6 u# L2 _1 Q
    • + o: Y& D6 O0 G1 Z, ?. D$ h' D# M3 m

      4 n  ?' G) m: y; Y% z. A3 o' o      {  
        Q0 m! [! H" ~9 A% E

      3 u# w* Y8 L% o- v$ O

    • 3 s& W1 G3 o. m) i

      # g2 s  U  Q' U! {4 W% O: D! X# j* ]          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    2 W1 u. A2 p/ c, c" P9 g

      4 }6 V. E' C$ [' D% Z9 K

    • ; g6 t! k; P5 W1 c

      , ]# l8 }0 n$ f. l) `          p=p->next;  $ ^. L2 P* q, T4 G% f7 D1 k
      4 @7 A, W: H2 s5 U9 {  p

    • % z9 ^% C/ [6 M8 c% w6 F/ S
      ) J: a6 ?1 s8 ^* F/ [, W7 @
            }  
      ) o6 }1 F+ H! {0 D* I: s

      . V8 @( H( s9 A$ L* H; M
    • : @# r0 W8 o6 ^4 y1 }
      ; I3 f0 m" I+ a
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      ! C6 I0 |7 L# j) q: i5 ?& a

      ' @+ X' p: g% R4 N5 T
    • ! l, G) S# o$ i; _' p9 M8 l2 p
      9 U1 W  }4 b1 H- c& G; e/ |
            {  
      2 E$ ^' ]+ B2 y1 |( i" a4 R

      & G; l8 |5 A; f

    • 0 ]( P9 ~9 A. h
      0 o" i: l1 T2 P' i. T1 ~8 w. o; B
               run->next=finish;  
      $ k* R9 [6 ?5 J. o3 G# W

      & b* O8 L6 y9 {: X: n- V
    • / j+ h/ E4 I7 p  C

      5 t. U% z* i$ ~8 I- \         finish=run;    i* g# L' l1 \2 @& m7 s

      . j0 q+ H$ \1 M" i
    • $ X1 l- i3 r9 a- h0 o8 e
      . N) g! F( r# A
               run->state='F';  /*置状态为完成态*/  3 C. y. j$ k4 F2 z7 M* L

      . M8 F4 q4 A6 j; k9 g9 d8 }

    • % w, U2 P: X+ ^* m$ F( ~

      2 v5 ^) Q0 R& L( N         run=NULL;  /*运行队列头指针为空*/  
      1 f; j, l3 ]- K7 G) h( {1 o
      - h3 S. U2 V- |7 n5 z+ m, h# r
    • 2 X( M& e* J* |, ]+ G3 k

      : Y/ J) o' k5 \* J- t6 F4 G         if(ready!=NULL) /*如就绪队列不空*/ ) T1 X: x* h  y) {* r: J$ s

        E9 I+ A* F# a' w. d4 y
    •   ~/ X1 F: q/ a

      % x3 `; E* B6 v6 k6 Z         {  
      6 R4 n6 V6 W0 ]% {) a
      # Y; ^* V& I- K9 \: A

    • 6 w- J, Y( k* @- G5 m

      9 Q( D) ]7 Z6 f. m4 ^" _$ K            firstin(); /*将就绪对列的第一个进程投入运行*/  ; o6 B4 z( P" u% F
      . k% L6 Q2 j6 m$ M) ~7 u! L( X7 Z) w

    • ; c. K0 F6 Y$ n
      " o' |; g) p! @/ K9 r8 |
               }
      3 Z# D1 _  Y; |) z( \8 ^

      1 H# G6 [3 U; I) @
    • 0 w; s" c* g& n8 p$ Q

      # m5 k( t5 T. N      }  & _7 _4 A' f# ~

      , G- K/ r' t; J3 G0 x2 H3 h
    • 2 \0 j9 K7 @  I/ Q( [/ k6 _* m  s
      + M7 K, K$ o% O
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      % c: I4 N8 e: u- s8 \

      2 `" _/ I) w1 b8 g! ^/ H
    • 9 p& q8 \" P9 ^! {
      % k: \& v5 K: T! z1 q
           if((ready!=NULL)&&(run->prio<ready->prio))    x+ h& H, N/ Y- U' \  @& c
      1 K6 a8 z1 C; S8 p9 R2 e

    • + ~' x: r% M- d6 z' G' C) h

      - f6 t, s7 ^; L  [$ c8 _     {  
      4 N4 R6 B/ a' s5 }& b
      0 Z7 i3 _( S9 m4 Y! y

    • 4 Y% i6 t0 D2 p. ~9 S4 ~. ?  Z! y
      $ O+ H' u; n, S& m- N$ V2 @9 c/ h; K
              run->state='W';  
      & h  S. s# l# n: q, f  f9 F8 i3 e

      5 c, }* w% I5 r. n
    • ' r9 }; s/ f. G% t  j# W8 W

      0 y8 G5 E/ g! c8 S: h        insert1(run);  " h! o: l/ u2 r' k2 _

      ! M4 u- v1 V9 M% p

    • - X/ f  I* |9 W. i% d9 F

      2 O% {- L  x! W  O        firstin(); /*将就绪队列的第一个进程投入运行*/  % \7 I9 c8 a& q& Y- ^. s

      4 @- f; x5 `0 g4 r# V2 r2 v# ]
    • / ~7 X8 a2 Z6 `" s

      3 z4 E5 v7 R) ~0 G. W% S% M     }  
      5 |* o3 L3 `: r7 i4 a
      ' B7 m7 k: u/ c( F/ D' e6 M: w
    • + K8 y0 N" |* h$ H! i4 ^/ h4 P: h* w

      3 a- m# v8 [( o  @8 G      prt(alg); /*输出进程PCB信息*/  
      9 h) L3 m. `6 \' d

      ! J1 \8 Q1 g$ M9 L, C/ X' r/ U0 s
    • : z6 x* i+ q1 }- ]  _8 m+ u

      , b, K' [/ q, x9 M; l5 M. W% A   }  
      6 x+ g$ d* V" Z# \; {' n+ k4 d
      1 o4 ]( t, D" I) D- k$ S) T3 ]& X8 _
    • ( ]% w, H0 |, V* B! t6 p: r) q+ E8 r+ m

      5 b* a3 o- ^+ M2 s}  / x3 @2 k. `+ k/ \& p/ p5 ~

      3 u4 f7 U. \$ Z( K

    • - I  O; e; Y, v4 v0 R( S

      0 @* h$ t6 {* I( H7 f/*主函数*/  4 ]/ T/ B0 w- o( X1 e! N% N

      % l; \. l( y; W) X8 D" D) z
    • 5 m% q1 Z2 F# f% H! n! F7 j- \/ V

      ; @5 I+ Q" f. u  Rmain()  
      / G' q. g" Y0 i' \8 S4 j/ ?

      % N2 X1 O2 v3 ?5 D# R0 R

    • 9 I! z4 }4 ~7 T/ P3 N

      8 F0 r$ j  n  \% i% C5 m" Y{  
      ( [* }, D: \6 O  n; G% }

      # k  l4 R* }7 e3 g

    • ! e- r% x- y* W- h  R0 ]7 U" r
      8 `: k1 e8 N% S0 }8 {! ~
         char algo;  /*算法标记*/  1 ^& W  m& X+ ?. Y4 z

      ) @/ e7 r1 Y( w1 ?  |% {: d5 Y3 e
    • - E$ u7 i' m6 y7 j9 P' F

      9 Y2 d# J, w& ^   printf("输入P确定算法:优先数算法\n");  . Y! ~+ a0 ?1 E3 ?1 U
      8 ?0 v" F! D0 B0 L8 l7 `

    •   [7 J' @- U8 G4 }: N0 r) D6 Y
      & y" k: ?* X1 I
         scanf("%c",&algo); /*输入字符确定算法*/  
      3 I7 K5 }( O0 _, g- Z; p3 l9 M+ Z- H6 T
      ( b, J, ~! M8 O' b/ V  l# P. d

    • 6 O  o7 s8 t$ \3 S/ D$ @

      / L- _' T0 o5 V7 t9 }2 [1 N   printf("输入进程数:\n");  % g3 J' W8 g) ~3 `: J

      4 P$ }! X9 ~  Z9 N
    • * p0 W8 l) I+ c. P
      + q4 L9 e, J3 _% O; P- h. q
         scanf("%d",&N); /*输入进程数*/  6 E7 O4 q$ N& v) G2 H% I# D7 w. b
      5 a* m6 h. j6 f0 x# Y. h+ D

    • & e7 ^* v" f2 b" U4 _* V

      6 n# a: j, [! o( D  c% G' k   if(algo=='P'||algo=='p')  4 n( N  I. @0 H) l
      2 [$ d8 T) A( Y+ ~1 P

    • + {6 m9 Z! O$ a, ], `6 M& W

      ; ]0 u8 T8 `) G+ y5 ^7 |4 I7 A   {  ! t" J9 l' _$ M- b
      7 P. @2 x0 x1 J7 h9 {
    • 2 L5 x: v# X6 z2 p7 B1 w

      1 ]9 [4 t8 P0 b  D0 H) u: b      create(algo); /*优先数法*/  
      - ^1 Q% E6 j8 }3 e+ Y
      4 ]' Y4 t+ W/ C$ z
    • " j. G9 O: x0 V0 u
      ; D: X! ]& v4 f. l% o- ?
            priority(algo);  
      # M2 M4 b; l% G( |! i+ A0 T4 L+ _' \* K

      7 \9 k& V- _8 ?: t# L2 r$ U' g! n

    • $ a! o( g: s# D7 I) c1 Z5 m' |4 L0 V

      " a9 T$ K( j$ V4 w# C. H) r   }
      1 p. ~% z6 ?8 W8 o5 }2 w( H7 `" I

      , S+ X0 b, l2 `4 j8 ~
    • % E, _* @) C: `5 G9 m
      9 t  y3 G1 R! u0 P
      }
      2 p& Z! p7 w$ T

        W; r! D- x2 {& F) D( W
      " ^+ ~/ x+ V/ Z0 e. r

    6 M9 [) m4 x$ N: \- p5 C
    输出结果:
    . c' V& O) F5 c! J3 Q. w4 y


    ( Z9 o6 ]% q+ |原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    ( n8 x" p* a; f% M. j) j2 E

    " }  x+ J" J; `5 G+ e
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-24 20:09 , Processed in 1.140534 second(s), 51 queries .

    回顶部