QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3232|回复: 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
    $ R; T, r0 X$ q, ]8 l5 m
    优先级调度算法
    , n3 {1 t, J# c* n' m

    算法介绍
    ) f- Z* q1 X/ S- P8 g优先调度算法的类型(用于作业调度)
    ( y& f: A8 S5 f0 k+ [5 E1)非抢占式优先权调度算法   q: N, X, w& {5 j! C
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    9 F! m" G* o2 y" @2)抢占式优先权调度算法 6 a" S; q8 {" x6 Y, x  h) S
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    ( c7 O! d  S3 h1)静态优先权
    9 s+ n& K) E6 N2 @6 A静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    ! j$ a3 F' ], Z! X; A

    2)动态优先权
    . ~$ A2 }  ?9 u

    算法实现

    抢占式动态优先权:


    & }- l  f. Z+ KPS:本人认为非抢占式静态优先权没有实际价值。


    • 4 a% `3 L0 e5 D7 Z. H0 m

      ( O# s# U( _& g. a# ~#include <stdio.h>   c+ q2 h0 U+ X5 \% W" w
      0 j; p/ C( h! W+ _# @! \5 U
    • ( y4 \* d$ i* z8 H& f- F

      ; e6 P; \; u( C& r$ ^9 ~6 @6 j; t#include <stdlib.h>  
      4 X( {+ R2 |  h' N4 }

      0 M2 ]6 H* ]( N7 \! p) P- W, r

    • " N2 q- w4 A2 \9 |# H0 g& z

      * K# Z8 c6 M* _# |) w4 L#include <string.h>  
      , X% _  [6 d* g) l

      8 t6 p, }( _) M5 `$ {3 ]" ]) u

    • 8 w8 `5 M3 ]( E& N% {

      + T. {: t$ I5 B% |- Rtypedef struct node  
      , W5 {# K& s+ F9 B! k, z

      6 ^, q+ A: T+ [
    • ! N: `" ?6 s+ x, ~: X. L
        l) i3 `8 V$ Y3 J$ s1 \: r
      {  
      - E6 x+ d# X# U4 c8 ?) n; D
      6 t) y: D! Q4 z! {' C

    • 3 L, F; L$ C0 |) r

      * ~- H- F+ S" ^. S1 q   char name[10];  /*进程标识符*/  
      ( [' v- J% _1 ]  d6 }) F
      * _& p4 K2 \$ f0 E

    • 5 z6 h7 b# s1 X5 d# M" z: H

      4 F6 @7 n: z$ j% i   int prio;   /*进程优先数*/  * n4 n( z% S5 ~

      4 c' V  l4 b1 P
    • 8 b4 j# m) U2 L; C
      " O6 N( E! M: Y! \
         int round;  /*进程时间轮转时间片*/  # w; f: Q5 k, N# o0 H
      5 G9 C& c' h# V7 s; H
    • 3 L' N8 n8 M* o* M5 b: l0 V  F

      - s! R2 Z8 E$ {- M2 }* T4 E8 h   int cputime; /*进程占用CPU时间*/  & K* w0 G8 U7 J* H& j1 |3 t

      2 T6 J& f; Q3 O4 k

    • 3 A7 m6 `" O2 g7 v  N( y
      0 j" h9 E' A- S  I0 c) V9 F
         int needtime; /*进程到完成还要的时间*/  8 Q& A. B9 w/ m: s5 T  b# b
      9 D: U2 L5 O3 O1 d

    • % `5 K. s. U2 }% R5 h5 L3 y/ `
      8 Y$ _: v7 }, B- E
         int count;  /*计数器*/  
      . U: w7 B3 X, h' l
      / m' N! Z+ B* }4 Y: n  B
    • 4 g( W" k) V$ C$ W3 F
      : _! e/ C' v+ a- u* c0 g) ~
         char state; /*进程的状态*/  
      6 L; g0 N  B4 ~. t# O
      2 y9 u1 d( c) ^& d

    • 5 f& I! u# g& H# @3 t) Z$ \2 Q
      6 n( A% ~& f  V# ?
         struct node *next; /*链指针*/  . T# ?& r9 B/ o

      ( T' T1 d! f- }2 C' p! f

    • 8 R1 c$ V" C6 Z; f

      , C: c: R5 H/ u; l; m}PCB;  
      ) K9 z1 _4 J' n
      ' B% d- b, P4 K& L
    • 1 p/ L8 m% t4 \# r' c/ x  [
        O9 s  M1 ^8 x% c; D3 q1 l1 n
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      ( _1 `- V4 l4 ?" D: A3 G3 w# D

      7 ~' ~' D3 n/ c' i  ]

    • 7 v. ~/ S8 \1 V+ g- ~
        x# c, y7 x5 _. b
      int N; /*进程数*/  
      ) a1 E% l" y$ S( K0 q. U* h

      ' b' y; L! l! N2 I  F& k
    • 9 D$ m  Q  `2 X! z5 V
      4 ^+ ^  e; z. Q& b0 _
      /*将就绪队列中的第一个进程投入运行*/  
      , X; }; Q. i$ L3 V  p& f% I  x  d" g

      " m) m" T3 @  T: b* n! \

    • 1 D5 Y' p. ?* b1 [: [7 i. v
      6 s+ K( L; u4 y
      firstin()  8 A. f0 N' q' E( _+ l9 W' L, C

        Y! O3 }, c5 E6 m$ ~/ S' l5 T/ p

    • & Z5 k! e& W: B% O5 |4 a5 W9 e. u3 X

      9 z2 S2 O9 t8 I# K{  
      8 ?$ a: _2 P. w3 s3 M6 T2 Y
      ' s$ I, l0 k2 Z% F7 B* Q' w

    • 3 c: F% J& |: E* J$ z% z( f" `
      8 B9 n! L% D* y5 z' Y
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      ( l+ s5 T- L. W/ _% m# _( K- X
      + V2 o( L# J5 T/ Y( g
    • & K7 c+ S5 h4 Z1 _: b1 G$ i" y$ k
      6 S; N, u: C; Q
         run->state='R';   /*进程状态变为运行态*/  
      0 R' _6 a% u/ H$ `: P
      5 E. p+ l$ J# }

    • 4 X( o1 b4 q$ ]& L. S' U5 p* i

      , D% y* r* k* X   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  0 h; H" q+ d0 U5 }2 |1 ?7 K) l
      - ^2 V) t9 G6 D/ b' j' ~
    • % b2 e. s- d( P5 \) l+ i

      " ?; {$ X$ A! e5 d% N' r}  
      . C4 ~$ A: c/ W+ [* I2 L; ^4 d7 n1 }

      & Q: F0 `" I0 W4 w9 x5 |- r

    • ' r: A0 R, Y3 s9 k  {0 R: Q
      ( F- T6 ^2 u* D+ r
      /*标题输出函数*/  ( {! `& N( U; x$ l1 u

      $ B) G: g2 q- L4 U  k7 G
    • $ a3 T7 q- U) u) x

      7 b! o/ R' N) z7 tvoid prt1(char a)  , E& m8 Z. P& T0 u! v
      6 n9 f$ g2 P2 J, W& k/ U+ m$ A5 u8 h* }8 s
    • & m2 i2 T, d$ M$ n/ `  F

      7 e6 p8 S: s0 S/ E6 N( w' V( f' S{  , B! i- v0 H, _: p6 c5 H# t
      # [) I% D- O# C/ _* l# s4 ~9 X

    • 8 Z3 F. }" I; {7 w: \

      0 d9 \( I9 [$ C5 w0 p9 ^' O: _5 y   if(toupper(a)=='P') /*优先数法*/  
      ; _7 L. _$ k; n$ g. G  W
      0 |6 _! Q3 H+ u" G  L' L
    • ' Z) v, Q0 R; W- ?: [# G; b# o
      7 g6 R0 Q! x6 f$ h, t& W; [
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      & p5 i! j- z  |& T7 Y
      4 n- @/ @0 i. P9 c

    • 2 ?( O0 x' W7 d! R0 l

      2 l7 r$ M4 z# z, z/ a   else  
      ! X' n* l* Z3 h* X) Q2 c; H
      1 U3 o' N- N1 G! f) m  z+ z

    • 3 Q4 w1 H: Q0 X$ {( I9 k( H6 T
      0 V1 g4 E  H/ ^3 S) x1 G" U( W- }; O
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  5 |0 v1 A+ {  R! X7 U. T+ [
      : {8 _0 l* B. ]  f- [4 U4 W
    • / @* o  s6 q; t# A+ t

      2 X& a4 T  T8 B( E. s. i; p}  
      # N1 G+ N: {/ Z8 j/ W& F
      4 c. `( N7 v  n" A$ z

    • ' z: m9 x; E- m+ U
      ) t6 X; u7 _9 I$ K2 d. s8 T7 _
      /*进程PCB输出*/  ; `& V# \( K2 L. T- `

      $ B* Z0 n; ]5 ]" E. f& c7 z. A

    • 1 q( y: z& |( A3 g0 o3 A

      / w! k% G# f; l: }7 ^2 a- wvoid prt2(char a,PCB *q)  
      & ?2 J  B, Y# c* [1 ?
      2 r# d  W% u0 _8 g

    • 9 J" B; Z9 ]3 f1 j6 z( r

      4 A5 [6 a" Y2 W# n$ k7 V{  
      ; g3 W" g) I  a) t7 T! v, `9 m& O7 e
      8 R1 h: Y/ K% S2 X" I

    • 0 }& U8 _& B& |7 S
      - `# v# b4 _3 [
         if(toupper(a)=='P')  /*优先数法的输出*/  
      0 U1 ~9 z1 K: m* c
      4 T3 E. a* M/ l* K9 s; B

    • ' p  J0 s" ^0 c" Q) V- o! p" h
      4 ~0 p- j6 C  ?5 {9 m* {) p% L
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      ; f/ k2 w8 g8 t  [( j" V/ _7 f
      6 W$ O  E% z0 w$ S
    • # g/ o2 w1 P* K6 {
      1 s6 C( D( C5 H7 N
             q->cputime,q->needtime,q->prio,q->state);  / x4 T  g; M( P) x$ p4 d
      8 K- x! L2 \- K

    • % G* b6 @4 j% _) t

      , g. d; z" c. V) i+ P   else/*轮转法的输出*/  ) |. ~+ K  m2 s# N) D  P
      7 b2 G" j4 n( B$ B. j/ c9 A

    • + Z$ d) v5 X2 p/ J

      ; |, A! q4 K4 p# ~% l! H      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      6 H) S4 l5 s; S7 U9 Z* ^

      ! t* J( p3 m/ l: O' P! |6 }
    • 6 r% A) ^" W# |1 Z$ Z. m  ^) S
      " J( Z! m6 C  u) p/ L% u/ U8 w" @
             q->cputime,q->needtime,q->count,q->round,q->state);  2 h5 I( r4 a5 h* Y& d; N
      8 B1 N8 f. O( y% D$ h: i/ D- u# r) E

    • ' [$ C0 ^; J. o
      + f8 s2 }1 D: _+ O! A
      }  " Q# {- l2 H; w% Q

      + B1 W/ K: E* D1 j! Z  B) r
    • / H$ Y1 q% j; j
      2 E* A  ?6 o8 P2 \& a; R1 I% x
      /*输出函数*/  ' I0 ]# M- o. {$ Z7 X
      7 y  {% L8 g: `% ]; r) F7 R
    • 7 k- ~& ]1 T8 @* ~

      " y* d7 Q# e" g- E" Rvoid prt(char algo)  
      ; h1 ~7 s+ P4 a& K
      - F! P: m: }5 y% ]% q3 r2 q
    • # q/ v2 t6 Y! d8 X; D

      : z# c7 Y+ i! I' B2 f9 u4 i{  % s, |3 ~' P5 U" Y3 C, M
      / S$ B. l/ c0 B1 ]9 T$ y- Z5 R

    • : ^; _3 Q) \  H6 l/ o: B& e7 [- o
      * t( G. H; Z/ u1 z
         PCB *p;  $ a$ h( k2 C# _) `, a. a- _  z
      3 m5 X5 g- I7 T5 X6 b

    • ) s9 D0 i8 g  X# S& Z+ j
      2 z& M1 n4 {) [. u4 ~
         prt1(algo);  /*输出标题*/  
      8 G: T8 C& e. j& K

      # I& s7 R, I9 k+ T# b# p+ v
    • 1 Z2 j6 C2 W7 S4 m! Z% s
      2 F: W" J) E; n7 M( b0 _
         if(run!=NULL) /*如果运行指针不空*/  7 n: D# O5 F  F" P* C, _+ {* c# Y

      - C8 }- z) H$ X3 r' n6 ~
    • 2 m* A0 U- Y& ]
      & D/ G. _: b% s" [; @& x1 _
            prt2(algo,run); /*输出当前正在运行的PCB*/  ; n+ ~) s# }3 s, Z- c

      % S, r- H. }! w9 `5 L) C

    • ; G8 s6 u1 v( F5 V

      0 I2 s. q0 `. a  s: {1 x* O% v   p=ready;  /*输出就绪队列PCB*/  
      " k) N7 s( k5 U% U$ Y
      ) g2 U6 [. g( ]6 f
    • 9 O- H' s/ a8 C: ?. z  `1 i
      : Q4 W8 I; W/ |- W' a
         while(p!=NULL)  ' T% p3 s% B8 P6 |0 N# e* X# a$ e

      ) T2 b7 E; K3 F% R

    •   ^; M$ I+ _, p3 r- j: C/ X
      4 ]) S# Z. ]- ]+ P) N# D
         {  / }4 }7 r4 z0 L3 i! X
      / Z" [- v# Q, c7 i* g

    • # Y  X/ t" ?# j8 g* m- b, n! T
      ! D3 U& k. W' |3 E! Z' A
            prt2(algo,p);  
      , G+ A  _! Q: r& Z
      / w- I+ s+ ~. Y& x

    •   E, C' D& ]# z% G: Z& l

      % n- g. f1 B; K8 x& N; R2 _% e      p=p->next;  ( w7 E; I; L$ Z. T

      - I. b' O# m& w5 k

    • 0 v' Z' G4 d3 e
      4 V9 S& C. _! J" _% P
         }  
      # y) W* G/ S; o* k6 y
      : o/ P6 _) P/ U/ b; O0 _; l$ P

    • " o! G. D7 Y8 S! O
      7 k: t8 g) k' |1 M) c; z  W, k
         p=finish;  /*输出完成队列的PCB*/  
      7 {+ O; `0 `& a3 S( S2 H4 H& U$ f8 v

      + n: F# j! U0 a5 F

    • 9 t+ ~+ j1 C' _% d$ h

        l* w5 Y5 b' P! g   while(p!=NULL)  
      $ K1 f  `0 U. p1 Q' W0 f, }6 H
      4 s7 Z2 k; q. W3 _7 q

    • + ]- J' y( u; i' U  }
      ) Z3 Z) I" S8 ?4 a2 M! }. n
         {  
        a: O4 Z1 r0 J

      ! Y) I2 ^8 B9 A2 F* P

    • * @7 z2 y( d1 M4 C. Q( c" }' h

        t) q& P2 K( Y  r3 {4 o9 ?9 h      prt2(algo,p);  ; @+ ?6 g( G; e) F
      5 [0 w$ B$ W- C- G: A
    • + b! Y( \$ S8 B% V3 ^$ I0 {

      - X! N; ?9 G4 I# e- o/ a: z      p=p->next;  
      4 c% m6 I. ^! ], F1 ?7 z9 ~; B
      - H  \3 x) |- m3 |& A. Q5 N" M) Z
    • 5 S0 Z7 J: S/ k% s: h4 B2 D) T

      2 R6 y# h# `; U# {; D   }  2 a" T* H5 u1 S6 c; k. `1 M6 H( X
      : m! e) P$ d& Q- E6 b( U! o
    • ; }/ d5 C+ \4 e/ N8 j: P) M4 i

        m9 F; F/ F% v- Z+ `' ]   getchar();  /*压任意键继续*/  " }1 s% ~9 r; o1 p. v
      4 s# _5 ~7 M! f" ?
    • : o# n  T, j1 t

      7 P/ R7 U- Q' E}  * ?8 ^0 v2 m$ g% w4 e) `$ t

      4 o/ B2 E1 s5 G5 R! e2 r. k& B4 C
    • ) G0 |8 @$ X/ m8 r) f( q
      5 u: b% \5 U. s; F4 \" z' g0 C
      /*优先数的插入算法*/  # u. r; }/ }8 V3 E: j

      6 c7 `# Z3 [/ j( W  g7 L* U: N

    • ' R3 {; s! d4 |! U, l- F

      ! W; z& {0 y& @; hinsert1(PCB *q)  
      0 n! U! t0 t' w) P2 H% s! q; _
      ) p3 o  L% ]7 D8 Q) A) e

    • ' ~, ~9 h3 N; x2 [1 [% L% u! T

      ! q# j3 V8 e2 P) [+ }{  3 H1 j  ?! W1 E
      $ H! z6 K/ L$ K" i

    • 2 J. W8 q! ?; y+ Q( k" K

      6 o+ y3 d; i' Q$ U' z# t   PCB *p1,*s,*r;  
      7 a5 m# H! J9 t" }( E5 d

      ) z  e" q4 p* \% E

    • / ^0 u% r2 @/ }" L% p

      3 W5 Z  B) i; J) K. _" O- c   int b;  4 e7 q6 ?* n, R; M3 b# v: U2 K

      8 K' k% Y# Q5 o

    • 3 d8 A4 o1 O1 J) q1 g+ p/ H7 p. I

      % y% {  o7 z. v$ K/ V+ X   s=q;  /*待插入的PCB指针*/  , `1 r* ], y8 Q/ t0 T) D! _, U

      ! ~5 i* r8 |' u0 _4 |
    • : V; W$ ]& |- S  W9 G7 Y. A2 w
      # b' {' ~1 r4 D  c
         p1=ready; /*就绪队列头指针*/  
      2 S" S  _  u- }& Q* J% q
      0 @3 p  R5 c. R7 Y: h4 a+ C- P1 C: v/ |6 m

    • 5 g4 i( H' \) g
      # m- Z  r; A! \4 U" Y4 `
         r=p1; /*r做p1的前驱指针*/  ; S7 C+ T& W* \$ {1 f; w' X
      3 Q, m, F  Z, ^+ n

    • 3 F6 R6 Z6 @) O6 J+ `9 P

      + M) M) Y: U: T  T- [; u   b=1;  
      8 n6 U0 B- J, I. z1 F& m

      ' f* H( |+ K$ I$ F  ]

    • * O- N. v5 ?; L) I/ Q9 j' N" h
      % f" T' C% ^2 `5 J# C7 f
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      ' s* ]1 S  s( z% {

      6 s5 B8 x* ]. j
    • 5 A0 R: n  E5 r+ m5 a% i6 O

      9 Q+ Y) M; {) y9 v6 [! U      if(p1->prio>=s->prio)  & k* P7 `) a) x. e) t

      & b- B7 V$ {- A4 R! [/ H

    • " i( _' _% u- ?  X. f7 H% W( p

      8 n5 E: B/ \! V1 b8 \5 O      {  9 d' L1 j& U2 p) t* q. d
      * A: C& h/ a7 R

    • . k* O: p5 n: v- G8 j( r2 F

      9 B2 U6 X3 F( e+ p     r=p1;  
      ( T9 s1 {" C# \. U

      ; b) \& B% W5 n4 r- g
    • 3 s2 K; m# y4 Q& y
      + y- z) l. d1 R1 `9 [" o
           p1=p1->next;  / X& Q( e* B3 y. F% }

      # k- C; P- `# b

    • & G/ u- `" V0 D+ F# u1 g! F' A

      % V" U% Y) J1 \5 C      }  
      / M4 z7 [- V2 Z( W7 ?5 M( a" E
      / ^4 k9 O7 h/ f( _( s

    •   \/ B' w* B' y; [5 P

      & i& i0 \/ u2 X3 M* X0 S3 R% s1 T) W      else  0 |' y/ p! o! ~$ H' u

      " @3 z2 H6 _! z7 {- @# z. K2 }

    • / K4 O8 Q. ~) t! @5 m
      1 Z% L6 _2 e* e7 c2 m8 n" o
           b=0;  ( r. ]6 T; L! U4 O( z
      ; `0 u" T7 g1 m" ?

    •   J. N" ?! O/ @, z) e% q# S: @
      3 W0 }! q$ T4 s; J4 a. G7 {; F. U
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  ; I8 D* f+ ~" o. u- a" y
      0 P  h1 T3 s* [6 Y5 v) i

    • 7 @5 Z* U* o4 k0 S
        f: z8 K4 r& s5 c4 ^& s5 h
         {  
      4 Z: J& b- K8 k
      8 ^8 s/ K0 r2 v7 K
    • ( w8 n4 K# k. }
      * N, c* n) j) G6 A* ?& _
            r->next=s;  
      4 i8 {8 _2 t$ z. W% i8 f8 V
      8 X" P' i+ s" r' T/ j; U/ N

    • 7 v6 _9 U  L  Y, k5 m
      9 [7 l3 ~7 u& k+ I# u7 T0 K5 f& z
            s->next=p1;  
      5 n* ^* @% j! o" P

      % i) q' ?& V; v
    • 6 X" R5 B( U4 F$ Q# i3 V

      ! ^8 m9 v; j; ~. ^/ N7 C   }  
      + @( X1 ^$ e8 S: e2 g/ f$ E

      - B9 B! i8 \7 I4 O' U  K# v: g5 }
    •   Y/ ?0 S6 O$ Y! V, H8 _

      5 M+ c! F! r  M$ _6 T" b6 g- A   else  
      $ t4 J) F3 W$ _$ ~4 i9 U
      ( @3 v2 T, |" H3 ~- j
    • 5 a2 k1 M# e' V7 [% m

      8 N( }6 ]7 P" q  l; S+ ^3 Q   {  . u4 @. j. E. C, B4 l/ D8 f

      7 o  k+ ?8 w8 V% q4 X9 a' f

    • 0 l8 \. G6 ]2 L

      / O% R3 {+ |: D      s->next=p1;  /*否则插入在就绪队列的头*/  8 p* F5 A5 a/ E; w; {, A: ~" d

      % d8 y( a$ \; B5 Z! G/ z

    • : X; X( }( J/ C% B/ T

      5 g6 n; u& N3 L) g1 P5 D      ready=s;  ) L7 S1 P. M7 F; k. T& ~" u' Y- e

      ! I" p. [) Y: L; S0 \

    • # |5 F! ]& L: t! N
      8 j0 b* Z% K% i
         }  " k  u) _+ n; D- \, X% L
      " S) a9 I) s" ~4 }3 r! i

    • & X: X/ E2 U3 E$ E/ H! P' _" B

      % F5 k* b1 g+ ^2 O! m8 R}  1 |+ c/ p: t% r) u" Y- n. j2 Y
      9 |- d6 b. L' k5 O! B" l) n

    • ! |+ m( J- y$ B6 W. _7 z- k. O5 _
      3 P: j! V" W: ^$ ~0 U& v1 V6 ]9 ]* a6 A
      /*优先数创建初始PCB信息*/  
      ! G+ |' B& B2 ?2 ~

      ' _+ b. W) j" W$ U8 J4 T' \: {
    •   W# t5 k: I5 `3 p/ x- @9 |+ C

      * ^$ ?# Z: n& X  |1 r. h/ L, \void create(char alg)  
        ~! s! C- l9 A+ F7 A

      - C: j' L7 r( W$ ]& l

    • 8 m; R- u2 l& j; ~1 k* }' Y

      ) @4 @+ d# e: N* ]# N  T  e+ Z+ O& M{  / C' x3 ]4 C( \' v
      . H8 `0 O  S2 n4 Z# _
    • 3 O2 ?( i7 ^) Z4 e

      ; Y2 ]& @. m3 [2 U! M! t! f- f9 B- L   PCB *p;  
      2 C' o4 [# a) z( g

      : ^! T/ Y( ?, k' @6 h
    • ( E5 Y8 [' \, F8 |! L/ r! I
      ! c6 V3 e7 }3 |& b+ m+ I$ K
         int i,time;  
      1 m& p# Z" d7 v" h
      6 d0 E! T9 U( ~+ O* `0 s
    • & e' ~- q7 H2 ^& P# e; D
      2 D2 F% I- r. O0 z
         char na[10];  
      - j4 {# `8 t' Y5 `

      ) N4 P# f; v! u6 \  o

    • 6 g9 h% y) }, j0 B  r* J4 f9 I# i

      / C! k- C. |) n) H   ready=NULL; /*就绪队列头指针*/  1 x; P9 d' H$ Z

      - H0 B" B, z$ F0 h, r# N4 s

    • ' \! g( A- X8 D. I) P

      ! f4 L1 G! s: g) |   finish=NULL;  /*完成队列头指针*/  
      6 Z* f: t3 K4 u5 o& e
      - o% D) v# L! C2 P9 `

    • $ y* g0 r& Z, |' B% Y% P9 k
      ; j! l: q. k$ z( X) E
         run=NULL; /*运行队列指针*/  6 U4 r& m- z2 A& B! h

      3 ]' C$ x/ P+ q# r; L/ v8 [5 v6 K

    • " [% ]. G3 j% ]5 M7 y& |
      , o' `& V! m0 J
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  3 X! M! g, l  R. O
      + `2 N' Q, s3 V2 Y% H3 T

    • * Y) g# M* L( |' z  G4 v

      ; t" C3 q( O* ~. v   for(i=1;i<=N;i++)  ) l7 ^6 D; H9 D' V0 ^0 @
        G- [4 t* z" x5 H1 d& a% N/ o# M) E
    • 1 a. q8 `9 P* D! y' a! L8 Q
      : i0 z# x7 x; S9 @9 F7 Q$ X
         {  
      " O1 P* J  m3 j' N( B

      6 T! N/ f* |* t' p0 G. s7 {

    • ; a. |% X! _* q1 s  V! ~

        D) N. n) m1 m1 _: M2 b+ @      p=(PCB *)malloc(sizeof(PCB));  
      6 {. d: ?; z  R* F& ^  E& K

      7 E3 Y% y0 a- e# ~1 V) u; w

    • & {% O- u) g; L' l# X

      + C3 o; z7 y* T( E      scanf("%s",na);    u4 l4 x8 a& y- d: V

      * i. U6 L- T$ x# n% V4 A- ]

    • 7 d' r) ?% k' Y2 c  J) Q
      $ w# C! U5 h0 W& B" j( ]( d$ W
            scanf("%d",&time);  : i/ w; J& h9 s" k& F

      ; G3 C$ @! H% R$ F! q
    • # K. v8 U! F. e0 z8 }. M6 K. F% B
      , ~; \+ s) k; r) A1 l
            strcpy(p->name,na);  
      . z4 s4 n  m! c" m
      1 I" L$ H* y; C% @

    • $ A" Z9 Z& }5 @+ J- }% ^: r
      4 U6 x  p" N2 _' t. J. c
            p->cputime=0;  1 V# B2 |2 ^3 `' D( ]/ V

      8 E, F& _, X0 u/ j; W( G" D# A
    • 8 {2 O9 u! j! {6 r% m' l
      2 p" @+ s, \' s4 b8 o/ d. j. W
            p->needtime=time;  
      3 k0 \- H0 y- T0 l6 {: @% S  r, v

      7 z2 ~! p) ~' l: K4 ]: u' t
    • 9 \9 u( \  f/ _" M: q5 b
      ( Z) x) e0 R7 B* \
            p->state='w';  
      * O% o, i7 x" l7 ~8 q

      2 N  {, h8 G( l& V6 n: p, z
    • * ?% d4 r4 c3 ?0 E( [/ Y' T- n
      : {) @/ ?& q* Z5 K& v! a5 N
            p->prio=50-time;  % t# D. z9 w  P0 H& B) Y3 M
      ; t" o. {5 `; l% f& ^

    • 6 r- ~$ c* [! l, C  ~
      * _) P: S, \  u' a5 e( [7 j$ k
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  1 f) j% }! n5 b: D/ r. M

      0 m" v) ], k4 O; f) l8 Y% D
    • 0 y+ w/ e+ ^+ d! ^& b* _

      $ t; O% J0 r2 L! j  M- W5 v% H     insert1(p);  . [/ N  D& O) b7 @

      ; D3 ^. ^  D, j
    • - ~' s* {6 b3 i" Z
      & U- m4 D1 L; x4 j9 p" P6 g3 ]
            else  , @* s$ _+ w4 Y( d- ~) b' J

      + p8 D' w  i, X; j4 F6 u& h
    • $ F: p( B" a/ [7 x9 _) ?

      # A1 t8 O" q. k6 I" {: }& ~* D      {  
      ( d% z( T) r5 s( z9 r  q

      * W/ q6 t: f* b

    • 2 z+ `+ r3 M, r. @- `

      6 v- W- ?& j7 h) a& W+ f     p->next=ready; /*创建就绪队列的第一个PCB*/  
      2 _: n+ k2 M5 W* A0 h
      & i( _# Z/ K; X9 m5 X4 ^8 p2 |
    • 6 d& R. p. R" P8 h% J! ^: q

      1 J0 M" i! l$ \     ready=p;  & ?( @9 F# ?& F1 t  ]( y

      ! G& q6 y  d$ E  {

    • ' w; E5 V% ~" C3 P5 o. C% _* }
      ! J3 Y5 h( y# w  \
            }  ; a: G& x( @( V

      7 {' W8 C# b; U& W5 b4 W4 b

    • 4 H) }/ B2 A% v: M5 p  `, O* [. j
      - J7 L; ?2 n# ]4 c) v% L! ^
         }  ; x* @, h0 W& i1 r7 L; M

      / r& D. U: b( F5 Q! `; @

    • ; G5 L  K6 a" u; V# x6 G

      ! U1 D" W* W/ |# {( C; T   printf("          优先数算法输出信息:\n");  
      # `2 [7 ^! D  ~0 j5 L- j

      % `' u! J9 l' ~
    • + o5 ~3 g! Y$ Y/ q1 k- u
      8 ?$ M) Q# i0 G. h8 h' H4 Z
         printf("************************************************\n");  
      4 K5 j/ ?( v; k

      + d9 {  x9 ]7 e) m
    •   k  i/ L& u, W& \* b% Q
      : k% x9 F9 w5 Y" W8 R; p5 I2 ^7 D7 q
         prt(alg);  /*输出进程PCB信息*/  ' J6 ~& Y9 ^8 ^* Y7 J# b1 m

      & k9 s: C% b: N
    • 9 y6 \9 p+ \. k$ Z

      5 }7 W2 S; ]; m7 e* Y; m   run=ready; /*将就绪队列的第一个进程投入运行*/  
      ' J) r! M2 I. X& [* U4 \

      ' s$ g  y/ U; ~5 y. T& ~
    • 1 W, w) `, w& X4 v* b! J: G! P5 n

      * B( V+ _+ y6 H' |4 r   ready=ready->next;  / V2 v6 \8 P# C" a; ^+ k( z% M
      " k2 G. k4 P+ x! g
    • 9 S8 `$ y, _# `1 E. a
      / j+ L5 Z6 q1 g! {0 A. l
         run->state='R';  . ~% [, }* Q5 D% A4 }
      ! a  B! c3 l! A, }9 p
    • * t# T( ^4 d" W: i3 u" w& j
      1 }5 `7 M2 {: A; K3 e
      }  3 y7 y2 m) E$ m$ V. E, z; ?

        t- @3 G" ?8 B. E; Z: W
    • # R6 d+ w0 S7 c7 i

      1 K& j* V: y2 l7 H, t7 ~/*优先数调度算法*/  # {  d0 D$ a4 E3 m& e: ]2 B' [
      0 R$ g: D: u# l: ?  a$ ]* ~
    • 8 R/ ]3 ]0 V0 }7 f  u- s4 L. ~

      3 f4 v8 j# ?( O$ g) G/ s6 r+ Z& {priority(char alg)  $ B+ J$ r6 A6 t+ i: ~
      3 a3 g" F- ]3 ]! `( q2 x

    •   g7 ]: i0 b% O0 r) P: q

      8 C) P/ s" v9 m4 {' V9 p4 m) |& y& @{  + ~9 Z8 P1 }8 H- |' |9 }
      $ @7 z) @* a9 O9 M: ^2 @

    • 2 @, i5 T. f& x6 u
      7 [( O: q3 ]1 |. K* M9 G3 E
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  ' e8 Y. ?8 P8 K. m# G) G+ N
      : R7 F6 s/ M8 h3 B, b

    • 3 M  p6 s; T, ]9 x) Y0 ?2 n# l
      5 g; u- M' ~/ Q
         {  - o( t3 m9 k3 X+ q' U( A/ w; @

      # L, [( U$ V, w7 F, @7 a% h& b* l
    • 5 k% `4 ~' V/ I" J( F

        ?: f2 c0 J: U  ]6 W, A. [      run->cputime=run->cputime+1;  
      9 }3 [; ~" L$ ^3 p4 P; r: u
      9 i' `; o2 J" h" _4 s7 {8 U3 z% r
    • $ O' s2 H( x) c& G
      / Y% d1 y2 w, A7 D$ x) ?- x! P
            run->needtime=run->needtime-1;  ' ]3 l! Y/ Q4 ^( R0 l2 R
      5 C4 {2 h6 ?, N: N  s! @8 D
    • # d& ]& l7 Y) X! U; s$ [
      8 g' Y! q, ]" O
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  / q1 ^: {- t8 R

      4 C$ Y6 I+ ^' n2 f& `
    • * b* j( U2 \$ V4 P; p/ u0 N

      ; x8 f6 z* T0 X5 I3 }      PCB *p;
      8 X8 w+ l! @( t& k/ I5 |1 p  }

      * v- C/ b# L/ Q

    • 0 [% ^4 f( J8 F) N& Z2 i) Z

      , l' q5 Y& H7 c- \- p      p=ready;6 p0 w, z- p9 t8 P
      4 y" l' [6 B% O# V* O) l! G% O

    • * q7 W& Z3 w* f" O$ f3 e- T: Q
      * Z/ K9 e8 Y2 W. N" R! e, r4 ^
            while(p!=NULL)  
      : K1 G- e$ f, B; u8 I& y  }

      % j  f6 p, B5 L6 E! L
    • + H8 x3 S& [3 e+ A+ W

      # H+ F5 o3 k8 x' S" _      {  
      0 m% H9 _5 A6 q: L2 j1 O9 I

      , v: G8 G4 u4 o( X: t
    • 6 l; r9 c4 E- H3 @
      / Q+ t* A* v' W# P; c' U6 y* _
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    $ I0 D+ W' n! ?$ _8 m0 r

      ! L6 x- h4 e- [( W7 M- p  K% O) `

    • $ C; V% ]) A, q/ j* Y
      ( I2 k! z5 `- V
                p=p->next;  
      # v) d! [, z* C0 W
      0 d3 S1 Y: T# J. ^

    • # ~3 U2 `+ O: d% D0 F
      / l2 B% V6 X! U( _, D1 B6 W
            }  
      1 D, p' B2 C; A0 ]" J

      2 o' ]# }$ \" U/ Y, r" G$ t

    • : H" y. }" ^( G5 Z& l

      " F+ k9 b3 B% W      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  ; v: K" _- i. i7 b* O

      4 z( K  T: I/ d7 [
    • ) P" c5 j/ \6 d; A
      " C' O% ?! \! D, i
            {  ! n( l" c8 d8 g1 F  V& y+ t
      1 m* I5 x! m$ m8 ^

    • 4 b! n* L- ~2 A. o( j

      . b+ S  l6 u' I& J. r2 c         run->next=finish;  5 y7 z* V! q& A% p

      ! `* \5 X% j9 g+ j- Q) s

    • ) ?% s: E. q# |$ ?% a+ o8 e
      4 B3 b6 g9 _7 w5 A+ u1 l' Q, X
               finish=run;  
      ; _% d4 W& E$ p! j

      9 s& m. y, R% N. C' R

    • , j0 h- }3 x  V5 O" t4 p8 q1 l% ^

      3 y- k  I" _: m  r/ ^& V         run->state='F';  /*置状态为完成态*/  8 {2 {' G, W$ X4 S

        b$ P" s/ t" e4 B1 _

    • ( |4 }1 O; X. S, g9 e
      8 m2 ~4 f0 l4 d. Q% \
               run=NULL;  /*运行队列头指针为空*/  , D% b7 x9 V% y+ O. P" a
      - j5 `  l) c) H5 s3 _' G
    • / B) }$ {2 ]" Q- h1 r4 Q

      ( W; L2 f) u, z( O# J- j         if(ready!=NULL) /*如就绪队列不空*/ + X' j5 u1 {+ U- `! F" z0 n3 Y
      - a8 U2 b! {4 a$ e
    • * |/ u- d5 ^; g# U0 ^- B+ e2 F

      % u  A  K* \9 Y# U  O2 o) G         {  
      $ S' n5 z3 z: h8 t  V
      * T& I: l: Q, N  d0 p

    • * Z; d& p7 B$ P

      4 W! ~) _) [6 Q" P$ y            firstin(); /*将就绪对列的第一个进程投入运行*/  
      " A$ U: P. b& K; N) R& c5 [$ |8 f
      * d; r; H2 w- c& a( ?2 d' N
    • 3 i! V  K- K) s9 Q, g2 d

      % y+ {6 P; m* r6 q& M& ]         }8 b/ }" Q. ^; a

      . n* c# I# {, l5 S% M; H. C! S

    • - Y/ Z6 u# P) {

      ( d2 P3 _2 X9 @5 p7 V6 K      }  
      % N. [5 U" r1 O& H
      " m. W/ ?, Y! N2 b/ u

    • / x8 [3 t+ K0 s% m+ B

      4 R& D7 O0 T1 m" z4 a# W) L/ z      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      , b# Y9 n" @: u. q7 T: B

      " ~4 t% O8 I3 v5 o: X2 K0 ]
    • 2 r$ `6 S7 i& m& Z6 b

        w& d# Q1 o) k! {     if((ready!=NULL)&&(run->prio<ready->prio))  + m9 i# _/ G4 {8 b: f2 v/ s( X

      & k, h- w; a. P, B
    • 6 ?, z' f' _" |3 _% d" d- a( u

      ) @2 N  v' m. p! F' K     {  & |4 `) v) [" h( ~2 F

      1 P# ?6 X8 l  ]/ m( z0 }9 k0 D7 C
    • ) U5 B  X4 F  q. `% _$ C) z
      ! ?+ R. L1 X3 W0 z, f- c/ b$ B; t: f
              run->state='W';  
      ( q$ [' _. O" b7 A2 i- Y# A

      : j' f$ S* q# L3 i* p7 y
    • 6 p& K0 U% G! K% f5 R) j1 C

      : w3 k; d, |( C% `        insert1(run);  
      ) Q* c3 B! `0 q: N% f1 L' R

      2 @& j) g- G& N& Y
    • * T( @' M. b; x1 X  z, |
      4 V$ E( o3 F  N3 S7 o. D/ ?6 Q5 ]  J
              firstin(); /*将就绪队列的第一个进程投入运行*/  
      0 J, l0 M$ c3 H. M3 x- |) k5 P  L
      9 m( N8 q4 `5 p. J8 u7 Q5 f/ t

    • $ @/ N, R1 g2 J5 a
      ( f0 q. F# M/ A6 ]% ~3 K2 |
           }  . U0 f( a+ B2 N$ t: V

      8 W" U* t' m8 a4 z. ~* _

    • 3 z9 }) {8 E' m  L, M

      5 @4 p% m+ ]0 T0 a, y8 K/ Z% i      prt(alg); /*输出进程PCB信息*/  ; f8 ~3 ?, a) x! D$ C

      1 o  ?# D6 t' u- G

    • * G( V. r8 k9 b6 \! C# }

      3 q9 K1 N8 B, L, j4 \   }  ' F( l3 u0 U+ s: c" Q
      6 Y9 a& O& z- z' v

    • 4 @1 r; i9 w# B- e, _
      % f6 _0 ]  G1 J$ g/ h# R3 {; r
      }  / U2 [- J3 f& U( I7 m
      & g$ q7 q8 s- u3 H3 a
    • * u' u$ o. {! U: D) _; N; k3 L

      : G1 W1 ?9 \; W! Z+ [/*主函数*/  
      % n& s/ d/ A3 N: i; @$ F6 v; f
      ) X8 C5 [( m" x* Q2 T; X/ \4 d
    • 2 R0 z- F2 h. R4 w% [" }

      " s* [& @9 C4 z( hmain()  
      2 c4 J: L- I. p# s! a

      7 N" j' a  o0 D, F- W, L

    • " k: g/ v3 R" Z8 p% J! w1 U

      + p" u0 A$ U1 F1 u7 X" G. J  M{  
      3 O0 {( X- w9 Y$ ]
      ( Q+ e. k3 V, p' e( B* D- Z- v0 _
    • 5 p/ `" g7 [" H
      ' D% |& G, D' i: P! e, |' G
         char algo;  /*算法标记*/  . _) I/ r6 c+ ~& ~
      - j. n9 a6 U$ B6 W: z( l; j, I

    • # n2 Z0 @6 ], l, H7 O1 X( F7 j

      8 `8 m: a+ C: L6 b4 K7 O   printf("输入P确定算法:优先数算法\n");  0 R/ i* ~! l% g( S8 Y

      % B" {$ R9 X1 n1 S1 W$ i; Q1 Q% X

    • - X) ~' P- d+ G& T; P
      + N9 c) q3 @4 ^( q
         scanf("%c",&algo); /*输入字符确定算法*/  ; a& Y, O7 v2 }8 g( D5 X, \
      : N# g  B: q( X9 a7 e) v- |

    • ) X7 \; O6 L0 e1 [. p0 Y
      ; Y4 G" ^) f0 Z3 F3 }8 t# c
         printf("输入进程数:\n");  3 W) g6 T: B& |- o: p/ v7 I
      ( z+ u/ y" }& k5 l. v' N" T  E" k
    • 6 S2 ]1 Z+ |. b4 c4 n  j

      " |* D; b) m9 Q: C' M) \1 Z5 ?   scanf("%d",&N); /*输入进程数*/  $ U' U9 d' G9 I+ {, A+ b

      ) S9 B  C2 }+ c, X8 {+ W

    • 6 ~- w0 m2 N  v# r1 s. p
      - w0 e8 m, E( d8 C" s* {
         if(algo=='P'||algo=='p')    `: [6 g3 q) s" [

      * d! G" a  u) D. x  P+ a
    • / S" m; B$ B. [+ Y
      7 F2 n) Z3 y. U0 f
         {  
      ' F& w- P4 z8 i, k# R% L

      5 z7 y  x8 T& P% z9 {8 b/ t+ A
    • # j' ?; A! e* N# O) B
      ) n% \$ _1 a) T, V+ F0 M! @$ l
            create(algo); /*优先数法*/  . t, N! v$ D  k

      - ~6 T. s3 z2 I/ j
    • + N& N; I( L2 M% J; s" ?
      ; a7 H! _/ X! c9 f0 y1 B
            priority(algo);  8 x- V6 `; Y0 Q5 \2 `
        f8 A/ `: `2 s" \! B
    • 3 P) A( a3 w& ^( x: y2 A

      / ^3 \7 {% p2 k2 K   }
      4 B' s* y# n+ U1 L. w

      3 Y+ u. q: t! c
    • 4 g" J9 O. y/ [; d3 a
      & }3 Q  u3 C3 i0 a
      }
      . X: o  j3 I4 n$ k3 P2 F/ U
      # T/ F* W- c1 n6 D4 N

      8 T$ g/ R& _& v8 l! \3 T7 r0 g% H

    8 G4 b: f! A6 ^4 S0 U
    输出结果:
    # X0 S& H2 _  n9 z( e, y7 g


    & j& a  Z' @8 F5 `) G+ i原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    / l. {. r5 |9 G, T7 }
    7 W! {: R# H% O# T; f& U
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-11-1 08:07 , Processed in 0.345364 second(s), 55 queries .

    回顶部