QQ登录

只需要一步,快速开始

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

    . Y* a; v7 W8 {7 O优先级调度算法
    # c3 Q! x  ~9 u0 R. W2 i" o8 L! S1 f5 h

    算法介绍
    ! ~) Z3 Z: q/ G0 D优先调度算法的类型(用于作业调度)
    : s5 y+ V& j; ~6 p0 p$ ]1)非抢占式优先权调度算法 * L) P' n. J3 d
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 ! y, N3 L' z# A* {8 l
    2)抢占式优先权调度算法
    2 x/ Y) e- P8 Y& Z0 n; E只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    2 H0 K$ K* A1 t8 u: m4 O4 ?! U& d1)静态优先权
    * }! N* R' x4 d静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。  E! z  s' M3 ~8 s

    2)动态优先权
    ; _  Z; p! n# @. Z: [

    算法实现

    抢占式动态优先权:


    4 g. m- `$ O/ LPS:本人认为非抢占式静态优先权没有实际价值。

    • # H, t1 g1 s, \. s
      9 ~" i6 L5 H2 h( O& h2 j
      #include <stdio.h>
      0 X8 C6 d# w8 |3 `  C- u6 c

      : c+ N3 B: A. b3 Q

    • " C- Q. S2 l+ s) s; w3 y' x% L

      " {% Y4 K- a" e" _#include <stdlib.h>  # \' {* C  ^  P1 [, U; O5 z  G
      + q# f% v& N, [$ k) G! y
    • ( B3 \6 D) ?- N2 u% ~7 i: t
      0 c+ n; B+ t6 N7 K  T
      #include <string.h>  7 {' H" h& H  i/ }7 _0 f

      ' ?  ^. G9 W. `: w6 @( Y9 l$ H2 \
    • : e9 }9 }$ ^' x/ k  N6 H

      # Y2 k) c* v9 wtypedef struct node  
      6 o' C+ T( i1 B
      ; E5 ]. [( U6 S& b2 j* P5 P# }
    • ; M) D* O9 E& ?2 K. A

      6 Z( ^6 p6 f8 Z{  
      6 K- z$ x3 o3 f4 A
        e  x& }# F' y8 p
    • ) M; @* z9 i9 U

      7 T/ V5 T3 w! Z6 }$ \! m: G   char name[10];  /*进程标识符*/  3 G4 l* F/ b/ t7 {; [& u- d/ D
      ' m; S# n( a8 m9 A+ Q6 a

    • ! {" ~" I& O" C( p8 }

      , q, g2 F" P! ^7 O2 H   int prio;   /*进程优先数*/  ' q! n  H% ?# Y3 F

      & ~3 ^/ D- H, j  F

    • 0 w) u" E, _/ p8 o* a1 Y( T. [1 V

      + {' e7 U  N: d0 E   int round;  /*进程时间轮转时间片*/  & U+ _3 p  k8 R, k! R% t8 u0 l" h8 M( d4 Z

      % o4 `) C7 `2 t' O% C; j: ?) \
    • ) D0 D9 ^. k# F4 A
      % g2 Q2 E! A" F8 R
         int cputime; /*进程占用CPU时间*/  
      9 I, E% \, I( d
      ) n& Y9 w' x$ E
    • . j  X$ b( q) T; t/ ?2 k+ l

      3 _( ?9 B! E9 ^( Q3 M0 v   int needtime; /*进程到完成还要的时间*/  $ I2 Y" x! ~5 `2 H( h: J8 ]  ^( e
      - A& v; e  z# ~
    • 9 w" P" V& e& U+ _

        J6 m( a. m3 s1 W- ]. {2 y   int count;  /*计数器*/  $ a5 A; A! `$ q7 L9 b
        U+ S( V; Q5 s7 e/ y  W
    • , D8 d6 J% c5 i0 Q
      ) |% g+ \3 ?' l' w2 H# D
         char state; /*进程的状态*/  . o7 C  z' l' H8 q+ N! Z4 t0 k
      / z/ t$ U1 Z) r) p' \

    • ) x& p3 d) y& J" O

      7 g- v: E# p) Q8 }! [   struct node *next; /*链指针*/  - Q- d0 i) S9 e/ L

      7 A# D) I. _, a" \; k' X) {, L

    • : A/ `8 ]) M0 {5 o: g

      4 r4 v1 {! s! Z}PCB;  
      . a) T6 e! A0 o9 M& T3 L7 g$ _
      5 F; n( D$ p& ?2 Z, n
    • 4 h/ ]2 K! m3 b, [3 m. a. w4 g

      9 d0 t& c; s7 D) a' W* qPCB *finish,*ready,*tail,*run; /*队列指针*/  , z. O+ w( Y/ w& T8 q) A/ s

      $ b7 G9 j( w/ ]8 R
    • / u$ m" A& _# f! T) n

      % ~9 ^- M0 I3 A$ ^int N; /*进程数*/  
      0 f4 d5 M) k3 Z( s
      9 V7 m$ q. f* C* y" J
    • 2 K. ?5 K: H& ?( E; ]+ u- w. C
      ) J& F& \. O, j, |( o" ~
      /*将就绪队列中的第一个进程投入运行*/  
        R! d. f9 G2 c$ J4 m

        @" c% a; C  Z# E- H

    • 6 }! W# v) A' b1 B& l3 V
      9 o: K1 N; L& D
      firstin()  
      3 t/ D  s' e3 D  s' B% a3 N
      & `. u/ [1 f# N# o2 Z
    • , v& b/ L6 s0 r  A; u

      " ]/ N( x+ t  P: B& M{  
      - K: Z- y; O+ F2 i6 v( T& b& [
      " C* W4 @' [% v4 i- C9 s9 S

    • & v/ g. f6 n# u. G4 @2 p9 R$ j
      0 n( T/ S$ p; f' F. V* V* ^6 A/ o# T
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      ' J; M7 m+ }7 t6 w+ H% \) H

      " [: @# l' d- M

    • 7 f* r4 c; A2 Y9 o
      . S) f: G' K. n7 s
         run->state='R';   /*进程状态变为运行态*/  
      # g! N/ F% r5 k  Z
      : s" _' \& r4 h

    • 6 `3 d1 V$ {- ^+ q8 R6 c0 [5 ^

      6 C: l7 Y& n/ W& ^9 K   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  % j; o6 w7 ~' C1 D: _" Y. R
      , Y5 U+ B0 P( G& q* n: b
    • : ~3 t% ?/ K2 }2 P0 v0 c
      6 C1 S% `; |" h- X! V/ N
      }  $ r' e3 \$ E% N0 `: \7 C

      ! M- c3 ^( e4 l- N  }% L
    • & }, \0 X6 U" V- }  S. m

      4 \9 Q9 H* m  ~9 r8 `0 s+ p/*标题输出函数*/  
      ( C0 m8 y8 d" [5 J

      % ]5 ~! R% ]2 o" I( U8 J8 g
    • 3 ]" J8 d; T3 d: W
      . [: p! F2 _0 \) Y
      void prt1(char a)  7 I. [$ U9 B6 h" H- C+ C: ~
      9 D% i2 v  z" ^

    • 7 D1 |$ E# P# l0 S- Y4 X
      + b& |5 d0 m' l3 S4 Q3 C
      {  1 |0 m8 d' e* n
      / q  p. ~5 X0 N+ X" _6 r

    • 3 w* z2 n2 v' e- \: b- w- Y( D0 C: B
      ; Z+ Q2 i+ f% H! H6 z
         if(toupper(a)=='P') /*优先数法*/  ; @7 M9 W/ g. Z" ^5 m
      0 Y- w% X7 p, n% W& `! `

    • ) I9 {( I+ V0 X5 |" A' Y6 q. H' z

      1 f6 _$ T' y4 i6 ^8 g! P" G      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      3 x6 c! C* M$ m3 Q8 W

      ' M) U4 a3 [1 l) m" b

    • : n3 t. ?; {+ ^1 r# `1 R

      - x, c* n* x3 t" [& }- ?   else  
      & @9 H0 ~  s/ p/ `! R" N1 L, _

      / b; k+ h& G. s+ `( I% f" Q4 ^  H5 o
    • % w9 {1 B* F8 \9 O% K4 C

      , T- Q. I) D+ @) [4 _      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  * w  V! M8 ?6 L9 K) R7 _4 A$ `
      1 d  o. S( I/ a. U& ~
    • 1 @/ O& {# |8 X

      0 }- W$ j2 ?/ }: v, l: T# t+ H}  
      5 _& p0 @* ]' m, C4 k- M9 G
      : O2 P; H- c" t3 y+ K+ f

    • / o) S0 {% q1 V# X
      ) T! h9 h$ J) N. A" T3 x' V
      /*进程PCB输出*/  
      - n$ Q8 I& U2 _  v" }3 U

      , ^2 B) k- V5 k3 f0 u4 X/ y* c
    • ) d: n8 j! C. G3 Q% e
      ' V2 N+ b0 L+ ]. C. i
      void prt2(char a,PCB *q)  3 i! n$ W# \3 S2 x: x6 R' @0 C: f9 z  @

      " y( K: [1 b" `6 Q" m) n
    • , A4 q1 n! r; r* L% N) @8 P

      4 s% E; D: H3 A6 s1 n  u9 a- {{  
      9 h  l4 L5 Y- \! b) m1 [. k
        O7 v1 m, c6 Q% X

    • " J" l1 D; ]; e- ?6 q. T1 ?

      0 i0 U0 `/ @( k  h2 r$ Q   if(toupper(a)=='P')  /*优先数法的输出*/  $ y1 d; z2 T! S1 L2 D
      . i4 t, j0 U% D( O6 {( G  v

    •   W2 X9 y; N8 Z$ }7 ], V  t

        {  v7 X" s1 z* p9 o. J5 S      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      $ s. m; E# m# u- m+ A: B
      * N! v: c' E: l# H. H

    • 3 W$ H' p/ W0 D3 b) b
      ; \, [6 `$ T* P! D
             q->cputime,q->needtime,q->prio,q->state);  9 A, F1 V9 h: j$ h' V

      / J: H& U( o! M4 o- c% n
    • . _4 U* ]/ [: P% Q8 d5 N0 m- [

      9 U" k' ]& Y# S5 i8 W9 J( c, p   else/*轮转法的输出*/  ( T) s- z& ^& |# k% [/ @

      + c* A  U& l5 m; S2 L
    • # N2 v$ |3 }1 Y8 p

      8 d* Y/ C* Q) a8 n3 [      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  8 F9 n. J! d6 [- N6 Z5 u) j. R  t- i
      / Y( Y1 b. O) i' a- E

    • + G6 C5 [2 ?! u6 y- @
      8 a' ]& u; B  k. w( |! s) t
             q->cputime,q->needtime,q->count,q->round,q->state);  9 Q2 @& h: l4 o, Y+ J( y3 q- f
      ' Y( |9 ?: U4 b& \
    • 3 _1 }$ y1 n3 R2 Y. b7 ?1 T' ]  a
      9 w2 Z; d+ T% W6 d( t
      }  
      5 ?8 |& `  W5 Y: G- ~* @5 D

      " ?' f( p0 M9 N# x

    • : k  r* _) _( H# ]3 }7 o, t
      2 k5 h' _5 ?/ ~$ v; b: V# e" \
      /*输出函数*/  5 K5 }9 P/ M3 V+ ]  \# o# Y4 a7 m% H
      ( R& N1 D+ o2 ]  y0 B9 |4 I. y  T* c4 a

    • 8 r$ o! N9 ?# Q& }
      * W& b% Y9 i- e- M$ S
      void prt(char algo)  . j! k9 v4 F* L6 H

      / R7 q5 Y: E' H2 w: N! i. u, ^

    • 4 z/ X! J) h6 X' N/ ]$ c, U
      # W# g+ K6 {8 ]) Q$ c) l
      {  % C5 }  [5 J+ y/ W- w* Z4 }

      ( S2 G6 i$ h: e# c5 y9 z  P: K4 j
    • 0 z" F. N1 u# {3 B2 a3 M
      + E" }: ^) o8 I- }) A
         PCB *p;  
      9 ]* O- Q; q' I7 |+ i* }

      6 f9 v! q2 Q- t5 c. ^/ B% e2 j
    • : e- d' I5 _: d; y% a3 U* {5 n9 S

      ! W8 O1 w  j2 s9 F# h4 }9 L   prt1(algo);  /*输出标题*/  
      . s. r$ K& F2 t( q% }7 |  H

      + z# N: @# k0 N, Q5 `
    • ) o; z  {# @) @- t! d; h" s

      6 i2 o! A* G4 r/ F& d   if(run!=NULL) /*如果运行指针不空*/  
      " p, D) }* o2 S; _: N6 C5 h
      " |$ e: v6 n; a+ Z; f. o9 {. d
    • 4 @# V' E8 L/ J+ n9 ~; m& k5 e
      9 N" _( C4 z5 m- x' ?8 N: L
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      ; F( e3 t9 m3 S5 X8 [  H8 x- }
      6 ?- p) g7 x; e3 a/ h2 M4 E
    • * ?4 m5 P6 b) A: M" y2 }# Y

      " M" T5 m( n) Q3 e   p=ready;  /*输出就绪队列PCB*/  
      , |% c5 {6 |, G* S$ e2 `
      / b2 T6 i9 ~+ q0 _' D& v- |

    • + a, ?) I1 D% t8 o# T2 T5 ^

      0 W8 L  x) c1 V% |. c   while(p!=NULL)  
      - f6 x" ?2 W* W5 F; K# _
        q2 Q7 M' [5 V5 S: |

    •   {2 B% g; t7 E9 L& O. ?

      & \' |  ^$ {( H" L   {  3 q" ^0 f% t9 a( p4 m. S( ~6 ?

      * U4 y/ d" Y6 w; h* Y

    • ; W# |$ [. W7 B7 e1 X
      ) ^  y  ^5 F0 W2 f1 q- O
            prt2(algo,p);  7 u/ `, J) b/ G& b2 E

      & _1 a1 L$ }: x0 d% u, G, C# @
    • 8 C; D) H0 E1 ?! B% |

      # _" o3 V3 J6 D( M; s* T& V      p=p->next;  
      # h0 q% g* ^. x
      & o6 d$ n8 r  s" f/ u8 N
    • " J( B# s4 e: |1 o

      ' w3 D4 N$ [* A  Y" [3 J* j   }  7 |+ L# {3 t; X" E0 W5 a. x
      , v' v  g( P  x1 ~  I

    • 9 g6 D) u) G  }: [. e5 R

      ' f4 M6 r$ R  o   p=finish;  /*输出完成队列的PCB*/  5 D8 C7 S9 M; b

      8 ?; D) o& I  \! U
    • ' J9 W( w1 L; y$ p

      * G  g# m* f5 b- u. E: x. p   while(p!=NULL)  
      8 L  d0 T: n9 s; I  M) T8 F
      ) W3 q! c  k1 z1 V
    • $ k3 Z$ T. E& Z1 F' r& G
      + h6 Y+ a, R5 ?8 V' L' Z0 l
         {  3 x: y& C5 A4 H: m" I

      / T8 P& B3 v% d  }9 F

    • * w' Z+ q. @  w7 i5 z
      7 M/ P+ K, ~4 P5 Z" d! o) @: B) b) a
            prt2(algo,p);  
      7 Q4 `8 U( k% K7 d( c

      0 z; ^' j1 A. `3 r3 X( [

    • & q( }% g; S4 v: J! m8 V
      $ A  X+ J, j2 d5 {0 @: x  J
            p=p->next;  
      7 e. a$ Y3 t* ~  |. Y0 `
      & C+ k& L6 G( Q0 g' n- I7 D! }7 b

    • # P3 Y3 |9 W. S; I

      + m$ L/ k! C/ R( l% \   }  0 p9 P& e1 X% q. v
      3 F" y, b" D/ a( v2 g% v
    •   s% t; `% M/ A' }/ b
      8 h% `8 L6 }# J9 i
         getchar();  /*压任意键继续*/  
      3 O& j- f9 `+ C; u6 \: a
      ; S8 `1 d/ z9 I

    • , S) V% ~; @$ ?. H
      6 a. m4 B' K/ }2 v4 q: O1 c
      }  
      , o$ y/ g+ I+ n& a4 u
      8 M1 w6 C" ]5 O7 [' i, V
    • / O: j$ R0 u3 X  U5 Q; e! a8 |

      ; K, J7 p( H+ O; l1 o6 B0 r5 w' E% D/*优先数的插入算法*/  
      : m% J/ J2 C6 ?. n' W/ u, j6 b! g

      9 E) X0 x" c! z2 p5 u5 w- N
    • ; q+ a& C* S. e; `7 i; f9 b% R

      / H' I/ s- t: `# q% q: N2 a. i) B( V+ tinsert1(PCB *q)  
      " R* y0 T& u( d* t$ v& v

      & ~! H. C/ _- D8 }* [9 }6 `
    • / c0 o' z8 m4 r
      / _: L" W1 \9 s* E4 X7 V5 N
      {  
      : A2 Y. P+ y- w' p. v9 `

      ' W4 @6 K6 }6 G

    • ( h, T4 n5 K: Z& B/ {

      % {! S  C; S! v5 \/ x. X& a* E   PCB *p1,*s,*r;  * ?7 s9 H; v3 E0 p
      " t' N) P( G" q8 V+ p
    • & G2 H1 f9 n% [

      ! A2 y8 `* X  q3 b, j1 O; v6 h   int b;  
      ) l) F: U0 t9 o( W; G5 N, g

      / A. _0 X8 r0 V
    • 5 ?9 @8 G. \8 H

      $ B, D  k- I: {( T1 d0 }   s=q;  /*待插入的PCB指针*/  
      1 e3 P! H3 N3 V# i, V+ U" u
      4 G- t7 i0 u0 _6 |/ `- {+ J" L
    • , s0 Z3 i  S7 L9 `
      7 \% `/ H: d4 y! L! \" Q
         p1=ready; /*就绪队列头指针*/  $ k6 y6 S6 S$ ~: o

      . i8 U6 O+ F: @! x( |/ C( B. L

    • 9 b# B/ k' a. T3 o/ T
      ) C: @% |  w$ o5 s! a+ @, `
         r=p1; /*r做p1的前驱指针*/  
      , J0 \' B+ b+ y0 J) _- k( F
      * ]% M0 _" J4 R8 t3 x! ~
    • - o5 g& o4 Z& \* M% p/ _
      ; h2 T0 i% M$ M" i, a% ^$ D6 L
         b=1;  1 |" S$ d9 C" F0 G. a/ Z

      % n9 W' y* N* n5 j) |) K% y
    •   A2 ^/ H4 h# @" k- ?# O- j6 W! [" \8 h  ?

      4 i. a* U; K" O1 a3 \   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      4 k, f; V- j4 a) [9 ~
      4 N% g9 j) Z, w3 ~' ^' d  a
    • ' r- J& w  K% Y

      4 ]) G0 j+ `6 p; H      if(p1->prio>=s->prio)  
      & {* a) k7 W4 N# N3 v) y7 n5 w
      9 t4 }1 u, b* m) P4 T2 E! g
    • - T: ?1 K: [" k4 S: S% n" C

      8 H3 @5 W) P# c      {  9 ^+ V4 H# z% o& c

      " _" ?, X/ c$ B1 ^" w6 A
    • % U0 T% d9 ]6 _. g6 d3 V2 H

      / @  q7 F1 g/ h/ Q     r=p1;  
      - U4 p/ ~7 w# m0 d6 [& v9 a

      / q# q5 _& J/ b$ U4 N  k
    • : |. d) b9 t9 f

      7 e" ~' N# i8 b1 a! B  J, X     p1=p1->next;  
      1 s/ D. b  G4 `/ m

      + ^! ]" v  s4 I# g

    • & R4 d1 N+ I8 C9 @

      6 T$ X# T1 m$ _7 g5 \$ t, y* b  j      }  
      : q$ s$ c$ ^, ?. f9 t2 s1 A* m
      + `, \* G9 N; c: I# n, Z
    • - \2 j3 L/ ]' O1 P+ x* n' X

      ) K" b9 U2 R) E3 E& b7 L! j; L( d      else  
      $ ~; P, i1 x) J1 ^8 {5 _& ]

      2 J6 l' W% X$ Y% B  @

    • - M; E* m/ z- ?8 f  o

      ) x( U5 O/ q" z' P3 q     b=0;  8 D4 g. [7 W: P: E

      , v7 e+ Z8 ~# ^# P
    • ) q% _* d. w' o& t2 G! Q* \+ j/ E
      6 I1 N( S- m& X2 R0 z$ X$ Q
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  . w1 a: @$ g& H6 y
      * F3 G1 H9 @5 |# c
    • . P( D- j! P: y3 x% x
      6 j" `8 z- w( s6 j# n/ U) _  h
         {  
      ! H- C. D( g  v0 ~+ ^" {

      ; B$ `8 T1 z- F' m
    • 5 I3 a! t" d- Q% p6 X2 T

      : S5 c+ U9 u4 w! |5 U, r, g% ?      r->next=s;  ! @2 L( i; a* [  @2 r8 r

      & B1 I/ B9 c4 d* P# n$ i% e3 s8 Z
    • 5 \3 t# b8 N, {, q) q

      - \. o( u& G! p% [' P; `* ~      s->next=p1;  
      , i: W2 i# \& E+ ~  R* n/ j
      6 ?! K: q) H4 R
    • ' r- A1 w, r( V  D) U

      ' Y% W" M% N7 S   }  
      , I) O% E' x9 ]) f4 c1 L" _% N
      + U% X3 T( g; Z$ T* E

    • . {' h7 E; s7 Z

      / B/ j" }2 m4 y9 D" u* n1 r. ~   else  
      4 q$ \; x% B. ?- i$ ]

      * a- e  V! G- j$ J

    • 5 c' k' q- r& p  ]; v
      3 U. M$ s& \9 g3 [# i2 ~
         {  
      . u* D& B" D8 h5 r  `" I5 {6 ~
      - y2 x. i/ T) H
    • . T# v( }2 f$ i
      / A2 |* Z! V% h
            s->next=p1;  /*否则插入在就绪队列的头*/  
      1 n. ?- E2 H. d
      ' _# z4 u5 `8 B- w4 d+ v5 k% t

    • " D3 q5 y* z, I7 @# U  b8 P9 ^+ v

      * o/ s6 b$ ?0 r      ready=s;  
      % N* S& k5 \0 k: L* c5 w, L
      & x% b2 z8 H( ]/ F, @

    • ' t; {7 [3 F9 b9 s7 \( m$ o
      2 T1 b4 ^$ p8 T: _6 e- |' k
         }  
      # o7 Q: r4 I  P
      6 v7 o( c9 D6 A  L8 [

    • , f' S* l2 Z* p$ A  n/ t

      - B+ T; @1 i; S8 D+ w}  " K+ T$ m3 s  n) B6 _& Y

      % D* X1 S+ G" o6 |/ c- }

    • ; _" C1 E, M' y7 n

      2 Q0 T$ W: z* n" M/*优先数创建初始PCB信息*/  % a- L" H8 x! m* R, Z1 ~& @

      $ {' M* S4 |! T7 j
    • 1 E1 p8 {2 d! x+ \

      0 p; O. _" m& L6 l3 jvoid create(char alg)  
      8 T2 w% o5 u; B- z6 K, T9 y' }- f
      , Z- f" e- Y$ k) s9 S! b

    • - g6 A. S2 m# O" K4 L# B8 Y
      3 \% _8 O+ I# O7 Z, _" X
      {  
      # @( r6 E4 c, P3 h9 W1 b/ N

        U8 O% o5 y. V) v  d+ R
    • " }( [  j; c. Z* i' d

      ) `0 w) D+ n% i   PCB *p;  
      % e& [; |$ f  E. ^& Z3 W9 ]

      ; p: S1 y. k6 x8 i( @  Y' H

    • ( M7 Z: f5 [. k, D; {2 P: f
      8 n' a% b  V+ ~$ S7 d4 D
         int i,time;  
      7 ~' P/ ~# Z/ X! N% A8 k& |( C

      4 F3 Y/ i# d$ h4 E+ t
    • 9 w! H$ g; O6 x  a
      7 d% F( j' U1 o! q, ?
         char na[10];  6 w/ F% B3 x- O; o; ?

      7 C) N. Q2 ~. u: l

    • ' S2 g7 y& {- y' c9 j2 M5 B

      7 s5 j0 p6 H! d' W5 v! O1 i7 J   ready=NULL; /*就绪队列头指针*/  
      : I. U& C1 e8 G+ Y4 w

      8 P- l$ B/ P. O
    • 1 \" E8 R' h9 D9 ^- V6 E

      $ p# Q2 g3 }  a8 s   finish=NULL;  /*完成队列头指针*/  
      3 s: E. y- `! y$ w2 }5 Y9 y

      # U% @' M& A1 Q. O; M
    • - e/ C4 i; n2 Q; @, U

      - _- s8 r' ?) `& `   run=NULL; /*运行队列指针*/  
      , `+ V. R* g+ }1 k' |

      $ V) @- m3 i# g! G; H$ [
    • 7 N+ a" {6 X0 o
      . O* R; M  u9 Y
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  ) R+ _0 F" p& l
      3 |# A7 @( Q, B& Z, {( h6 K0 L

    • ' Q0 w: F4 L4 _! Y) e

      ! T: |+ K$ R" R3 B8 M   for(i=1;i<=N;i++)  ; P9 E; I4 H/ @! V; a3 @9 @

      2 ?, Y! I# M$ p& f* E

    • ) `! v& e5 a- Q8 ^$ {% P# t

        {( c4 q: C4 ]0 J& E1 N   {  $ u* ~/ H" u% J& F7 }
      * d! a# a! W4 B9 t
    • : O' r" h7 n4 [0 ^
      - M6 R! @: B+ Z; x; F3 s! A2 `
            p=(PCB *)malloc(sizeof(PCB));  
      ' W0 N8 i2 t9 `' g8 M; i

      & r3 K' X9 g0 _  t0 g' _& @6 {, W  W1 r
    • / T  i/ t$ q: |  V- s1 C& D) D+ i

      0 H1 H7 F' h; L7 t. L& x      scanf("%s",na);  
      * S& N2 V* C" w- R1 i

      # |- |$ [- H! }
    • 0 M$ E/ }8 a1 }: v2 ^

      7 g* ?$ U$ I7 n. y! ?" [      scanf("%d",&time);  9 J- z& z) z0 r! {

      % R8 f; N" e5 F
    • * D, ?2 T6 f- X2 x
      , k+ ]' J" M1 B: z$ C
            strcpy(p->name,na);  
      : S% G& {( L6 q# S0 H5 e  `4 T

      1 h! t$ a' E% z% |. Z

    • $ R9 V$ ^, z2 _' o  q
      3 I( x" q7 S' H' @  U, d
            p->cputime=0;  1 E( v1 D$ K" U7 r/ y3 `
      + P6 r$ `+ p1 y! N+ U! n

    • " [6 w3 r2 k1 z( B1 l
      7 _9 z; p9 [+ {) S/ _% b0 \( o
            p->needtime=time;  
      ! U7 J- J% t, _' D: Y5 y
        s4 v% I9 C) e$ _% A
    • 1 \6 J# Q9 r6 O% I9 @: n2 f. z6 O& ]
      # s( R  C! {. C9 R! `
            p->state='w';  
      . b  a" t  Q8 ?+ F

      # M8 \. Z/ N! Q" e! I6 \
    • ( e2 x3 S' B0 u# ^+ M

      , z3 y0 j- u3 f1 u" a+ l2 _, m8 M      p->prio=50-time;  + ~0 v4 n6 z4 I( V  A

      + B; u. {! K7 W, c6 M! {

    • : U$ h6 H! i7 {! g# ]9 N
      & _, V5 J* D% z2 o
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      / a/ @: }. K0 M$ |- h2 s

      . t8 B( ]9 G* t! z9 r' E( h, o

    • 8 Y% O" i$ h7 q% g; X- V

      9 J0 h! z& {, Y     insert1(p);  
      , K$ X6 E2 O3 {6 u2 X" q
      ; D" M3 V5 `- E5 b

    • ( r! I" p# W$ e1 F$ ~

      - i$ @& ]! r( B, h& n* d: [      else    j& b1 @7 R2 R7 q
      ( ?2 J4 f- k# o" v8 E

    • % v( t% [3 f8 z2 F' k/ x7 n) O

      2 S) [* c) P2 Q$ K: G+ D0 V* ?      {  
      - ^! Y4 L! }8 F7 r

      ; a  H3 c, Z2 z
    • " o# A( h3 {& V" `/ n+ [

      0 x" Y7 W+ `9 w0 F+ I     p->next=ready; /*创建就绪队列的第一个PCB*/  , x0 c& ~% M* T, C  }7 G3 w

      0 U5 t( `: U. H' ~' Y

    • 8 T' \7 R- V9 p" j3 O6 L# E% H) C
      * s6 c4 _2 n" r3 O8 W
           ready=p;  
      % m1 S8 x3 I8 N+ i% g" n" {; ?) D! A1 p

      ; |( y8 `5 {* K/ ]9 t6 ?; T

    • 7 ~4 `4 o, _4 b; R5 z3 R

      6 L1 T7 K) d# ?5 J      }  
      / S* p+ h5 x# s3 X. k
      * h7 r9 f: o9 R$ R. y/ {
    • . T2 ^' M8 ]% M/ w7 \3 V
      . m% x* g! W  A  g
         }  
      , `+ v8 l6 B5 ~
      : _+ @/ @$ K$ R* i' {

    • 9 I2 t* {. ?8 L$ @

      : [# p$ J* D4 f   printf("          优先数算法输出信息:\n");  
      : y  Q* I/ j8 r

      2 U6 ?8 I) A$ c; U0 }0 |

    • - G/ t* a7 ]  C8 b0 U* D7 l& n* u/ {

      3 z- ^" B, E: E   printf("************************************************\n");  2 u1 E4 ^2 M; o# P( Z$ w5 f

      ; w- c9 E; K% T  [7 X& `

    • " e+ }# W+ T, F6 V6 v6 W9 |% e8 z

      1 A$ m' g6 {. v3 p: ]   prt(alg);  /*输出进程PCB信息*/  
      : H* \! R+ g) q0 N" ]2 R

      : O' N7 k9 Q# B. F& h' @

    • 3 o: `$ b7 P# N4 t# i" ^
      & i$ F! X3 Y4 |
         run=ready; /*将就绪队列的第一个进程投入运行*/  " l5 L; D1 a- d* t% w' R
      8 Q# W6 |- Z: f% Y" e- {! {4 r

    • ; y6 l( J0 o9 y9 f. E" L0 `
        H# ^5 s" h2 z; R2 U2 O
         ready=ready->next;  
      : Q0 [9 W# h) v5 w+ ?9 e2 G" b5 r

      & Y) q; ^! Z1 J4 b) H$ I
    • . l2 g7 r: j9 c, P) M: A( A7 K/ Z  ^

      : Z. U1 x$ S+ ~; k   run->state='R';    y! A5 h# i1 w/ G4 z; b0 I

      / F  s8 e7 o0 P! u4 X( A

    • , e! \; O4 x2 t0 P8 `( S
      6 c. [& `0 F6 q5 Q7 w( s6 j6 t
      }  8 w) \/ s' \1 O3 ^3 \/ Q4 [  i
      ' R6 K  W9 E! }: T; r9 Z

    • 8 p  e. [3 d0 n$ [! b" `
      ; b2 e3 y; z7 ?8 ~" k
      /*优先数调度算法*/  ( k: x  F' F1 p
      ( ^$ _+ o1 I4 e8 N1 @5 _
    • 5 N. k% g* s% ?1 \5 H

      * L0 o- f9 g7 O4 q2 N7 |priority(char alg)  
      ) h: E. r6 ~1 u; _# B& t6 O

      & {+ X5 N  S+ U$ ]5 S
    • , y5 H) \) j$ @2 U7 r
      * I5 p' L9 {: i5 B
      {  3 a( h- z3 }$ X0 |4 ?1 ~8 y& b

      3 Z5 L0 M. z* b9 s# G* M
    • 9 `$ }- O) f. u3 W
      : p+ J# l: w* u$ W* n
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  " [. {# o) o/ e% y5 n5 M3 z

      % R  X6 C% S/ x0 D) `, o3 j6 h

    • ) Z. ?2 S8 \" B% J6 F8 I
        C% h2 K0 I# Q: D& n% }: O! e7 `
         {  
      8 \5 x+ U( s. q' s; g0 k# y

      + ]; ~5 s9 H! _5 S0 X: ~

    • 6 p9 W% r+ E; l

      + W( K, K0 ^% r  I/ `2 t      run->cputime=run->cputime+1;  " i1 O) d4 ^5 d# k! E6 ^! e+ B; [( m6 p

      " A  |2 d% P; s0 p& }. D8 Q
    • 3 f9 M1 }+ u9 W# a; i
      8 u/ T* X# ?- w( `$ ?
            run->needtime=run->needtime-1;  5 O; S* w& @  p& Q' h! u  X

      # _6 I  H$ v( e

    • $ h/ \0 e; O! g$ F  K% `: m+ e' A

      8 I4 ^" A7 D) d: Q( B      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  1 Q: F* b+ S3 w: a& \* D% t. P) h8 W: R

      1 ~" k( ~& |) U( X& b# C! y

    •   C6 e* S% O8 @" `) a9 E

      & q+ m2 Q! \( D9 [      PCB *p;- B" U( ]7 J- T8 @  s) u
      & _( ]1 S7 A( ]( D" T/ k. ^
    • 5 M$ U  l  n  `0 y

      3 f) M9 V8 Q$ {      p=ready;/ x2 x+ [2 H( j5 ~6 G0 a2 i
      / P# u; N8 Z8 g
    • ! n$ X5 K, C4 R
      ( P5 H, O* b& ^
            while(p!=NULL)  
        ]9 x7 I* ~/ u0 j7 n5 b" i6 f+ u) T

      . O; k$ j+ ~9 u9 r, M* \- f

    • * A3 P6 y- Z$ h% l* V5 y

      # g/ ]/ o- F, Z/ Q* Z7 ~7 h# k      {  
      6 Q5 j' L4 V5 v8 F

      # v- H$ C# R) b8 h2 A" _; A
    • 5 L4 U& Q% H* |4 }6 a4 E8 q& K
      - Q) k. X6 F$ J8 m- ^7 t
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    % D( H7 P; C4 T; I/ c: f' s" }

        o/ [, R9 y) Q7 {

    • $ A- T# u) G5 l( B' Z# g: K; F# A2 {& X

      / c& x: D, ?  \& T9 v/ V, O          p=p->next;  
      9 n! h9 L* C  L& S. D

      3 o) d5 g7 Q: P: u+ \( c  k

    • 7 H. q7 Z) b6 {9 H
      8 _1 L  X: ]0 l# y/ k
            }  
      8 U0 {' p* h% g

      : t( ^7 F( I5 Q/ f

    • 9 C# e& K/ Q# b! L% B! s6 d
      , ]% T6 F2 ^+ a6 ?3 H
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      ; z, l' G' t6 T/ g6 C$ a
      2 B, S' D) r# V) r: U

    • 6 J8 }4 d/ M7 ~

      $ _% S% X- C3 W1 C      {  
      ) l4 P3 i7 ~1 F$ B' U7 E

      + ?. ]0 V1 l6 u8 f& ~! U

    •   n. q7 @# P' D( E

      - D1 i- i( a+ S6 T- `         run->next=finish;  % B0 A' }" i4 X
      0 @" l; p+ u# y9 Y
    • 3 ?8 c2 ^1 L  B/ {5 P) }4 `

      8 n- |, G) R" j& U6 N& H+ C, X         finish=run;  
        _2 k6 p# N2 Q, D6 Y4 R/ J
      , i$ X  H" ]9 s8 v4 h

    • * N1 E% N" x8 O5 q$ b2 P* i; t  b

      * K5 G0 z  D3 ?) Z* v% V         run->state='F';  /*置状态为完成态*/  
      " D! |, ^5 `( W, }; B/ {' Q( R
        W5 E# A. i2 }+ L. D: z% z; ^- F

    • " n7 B3 J+ L. v: ^8 w' ~1 n
      : R4 `. h" O/ E& P
               run=NULL;  /*运行队列头指针为空*/  
      8 G- |9 m# H6 s  z4 T! L* `' E1 ?

      3 i; H: G: m5 `

    • : e* z$ i; F+ o

      2 y4 N, W7 e" b4 I8 }         if(ready!=NULL) /*如就绪队列不空*/ 7 G4 g# t; A9 r* K1 m" r" \$ B& _+ O
      0 Y# t2 [6 E% k% k2 G) E

    • * M$ ]0 u+ u3 z3 L$ n
      , |/ W1 S3 ^# d  I
               {  
      $ i% x; y5 j7 @+ M1 B- M

      0 |- p6 s$ f) g# W9 s: }$ j

    • . _$ j9 ]* @" ?" G

      + D5 Q( B7 h0 A            firstin(); /*将就绪对列的第一个进程投入运行*/  1 w( X% i  i- t7 |) f6 K( ?& Q+ i

      / z5 ?. ]9 t: G; B

    • * B( \0 `9 V4 N& c% N

      ) S/ J1 z1 _4 K         }
      8 U3 V7 y" p, M+ N; \5 B0 B

      % V6 w% t% C. S7 ~# [. g2 s/ h

    • 9 \* x  a0 [' A" v6 L
      + g: ]' d3 t- n6 V  w& L5 A
            }    @7 t. q- O' ^) `  E

      & j2 f, ?; [9 X& a8 M4 e/ u; [

    • % b) t+ Y. G& k1 c

      ! c- u& P$ E3 m      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      & g/ T; U, |* [# X% z  a
      ' x2 p" i- @/ e

    • 4 I1 g$ \/ z* ?0 l. l& {- @  u. M  z
      ) ^- f5 ]) x* F3 Y3 n" {. d0 i
           if((ready!=NULL)&&(run->prio<ready->prio))  ) c3 p& B; `7 l" F" A0 O) y" u
      6 U2 l' z7 ?' X) p6 A
    • 5 t- |" p* e; @8 o, G  ~: C2 `* ?2 O5 P
      2 L/ b. l. f: u* N8 O/ r
           {  
      : r: }3 y, x& Z1 _, K
      ) C9 Z% C5 u$ R  ?$ n8 J4 B" l: I
    • ' f! G* Z, V! i4 K3 U: P
      8 S& j, O, g8 z( A4 p+ l! A& L% F
              run->state='W';  
      + \5 H7 l( O; T/ E

      0 i% m0 y/ X1 b8 d2 q

    • 7 O$ X" B" z! z
      ! W* r+ C0 F' {0 W( m
              insert1(run);  ! D7 o- B; z0 R! W' z4 Q
      ; c6 ?) f; f$ Y- h
    • ( Y/ _# a% \' _/ L! I& o

      ) s& T0 W2 I+ f$ U( X: R        firstin(); /*将就绪队列的第一个进程投入运行*/  
      3 W4 ~, H1 D. g) b8 v- M5 f

      - z' w# s$ K7 g, a! {% @9 F

    • ; Y; a3 ^* Y! z0 |( _7 B* L, ~8 a: F

      # T+ C! k, Z0 n! b     }  ; I- y% e2 u5 U5 k) f

      6 u' }& T0 v& q; ?: K$ q! y! T
    •   w4 @) W6 O: J/ t. t1 \

      6 j# H- g4 `. u' x: G$ r; G      prt(alg); /*输出进程PCB信息*/  ( b$ Z: X1 b% D$ R# ?
      / U$ A/ T3 }, `6 p" M  t: t4 b
    • / ]: T8 h5 @* n+ n, Y5 ?

      ) z- N, V. J- m0 b   }  ; ?% [% E4 ?. x+ x9 i8 [% n
      7 n) M# f4 S. z* S  g! O( W

    • ) W4 Q" |$ Y- F1 Q
      $ n# J" A( ]% F+ N
      }  ; D+ |; d  _* ?  S. [
        V# j* N) E7 }

    • # v( p* q4 W9 b; t1 e
      4 f: x! x( Z! z+ ^1 z0 m
      /*主函数*/  . Q. R( h  I1 S
      & U2 E0 Z4 U% X" D* f
    • ! K6 m7 o- p5 Y4 b
      ' _* c. ^( S6 m
      main()  
      5 [0 g6 f* g+ I: i# h8 z
      8 [$ L0 Z+ G+ p" h

    • , z4 T4 Z% J% r
      & n7 T9 S6 _6 D5 c7 v7 L
      {  
      * ^9 ]( i& `7 u; X$ y4 P0 l
      6 q. T1 X+ l$ X; D0 g, E
    • / A* A% ~/ F8 Y( l
      . o4 t5 t2 ?& n, ^# b" I9 V
         char algo;  /*算法标记*/  2 J/ z9 F: |! z3 {5 x/ y
      " O6 [+ h& O, q* a4 c0 J$ r
    • 6 f! ^; H$ O* G* A

      ) l  l( i0 K( W* e$ m' P   printf("输入P确定算法:优先数算法\n");  8 |) @! [& s5 G" ^
      $ v7 s( z9 d! T2 w: d: S$ I: j: [  E
    • ( E* O7 \; u+ t) t6 d* {

      / h4 }) s/ q1 s* r8 i' \6 C   scanf("%c",&algo); /*输入字符确定算法*/  % X$ P- w& e$ w$ k4 w0 ~8 I. ]
      " ^+ @3 D/ ~( E, H
    • - e- E4 A" F8 `1 e7 e# Z' x* {
      " A0 q1 @" r/ C/ A0 o. H2 d* z
         printf("输入进程数:\n");  
        k) G6 f2 v4 L1 h
      * S+ }6 h: |6 F" l: Q/ S+ t

    • / X3 J6 t8 y2 o9 A$ `4 {$ M

      : Z: U! i) m  q- O% T  J+ D* j   scanf("%d",&N); /*输入进程数*/  0 V6 K! K" T0 W5 b5 I
      + }$ _0 \3 U" ^
    • % p4 p' f5 t+ r+ j! h! N
      7 S% v7 q* P! C
         if(algo=='P'||algo=='p')  . m/ H+ J9 C4 i3 e1 p- z) d0 N3 s

      # [$ ]6 I, z9 O% L' C9 l

    • 8 m& d$ f+ M, x. V& K# |% f" Y
      4 `, y3 [7 G) N. X
         {  # a% l8 D" f/ L3 c/ _

      ' F: f7 R: V( y; M, a  ~2 \
    • & I, f6 {; D6 x) M4 ~

      " l7 Z& |& V( L- m. k; a      create(algo); /*优先数法*/  
      6 [) c- z, k' \3 E' x! }  R

      : b/ S0 B* E. r+ R) ]2 o3 v% v1 C

    • ' ~' L5 M1 u$ }: O# s

        Y0 [8 O# ~. @; U2 `/ d      priority(algo);  
      * b7 i  r9 _9 T' a1 C! R+ ]
      6 m" U7 W: ]) @$ r

    • : r+ t: z3 X9 O9 G" Z# n2 [! p* l3 U

      5 X# N1 M, Z5 {+ L1 d   }
      . E- B( I& O+ C1 U* v
      # E+ B/ ~' u- U4 G4 z3 B
    • $ i  z2 o2 \+ r0 t
      * S3 M! {" u& }( E
      }6 J4 P* P% R4 h3 X

      1 b. \3 W- |; s0 {
      % d; x7 F" T0 w9 |+ O% W6 x: W: D; O

    , n9 p3 X5 X. X, T7 F
    输出结果:
    0 q$ _4 T" v! r% p

    $ d# J7 o8 f& A1 J
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    / f! }; Y9 O: ]  h; Y
    0 q/ W/ n# t2 x; O5 ?6 i
    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-8 07:50 , Processed in 1.308505 second(s), 50 queries .

    回顶部