QQ登录

只需要一步,快速开始

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

    - Z% p- [% A$ n4 ~8 D6 r优先级调度算法9 \9 ^, l3 G1 e' x* X8 N

    算法介绍
    % [3 z- M$ y- q  U; [) r6 h优先调度算法的类型(用于作业调度)
    9 V1 q# ?; t5 o$ ~7 K, [' a. U1)非抢占式优先权调度算法
    ( Y/ D  P. @, b' K9 u系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 ! z, L" i; V. y. W
    2)抢占式优先权调度算法
    3 s! y4 N2 Q# N4 h; a, L3 I只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型( c; t4 L' C4 N1 n' N
    1)静态优先权
    0 G0 u* X) o) S" z8 C2 w静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    ; \2 _' [4 s% ^  ~& F

    2)动态优先权
    9 {1 h- h( h8 d: `

    算法实现

    抢占式动态优先权:

    # F/ k/ S& m- M( a7 B+ P5 I
    PS:本人认为非抢占式静态优先权没有实际价值。


    • % s: w) I2 m( b8 s- i1 W; z

      ( J* z. f  C0 p3 m; ?5 d7 V#include <stdio.h>
      : a' Y. p! ?) l: I
      - X/ R6 V' P- m0 c; i
    • 8 R) G& B) c8 l/ D7 \: S5 L

      : N& `5 m# p+ i1 f#include <stdlib.h>  
      ( O6 e/ g4 a& N* `2 N4 t

      # I7 o2 Y0 n, h3 n. C8 Q7 p
    • - _; _( h( m) R$ d

      ' C. v8 R5 H! |, R$ i#include <string.h>  
      ) f8 Y% x  _7 _* `- X/ z

      6 l7 D( k* F- h! {, b) W

    • - k/ y% G5 w* U3 J" Q

      * l$ s% A; h$ m; J; |5 M; @7 \typedef struct node  
      2 z* Q5 f1 X- C8 Q* ~/ l1 G
      * J. A7 [/ y4 f# V; c! w" x
    • 6 ^% }/ ^# E# G6 i7 m5 b$ z

      8 \" {% i/ x# {{  
      * K- j, S. a% `% z# y8 i& v

      , l! n- ^7 E% M8 V: ^

    • 6 ~0 q' s2 P  x: M0 }1 V0 b

      ( |' i" s, K* F/ L2 d- K! N! q   char name[10];  /*进程标识符*/  
      / `$ O% B; y, p5 L9 y: x
        D' f! f+ `, q
    • / q: l  f4 R- `% J, ?: Q
      0 L/ q7 b+ p. r+ a3 p! F
         int prio;   /*进程优先数*/  
      % i6 \; T6 o" ?4 q7 C3 b
      4 W5 L1 N: G  l/ B
    • $ |8 P' J+ u/ c' g

      5 b' K( x1 u/ G3 H   int round;  /*进程时间轮转时间片*/  
      , T$ p. H" M3 A  `  H
      , R" c- N: a! @1 c
    • ! n& H" i2 I1 ?& \* h0 f

      8 |" F6 Z1 E1 t) P7 G/ ]   int cputime; /*进程占用CPU时间*/  
      ' g$ W- Y& P5 c. R6 d& R5 ?% N% [
      ! E; w4 G0 m3 q, T: N
    • ' g9 Q# [2 _. I( q2 f

      , O, f: t) B' H3 G/ e   int needtime; /*进程到完成还要的时间*/  
      ( U! A* `' ?+ `6 F2 M. ~- X
      " J) n' Z& ]* d* Y
    • 6 q( _) p! b& ]
      ( A; }: u- S7 p- J" A
         int count;  /*计数器*/    `+ p: r- R, p! w( q
      5 S7 B4 L5 H! w8 |& l+ {/ N1 |3 `4 g
    • 4 O  e  n+ v/ A% L7 k/ M
      6 ~. L6 e/ c5 z  M7 g
         char state; /*进程的状态*/  
      6 j8 \" L3 G4 X* Y% u+ Q: W
      & m% x0 l4 C0 Y/ h
    • 7 a" l2 d  T- ?2 I7 U
      # d9 u  K- c+ Q+ `4 h- d
         struct node *next; /*链指针*/  
      ) n0 R" Z. D5 n& I
      + o, v$ }3 {6 n3 q  l; `

    • 3 `% H$ q+ N6 B( @2 `& K& Y' B( e( b

      ; ^  A  V! ^/ x& K3 R/ Y}PCB;  
      3 `1 Y" N1 j' U
        `; B7 k9 C" p2 O2 v- W

    • ! l" P" F8 c9 h* l% [  o
      % o/ {+ Y8 i. ^& Q; E4 A
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      7 |  d$ P# e8 p+ o- ]

      $ O. |: O, P; ]2 Y( d! y+ u: B

    • " f; A, f: S1 {
      4 X" U( L1 N+ T; v6 W* R$ w
      int N; /*进程数*/  
      ) n" ?5 S- ~. N: ~: E9 G

      ; ]" M* ^$ U: k# \9 N, e
    • / f1 s, N! G" C( ?) `
      8 z: U5 G7 V- l
      /*将就绪队列中的第一个进程投入运行*/  
      & J  p, b* J% d

      8 y5 a0 d4 ?5 V/ G0 b

    • . P5 r1 l4 j8 R6 Q) L5 ?) i

      / o! R. K$ S0 m, P+ J) efirstin()  % `% l, r. Q, N2 h& i" I

      : v4 B, x4 ]  U4 U: ]8 d8 D

    • 1 {; E: N4 H0 x

      & J3 E) r: o: ?' p: @* z4 J' ^* Q+ b{  
      ; ?$ s; }/ C  Q* l$ H

      " P# b9 Z1 [! |* |
    • / I# [% c& m& E9 y/ E. ?
      8 c9 d1 p$ h- E
         run=ready;   /*就绪队列头指针赋值给运行头指针*/    C  \* E4 r/ u2 @

      3 b! D6 r: [6 W- _6 b

    • : E; B( \8 D0 s
      3 K5 m7 O. j. X- E8 U/ J, n, X: g/ F+ R
         run->state='R';   /*进程状态变为运行态*/  , a) Q; B) o& @3 V' V0 E8 Y* L

      . R6 f; N4 w6 A2 n7 U* f2 K

    • " V0 Z$ c& _# ]) e3 P5 Q+ @* f* T
      . c7 s2 E  l+ Z% x
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      ! P" `$ E8 U+ K. I
      2 F" A# Q+ [: f0 i4 ?8 J

    • $ ~/ z7 x) e- O6 F; A& g9 ?
      6 @3 N  _/ ^" c$ K1 s' l4 m
      }  
      3 V/ b+ u$ S! c+ R
      # ~6 H! m! R, }" A* h  _
    • 0 \7 m- Z* g' _0 e- B/ o. V' ]

      % {. x3 Z- p; ~& x$ g% {4 `5 f/*标题输出函数*/  
      1 i: x  \0 M( o0 u, f* f

      3 M5 D# J: X5 j; o  Z

    • 3 {+ k3 g5 Q& N  D. F1 @
      * g7 _  m4 D$ ?+ H* K
      void prt1(char a)  
      % Q0 n* [+ B% C& m) u' }
      ' f+ O" Z% e3 r/ s1 M2 @  o
    • % o4 q% g, r  _2 k7 U
      % u+ H9 f) M9 V# O5 m- C% U5 T0 W
      {  . h: `5 g- |; m$ X

      9 U) m1 ~4 m+ s* |

    • * i5 `& }+ p' K" \% X( E% ~
      ' v4 N  p  \- J* j
         if(toupper(a)=='P') /*优先数法*/  6 j  P: d+ a2 r. f! R* D5 G  i
      ! z! l3 Q  @2 h: [: J0 I  E3 X

    • ( `& A0 n$ d1 m0 L

      9 Q1 `9 j0 L7 j( x7 N/ J3 F/ d      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  / v( h! ^/ I  ^* {. ~5 ~, V
      2 o; B/ J+ g& ]" g2 ?/ m- f
    • * X/ A+ `& M/ H, h) ]
      ' X1 d  e; ~" ~- G% m0 C. U
         else  
      ' ]+ i, N7 R0 i1 @  l

      ) B3 e  l; T7 m% `3 E7 ~9 e5 f

    • 2 S8 A; M; ^4 G7 }% a2 T
      ' D$ `# ]- E/ ]
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  3 ^7 w% X: p' {( V7 i& v
      * g9 S( R3 e' z% G; C1 J  S" D

    • ' J6 u) {& c) K+ [5 v
      0 P9 x! p4 F; o2 p9 _0 c" p1 ^
      }  
      $ U+ d: O  }2 x0 l+ b% w) x" n
      3 k  @- S. S4 L" t- b. J* K

    •   Q% G( ?2 Y4 E+ J0 {( x; R
      ) C. I5 k, }6 n3 L
      /*进程PCB输出*/  * s! E, x8 K0 U
      3 }. G4 l2 q+ ?
    • 9 m& |7 \4 B1 Q& ]2 F. ?( w

      8 E7 H4 _2 `  V  ]% B6 F4 _void prt2(char a,PCB *q)    _3 q6 V, ~% f' r2 t4 X5 A, r4 s
      0 T  b. I, N; D6 `& c0 i* H
    • / ?( |6 h: L. f$ t1 P; x
      9 Z- u& U0 J1 Y
      {  ( V5 U' [# b  z2 q' d
      ! C+ g8 S5 x8 Q3 ~5 W

    • 2 \5 }0 ~" }: c0 K% w3 n6 j

      1 \/ C1 h' i) K6 h   if(toupper(a)=='P')  /*优先数法的输出*/  1 f; p( `& o6 u7 J, C! \6 }$ U3 D5 O

      0 ]% f$ C. D6 y" e/ P8 l
    • 4 _, X8 r: L- f" e/ b. B

      ( c8 q8 [) G8 o( d4 f- F      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  $ _6 X; A& O6 O, @0 z3 a9 U! m
      $ }+ t& f' C, h2 |; _
    • ) S; \! i) u# ~
      ) n2 {! N/ ~6 E, E' Q. I
             q->cputime,q->needtime,q->prio,q->state);  
      # _: d6 b  j7 i& T) ]' p; Y. Q
      ( i, m$ L* k/ F( G5 M% a  m: Z
    • ) U# P# R  k$ E$ G2 ^
      ! \- P6 B; c* k2 m: Y- U
         else/*轮转法的输出*/  9 R- c$ I1 s9 N! `

      . ~( F( c& Z# h$ e9 W4 M

    • 1 n; g/ f( }/ p7 V1 |
      , Q% i% X0 B! Y' L& S
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  , D1 G2 r1 F, {6 t0 @/ q

      ' s3 M% x6 c8 I8 _! ~' g0 V

    • , I9 P$ {, t0 |& o  i  e
      7 f6 E$ s+ [% X2 e$ j
             q->cputime,q->needtime,q->count,q->round,q->state);  
      4 k+ b2 X3 \2 A& S' B
        C' Y" v* A9 C! P; Q$ [& N% G/ \

    • : g3 I2 b7 N1 [& c' V+ m: D

      - @6 U% ~0 p$ e# F2 t}  $ o. n: `7 W2 I
      4 [1 c( ~7 Z) [5 `6 Y, `/ [' F
    • " z6 ]) o& m: ^: ?/ Y0 @  B

      ; Y4 v- U0 L* H0 W: R/*输出函数*/  
      9 w6 w5 V( y, J7 W1 g9 F8 S5 T
      . [2 D% x/ q9 I; a6 O6 N3 R

    • 1 ]7 u% O3 p6 ~# H

      ( A& a! k  U) l3 Zvoid prt(char algo)  : ?: }, L( r: b/ y

      5 e' s, B/ _1 R2 \, {* K

    • $ d8 e- M9 Y! @, j) s% M( u, I
      % T& M$ q' F$ q9 C9 N, K
      {  0 y2 N: ?8 o, H1 R: x: m
      8 c' v' ^1 [4 |8 K
    • , p9 B$ @" c9 ]6 `- k

      6 q) e, G5 L9 w   PCB *p;  
      : m( d. n" x1 k! ]4 Q4 D
      ) B  B& ~4 q0 W# H: k
    • 1 J2 y/ D1 Q% Q
      " U6 m+ T& ~! H3 B. Q
         prt1(algo);  /*输出标题*/  + _: M$ D1 p0 C1 p9 B# R3 R

      6 [( c% q5 J* G5 `/ }
    • ; d6 m. C; p% r* b  E; D! {
      ) \' B/ l- B; v& e3 n& Z6 l: U$ F
         if(run!=NULL) /*如果运行指针不空*/  
        q2 b  o; k, ], @

      1 V; L" j% [: G# r5 S/ j, F* ]* ~
    • - v) Q/ {' p: h" B$ W! Y% o

      ) P/ a+ x* G4 Q& l# o      prt2(algo,run); /*输出当前正在运行的PCB*/  3 ~3 ?! t6 V  B* r, b" A

      ) f4 o: }& X) @; [6 }& p; o
    • 6 X) W4 \+ E* U( A. [
      . r6 {. p# @; r! ~
         p=ready;  /*输出就绪队列PCB*/  
      1 x+ P% {0 P* ]0 ^) B
      8 k' @2 B2 D) N8 a" i( d" p* b. ?

    • $ l4 s3 |+ o: K
      7 P% ^/ E! H' k/ M& ^
         while(p!=NULL)  9 X7 }  r- X# l0 K
      5 |# Q$ X- V/ }' |

    • $ B3 Z" S; b4 F' K- N3 S* r( l$ ^  v
      , z5 s* @9 T' v4 r+ a  H6 A
         {  
      ; x! O" w0 E3 m; O8 `

      ! E. i0 s- X! X$ {# u6 R" c8 \# F2 ]

    • 0 \& t/ z5 _2 Z9 g" @6 Q  a+ N

      # X& `( `( S' I) A      prt2(algo,p);  
      ' y. u/ M% S5 v" T
      1 q, j3 e; L- G0 G4 P6 N" L
    • 1 i) Y. q6 d" p. ~) K
      ; m2 q, ?1 g9 j8 t
            p=p->next;  0 D& ^; |# \& K' ^1 i1 W5 f
      ' \+ z1 k$ U# a* \) r

    • # Z: K$ \2 s+ @9 n& L9 M5 _6 k3 X

      : Y( w7 Y- r" Q. Y% Z   }  * B+ C. }5 A" z4 z
      $ G% {5 U5 g3 m5 g0 f

    • ) w) Q1 c: E8 n- c& O% {4 v
      ( g" I! S/ b: L  _; z$ a
         p=finish;  /*输出完成队列的PCB*/  
      $ o8 a! `( f5 B5 @1 q1 l! w

      0 o( F/ a$ {4 v2 o- L

    • 5 ^4 W( ^9 K5 h7 t1 ?6 s

      + k7 e( d( q/ d  \   while(p!=NULL)  
      " y9 n1 c' l# L

      7 N. K: V9 m9 z

    • 0 ]! o6 J5 @1 S+ H
      % Q! a3 ?8 K9 h* L
         {  
      9 l1 h6 ]5 d& I* C/ H& V

      ' q$ l+ ^1 h% F' o9 i4 P

    • 7 C6 I, O( ^0 {1 z0 E/ Y6 s+ `

      : V" m% v% `. ~# x      prt2(algo,p);  4 L2 F$ O- ]0 }

      1 ?2 \: r5 d" B, n
    • 3 u$ A! h& |! O& b' l* o

      # |( U+ U$ k& c% m$ s2 u8 E      p=p->next;  9 ]1 S7 S/ L+ J8 o5 q, V

      + ~" @- x& F! ~; K
    • 3 S7 p7 V" i4 S5 }1 i( T( L3 M
        Y* s' H& {/ {3 ^
         }  
      9 ~+ ^" ^$ Z- D5 k. _- x  K+ U9 B
      / h& U6 N+ w6 g; l9 m& u# H

    • 6 k, {" ~1 a6 |2 Y
      - e  ?: t  ^( e
         getchar();  /*压任意键继续*/  # b' {% T; n: q# X+ P
      * ]: I7 H+ y  x1 G0 ?
    • : I* [3 G5 p' w) H/ b, m4 T4 Y% t

      6 L  I4 s+ S% @& n}  
      : m3 b( T+ S. y
      + t4 w  T2 m( i* w3 V& |* I. ?

    • 5 }" V7 X( r  j
      , w/ k* t; a* X1 l; N0 U
      /*优先数的插入算法*/  
      ; P2 F: L. |$ W- w
      . J9 q; h1 [& D6 u- ^+ X
    • " j; m% N. W, z2 W" F8 |# C

      6 W/ ]( q5 V' J1 X. v4 d+ ~insert1(PCB *q)  
      $ E: v* \+ F& d# J" g5 Y+ ~
      $ ?$ q* j+ E" w( f1 J( }, ~3 A
    • 3 T- l  J8 h, J, A/ P7 o
      0 x8 B6 X& R1 z; @
      {  ; ^6 y6 f/ [1 U0 c* T* p, s

      - Z$ v4 L& R! _9 ~; H

    • . }- u+ p; U2 {. ~! V. Y

      0 D! B/ m# K2 a9 n9 Q6 K# |% N4 o   PCB *p1,*s,*r;  
      8 ]  O: {) q6 k# J7 B

      2 V3 z) O6 f% h. D: F

    • 8 u. c3 d/ }" l, `; S
      ! O: J6 l) e$ ^" ^
         int b;  
      : ?) @% N2 n2 u; Z3 r: x5 h

      2 Z  ]4 T' u( R) g

    • 6 {9 Q# b! }. D8 H. o2 z0 [2 l
      8 l) V& q5 P* R9 s5 @) z6 ~
         s=q;  /*待插入的PCB指针*/  - R, \: a* c/ g4 w7 @
      , l" \: x2 ~# }3 I- _: p5 ~0 s/ ]

    • ) B# p8 y# z, i  c

        i$ ]' Q& q& a) ^" T1 N7 m" P& Q   p1=ready; /*就绪队列头指针*/  ) g7 F7 N6 ?# _' J
      6 A: V' _* l9 q1 ]- v3 s
    • % V$ f9 T8 f% k+ t

      : n( A# v" `* V- s% T   r=p1; /*r做p1的前驱指针*/  8 R5 F0 n/ w+ F& H  P" [
      6 A) R2 f" a) ^4 H* [
    • 9 i# z4 J2 a: u% J* J# N9 A' f

      , ?) c* Q1 M- e" H3 j   b=1;  % k/ V; d/ h  d4 H0 S* H' G% c

      6 \) x! |. r, K( s1 R  r; M$ j" d+ R4 h
    • - Z2 I) F2 ~1 o5 Q
      $ E* [  Z" T" c
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      ( s3 u* L, A# \& o% S# [/ N% h
      ; T4 x  c  Z- f! z: z

    • 5 G- p$ r4 N4 K* [9 n

      4 g0 ?6 o/ Q3 W      if(p1->prio>=s->prio)  ( ]9 `8 ?! X: U6 v  D  ~$ @

      8 h4 b% X. @* o& V, O

    • : v; ~% @5 G& K! i% u# l

      7 V3 R: t! V- ^! T2 v. ?7 w- v4 l4 s      {  ' ~6 H$ C& e/ A5 `5 Q2 Y

      8 U- m  x. G: p/ b
    • ' N; N* l9 ?/ C9 d
      / E; _; z, a1 l$ X* a6 |
           r=p1;  . F' o( q, k3 n7 P. z) e
      0 h, \8 f$ C6 i1 W# B& Z% ?
    • 6 j$ i( w& L4 A* ~: @' z$ O9 p8 S
      * f- D: C# n3 K' c3 u3 n4 u
           p1=p1->next;  2 H) N0 P4 G6 i/ [( C  p. W' _

      ( u" s3 p9 U8 S) b9 q' \

    • % t2 \% O2 r: k5 s
      ' z; R2 c* K0 _3 }* ]8 N0 f' S" E
            }  
      0 \$ ^1 M  t. @- i; P; ~3 S

      $ n9 [  a- J# A  \0 }# ]
    • + Q. ]  P2 u" e

      1 V) W" H) @+ t; K' ~3 O      else  
      $ X8 |$ N( T% y6 F

      $ g  l. ^, Y9 e! U
    • 4 d) I$ U/ W( G6 @) q

      8 B# d: Q5 Z- ^6 z1 v     b=0;  - Z9 @& J& Y. I3 {
      " s! b' s2 J4 \+ W; W
    • , b( a8 G$ N! g) k* u

      2 w) {+ \0 n$ H: Z& v& ~   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  . W9 ^$ \2 ~0 g% ]# r& J& q+ u

      9 o2 z7 ?, G3 }; M' l1 N
    • " X6 q  i7 ~! ]
      - p' w5 K% [$ b( k# a, `3 b" l) ?
         {  ) O$ `: D# Y) ~5 Q  u; F
      3 ]0 F1 h2 f/ K% L
    • " g! m( z. {2 p$ x1 B; ~) `& J
      ) u: a& t" ^. O, c- i7 @
            r->next=s;  
      % I* b! ~- C0 J& U7 R

      . z* Y! T8 S4 q( f- k. \/ y

    • ) a* P$ u8 y# d# K4 X4 ^7 K
      : F' e8 p/ F3 `/ c# Y  x
            s->next=p1;  
      # W8 J. w/ P# \

      5 \+ Y  ~, K, V: b

    • ' B$ K# R" v* T7 P4 Z

      . v1 H1 [5 j. b1 H0 ?  I" m   }  
      " U3 t2 B9 p% j

      # T0 R4 B5 G$ f* Z4 a# V
    • 0 j9 d! d* Q1 N( [* ?0 G) m" Z

      # m. R! f/ ^# R; f% C' K4 j2 ^   else  $ b4 y& |9 s9 F4 M% J) y5 B
      ) ?+ B$ ~( Z# k# k
    • # Q, Q8 _$ t9 w8 O
      & D* o. H5 I% f- |( S6 S6 D
         {  ) ?. f0 W: L/ K- ~5 V

      7 k3 ^' z2 f: o) `8 _
    • : p, S3 D, q& _8 e% T

      & l! f6 K0 d; ~      s->next=p1;  /*否则插入在就绪队列的头*/  
        ~2 @7 n: K1 d* X

      1 ]0 t- w# U6 f* {% w
    •   f6 f) t/ ]) h! o! c
      : E1 T  P$ m; z& U
            ready=s;  
      $ Z" C; b: D! v6 |; J
      / w8 X/ C. A" g4 E  i6 T* P% H
    • 0 i: H) V! U: I

      , U/ p% O+ X  B0 `   }  " u0 Q' a# j) d4 ~/ c2 T
      8 U9 i  @9 Y% Z* A

    • 1 }6 b( m' s3 `: G9 t4 t

      + O* M* o  h" S5 C- s* \+ s}  
      8 y: i% @2 c, M) K/ u) v: s  P) K

      " Y+ ?+ [/ }! r
    • . M9 A% p& S3 n
      ( {; `4 x9 Z  P: U7 q
      /*优先数创建初始PCB信息*/  
      9 k/ ?6 I3 O) J7 Y7 L% P3 q

      - D! n. h4 A4 l# P2 S
    • " y- X, }, L  r6 @/ I
      ) s, K& i& {' @# M3 I- f
      void create(char alg)  , j& F2 B+ e8 ~! H5 i: V) {0 o
      8 \0 D' o5 C7 X, h% X+ P$ H
    • + Q+ t& m) c6 C0 M
      * _1 t8 Z  e5 q4 q4 Y2 F3 V
      {  
      ' Y% ~. \3 N9 K5 y, l9 F1 A

      . g2 Y) z+ U: C, s

    • ) W( E% O, q! }; ^3 ]  a  ?4 p1 g. p
      " I5 E. @# ?4 n
         PCB *p;  6 H+ s' H2 U! _. W/ D
      . @) w  h) p7 x+ o- |2 l
    • : {0 _' ]! n& c9 e! T

      2 I7 d* `( U+ z' W- G   int i,time;  ' p0 c5 G" K6 `4 t; h# J( `( o
      + _- ~2 b0 t2 q+ B0 N* I
    • 0 g5 \6 j. E% R; {
      & i; H) I' B# t9 q$ u  t2 e
         char na[10];  9 V5 O! o$ ^* t) }6 s8 D; R

      ) C/ \9 U0 P1 z4 B4 x* y" r

    • 1 N2 g" w' S: _& z; S7 l
      8 ~" Y/ J1 h8 l) N, g
         ready=NULL; /*就绪队列头指针*/  
      9 `( m: r  L- N2 r' e4 W
        `5 ]5 _7 K- }5 w+ J

    • 7 J% _: G& Z' j' j: _5 Z1 a" C
      ; {5 O* o$ R9 _/ u" q" g
         finish=NULL;  /*完成队列头指针*/  
      # p0 V6 B; ]; f6 Z3 C

        [% K% c6 O/ m3 q/ v- z# m
    • 4 P5 D7 g! L, A; M1 a  q9 ~, U

      ; G" ^% \0 h" }2 z' `8 U   run=NULL; /*运行队列指针*/  $ H' w) n& V1 b* ]0 U9 @  r

      $ G4 O1 d. y4 A9 l. O0 J/ k  S" t

    • / S0 w7 X" x/ W

      ! j9 c& M2 z& k  Y- r; h9 O( ^% u   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      6 D, p% H$ i" R/ m: A# d* i
      2 D% Q7 e6 v( O2 z
    • , B5 y) P! p2 v) r0 r) t

      7 k5 x) r# q6 E7 W, K   for(i=1;i<=N;i++)  
      3 E! W4 M$ s4 ^9 e, a% M

      # c$ {" d% F  a+ V( `# m5 @
    • 6 {* n! A3 z8 O1 c5 s; t

      % V/ m! Y) y! w   {  ! n6 D, y8 o$ B( U  a( b2 L' U. Y- v

      3 Z( F2 B: w$ q2 z4 y0 R: ?
    • : A7 e: b  t" f7 S: {7 v
      ! {; E- W- ~  M
            p=(PCB *)malloc(sizeof(PCB));  
      2 i+ n8 q( K+ Q

      * F/ V* b6 d# n8 D3 ]6 W
    • 2 e: n. S( s' P; J6 }
      + i0 F& m- m7 z. w: o
            scanf("%s",na);  
      5 m1 X9 r1 `, @# v- n  h  U
      - ~# \4 ]- c! e1 Q+ p8 `
    • & _6 G) z! a" o) J8 `
      6 @7 ]- K* I0 d6 B; W
            scanf("%d",&time);  
      9 U. d$ b# e# z5 k; N
      * M% `5 N4 j2 c# X

    • 4 `& s# I7 G  T  _) W
      : _' q6 B1 Q6 B$ Z0 A! [
            strcpy(p->name,na);  
      # E* J; G* H. k9 ?+ ?
      & F4 R* B1 g! o. [

    • ) r9 x8 \5 W3 e) A

      8 b) p1 I( z, p8 O+ I      p->cputime=0;  
      # e' B' r& M# u$ B/ t9 w8 c8 c$ }

      1 {, }& d0 R* D( e: V' A5 I
    • ; r- `" T, C, X
      ' ]" Q1 n3 y7 W% f; ^
            p->needtime=time;  & Z! p% L( Q9 P0 K. ]9 S; w0 a2 t: o( K5 C
      3 N0 B' v" B  W

    • ) a! I: l1 s2 `0 k1 b% ]3 }

      ( q4 n, e  ^& T8 y5 V) s      p->state='w';  
      " G$ A( N, }9 K& \- I- X1 U

      ) R8 p% S& i: {2 L2 w/ F2 }) D% l( C

    • ' P: |2 \9 q  |5 s

      5 |4 M7 n3 n/ @( V" J      p->prio=50-time;  
      0 Z; F3 @9 U! V1 K5 b+ x

      ! u8 R& R4 i2 E& y* k
    • % M9 \6 C: a" }& K+ U+ F6 F
      ! E- Q- Y5 p$ ?, b+ U9 S
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  % J; ?% h, Z( U& w& s) {( o

      0 {& Z% J; i; E$ d% W% u3 o, [) p
    • " |6 c* |# M7 o* e  x) b

      7 E. g: H/ e- q0 t* E; z' w5 f     insert1(p);  6 K7 O2 [: y9 ?
      $ W' H8 C1 `% K6 b8 a

    • # I2 `4 ^- n- f4 ?; F/ z9 d8 s  ^
      : i9 J! W. a' l* o# n" h) T% o
            else  " T! T0 _; T5 i& Q/ g3 t
      " e) Z% A6 v+ F8 u2 Q7 B9 ~( o

    • 5 M8 o2 l  J- i8 ]

      ) w* `) F/ T/ S5 s6 e      {  : |$ n( H0 U) J( l2 S6 m2 C& R$ ^7 ~

        s! R, ?! _' [, @* ?

    • ' {$ M) m1 D4 ]1 q: l) W+ v! g
      + N8 a$ K3 u) A: e) S, J
           p->next=ready; /*创建就绪队列的第一个PCB*/  3 E* l4 p8 p& e( y: m1 }& a

      ) p  ~  y' z2 J1 x. z' k
    • % O+ u4 r, F# ~9 w" q% A: ~# j# B! `
      5 {* @4 W. s, d* B
           ready=p;  
      , k2 H* j1 ]: J/ p4 _" \+ Z5 A( E

      : t2 x6 C3 C+ u% _$ Y
    • ( }' U1 U' J3 ?' A9 f, _8 l

      % O! `) |$ c8 T& Q+ b8 M      }  
      - m- L0 B$ G, [' u
      + u- q: r. C: q/ T5 ~/ z

    •   t  l* u" P7 m: d; `$ B( o! s2 B

      8 @9 i8 t1 k7 z, T; \5 T# x   }  / D; I2 i+ ]. y' X
      1 b8 p2 |1 `8 q! \/ C) K
    • 5 I  l$ f. k! w! U' i

      , C9 f! \  Q- S* x9 w, M1 n   printf("          优先数算法输出信息:\n");  & w. [9 E) H. |2 i7 P0 R. N; V

      5 U/ l% @0 L/ C# `! A
    • + L. V" y( g9 c' m
      & ~& g) v4 A$ j) w9 h6 Q! `
         printf("************************************************\n");  4 u5 d# a7 }3 t1 N1 ]
      2 Y/ j9 ]3 F0 Y) i8 b
    • # h3 D* q# u$ d) r* I) C

      ' ~  z, F3 p- D$ e) |: F  Q   prt(alg);  /*输出进程PCB信息*/  ! ~2 }" X8 ~! a% q. i) h! D

      7 q, i/ Y+ f+ w  [3 r- B/ A

    •   K( w7 U+ u3 v" G6 ?

      " j! z2 N. V8 n/ }& Z& d% Z! E2 V   run=ready; /*将就绪队列的第一个进程投入运行*/  4 l& _3 r" D+ d! y2 _* G2 b

      0 k2 p# l# I# u' F8 t9 U) x- k

    • + E8 o- D( E) d0 X2 N: T- W7 l8 C  z# ]
      & M* h8 |, I+ j9 }" j  {7 |
         ready=ready->next;  5 J7 c, b, p5 m4 e9 ~! k
      ! ?6 N5 T: X) V! \, }/ `
    • / _5 H- h) r  b- w3 ]6 T) i% o
      ; y) I( H4 {! Q+ H  Q( W
         run->state='R';  
        ?, I5 K! f7 U$ {$ j, z
      + u3 b8 U1 C' `' q. _( n
    • $ \9 q6 b* |5 T- k
      ; _/ W& D9 Z/ b- k$ s
      }  $ [7 s" U. N2 H( u3 J/ D. @/ c6 w
      " e4 Z9 O7 p3 @% s

    • & w/ M! l3 u1 A8 H7 P
      5 B$ d& G0 f  m( H) {; D9 R
      /*优先数调度算法*/  4 H( I  O2 e- w$ B6 A
      * H( a" \% I7 Y# i

    • , j+ Z! R4 L5 v
      5 X1 w9 r3 t& W& _* f) u& i
      priority(char alg)  / }7 T* {$ U6 `5 l+ H. C2 |$ _# X
      3 _6 H! ~$ L# Q  k! `" H' l- x
    • + D' o: H8 h; V) A; a& U
      ; @  ~" T/ e. x/ D) \: z
      {  
      , u7 Q6 I0 K% h

      : u* p7 M6 i2 i- X8 O, s

    • 5 A, g5 W. ?* v/ ~' P. E) W) n9 |
      ! `3 m+ z2 w4 O' w3 o
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  , u4 s! E; r9 S8 L" D8 p# |0 B
      ; d% h% @0 g) D( M# @' W

    • 8 `/ }$ S" B: u- D. B% v1 A
        {- E5 x8 f0 y5 r* R4 z# ~
         {  & w9 r8 E# g: k5 j$ m) F

      2 ?* x7 e; G" N

    • 9 o, |' W! ?* k4 u- G, q" C+ \
      ! a2 V; J# p' b$ L: k+ z9 e
            run->cputime=run->cputime+1;  
      4 v! ^" E0 P, @# U
      6 F: C  j- Z/ Q6 S7 V( {+ ^( M( C( B

    • 8 q& s- A8 c0 @1 M# ?

      . k, J" g# _4 w  ]% @! X+ [      run->needtime=run->needtime-1;  
      ! e, |2 B( r8 b; E- s, y# c

      2 [: O1 d/ `+ i$ d6 C1 @  J8 z
    • 4 B$ y6 ~$ n5 n1 p" M
      / ]( {/ b- y! r) U: f, ]8 Z4 X3 C
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
        P" q6 u8 t5 E: p2 e2 g: ?( `

      3 l, f0 f. U* p7 U2 ~$ H

    • 0 g/ ~9 p) p2 F$ B, x

      - ]; t( e2 F$ j0 ~1 g% s' T      PCB *p;( L( V  r: s$ r# g+ D6 y% K1 n

      * @# F7 Y& Y! E, B% S9 N% I; X4 W+ {
    • 9 R$ T) ~$ {) E0 Z' W

      6 b7 v! m% v- o. j% Y      p=ready;0 c. Z0 R8 ^7 p3 l: ^- W
      8 X" L, Z2 ?! n1 x1 ^

    • ' F* o- k+ r9 m( ?8 T

      8 m* R' A. Y5 J: v      while(p!=NULL)  
      / W: J. Y  e* [! g5 w
      , R- y  Q( {' B
    • 6 i; I7 i( p' }* `! V7 |/ t

      & U; g1 B6 K1 L      {  ' F' P9 @. G# S& [) \2 U+ o% z
      : K9 \- J5 f3 \' O) B
    • 9 \8 D- `, N: M; g  \+ w
      * }: x! k& s8 T8 |
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      0 d7 O6 m4 K& f& p1 ^1 s; X

      % z. o. {; `8 U2 J' ?+ X, S
    • # [4 t5 x9 I, s; w
      6 B0 T4 p) D) r% C; s
                p=p->next;  
      * l, t0 L' z9 S+ ^, D: j
      9 T/ q" ]3 r1 \9 x/ X3 g

    •   x, ?. I: W: ?6 Y" q

      ! d1 x1 L5 [: S$ _5 [$ g+ N7 x      }  
      0 T/ P3 d1 A- v: F% r
      ( C9 Y- t* I) [: e. J, H2 ^; i  L
    • ' a# p4 K+ q2 T. n# q/ {
      & g& a  M4 v% ~" ]) E% M& p
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  % h; w5 Y# B8 X

      0 b/ t  Q  w1 f! d

    • ( n9 y9 S& b9 g& o7 W* s

        o6 y7 }; I! n" m% s5 \# j      {  ' V7 l( b  I  ^  _+ C1 O& i8 V

        H9 Z8 p- n. E' C

    • & ~9 c3 N+ P/ E9 x! X

      " s1 P6 i4 D2 \( ~4 p9 J$ @         run->next=finish;  9 \6 G0 K% x" t1 u" E3 C

      6 Q1 l2 K$ f  r: x" `9 m6 Z( t% }( X

    • 6 h, i5 Y3 m9 w' G

        \" N9 P0 f' p- a2 v         finish=run;  
      0 f4 J" I( e# m/ a! n7 W) D
      / w* l& C8 Q9 K

    • 5 G  e0 t- U2 e) O4 W) u6 T9 [

      9 I+ @" I: s9 q# J. E         run->state='F';  /*置状态为完成态*/  
      9 G" i2 i& M: T
      " |  z: [9 e) @

    • 8 y; S. p. e' a

      8 I) N$ h2 g' f+ t1 D4 z         run=NULL;  /*运行队列头指针为空*/  
      : X5 N' L7 r( D0 Q* _! U4 u# I8 X& R
      3 w1 s% \7 k& M, l

    • 0 V$ J* h( X1 _! i! B
      6 J- n. a- T$ {4 d/ E5 Q6 U/ W
               if(ready!=NULL) /*如就绪队列不空*/ / ~0 E. w7 D7 }# b% G
      : f6 B( j# ^2 I2 x! w1 Z

    • / |  @0 g+ e$ s' ~
      5 P! U* \  R/ @9 [% g
               {  
      0 ?' f# B* |1 b7 s/ F* o1 c& {

      : D6 |  J) T% C, m& f6 ^# c
    • $ o1 d* `; _  l* G) P

      6 ^6 Y0 h+ p( A" q% j, |3 X( G) y            firstin(); /*将就绪对列的第一个进程投入运行*/  
      9 }* c: h; R& r# m3 ~# A

      " n- z  i$ J1 q$ p4 s* O( \* K; u$ l

    • / Z0 _' O' w, k/ k

      6 R. g0 V# T; j/ M0 o" b! M! @         }4 I6 |9 V- ~& s& @

      - U1 @- F" s' M1 G  n

    • - `5 y# h# f( S0 n1 Y4 h
      ' ~2 E9 I0 |# A/ H+ y
            }  
      , W3 q) s3 d; G2 v, }. i' @- d

      " a- T; z- k3 j+ o( B
    • 1 W: u5 q. {+ H) D1 I
      + O% b" w! h2 q9 `- \- i7 g0 V
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  ! ~& R) k* i: @7 J* w+ F" O5 u
      . o$ {3 a$ n0 i  V& @: b0 U5 @

    • / D8 v# E  c' @5 `0 @

      7 U' \5 C6 Z' w' x* m( j! k% ^* ]     if((ready!=NULL)&&(run->prio<ready->prio))  2 {) o& S" @* B* J2 D* R
      ! c1 d; E" Q5 F$ }) r
    • 5 P5 u- H( V3 d

      ! q! m5 f: H% l$ r$ G. J     {  ! X  v$ S# u; `* f0 \. l
      . `0 K( x6 Y" L% T& O: G

    • / Y* ]1 V4 }4 `, `) Z' S& r

      $ p7 p( w" p( R2 S( F# W2 a, m5 d& F        run->state='W';  ; {$ b6 A1 i/ ?. T. P
      ' D' ^- s0 W" R+ C8 t

    • 5 R- S6 n0 ^( \( K
      3 B) B/ N" v3 E9 y8 w/ ^- f
              insert1(run);  3 ?. g7 J! v& v2 J/ \4 A. y; z$ m3 {
      1 l, h% C8 p6 }$ c
    • 5 g8 B( T4 m: E+ [$ Z

      3 p" t) k7 I( X+ g: c8 n        firstin(); /*将就绪队列的第一个进程投入运行*/  - D, T/ P; E- U( {9 ]

      + V  M; P$ ^7 J# G

    • $ R. s. y8 q+ ~
      ; F# Y4 T, {" E( t
           }  7 p) w& l* R1 D5 m: ]- x# x, U
      4 x9 E9 c& j9 ?
    • 8 F  ?& N8 s( |  K4 S4 q

      7 X- `; t. b& ~# R& c+ `& S      prt(alg); /*输出进程PCB信息*/  3 `, _3 w; I+ }6 W) e4 w- G8 {: {
      8 j0 _" l; B" g: K* m
    • $ z) i0 S+ O( r5 X
      7 U  u$ C9 n9 L; x6 v$ U+ Q
         }  ) L$ b  W# E* n5 Z( |0 u# W
      9 q! W4 T+ y; a$ k

    • ) G/ |0 [1 S* P# i

      : Y2 u% ]: C; g7 q9 J5 {# E}  ' _0 V0 y' \. D

      * R( ?/ \3 p; O* g- r

    • 3 g+ n, L4 l& P* _* ^/ U" U+ C" k
      4 z* v; r) d* _5 u& @; J
      /*主函数*/  " v* j, R) s* ~& t9 P; A

      0 b" b1 g+ C& i+ a) B3 T# @

    • 1 ]( i. z! f9 {+ C" A+ g. `4 D' K$ f
      * e# N- q0 a! m  g5 L: G& I
      main()  
      ) o6 G( c8 H. D1 d  O

      $ ?( ]5 P& C5 k
    • / ^; {* b- K6 q1 c8 r

      9 t# S" \0 X0 H2 F{  
      / Q( R+ P% Q/ d) y, [- U) l
      ; u: @: I. g" M

    • ( m0 c2 b! K6 l( J

      4 d# E  o6 x* p. \! b1 r0 Q   char algo;  /*算法标记*/  : p& g# G! R: b% I3 M

        \( {& k$ e& c5 G' n

    • ; a; r# R' e5 D' R
      & D# O* U4 Q/ u* O
         printf("输入P确定算法:优先数算法\n");  
      / ^3 ^! ^: [3 X4 B7 L3 f
      1 g$ l& b" Y2 [5 q

    • $ R9 P6 \( e4 F% U5 h1 F

      # ~& |8 |9 ?- k) l  c0 N   scanf("%c",&algo); /*输入字符确定算法*/  5 r6 K7 h: G) m) R! Y

      / _( b, ]1 M! ]6 A
    • / h( a: b" w9 L2 x' E

      7 g+ \. H! e. o5 L* `   printf("输入进程数:\n");  4 T. K7 x! u) y" |  B

      ' R% X3 l3 [8 \" N0 j( A3 g

    • $ p: U3 N. R( h, A, T
      5 K7 d$ ?+ L6 N- d5 U5 E
         scanf("%d",&N); /*输入进程数*/  
      : ^4 r+ ^4 q. G$ ?% Q, q. f
      9 U( _0 X& T& w- F
    • & N9 z& {. `, r# `8 p

      / j9 t# H) @2 x- ]2 S* P/ o& K   if(algo=='P'||algo=='p')  ) A8 E6 e$ t" y' ~% R" J
      0 D& I) T* h4 m; {( m+ W. k6 a
    • 1 o& I  N. }0 t# ~3 }

      8 P9 Z6 X; R4 C' _2 H9 [   {  
      5 z! ?& _) ~9 t5 ?* V

      6 m5 X) S5 I  y  \% N2 C) Z2 V" v  Q

    • 1 j( \8 {6 b8 w& I3 u, Z, F
      # H* T3 N% Q: x+ U2 k( g8 q2 Q
            create(algo); /*优先数法*/  
      6 \1 i. _2 i! b( a: {; B/ q$ ]
      , t' A3 t1 G* a  o' a% J- |

    •   _' d" h* ~2 h% D6 m$ N5 J

      5 h1 w8 @3 G0 F! v; ]+ I$ e      priority(algo);  
      $ _% a4 w/ }5 d# Q' J+ l0 r& P

      : N: z7 W8 ^8 g, f0 r4 f

    • . B+ [" S5 W: a4 f8 R
      $ O# z' `0 t. E: ^* t: {; A; [
         } ( I* d1 _" j% _( D9 i+ R
      3 A" Y. p) J# p5 z# I

    •   }" X" c$ i- P- I
      8 L8 ?6 e6 \9 e  C; [( o. d, _
      }
      2 X" I/ N0 ~/ L1 K' `0 b

      / H4 O) J8 a5 l
      ' d2 c$ c9 }6 F5 v4 s( J& o8 I# i


    & ^# ]4 u" v% b1 u: q8 L& @输出结果:
    1 W) u& a/ Z$ P9 l" f3 B+ q- }


    , @( }% E# S# h原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    ) }/ Q' c; Y9 Y6 m- {4 J+ K/ F, s, ?- C; N8 E$ 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-9-9 02:35 , Processed in 0.298507 second(s), 50 queries .

    回顶部