QQ登录

只需要一步,快速开始

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

    % B( W: {5 r2 `) h! E+ T2 S7 \" M% m优先级调度算法
    5 ]! J! n( L0 d. B0 ]

    算法介绍
    ) J; s( Q' S1 i优先调度算法的类型(用于作业调度)
    : s: M4 B4 f$ x/ B# c, v1)非抢占式优先权调度算法
    * }. N4 N5 P, |  [3 X系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 + X, R/ f4 D  ^0 E$ s- T9 g
    2)抢占式优先权调度算法
    2 m+ Z, f/ \0 J8 M- k7 [只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    $ [3 F2 a6 w6 r# [' l: J1)静态优先权 9 f9 d1 n) ?0 M4 G& b+ E5 |
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    . }& m: S8 ]; u3 L) S

    2)动态优先权 & p4 S- x! W8 W6 ?, K9 e( q* r

    算法实现

    抢占式动态优先权:


    . j1 h% _, g# D5 P4 ]" rPS:本人认为非抢占式静态优先权没有实际价值。

    • ! M- F0 e# ?1 l% {: d+ W1 \( [

      ; i( J+ h# D7 O. v% T. L1 |#include <stdio.h> 1 X! k$ ]2 v" d; ~8 f. a
      8 b1 `) a# N% \! S/ x; l) n/ |1 K

    • 3 Z4 l' c/ D" o3 r
      & N  x$ \5 C6 h. E
      #include <stdlib.h>  & R3 X' s& ~! U, ]% k5 b0 O; o) Q

      7 \' u- s4 i6 ^0 j( Z

    • . p$ R5 b$ T6 R4 H, H. z

      4 Z) B3 c% C/ x4 J8 f! }  G#include <string.h>  2 I! C' T0 J" t& L/ w
      $ G, K7 g, M+ b  T9 e0 K# I' B

    • ) x* ?$ N! F- Y- k
      5 T+ B7 N0 @( m7 a; f
      typedef struct node  $ Z( s# x. U/ Y0 L* R7 P: ]

      $ ]; N( J0 [4 g) L

    • : E! J5 R& r* x/ @9 P. Z

      6 E/ [' N' \+ H$ g; T3 M{  4 ^6 U8 [9 c" ^3 ]

        z+ k% W& D6 U3 D
    • + T; R  C7 b* Y' X! W+ f) {
      2 d$ C$ [# h5 x$ O
         char name[10];  /*进程标识符*/  * _$ v; {. t  X/ m

      + i7 G( c7 [  }! }6 n& \

    • . h8 C- r' S# E" ?

      3 u5 A8 @, l3 V& z/ X( z   int prio;   /*进程优先数*/  $ w  _. p9 W4 V$ Y. X' @$ _
      $ Z: p  b0 x2 p, I+ u$ d

    • # A7 B) O0 H( o+ p- C
      - _# T1 T0 ?, {6 v9 i+ o
         int round;  /*进程时间轮转时间片*/  " n* G( U  P- I! h  O* m
      ! }& P' ~9 G5 T
    • 8 i. A7 U/ j8 q1 F7 M9 u
      . k# ^  O) {' R" R
         int cputime; /*进程占用CPU时间*/  2 M5 _. X5 ~& ~6 Y+ c
      1 H% ^% S& E& C- C  b6 i

    • . h( P# `( n9 D7 Z% e# H2 w
      2 K! ~, s  ^3 ~! Z# [
         int needtime; /*进程到完成还要的时间*/  
      $ N5 ~5 Q5 E4 U- K: m! W! w- o

      - z, V. Z5 X" a5 Q
    • # \' ?" z+ ?1 W5 |0 I
      * T: h0 \& t2 K; i
         int count;  /*计数器*/  # [! ]% I; C: s0 x3 O
      4 d) H4 g& }6 S
    • 2 L- s" P+ P( R5 B

      : ]: _+ o. y! g' V/ m   char state; /*进程的状态*/  
      & D! g& {0 w% ^/ r; e& W' y4 V# p

      & X: F& a( F( {& Y
    • 2 h1 L: d5 }! i& X; V3 ?

      9 }) `/ J4 I5 \* `# B   struct node *next; /*链指针*/  . x% f2 W# g# v3 Y7 o
      ! l2 h" {3 `5 u$ \$ y" R& b
    • 1 _" n1 n* d0 a6 c# S
      $ p, o( M: S2 g* r6 V
      }PCB;  4 S6 D/ H/ L) B

      6 K: p; ~! h8 P0 X

    • 3 K. U7 I( M6 o8 N5 J* |

      # T/ M/ B% l0 b5 R- s, s6 c0 }9 QPCB *finish,*ready,*tail,*run; /*队列指针*/  
      6 D. F& P- a. k

      0 Y" W2 w: G% t) f1 |

    • : q* ]# L8 _9 L# b

      - f7 K' t# k6 i; {int N; /*进程数*/  
      4 \3 I. r, K$ a: ~  `
      ! K4 E! b3 w2 r) N7 A3 f( w1 l

    • 2 z8 D* g2 o7 w

      + R6 t: O9 L9 S1 u- n7 h" y/*将就绪队列中的第一个进程投入运行*/  
      & {) T7 {9 ?7 G! A3 v# B

      / I! t3 c9 B# K" g" |9 ?
    • 5 _; C: `9 a$ _1 A  B0 L5 E

      4 K0 l- O  C6 D2 ]firstin()  
      ) Q' i" m) D) K; t; i: O
      ) K, ]9 c( J' O$ t( L8 F
    • $ H, {  |1 u) y% q' g1 ^/ [& ?

      9 B/ {- M/ w; F' E) F5 l{  
      $ I/ k* m- d4 F, u, k9 x
      * N' k: T  I2 `3 }6 I. ]9 H; |) @/ a* k
    • 1 t. G9 O4 y! Y' F; ^

      ' S  z4 i  l2 G( Z   run=ready;   /*就绪队列头指针赋值给运行头指针*/  & t9 b4 h" y' m3 Y7 D0 V  J- |

      9 S9 x/ s1 M1 d$ K7 i) b

    • ) R/ ~+ y' Q9 x3 x( A% j+ v
      5 U/ N- [  ~" s% h* H/ ~. y
         run->state='R';   /*进程状态变为运行态*/  
      + t7 {( K+ ^' ?1 t+ O
      2 w% w9 q) l7 b% [1 v

    • 7 w, j) B, h+ G# j/ b
      # ]( }3 R. f! f) g5 ?( v0 m
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  - h) z7 b0 o+ p9 o  W. d. W
      : ^$ Q, f  ]% X  n3 _. [# o/ q# |; a) i
    •   a1 F" Y5 e/ o0 {/ K. [' r. J

      3 K$ b5 q# E; N}  
      - n3 I. x: x2 X  ]
      & I# i* L' j9 W* f1 \
    • # J" O! L; U6 G# j- f
      * r6 F6 A( c* @7 w/ J, \! ~: Y
      /*标题输出函数*/  ! d+ O3 m( O# ?8 G
      ' C$ F8 O1 L" d. m8 P, R$ U7 E/ H

    • 8 r" E2 p1 C* l! `" f# A
      : u* u3 p+ p" n0 a; W
      void prt1(char a)  3 h; V, j6 c) S5 j7 [5 Q

      ' p7 E2 }; C# [( }- x- U( u  A0 a" R
    • 7 |- |0 G! ?2 _- h/ S$ V) A

      , t) W8 B1 ]( @5 Y, J1 X{  1 P" W0 L4 V$ J) o

      * P# D4 Q, P8 k  T. h3 O. y
    • * M  Q+ L7 L, Y8 W+ n# z
      5 j  A/ G2 A  G6 n  R- g, v
         if(toupper(a)=='P') /*优先数法*/  
      4 Z! @/ h- O2 n

      ; `* S/ c& e# y4 i6 E5 r* s

    • 0 j) e; b3 j! l. Q* F) b
      ( O% F" c' m6 \  d- u
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  1 t( b7 [; H. }1 k
      3 z2 D8 Q! v/ t% }$ ]

    • 0 d3 h8 M7 C" o  I) Q

      - H! l9 R% P& h5 b   else  # h+ v* S, }% p' q7 @# {) V9 i
      % ]# \5 l7 a2 v  w6 C+ P4 `; x- W* T
    •   `) t! s* u  M+ t
      * m2 |3 ^8 r1 {( u, ~8 X6 G
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  / v0 e" @3 h' m- C9 b
      9 y% ~/ B1 E2 W
    • - t; C1 w1 P1 u3 s

      0 U: {. Z, M; T5 l! N}  
      9 @% t" @4 c% g' _! T! f' @8 D2 i: k
      * K+ \- P& {/ m* M) z+ n

    • . G6 C+ \0 _; P$ A2 f$ {
      # a+ `7 Z2 K; [3 L6 r7 v
      /*进程PCB输出*/  ( Q1 k7 t7 B. n5 {0 S5 }
      ) C8 @* n6 X; A/ ~: u- W

    • 7 Q! J1 X1 g  J+ I+ i& d7 O' R8 J
      $ v. a7 G) y  J6 }3 J
      void prt2(char a,PCB *q)  
      2 {8 E/ r& J5 g1 I& k' n
      & @+ Q0 k8 j6 r9 {# l1 W2 f, K

    • & E4 c% |$ J7 C: B3 X

      6 X1 e- }' `5 H# z: h$ y) n{  
      & Y  V0 Z& b* b, l

      ; k( [  }5 B" C+ ?
    • + o$ X* d+ Z# g! L

      0 T) x# H4 W4 K1 Q6 W  t" I3 j   if(toupper(a)=='P')  /*优先数法的输出*/  
      1 w- m, M2 _! e- F7 E
      - ~* V* m$ `& K  g/ k! `
    •   U" Q% B5 K8 e9 p+ B& L1 I
      . a  |9 i* ]# f( l, s3 ]$ @' R& t
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      - Z) I7 f& m, o! u  b
      4 U& s  d2 `* P

    •   V) ^; T: {$ W( l( k& z
      4 `/ R8 \3 @$ R9 Z' i* V5 e
             q->cputime,q->needtime,q->prio,q->state);  7 l; K* m, G/ L4 T4 N( r! D
      / C! [1 ?+ V2 l( l" c0 ^
    • ; _7 N5 W2 S; t% R

      ; {' C- F2 ~7 t4 o, r   else/*轮转法的输出*/    l, H/ U5 N& `: s
      - N5 z, P/ q& g6 J& I: x

    • ! z4 O0 v) a1 S( Y/ }* n

      1 p2 S  [7 v5 R/ M, h4 ^  B      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  6 p' F) x: v" {: B; H
      ' V/ \0 X) h3 f8 h/ S' O
    • . L8 h1 o% I: h8 A

      / n# _1 u4 ~& c( [; v3 O3 X       q->cputime,q->needtime,q->count,q->round,q->state);  
      6 L4 |( F" H! ^& s* `2 ?

      5 N: S* g( z& h( G$ C

    • & h6 O3 O8 Q  @2 h

      " x. D, t6 z" p0 t& W. S- r}  
      " Y! d9 ]! H( E) c6 I, s0 Z' G

      " `! z: a. a& Y5 r' @

    • 8 P7 G; m& h1 l& o

      6 B2 F! @: T6 i7 j9 X/*输出函数*/  
        e# @( r2 j4 i6 I0 P

      0 `& C( \4 X8 c2 G2 E  s

    • ! f9 E6 U0 {5 R7 A0 |" `

      % g0 Y( S4 ~, u9 t2 |& l% bvoid prt(char algo)  
      2 e- }! F/ U3 O: n4 Q
      % ?/ f; T, ?+ X! J5 }3 C

    • 4 H- v3 p0 j3 n- a: s
      3 j0 d: y1 w4 S* p5 D
      {  
      - t* N+ Q" d/ ~% x, A+ s3 r+ L& X7 y

      7 D" @" l5 r5 o  [# R: L/ R

    • ! M' ]/ ]5 K/ P8 ]& s

      6 n; A$ [* z( N% ?   PCB *p;  9 M  v( O) @' m( I- k( f. }- r; G9 e

        H+ f9 l) ]8 m9 Q) ^' h6 Z/ v
    • 8 s$ r5 ^5 n5 V2 o4 u
      # @5 g6 q+ Z4 \5 i# t' g# G
         prt1(algo);  /*输出标题*/  
      : B% k! \) ?! M# d9 Z
      : D& u3 j# b. l8 {' x
    • $ L# x) F" c. V5 \8 h( W
      1 N6 \8 a6 g- R' l
         if(run!=NULL) /*如果运行指针不空*/  
      $ n$ u/ T- N* x5 j  c4 r7 H

      % k1 _0 k% n4 P3 I
    • 9 J& S. g6 V! Y% I$ {% j
      % N) C( `2 k0 _
            prt2(algo,run); /*输出当前正在运行的PCB*/  " c" ]6 T1 q& m2 ]- T
      - [3 A  ?: S% A( g9 K! W5 d
    • ; n5 C" ^) n( t6 A7 W7 Q& A. o& g
      ! ~/ g* j2 U+ F& t$ v( |& I" q, J
         p=ready;  /*输出就绪队列PCB*/  1 d) C2 {9 H$ Q5 A
      * s" [! J1 C2 N, h- b5 U1 v
    • , \( |7 s8 K. f# X' |2 ]0 p
      5 u. ~% V5 d; c& d8 f( K. x6 ?
         while(p!=NULL)  0 [; P; [& Z, E& f4 W* [% G

      - s7 }. x" f3 ?1 Y# i
    • ( f# Z/ ?% X2 e" f4 i/ p. b- i

      $ P9 ?3 G: m5 q, j' f2 u7 u7 l6 P   {  0 x5 P1 o3 U  C. ~- P

      8 t9 Q, |  K; F9 x

    • 6 R" C' }5 j0 C/ o3 }# V" t

      " E( y5 Y' N4 W! K4 m) H2 g8 J      prt2(algo,p);  
      4 ?4 H7 d3 h% I: y0 G% v5 I
      2 _0 H& a' h. P

    • % B" w$ j- V+ A" L  v

      0 Q& r( k* |8 s% p4 q      p=p->next;  
      ' ?& D2 a& W1 n( v; {" @6 G" x3 X- e
      " \& C; Y* p, R$ y( ]

    • ( m4 B4 g$ p1 j$ ~, o* I; b

      # n: c( h$ Z% r2 n4 I   }  
      ( O" m' v' t  d2 R8 B5 }5 ^
      3 `( }: u  e8 `9 \1 ^
    • 5 ?# n. C3 C% j! m* X8 A/ y- i
      6 A4 `$ E! B6 Y: J. l2 I3 U1 u
         p=finish;  /*输出完成队列的PCB*/  6 [$ ?" m0 I( {( i8 z' j) j
      ( ^! f" {2 o6 H# n( T/ Z

    • 1 `* X8 |3 ~* s* J. r: w: `( F

      , ~7 {& R# a  U; z   while(p!=NULL)  
      5 N- j) D, P6 j- A( F5 H6 O. B
      7 s: X+ R) L) M- d7 {& a

    • - k0 @, B$ H: e. z! ]) M

      - w2 X0 i: [4 H: |3 [$ g& j   {  
      9 b+ p) L* q6 d  P' k; G
        i9 V' H  D8 E7 v0 A

    • ) T3 Y3 X; M+ r$ Y
      ; S& s4 r7 ?4 |5 A
            prt2(algo,p);  
      6 m/ ~, `: W. @, u4 z+ c
      2 k6 s1 }" ?+ |' t+ u

    • $ R& r' H6 @+ U! g$ U2 g

      " [0 X/ P+ k* H( t, \6 @2 ^      p=p->next;  ; \+ b( X: K5 C8 Z5 }; y
      5 {; s/ `) B* ~4 r# u9 L- j% A4 r4 {
    • , v/ Z" w- |# Q! i: I0 J; W
      " h. q: @7 P# z2 v
         }  ) O* m8 X) ^  J( T# R6 W$ \! v, R

      6 m" W7 h+ E% Y6 x

    • ( V9 c" s* I9 `& J
      + I# K" V2 f, E$ }: M, |
         getchar();  /*压任意键继续*/  ( k9 I8 H" w7 l, A! A* Z
      . E; `7 O. ~' X5 F7 t
    • 3 d! d* G, p! D8 a0 b1 R+ W
      ' R# R, L$ `2 x, D: u& j
      }  " i5 {( v% @$ U* ]7 Z
      , k+ e0 y4 [8 {! C& w& ?
    • - R, G9 }: E; @$ k5 X

      % R: d, q  x* d% c/*优先数的插入算法*/  
      / ~) M9 `6 v8 D) w

      9 W0 w0 u* s: X

    • + N/ v$ Q# X. D2 Q9 N1 x
      3 s# C  Y" p, E, _+ S
      insert1(PCB *q)  
      $ ^( O, X6 [, ?! W: \9 D, @

      & g5 \0 R1 t9 T# {
    • ! K* K8 C* E: G) v4 v5 {4 m3 |" O

      7 c" z, i6 l) u4 b# O$ O0 r{  5 D- t4 Z+ E7 K8 K
      ' N5 N5 f' m6 J+ L' y

    • ' M+ n  ~% M! W: l

      " K7 |* n/ I7 \5 q5 T, F; i4 B   PCB *p1,*s,*r;  
      ' ~* Q/ t$ a& k, d0 w
      % R( c+ B1 a: v' p: Y+ t& @
    • 2 C8 `' `% M5 l( {) B

      . ~1 s+ u# C5 q5 p' m' C; \   int b;  
      $ ?$ d& p1 ]' ]$ Q" w

      , \* d, F6 Z; c2 @4 m. U$ ?# K: k
    • % G+ R2 g: |: k  f, h' j
      & S' L8 f6 Y4 e# ?9 f. d' q$ k
         s=q;  /*待插入的PCB指针*/  4 m- z  R4 r, q7 p9 D$ R

      5 S) Q6 E, L& o! |5 Q5 a+ w1 A

    • 9 V4 n5 V1 ~0 Q& m
      6 [8 l! r$ O! P  y$ U7 [- L5 l
         p1=ready; /*就绪队列头指针*/  
      / E5 N' ^* x" I
      5 E2 `) G% z$ s

    • 1 J0 H9 @  L$ v) m

      / f# ]( Z. W) D   r=p1; /*r做p1的前驱指针*/  8 W/ |' k% Z5 [' H% [2 N

      . R- F7 v0 Q; Z2 S

    • 0 S1 [' w  ^$ L- R& @" |
      ; K# y# ^4 ^' O) L
         b=1;  
      3 {2 e( c3 D' [/ M( G6 y

      4 k3 I; m  _7 R5 f; E4 R; u

    • ) _1 @, G' R# k, }! L( l
      3 T4 I; O4 L/ f, T
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  ( ]$ A! n/ k3 f4 |3 l6 }8 L, O
      # A. K3 P1 D+ g9 k+ @# f( J- s- g' O
    • - J. |# r& C# F# Z1 S) a6 s

      5 I7 y. u) e# p' ?( i/ R      if(p1->prio>=s->prio)  
      7 C5 O  @$ j* a1 O( u; f* F
      . D# w. g6 H& e4 G9 ?# t
    • 2 ~' R, F; m; ~! ^# A4 W. V$ J
      ; u2 A" W1 Q& g: x/ \
            {  
      0 r: D- G! H8 N: \! ~' q  r
      ) g- t4 s' B7 S! U6 ~2 C! \

    • 2 @! u$ h3 p* b& n) C. E4 U
      # ]' B& z7 I6 i
           r=p1;  % f+ Z+ J8 Y/ G- o
      4 J& B, ^, }" K" |4 c7 H7 J! m  X

    • : @, M4 U: f  Y2 l; @8 B2 x) h
      ) `: |$ F0 M: S$ R- n; c
           p1=p1->next;  
      4 t, w% Y" |& W

        l  ?2 v, P2 q9 h4 F+ S& J

    • 2 A8 h: h1 B4 b0 F

      2 R0 e2 x. H6 ]      }  
        l0 b# b1 P" d7 D) }% n7 [) t- @

        g0 b# W& c& c2 f; N' w- L
    • % g4 k5 v: z) P) \3 o/ X
      % q, x% N/ l# D+ ?9 [
            else  + M; }. E1 h2 A7 C' }, C8 P
      & X  m: B2 |7 j$ H) s& ]
    • 5 X1 n) k+ F  W( P) _

      $ B. A5 V; |. M, f, t& J! m     b=0;  ) C/ B$ Z# F! ~5 e
      5 `+ e$ J* r7 E& c% C' V4 D

    • 8 E8 S* Y* p: e5 C' M

      1 `' K( s+ S  P4 B   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  6 e( o- o1 W( z( S, _
      0 s0 K8 n! P) N1 ~4 q7 J

    • ! W% m' _' k/ r$ C8 i- F

      1 T( P4 ]% i7 J' O3 @9 A/ z   {  5 Y& y  I$ c% T( @

      7 Q: v' N: j0 Z2 B& ~1 Q
    • $ \* k% F- W$ u9 p. A
        X2 j+ W! ~, \' ~: q
            r->next=s;  2 Q) p2 y7 a# p  [" ~

      5 f% G' |$ k5 L# V+ u

    • 5 s7 \% E  d# j, p( a- |. P

      9 ^$ f9 V% }7 M& V- m      s->next=p1;  
      ' p( e0 ?+ Y+ T/ f! k9 T3 q, C9 g0 g7 Z
      % m+ O  e8 a3 @; z
    • 1 ^& ]9 f) [, [, x

      5 ^  g0 r8 a5 R3 [! `   }  
      ; q2 h  j* e9 q
      . h& Y6 X; z) q; `: w
    • 5 s% f$ d$ \: I, ~. O7 h1 P
      7 H5 F* B/ U* K% s. B( G" V
         else  8 Z  ^2 ]# o5 c

      & [! z0 K4 L+ T3 y, Z& |- s
    • % z* V; L% [, n

      . X( p( z  t; s7 V, J, Q+ T   {  
      2 d" v& G0 G: j# M+ k& ~: s: [
      - J- i7 P. m; p  H+ {
    • - G7 z, j$ l; E

      & M# u  x, S4 _3 a2 e1 g      s->next=p1;  /*否则插入在就绪队列的头*/  
        w; P9 S* n- z: g+ @

      ' i! f( J/ Q9 ]$ Q
    • 9 G! o) p& q) K* ]
      - y, r: P) n' `. A
            ready=s;    ^$ t- v4 G9 _  ]! j( S. Y0 y  n7 @8 m
      ! C1 R% C- b$ c

    • $ D% e4 M( x' \& W. f3 T
      " J% d" d1 r- u" n$ q
         }  # N( K) Z( O8 J7 q( T2 v$ \
      - }+ ]# [& N8 f5 d% ?& S
    • 0 e$ l. j1 E8 C3 U' j

      6 l6 T4 C5 M  |( G" w" S8 m' @% e}  " R/ N, ^% Q% v3 T/ T3 v, m8 B

      ; [* q& @1 h$ c9 P; `, ^7 X8 d4 W: T

    • , M0 d. v( l, Y  \$ _# k" Q
      . {; s" P. q; A5 P, k- N0 |
      /*优先数创建初始PCB信息*/  
      . M( Q) e. b1 z4 X- m

      : |( c. i4 S/ c$ \( \$ ?
    • . F' A5 s; s! M8 B+ o2 J! I
      4 v8 T6 U) \( V% `
      void create(char alg)  
      ; k  E. t) F( b1 `# ]5 `

      / s* r: U* a2 e# C  Y/ w

    • ; Z- U. j4 l( e4 h. w

      9 |8 H7 s( P; {7 o* p: q{  + K0 F( l4 h. S. Y' D# E

      : h2 ^3 W7 J% M

    • + _4 ^6 F% Y% H0 U  H6 e) a& G

      . `$ ~+ c7 u" o( K: Q* {   PCB *p;  . u5 b+ B2 B. Y) X

      : k$ P- m9 J4 ?; Y% j: V
    • / |; F& ]: K  R$ {6 a
      : q* p1 N: L+ h$ Z( }
         int i,time;  ! ]2 q8 y* i  K# z' E) ?# a
      8 E: s6 U. G- f. T2 J

    • # K5 H1 A0 J, }6 g9 F
      : ~* z3 L0 }7 ~$ t
         char na[10];  
      . P5 \5 C  m4 g0 A
      8 g* O5 N* _# j: k# G! `4 R

    • 7 ~" k. c( H( ~5 t6 G
      9 A( h4 K) _. S0 a+ E2 G
         ready=NULL; /*就绪队列头指针*/  
      ; Y1 K. u) B' L9 N. u- Z7 m$ W5 @
      $ N. b- t4 ^0 d. I% _# G) ?- j

    • 6 i. R5 N/ g0 V7 K

      ! }! d: }* ^: j! L7 M! ~) V   finish=NULL;  /*完成队列头指针*/  ; d$ W* l4 w- R1 z1 D7 f
      4 W; B- \$ E! G- U4 s% k

    • ! g" X1 ?( Z1 ?: z5 D

      & a; A% q, `* z+ B# A- k5 Q5 B   run=NULL; /*运行队列指针*/  
      ) ]$ @5 z! a# F8 [( o, ~$ y3 H" K

      / Z( Y/ t9 T$ b: r
    • 6 E0 c5 J; f* W9 B# W

      8 C6 x# O# y$ L" z# Q  s   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      , F* ], _- M6 m4 f/ ]# w4 M; k
      * d* ^7 S2 E+ j1 s
    • ( ?, w, [; M8 g) _( A3 z% ^  \6 G

      ! }" I. Y+ w. t: I( m+ M   for(i=1;i<=N;i++)  
      ( M! e  Q& a& M

      % I6 R# E6 \6 R/ u4 ?. |. f6 |

    • , m# p7 C$ F, U$ l% v* h  J( l
      * Y0 |2 i  L8 p3 k. X5 M
         {  " d  `, ]7 l) P/ ~' ^7 w. f
      0 ^. g+ ]2 G' P' U0 F& i

    • . V6 o: U& ]4 `

      ! s/ v8 ]) ]3 [3 {3 D# C% b% }      p=(PCB *)malloc(sizeof(PCB));  + G% J, h5 ~: B9 M

      6 p: ^" P% j, }, h4 x1 m8 p. e7 n
    • 2 J5 X- P2 y) \2 [6 K) a8 y3 K0 h
      1 _2 E- Z$ M9 P
            scanf("%s",na);  
      + ~! ?" W1 h- {( s: Y
      7 w3 U- r/ Z6 m0 v: Q  \

    • : K  w1 |8 [2 k+ C/ Z, c& a
      % ?* g4 [6 v6 ^1 c# A
            scanf("%d",&time);  . j) b! h: X( g) F

      : i+ Q& W0 m, y4 J

    • 8 `  C' K6 q) ~. X

      " _8 d( J7 G0 ]) h; T7 ?9 X3 a      strcpy(p->name,na);  
      ) X/ g* |9 B" r/ H- l

      - z/ u8 _1 I4 c8 p0 G+ q5 @8 r& r
    • % X: @9 r! i2 I( O
      ' k5 I1 t# R; B" n5 Q
            p->cputime=0;  : U+ i% l2 k' A% N  U
      8 l. h: {, P* S. j; P8 C
    • 6 S+ v3 p  q( t3 @* m* I2 L
      " ]' F: v: [% q7 U; G
            p->needtime=time;  
      * H% _: c3 l! w' e. W6 N, H4 ]: [
      : ^8 F* }2 L/ o7 d7 O' A

    • / N  C- |- s- b+ I
      2 l, y4 n# g' @% ~4 |8 p
            p->state='w';  
      : Z4 k: m; q$ \6 R( ^

      ! c$ o+ z; m  \" f

    • / g3 s7 o) j5 y1 U2 w
      8 U' V9 h4 @2 Y9 X* V+ m6 V. O
            p->prio=50-time;  
      & o5 ~# \3 r+ N  j: {

      1 @% K  w3 a- R' j( y

    • ) \. k7 k! @2 C" R9 ^# c1 T9 c
      0 `% o4 C4 e7 n7 A* w
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  + R, J2 W& I' A* K" _  u

        M4 v6 t7 ]6 x& Z3 C* d
    • : q! Q- Y! P) u! m& d8 y& u

      : M3 S% {8 I* K7 w     insert1(p);  9 {) S9 r/ z% }9 J5 l5 Q
      ; U0 m; M6 b& g, W0 E, _

    • ' @. R" ^: G1 z# f

      8 Q' u5 t& c+ O6 n6 k6 c( w      else  
      9 z3 e# [$ P5 s

      2 }7 k, c" x' x" |) G$ j' T

    • ) s, P8 r" R$ a* ?7 h  b2 d# W: t
      8 v' m, s4 U$ ~5 V$ s2 m
            {  $ {% }1 z" J% Y
      + h' ~  y2 G$ U( v# i  E: h

    • . _9 G/ ?7 N2 B) N
      ; _" T9 V+ u- k$ E( s
           p->next=ready; /*创建就绪队列的第一个PCB*/  * h) O- T$ l, M' g+ B
      & c+ k! }6 h# v! e! A& ]
    • % s* ~8 P1 x+ `! X0 L7 c
      4 |2 E8 E- ~1 n$ O
           ready=p;  ' u8 T' F6 ?; a/ m$ q
      ; t, l9 p3 {! l: P. s( b0 [

    • 1 b" J9 ~8 i5 \9 `

      ( b- f* a2 d7 Y# B; r      }  * V" v/ o9 \1 _$ V
      $ v/ P( G3 F( a& ^" A3 o8 ?
    • 8 ^. e( A! W, L

      ; Q* Q" t. w# ]" H; _' o4 z   }  
      , E4 ]' F9 d. y5 o, e+ ^
      7 f, \6 e# u' ?
    • ! h4 d$ ?7 I/ }! |# y
      0 q/ @7 a. i, W# |9 u: l8 A
         printf("          优先数算法输出信息:\n");  / i3 {) i: l6 S5 ]' u5 t" p( b
      6 W( h5 P  \9 v& J: `$ I

    • # c* }: V0 q  I4 f. f

      " H; t' {4 R- Z0 N  Q7 @   printf("************************************************\n");  % m- [. u! l6 b; g7 j( |

      , S" _7 A, R: X; O" y8 E) k7 {. I& X
    • ( n" w% E3 `3 h% V8 Z# @8 E, Y" b8 x8 f

      0 [1 z; G/ m) K8 P- t( p+ G. n   prt(alg);  /*输出进程PCB信息*/  
      2 ]: }7 O3 v) V  f4 l1 X$ Y2 i
      1 r1 l! q. G9 P) k( N0 F) J1 b2 _

    •   s" c& @9 b: a! b
      ( G7 m$ i+ ]% z& w7 L. U" @% {
         run=ready; /*将就绪队列的第一个进程投入运行*/  : M0 [9 _0 w% r5 p  k6 [/ F

      # a" c9 n7 A; ~) {! I+ ?

    • - g' Q" V% A# P1 ~3 |3 Y6 d. o
      7 D& t- _+ p: _& V7 D
         ready=ready->next;  
      & N7 j( r5 }7 W% h$ I1 N
      - }3 ^( }& @# c4 @) w; n

    • 5 `  Z# J, K! ^( u0 K: T

      ! M, n8 Y' P( d, \7 L   run->state='R';  7 Z6 }) z1 [- D4 f& X
      6 ]& R+ ^% F7 w5 z# _: R
    • / @' F2 F! w  b1 \. y- y

      : A: Q* `1 _; B( Y9 A% D0 a}  
      , R6 w1 e# `  Z& k, S6 m$ f

        R  n: H1 z$ f6 }0 c

    • : j& V4 ?: g" B
      9 g9 N) `' }$ ?5 V  B  D; t
      /*优先数调度算法*/  
      $ e3 C! ~' K; h- S( X* ?4 e! i

      + @/ m8 J/ @2 F; Q( M
    • . h8 I* f# a; w' c* u
      # k' t3 Y, E1 |* ]9 |( ?* d! Y
      priority(char alg)  9 E4 j' h; ~  t

      0 x2 ]8 A( i; s+ J
    • 1 H" A& w- I' C4 k* D6 W, P

      8 J: ~7 e' Z) V& G3 W; A{  
      9 s2 V6 I( w5 P- `  m. R

      / H. N6 x* N1 F% I: k
    • ; K" \( k  j( Y/ W4 A
      / x! ~/ B& ^2 U* V
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  # \9 d; F) R5 H  X
        A8 D6 l/ P5 c% D* K
    • 0 T3 [. H8 O5 h5 e! w  j( O
      ' P/ q  u7 K. G' ~& H# O( w. `
         {  
      ' ~, s- h  k% N1 [& f  T# V- p: `
      : t6 d  t6 d7 O, x+ F' f% Q
    • ( f4 E2 ~* h6 l' g( p% T( g
      # _) c6 N+ M8 }9 u9 ?
            run->cputime=run->cputime+1;  ( ~4 W/ L" H9 _$ o: I

        _. t/ l& h1 s. ~+ d. R
    • % d! z" N5 b6 B* c* O+ h6 ?

      2 o+ ?, d( q; C3 r/ F" g      run->needtime=run->needtime-1;  + F+ [0 A  K5 m* ]9 b5 I

      6 g7 N: p0 A0 L  j
    • 5 w$ V- A$ D3 _* j

      , f- ^6 i) L. H/ p5 \8 ~, y      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      ' N& X0 g) K' N. G: G8 _
      : m& u4 N2 K) G. X! [7 i/ K
    • # ~2 y5 p' |0 u$ C1 r' R% e4 Y2 L
        }& x+ w8 V0 l% h- t
            PCB *p;
      0 W, p$ b( j- b- C
      . r5 z# o; u+ [; U+ W

    • # x1 q* L! j: v1 v- ^+ ?

      * r& v+ J' r9 J5 _5 e      p=ready;) V/ `* K+ d+ }! i5 N! _

      4 [4 e" W; J; o% R# }# E
    • ! l! p3 c* w% q/ @

      8 `* P  G- P3 b0 Q" ]      while(p!=NULL)  & V/ F; M4 ]0 Y# c+ u

      $ g- {: ?. M! _0 v, l" o/ X
    • : T8 Q" C" R  v5 B% V' \

      ) [2 J) U( H4 h" P6 W% D" o      {  
      + T) O' d7 C% ~: K7 N$ w

      ' U" b& s% K, x" d, g

    • / g  t( @* u" }% v% c0 d+ {
      3 w, K5 o0 p+ W* L+ g
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      3 q# W. |: p/ ~) O# ?  ~
      - K6 o7 G2 ]3 s  J" D& t* K7 S4 @
    • 4 b  w1 z/ \/ A8 x. u' I# Q4 j) g/ r1 h

      * f. s' ^+ K* v# h7 j' U          p=p->next;  1 N7 e. D: ^5 P" `$ V3 D- r

      0 l9 {7 J8 q8 {$ K

    • ) l. `$ K9 x+ Q. {3 v1 `

      - l6 f* t7 ^  n! P. q' o7 Q: u      }  " J/ \9 |: h! ^

      # V) |1 b  r( b1 |4 e0 ]! e+ A) W
    • 2 @) }) S1 T6 c

      4 ^' c+ m2 e( I9 m# j* G      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  1 v$ ~% [2 W" R0 _; i0 p) P

      6 O+ L: ]( d3 R# D- N3 h
    • 4 G* y# k. {; V2 g& P0 s) ]0 \

      5 G3 t; ^! k  u$ r" V      {  6 Y  p% E: n/ H4 d
      5 w" e2 ~. C" U4 g, F/ H

    • 8 r( n* g9 ]3 t( m8 v
      / Q4 e8 u" C& e
               run->next=finish;  
      % x5 E) i2 i7 g- F+ h
      6 A" `4 a& x/ e, c% D. {

    • ; \' C. L: b& I$ m
      4 r% o% J9 j' X6 k9 I
               finish=run;  
      8 U* e7 ?& ~( m3 m. i
      5 j! A1 r3 S  Z& C# C& _

    • 9 c0 R% F/ M! B5 e
      6 ]$ Z$ Q" S4 r: j/ ^
               run->state='F';  /*置状态为完成态*/  
      ' h7 Y4 |0 {' l5 C1 L6 x4 U
      4 k9 j4 z' Y* c3 r9 J+ ]) \
    • " R/ Y6 k# `+ G/ R& _$ f( X( K
      3 G" [: {9 w9 Z
               run=NULL;  /*运行队列头指针为空*/  - \% ]8 t0 S) `) p) m1 u* R& ]6 s
      7 ]' j; D. X( L2 z- Q6 h" ^

    • 0 m) F( ]" ?% @* w

      # f4 I, `% r3 ?% P9 C& _. R$ K         if(ready!=NULL) /*如就绪队列不空*/ $ O: w  I  ]7 @$ `

      % k& G: [6 h+ h: x  k4 ~3 ^8 x; g
    • 0 E) p3 ]) ~% F9 }2 B7 O' f3 \9 C

      # T/ S( r) E8 e5 g( |& E! Q8 l         {  , C. E2 Y: ]: w, R, n, m& X( R

      4 z# D5 Z& C( a
    • 2 s. X# S$ R0 Q6 C+ l  R
      0 T* m, m! i7 Y
                  firstin(); /*将就绪对列的第一个进程投入运行*/  + P+ H0 {8 w! Y! j
      # y/ A' f5 x) b+ G5 o

    • : C1 ]* N- w; M3 B. B2 o* X

      6 D, M$ t- `& n+ m8 J  v1 k         }
      - i) _2 y# X2 x8 c2 t6 \4 l

      / c) k: {) Y7 L) h4 h
    • 5 j& ?; t+ V: }* T% o" i

      % p: ?1 h! l5 I# s) C. ?% r# u      }  
      ! p7 d2 N3 n# T* k

      ) S7 @7 t( n% p2 H4 }2 [

    • ! }( D9 c2 Q" v# q4 z
      1 a0 O' M) }* E: I! y3 C, R/ O
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  / V  p) ]% I$ v: m. r8 n5 c4 I
      / |9 ~$ m& c9 W1 l( S

    • 9 c# K' L; s# ?
      # j$ ]/ p; y+ k0 u
           if((ready!=NULL)&&(run->prio<ready->prio))  
      9 C8 F0 B" P% D9 m3 T) C" P
      + l6 v) p6 Q6 I: I5 |. B. ^- @

    • / L- I% ^% n7 @& {
      8 f! J* e$ G6 v" M& u4 h
           {  
      . i1 S/ ?7 t/ P6 [/ O
      6 B- w- K! b) [
    • " }7 R: S: Y5 G3 f# f+ n8 r

      6 J0 J) @% I1 z3 p' S- v        run->state='W';  
      ' \8 F; \- c! t) c' o( I- n/ A8 Q
      # |1 U* ~" G# \4 {# ^
    • " ~) y: f/ G4 {8 o8 I8 C7 A5 C  t- Y
      3 M" p0 n7 d- G4 Z
              insert1(run);  
      6 v: C& H: w& N! e+ @7 w
      # x3 h- E+ M7 V' _( `

    • + Q9 b/ F3 f" G/ E! ~" E# i
      ! b" m6 ~- E9 M3 @- t2 G7 g
              firstin(); /*将就绪队列的第一个进程投入运行*/  3 i8 t8 q; _6 u" T! W

      1 m) b) R! G- T/ A" t3 {* r
    • 2 S& E- |% e( w2 A. s

      0 ]" ~  A: ]/ F9 h     }  
      5 M5 L7 s" P4 k, d! ^( \

        |* L, V& b! z  F1 J' S

    • 9 X2 F' E0 }) P! q) `1 r5 E

      + b1 a  W- I0 ^7 D) p0 Y6 ]      prt(alg); /*输出进程PCB信息*/  
      3 Q2 w1 e" K4 E+ E& V8 v
      5 N; q- [8 a9 O% _/ p$ n4 E

    • # Q2 O- R1 v7 t% G" E

      9 c0 b: u; Y- H/ O1 \% M/ C6 P   }  
      + l6 P8 ]/ @0 r' j- ~5 g7 R* k

      + P  ^9 r2 Q7 a0 q* p
    • 9 H. @) x; u5 H3 \7 w' ~
      0 I" f" S0 P9 ^& ~( E
      }  
      ( m- K6 v: R" s( @* M3 p

      9 ]! t- Y" M, n' g

    • 8 X) v; K  B* u5 E% i1 N% s+ ~, b
      - j' @$ q. @* ?4 I9 Z/ l2 @. R
      /*主函数*/  
      8 `" h+ f6 x$ N5 r- G

      7 H( e; \* W5 l) @4 x

    • % D5 m! h- g$ D' R" V8 J) Z# u

      $ V% i) v2 ]' u' M7 x+ V( cmain()  
      ) e# G! n0 V$ X, j

      , y0 u: a# a& k  @5 t$ C7 ~
    • ( k) P: C& ^- g4 p6 w. J1 b
      0 b1 M% [- \% q3 m. S. K& z
      {  2 p5 S; e& O! Z! i9 n( x0 I

      0 a1 Y, I1 n0 q- Q0 e
    • ; B7 M' h' M" l0 X! G

      ( e9 _1 i' J. h" ^4 V  |   char algo;  /*算法标记*/  + k! ?; S1 q& F: m
      - t) ^+ k( e* ]" j, I! g9 t
    • 0 Z. N7 P) A, N: t% |% H

      * {- m( y1 a$ O; u/ H- A" d  R   printf("输入P确定算法:优先数算法\n");  
      ' M" X8 z0 O0 y1 g$ I" \
      , w1 O. q9 S6 [& G9 r
    • 8 b+ e; P3 A" D1 F! W9 ?

      5 P! Z/ Z( w0 O+ L   scanf("%c",&algo); /*输入字符确定算法*/  . g! g' J- i3 A- q5 L: i5 G3 z9 Q/ x
      0 e' ^: s% k; Q' w9 U4 E
    • % G2 F9 w3 N+ _5 s( \1 w7 J
      4 x* {! j4 E% `+ {# \1 l
         printf("输入进程数:\n");  6 i5 R6 l& q; S( B! w$ W3 L

      * y6 v! ]: ?! I: b( M# X! i: R, ?

    • 1 |& R# s! g: `+ j2 N% p6 N6 Y# n

      ( ]+ Z# N; g: @, ~   scanf("%d",&N); /*输入进程数*/  % g0 s, \; K4 K+ ]6 |

      9 e7 `  z- n* |' T; ~; ]+ Y
    • . m: T) d6 U' Q# L

      ) `" @5 h' |  ^+ }; ^, J' l   if(algo=='P'||algo=='p')  
      ! E7 x; C) B5 \8 G
      2 A" b  {9 e' q  P8 J  h

    • ; E  }% w$ n! j) a8 I; Z$ F

      / B  U9 {$ T* C6 {* p   {  
      ) }# B8 t  l5 i  X2 a
      ) }+ ?5 }" ~; L0 m2 @

    • 5 _3 F% i6 c; `

      . \& q, s% W. d$ s9 J1 F% @      create(algo); /*优先数法*/  4 D5 ~: p. w/ _6 h: r8 }7 m- o

      ; c8 ?- _# |; R# o+ f, i

    • + \( o- ^% ^# E3 _
      " p# z3 [! ?* \( b4 q6 k7 h/ ^
            priority(algo);  7 ]$ Z7 c- y% Z! A# y7 w, g( {$ M# R

      ( @' `  w: ^! O

    • 8 i8 [# C, X; W  r- C
      " K4 `5 J' Q9 w1 ]
         }
      ! D1 U3 A6 Q6 i% o

      3 V5 r) j  B( d4 o" L

    • 3 ~: r  G6 z" o4 Y3 [

      * H+ I+ N! T8 c$ Q1 }4 E+ d$ J}
      / j/ V  f4 K: e3 O( [
      ) M$ T, s& ~& z+ P( V7 {2 [; b

      - Q- C& a  K9 _


    ) T9 N- W  W9 N* N& K; g* i, d输出结果:
    ' ?3 Q" U  I+ I5 V


    " d& }* A# d& S) _! |. y# E2 |$ r原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    3 K* R; O  H  l2 u. B/ I
    ' D6 \' l* \( ~% f8 l2 [9 w, ?
    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-25 04:27 , Processed in 0.920832 second(s), 52 queries .

    回顶部