QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3155|回复: 0
打印 上一主题 下一主题

优先级调度算法

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 15:39 |只看该作者 |正序浏览
    |招呼Ta 关注Ta

    6 Y- s0 J& u" T6 l; C( @8 \* W8 l优先级调度算法# @4 o7 C" v+ C7 t

    算法介绍
    ' y( E( C3 i9 I+ g& N+ W. _优先调度算法的类型(用于作业调度)
    0 N/ w+ b; v$ ~1 ^/ e1 N1)非抢占式优先权调度算法 # o" E9 s! `$ l8 Q2 t! K
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    3 w1 p3 d& m1 Y& P/ Z% F2)抢占式优先权调度算法
    ! O9 B- _& P6 d0 J只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    # W0 _5 Y# O  ]) K# f9 a, p1)静态优先权
    6 W9 B% Y( v! \) N  f0 D( A9 |7 |静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。5 _: `  o: c* s1 S6 V1 S7 J" q

    2)动态优先权
    ( Q# P5 f# @  {2 O3 F! t

    算法实现

    抢占式动态优先权:


    8 C5 _' O0 m  b+ K+ b0 Z( iPS:本人认为非抢占式静态优先权没有实际价值。


    • * E  _; _* R" m: y. h  r

      " [8 {! M" `& p$ J4 x8 W* T#include <stdio.h> 8 M: @  D' r# \$ U& B, ?8 e

      & w0 i( [2 {9 C2 R
    • * \  F3 _$ h9 u# y+ Y1 r
      ( t: I. l: t: I6 R  E- ?/ e
      #include <stdlib.h>  
      0 L/ _* x) U! T9 C

      0 t: a. O7 z( a3 N
    • 9 k$ V2 S# ?) y' p$ n7 U
      / J+ X, [1 o, r. j. k7 y" y% \
      #include <string.h>  
      3 x& I0 V9 ^8 R$ F7 f& [
      $ }9 n5 j1 O( c; f% ]8 X4 `& c
    • - B# {# e! P# _

      9 [% C4 z7 ^5 X# o) T& V! u% t5 Ytypedef struct node  
      7 c* ]- h" K4 |0 ~$ t% n

      5 ?1 o; q3 z1 b  ~5 c% r

    • , a+ q  f; T8 S
      - g) y8 G, J) M; b# ~
      {  
      " E5 L0 W4 u9 {

      8 f" _* Z; |6 ]1 Y- d

    • ! P5 Z4 H# R, U* U0 r/ R
      7 e5 {/ ?7 C3 t& E6 s( F+ j$ H
         char name[10];  /*进程标识符*/  ) s. `, n; x9 u) {5 _" [/ b! {

      ) q3 r: E* }3 D( \8 A5 {

    • ) C% D, s; b. v! w, a3 k
      " B8 `, g# {: x  E1 y: `
         int prio;   /*进程优先数*/  7 b! _7 L$ v, P/ \8 r! r7 i1 a4 w

      1 V3 x: L! Y( N& s1 f. g+ ]( i
    • 6 A9 d8 L: l" Z- e. E8 V

      & C5 ~3 N% ?& g   int round;  /*进程时间轮转时间片*/  
      . g; K% Z6 U5 [; w; W4 V8 g

      2 N2 q: K+ ^' _/ {4 r7 _

    • 1 [1 `9 s1 k- a- Y! {; a) F
      $ A# u  f( E; h. k, {! B5 ?1 A2 i# ~
         int cputime; /*进程占用CPU时间*/  
      1 q. M, X1 ]" q' k+ y$ l( X/ D& p4 a
        n# P8 k! T' F; Y4 a6 Y5 h

    • 2 u" C9 a+ L* F3 R2 X

      # E. S. {/ U4 n7 a" Q" x% F' m) J: p   int needtime; /*进程到完成还要的时间*/  * X. }) p- B. D, Y8 I* h5 k2 B

      4 i$ B3 s- n) v' c

    • 3 D( W2 @. d, S6 g! L8 P+ y$ Q

      * v: A6 y+ U2 }" L   int count;  /*计数器*/  . n$ z! ^+ \5 v/ b

      . n- Y2 X! D) z5 U

    • 7 x$ ?2 ]  C6 P: k1 b# r

      " T/ k0 M+ M2 F& u7 I$ z   char state; /*进程的状态*/  
        O6 v* S) W9 \
      ; s6 @, i! D. h8 I. u0 v
    • / d. F- J3 s# {9 `) B# G

      / Y6 Q' w" P$ T; I   struct node *next; /*链指针*/  
      ; e. x: g6 u7 f. g& t

      1 j* L  O6 m; C! j( ?# E5 _
    • - U" [0 y. {6 ^. |4 [  G+ A
      ) s8 {" M6 o! y
      }PCB;  . i0 Z9 B* y9 m) I' I0 c! o

      % g  b8 d- p; O/ J! e

    • , W; C: s4 ~0 F& _% [

      1 t' X# V/ @& t- Q" iPCB *finish,*ready,*tail,*run; /*队列指针*/  5 O" W  }* u# C" z! ?1 g

      ' Z4 u% h. b* ~

    • 6 w* z* [' U. m

      * X  J' v7 w- vint N; /*进程数*/  " g5 M/ q& a- L" M* I3 Y
      " a+ c* u6 N6 g6 s) I- b7 u

    • 6 ]: L# O% u) k
      ( U# U# e: V0 [! k
      /*将就绪队列中的第一个进程投入运行*/  * r( z" o" G& |

      4 a, H( @! e% X8 S0 f
    • & u3 I, k2 s/ }  _1 `5 m+ q; ]
      9 ?; q7 \2 t0 g! a' V
      firstin()  # c' @; L2 ]4 r& e& d9 I$ f2 H

      1 C% o8 S: Y1 t+ }7 M/ ~  ^

    • * q0 \2 R- _6 c

      : y+ d& a! h- r* [$ m{  3 H: P2 J% Q. B: q1 q$ X8 q

      6 n# \$ {' f5 ]/ [  J* v7 n

    • ) E4 ]' v0 |9 @6 l
        ~( P! ]2 S  l( S5 W8 D9 Y& G
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  . ~# f& ]7 D4 Y  c$ T# n3 ^

      - @9 [* _( r  d$ o5 F% U4 W

    • * x2 ]! p9 G5 K( k

      ) b* z2 w# B! K6 g+ j   run->state='R';   /*进程状态变为运行态*/  ! o" Y1 I% h' `+ n' E8 G
      # y' I2 Q# a5 }" O
    • * I  W" b' g. n  N) H) m4 Z1 x

      3 _5 Q# F9 g* W: H: q; [   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      , u$ g; ?9 O% ~4 U% V
      9 `& [0 V0 `/ _# Z, }

    • * ~6 F$ `7 V; |, t( g- r

      * F- i$ N$ b  u9 m# R: I5 W}  # Y. [, F- T0 r+ V" A7 S8 G
      1 {7 M+ k1 \: C4 e' R' s
    • : H& s3 H0 I3 x; a* v

        K- W- j7 j5 J7 i3 b4 t. Q/*标题输出函数*/  
      + ]9 d( b& F; D6 d9 U1 Q6 V

      % W$ a" a4 h% g. @) R+ u

    •   @4 J! D- |7 g% U
      7 I* b' M$ D& O6 N3 |
      void prt1(char a)  
      5 s4 {0 p3 [5 E" Q5 Y: {+ y/ w; S

      7 f. J/ z! ?, k  x( A
    • ! b% E4 W5 J/ Q" N# h7 P2 {
      7 q, q4 R9 m" @9 k6 F) B& S
      {  & S# j4 d3 m7 O/ T5 U% M0 }# k6 u

      # V) q/ n9 |1 h

    • 3 c( e$ m- Q* N
      % w% O/ V7 w  }
         if(toupper(a)=='P') /*优先数法*/  2 u! E; L3 Y) b" F" X

      1 v, z6 l! e" s  u2 y, a( q
    • 9 Q$ R) Q, p* w
      " M: ^1 t8 G$ f1 w; c; X
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      4 o$ t! A2 |) K2 {  [

      ( c1 k2 P3 h0 E+ n
    • ; ?4 l; m% X& F1 q1 R% e  O
      7 H1 l* k5 h8 Y- h# U
         else  
        S' \6 q- [4 n' F

      2 o7 X/ w2 e# d% X8 ]
    • . i2 w7 p. j& \5 Q) i# A/ u# t

      2 B2 u* |! c8 [$ }' `  b% b0 \      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  ) L! ?; J  v+ s6 v

      # P$ v% Y# O9 L1 A
    • 6 d; X2 N* n. u

      6 e" }% q% b" |. I4 v# x, u8 V}  
      + Y- ~2 {) p# t5 C
      6 o# t" ^5 X$ B  `% l3 o
    • + p2 ?' N- K7 U, r8 q7 J3 M! f$ j- \

      $ r7 F  e& I  X" q! ]2 Y/*进程PCB输出*/  " d; j0 Q% J, ^. C
      0 b' H, T  }) k! U
    • 7 x# h6 G: F* J+ \7 r4 d6 Y

      5 @3 i3 A' I) _3 x0 Gvoid prt2(char a,PCB *q)  
      - e& g8 s9 J9 q1 X$ D/ W
      5 U: B: e+ K- a) {- @
    • / ?" k3 J& a4 r# O1 Y8 G+ I, Q( @
      5 p: a& }) @# l% l5 Q
      {  
      . O8 v9 S- R/ ^3 I
      / O! l9 m+ {+ m
    • * s4 o( N$ D- M  B+ E) N  g
      0 w9 I# ~  K! ^7 Q1 X+ d! ?
         if(toupper(a)=='P')  /*优先数法的输出*/  " @4 u6 Y5 F( J4 n- O4 K4 `. E
      / H3 e" L7 H4 z! Z
    • . |- V6 q+ O; r: u
      - ~( `% h8 b7 T+ b
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      + K4 o6 y7 N) M3 j( s4 I& b

      ) }& i  o. t- h& k

    • 4 l5 g) R5 N% ^
      8 W( i9 V2 S+ E/ V% V' U7 @# U3 H7 o
             q->cputime,q->needtime,q->prio,q->state);  
      : z6 ?3 q8 G3 j+ d7 }3 k; P

      5 J7 O) Y2 w, R9 N# [' M

    • , ]+ ~; S& e7 I1 m1 l

      / F3 J5 I  f2 p) {% j4 n8 ^& S   else/*轮转法的输出*/  
      * R* |" V8 Z$ _9 y
      % z/ r' L" O7 u) b0 l

    • ; H' t( C0 F. c& c* j+ X) W

      5 I1 Z/ X- K9 T, n      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      & [$ L; I8 f' C  M

      0 F7 [* ]. g- W0 }/ B5 M, l4 X

    • - a4 F# D; a  x. ?! p( ~

      5 O* V/ F0 g$ r. x2 X       q->cputime,q->needtime,q->count,q->round,q->state);  
      8 s! z  G! W3 r/ _( c0 L* v

      5 L4 T) a1 Z; G1 e$ Q) m

    • $ x7 N; |! W# K0 T5 S
      # G$ T9 U1 X+ d3 V, H1 a  }: R' Y
      }  1 E& P* z6 ^- ?; m. d! p" V

      6 J) J! E0 ^2 W8 p  F4 u1 k

    •   a% a) w# J3 J+ `! t
      6 f* F6 z0 ?/ _- Q" ~6 k
      /*输出函数*/    \! p; u5 ^: E. Y& M5 }  w
      ) B5 R* G0 s( k! \
    • + [) n( ^% L$ _" d

      ( z$ z2 q! b1 g! P0 k- zvoid prt(char algo)  0 h* `' e* o/ Q' j% M
      . o" |4 F4 N. C& J! i: C1 P+ f
    • % a# a8 g) |& {: g( R: |& \
      9 j) C% t/ @6 x
      {  & K1 {# D) u0 O/ p2 f) W

      $ x" O$ G6 C! K
    • ' v- ?: j; L% X$ S

      / P* S1 a$ O2 I8 l7 b   PCB *p;  
      ' \" P7 b  K$ A$ M4 N" H, Q
      7 \8 x8 a6 v. v1 K+ k' _$ h* i

    • ; M* _6 V3 c# N: E% f6 n

      0 K2 q4 ~& Y; V8 g* n  U( X   prt1(algo);  /*输出标题*/  
      3 B( q1 b& {1 ]

      3 g" t5 I' U) [  |* ]1 V

    • . t0 X9 q- L4 J7 {! c
      8 a* b& b+ i2 v" _: V
         if(run!=NULL) /*如果运行指针不空*/  " R% ^9 V' Y6 r* x* J& E5 ?* ^
      & l$ Q& E% `5 D* o6 O1 D! t
    • % r+ N2 x- V& ~9 p5 A9 I

      : m! j- f+ Q. ^- M; }6 u) t      prt2(algo,run); /*输出当前正在运行的PCB*/  : D. z" a4 ?1 b! `# {+ p1 m

      4 V* [# n8 \$ x2 I. \

    • / H  i& f7 G0 [4 l; L+ _* n

      5 a8 B, }9 ]) l" L   p=ready;  /*输出就绪队列PCB*/  
      % j! n$ T- j' p2 l

      1 v/ q. |* ]7 y
    • ; f% M' }! p8 t5 Y  f( O

      8 G- A& V; U. H; n+ S   while(p!=NULL)  
      - m0 }$ U6 E+ R/ m( J3 _9 A1 F

      % p; K# u( R7 o4 d- v
    • % l* c. J0 l. O  o5 Q  D0 d
      / Q! y* m( c1 a0 r4 S* {- a
         {  6 X) h1 ~9 W1 a

        @& I: U1 ]/ l& B' s
    • 6 R/ q/ c% s9 H$ M
      1 Q1 `% o9 Z% b* q! V+ G) C/ l; [
            prt2(algo,p);  
      3 v& l) ?0 r. e  u% ]2 G
      7 j1 a! N3 O: Z) v& t! A( u
    • " F+ s, O( c- v) d, B

      % C9 ^9 E" N; ~9 C5 j      p=p->next;  7 W, \2 e% p6 g  |6 q, q

        \3 t9 [* O  Q( n, z9 Z

    • 7 c) f5 ?( P1 q, Y9 o
      9 z; w* n! X$ d. F: x4 W/ e- N
         }  
      : _/ l8 e: {: v3 Y! M
      ! v9 t6 u  L: _/ m; d
    • ; f$ C9 u. w) ?& b5 W

      8 J* {% `( t% W6 L/ G   p=finish;  /*输出完成队列的PCB*/    E2 R7 y7 Y/ V" t4 |2 i. J

      ( j' Z+ p( b" x3 _+ h, X
    • 0 |/ U; H/ p( L9 F3 q' f3 e
      / z' W' U1 V9 ?2 l6 D. ]0 B4 x
         while(p!=NULL)  
      7 V! \& W4 t% S4 Y

      ( K. w8 |3 B# w' z

    • : }" k: |6 j& M/ f2 k5 h

      1 c6 U2 e- b& L$ \7 v9 c( X3 D& F   {  3 O) K$ W6 q0 c& Q( ]* l

      7 o! }: O+ b  n, w
    • + a, k0 J, ]( s1 J

      & e; G' {' j4 D: W5 t% J      prt2(algo,p);  ' ]+ y# M6 u0 u" r* c# C
      / @: c7 \8 ^, M; F5 s1 T* g( N

    • ! m- A! ]% K0 Y0 J: W; l

      + M3 B  o3 c% G" j9 R, n+ e( M      p=p->next;  ! F( }' z) l7 F5 m. B) }
      $ h) ^) J! [! n: j5 K( I
    • & M' |7 t9 Q# `) w% Q! ]

      + U4 M' O+ q$ F+ v  i# G2 Y   }  " q1 u" j) ?4 D. P
      * W" o/ X" _) P/ z; e4 k
    • 3 t) k" c9 u, t6 w# f

      : t) s- Y7 z& A% P. m' v   getchar();  /*压任意键继续*/  ! y9 S! E3 x* @( u

      % A. T" P6 E7 E# o9 \
    •   r7 c( x6 n/ |, Q, F$ C

      : R0 `4 f$ B# z7 |" b6 Z' v- c/ A) R}  
      3 V  l! i$ E  d# ^+ _- ~2 {

      8 x0 r. U2 i& Z2 Z/ ?$ ~

    • 7 D9 @7 b/ B5 c
      0 t* w! t2 A) Z  N( a
      /*优先数的插入算法*/  . D6 j) V& G6 N5 X1 @4 h
      & h; v( @/ ^5 ?1 p6 x- ~
    • ' f8 U. t* _; O6 i- x

      * U. b9 }. t, M- p# @+ q7 c  Iinsert1(PCB *q)  + B* ?, o; e% E- v2 Z

      ; r) ^7 L) O- k9 ~" e9 F: \9 _

    • 8 @' \6 t) n9 @# _# C+ B4 W
      & b5 B3 H0 S7 {: }/ V: P& B
      {  
      ! N3 N1 z; x1 |! n
      0 b$ G# q% t6 U6 [1 P. ^3 h$ ^

    • 2 b: @* s3 @! K' N
      . G2 Y) h: g: q
         PCB *p1,*s,*r;  
      4 z. C3 i7 }, k$ z. _& o% @7 F) [
      % D% f: P" @8 y7 I
    • / \5 k. g( U0 }0 J- H3 |

      * m& K0 q% G) a   int b;  + n9 O- i. L4 _* I. U
      . J* O/ V: A/ I! f5 A. k$ G
    • 8 v$ d; ^6 J/ p. c9 S5 I
      8 ~) T: x0 S# T$ r
         s=q;  /*待插入的PCB指针*/  
      + g9 v, _. c  _# c
      # t6 ]+ w, U2 ~4 G

    • 8 I3 b4 G9 T! t" x# x
      , M. |4 y: r) m6 Z# t
         p1=ready; /*就绪队列头指针*/  $ {) x3 y. `1 H; v

      . a) G- w' {7 }2 S

    • % Y3 K! R7 }# f! n! f
      , }* U! s8 F% F4 P  p" e
         r=p1; /*r做p1的前驱指针*/  3 }5 o* f* D6 E9 l+ E" M
      1 t0 A2 j1 M2 M% J# L
    • 8 [8 O1 D7 p" D4 F9 [

      $ U# j2 ]- T9 N! v: r' v: \% |   b=1;  1 U* F  }* J' r1 z

      / a: k$ T; [! Q" _7 G& q3 u

    • 4 ~" ^2 ]4 K- Y
      / p, K9 {6 k* v. ?) l4 I
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  ; O; _, e9 r5 m% l: T% p

      ! ^* ^) w3 m# \1 j8 f9 E
    • + V2 Y* S$ `7 _9 x
      ' j7 g+ z1 F1 N  s$ E4 N3 S( o7 _
            if(p1->prio>=s->prio)  ! j- p7 D% ?6 V

      0 H, O( Q/ G( s1 x1 G) D

    • ) S* r" R5 Q/ m6 V' ~( T8 [1 n

      2 }) b" N& U1 R0 o# u& ~9 I5 z      {  
      8 n3 n/ k9 ~  o& \% F

      . K3 i& y5 t* V5 C/ N

    • . @8 `& Q: B0 |, |

      ( Y# v3 K" T3 M8 u3 N) R( ?2 I     r=p1;  
      ' A; E  T7 }$ o! Q. n, X8 v& i
      ( X% Y/ o; O  r) Z
    • ' H  @/ T0 T0 d7 H* h
      ! Y, ~" |" O/ f3 d9 q7 O
           p1=p1->next;  $ `0 Y8 [/ f; O" H9 B. Q

      ; v9 N6 t, @! g

    • 6 g( _* L2 u5 X3 @

      + m% I- `; \9 p      }  
      * C# n. ^' b! T, \: g

      ; f% @% |0 \7 l7 c2 U$ Q2 S
    • 4 R6 y3 B3 C+ q' M3 U
      ; O: G4 t4 ]" ~( }6 a, l; u
            else  5 V! v' i; L1 Y8 z% h* u

      1 i+ u4 j1 v" A

    • 1 r3 q  o: G7 s( B2 `

      8 Q- _% u# H% s: x) u7 _0 j! `( G     b=0;  0 F! N! j1 {$ q1 N  `1 }

      1 [) ?5 o- v/ u

    • 9 D: O) m; P8 Y2 h) u0 Y; G4 s

      5 i) v, m  X) T7 U& `0 o   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      2 k6 U# M) A$ q
      & F/ f0 a) N* J8 l7 g& D) V

    • , X% `7 e0 P0 G% q+ i" U
      / _/ x& P& A% t  S; `
         {  
      0 b5 _% w- B; d
      , {# i( W/ [' s& ]
    • . ?$ o0 E% {( }( w0 k
      ) U% N2 K; O  x% H
            r->next=s;  
      : y7 S: Q0 Y9 @

      & Z6 A+ x( [1 ~9 c
    • % X9 N; j$ }" X/ J
      " n# N. A0 e" O5 U
            s->next=p1;  
      2 {' M( y: n0 j4 u9 K+ Z2 r

      # C9 R' A4 T( h$ b- b0 q0 `5 f

    • . r* m* `/ y+ G

      : |! C6 f# O8 z   }  1 D3 |6 t, }& Z
      ( b" q* m' O2 N( O) }

    • 6 H! l+ {/ X3 {7 Y
      3 a3 q/ m7 w/ u; J  b. X8 b% n
         else  ( X% [7 N% ?5 ]7 Z

      % [0 J: N+ {0 Z2 C; ?% I

    • , U7 u: w' S- J% [3 D7 k7 P

      * G5 z. V* _( W& T* S! {; e2 ~   {  
      # P1 f2 Y2 U$ o4 @/ Y

        G2 a; r4 g: q

    • : K% S' d7 o% }- S3 g

      ; H2 y# W  v2 v5 q2 v; c      s->next=p1;  /*否则插入在就绪队列的头*/  
      ; B3 G' F( ^( u8 i" H+ B" c* C. w

      / Y8 A: K6 e, P
    • : G) b3 u) A7 g

      ( b$ u, y' U% s4 \      ready=s;  
      ) T/ {% t, n7 k- B4 v! x8 _2 c; g

      % U& F! J6 F, j1 c, q8 J3 r; O

    • - N/ {3 i' @1 s) ~" G5 c: S
      ( c! q  m2 B3 {9 N9 a
         }  
      ' `/ ~- V$ n  {  ?/ D- T
      " V8 }2 c8 m2 F4 U3 i
    • 0 ?: C, z$ Q# [# d; S6 @. D; p9 b4 K

      ! g$ f# U7 [0 c# O0 [2 E}  9 z& c* y! p' P% K; t6 G0 }! y8 g
      2 E% I  D# K6 _+ ^' Q

    • 2 Y$ a& F& M; \$ X* H; g

      " e: z4 I' ~- t$ [3 Q/*优先数创建初始PCB信息*/  
      " G2 U7 @; J- _: I, |* P

      0 E3 e. Q& ~8 T& R! l

    • - j5 k& e8 E$ L0 w
      4 [; O9 g5 p8 l" A7 f- G
      void create(char alg)  
      " n( P( p: R) M+ Y

      ! W, K6 J) Y4 A

    • ! h# w# ?. I0 V7 _

      3 l" y3 t. A/ x! U{  
      " X- L+ U# D# ?2 g

      9 X2 C. n- H4 x" u3 V9 |' }
    • ! ]# k4 h0 a$ K- f5 v9 @9 `& \5 R

      3 [6 [0 Y9 A6 h  A9 P   PCB *p;  6 b$ w& W- Y2 u; o* f3 D" j" Y/ w) N$ U
      2 ]8 {0 l1 x! L; Y8 z4 R

    • 7 v+ ?$ n6 _/ m% O
      ( z: U. G  t8 K* _7 s
         int i,time;  
      * a0 N* i3 \" B3 Q
      8 [9 f) N7 o. g) m) f2 b- d

    • : R. A4 W$ I# i$ W$ u
      & x  g+ U7 W; w# C+ n0 B
         char na[10];  # ~1 V! j7 q& O1 v2 C* i' ^
      " t# o8 T' }, B

    • ; y5 }+ G/ W& ]. P! q& P; G/ o
      3 Z& n! N% g) v+ X* u3 \
         ready=NULL; /*就绪队列头指针*/  
      7 S/ T3 a+ V; Y0 ?. k0 a
      - G- K4 M7 o8 b4 H5 z- F2 B

    • * ?  \% t8 [, P, k, a: v' i
      2 t  v. u; G' T6 q
         finish=NULL;  /*完成队列头指针*/  
      ! s7 a. S$ J" q% `* C

      4 O# s* Y: T+ h% P0 \

    • ' [# Q2 G6 \. x+ P
      - k4 `) `! }- i1 }7 p
         run=NULL; /*运行队列指针*/  5 Q0 A! \/ K; b$ ?4 N
      , P1 K& w7 r0 H, J  ^2 ?
    • # `( p$ P) i& T7 `1 N

      ! P4 W  s# ]: C# ]4 _- C: t   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  . {5 z. X5 a7 Q( k/ }, {: s

      : T2 U! w- d4 e+ r9 }% R3 M

    • % K' p% Y1 n7 d& _
      1 @% o4 N7 h7 D2 q. Q7 s% `, A
         for(i=1;i<=N;i++)  3 Q: D4 f, e7 X+ ]" _. |8 o
        ]9 m- H, c4 x6 E' j

    • ( c: N% f) ^0 V/ n: Y9 {

      9 g# g7 s* s* F' [   {  
      0 ?/ x/ q2 w& O  X/ ?
      - Z/ h2 D+ [$ ?5 R

    • 5 v5 l4 Z3 y5 c2 w/ _- M( X
      / @1 a! i  i- A5 ]  ~
            p=(PCB *)malloc(sizeof(PCB));  8 d0 l0 j& N0 s) }* u$ P
      6 T0 h  }+ H8 c- d
    • 8 `, w- n- l5 o% F% N5 w+ J

      $ N7 d9 l$ R- k: G# c      scanf("%s",na);  
      1 e: Z* \: A. w4 \" Y

      - a9 S6 W" y5 R- {, [) _; W

    • : [1 ^7 ]/ w9 q8 R
      7 q2 [4 g) m+ X1 e& c# }6 D
            scanf("%d",&time);  
      ; A$ p3 k4 w: N: n0 T% w% h8 r4 F

      8 p% P8 P( D0 }7 N* u
    • 5 l+ `5 U& k( x( v) ]  `  E
      2 N) G. B- Y% K0 b5 G" o1 r
            strcpy(p->name,na);  8 ~" b& `' Z9 Y
      4 Q. w( g+ K- q
    • ; m6 O+ N; \9 y; U! L
      , m9 ^# R3 c" v1 U3 c9 }% `5 B* q# P% O
            p->cputime=0;  
      # b) p8 J- }* N$ s: ^

        X) V: g# [# J. O# O/ c
    • : R1 f, y9 K+ x+ i1 K

      5 ^4 h% Y$ H4 P8 d$ ?      p->needtime=time;  6 G$ T9 t, [# t1 a* y
      ( t9 P- D3 \% p. E# b( c

    • ! U* w+ F8 p( K* U$ o# P- I1 m
      " V/ {- n  S2 J! `2 [& b" I
            p->state='w';  
      % W/ d/ U8 b" ]) F/ L  j
      8 Q8 Y* l/ e1 J* U% }

    • 4 \0 \; |6 v: O  {& b' \

      * s! d. ~, a6 h      p->prio=50-time;  
      3 u: a: x$ ?. O

      7 L  I6 v% {) h3 P5 z# F

    • - Y/ [2 v9 L/ E7 j+ {9 c' D7 U
      * R7 A' ~% g  M9 \+ d- ?
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      3 |+ a5 ?  t6 \" m
      , h7 A0 P( I/ t. Q

    • 2 }* p) ~6 P' a% _$ p& Q

      ( y: L) t6 s' v     insert1(p);  ' k' q5 X3 }: m4 j

      , d& @8 D5 p( a5 E! K1 K2 Z
    • ! y+ T8 A- |1 ^2 F) H
        I$ i- F: V0 c3 ~. m# b9 S
            else  
        _0 T% I% D7 G# H; U
      8 d) E  x; j& A1 K
    • 2 H  z. e' F7 J0 j) t& R

      # ^4 J" _" F) _) H# _0 u: ?: _; y      {  
      ' Q/ ?8 p4 b5 p  \0 O
      : c4 b% f2 g% g1 H

    • 2 G# F* R+ A  r) N: N# y, K1 n

      * C5 U9 I/ x  I( a     p->next=ready; /*创建就绪队列的第一个PCB*/  ) P4 V! H  z" D1 f8 s) n

      # n0 {, p) t9 m. R8 I0 k

    • ) V6 `1 [! h, J
      0 J# p8 w: }& v: r. J( W2 p
           ready=p;  / n! |0 @8 ?* x2 x

      9 ?! |, K$ ~: t+ O7 J* h1 A# N: _
    • ) H, x( [3 Y  W  r8 V
      ! W3 t2 x9 E) B- @
            }  
      + {7 r8 ^! q; v: {# e& F  x
      9 }& y% E# f0 c% p
    • ! F- Y1 o% d3 p6 d  K
      ) M: c$ c: r$ v/ |! H
         }  1 G5 ]8 d) Q8 ^
      / K6 k1 C1 n3 o  G% ]

    • * Z/ c6 H9 v5 B& T6 t. d, d
      ; q( y* d9 X& A, O$ m. n  [$ V
         printf("          优先数算法输出信息:\n");  
      2 H& @" Q3 |% @1 X, ~% {
      5 t, U# D+ R: N4 S3 h) c1 d
    • 4 h2 h9 Y7 S5 E5 k1 d

      $ R) m1 q4 ?% j' d/ j, |: g9 ^   printf("************************************************\n");  6 q& U3 v* \0 [& k8 [, y$ J

      * o+ r% V1 g: _/ ^* o- |3 d

    • 7 ]) k6 r7 _( l# R: a! o' U

        W6 S+ w. @% s- |   prt(alg);  /*输出进程PCB信息*/  5 V3 T  |0 b9 V' z$ c6 V: s
      8 [4 M: y4 `  s# ?" n7 Y+ K, c
    • # X( y! Q' t5 o8 |4 @9 ^) w

      % J0 X- t+ c; r1 I4 {   run=ready; /*将就绪队列的第一个进程投入运行*/  
      $ P  H0 d1 }3 a1 w2 z9 O

      , l$ d3 i6 G9 ^2 h$ q
    • " e8 d% f1 ~6 I3 [

      / h) w# l/ V' h* ^+ }   ready=ready->next;  $ i! F6 c" }. n6 `

      . \- A  V7 \! v: m, M5 c; @

    • 8 w1 L) \/ d( a5 {3 ]7 _2 H3 [1 s

      9 {/ c! |3 I" Q& o  o2 Q   run->state='R';  % k& g. ]  D8 l+ x4 j3 C
      : E9 ~1 C1 }7 d# L
    • 9 V0 ]( S4 O* I! g4 E
      ; r# L. }& k1 c# D
      }  2 W# W% z8 `2 v; p3 H
      , l& j8 `9 K; Z6 E$ F* |7 }
    • ) ?& E0 [, Z  M2 ^& s8 b, }

      ' B* h- y7 S, @: f: E( ?/ G/*优先数调度算法*/  
      : i* A2 x3 d0 E2 @3 f4 j
      4 L3 _+ q9 R4 o2 u

    •   S( M2 X+ J1 r2 O* K

      9 Y5 C( ~- Q( U6 Apriority(char alg)  + Z: z# x5 j9 G; h

      # e9 H' F2 X, ?* ], J# F/ E

    • 0 i5 Z! b7 s9 v8 G7 z# B

      ! R( B# W, Y" d3 [7 t{  7 n1 {- ^8 A3 N  l

        q" Q0 |& U. `4 Q
    • ( n+ p, S- k2 o+ w& f2 R+ v; C! B
        b9 w7 n9 @, R; _# _+ ^  B6 ]
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  ) j% u/ C% H) C! j: v, n
      1 _5 [& q0 C1 C7 ?' o5 ~' m/ t
    • , [; t0 J. u) M+ w  d6 T
      3 ~" u/ T1 P" [: ]1 O9 h
         {  2 M  j" O  M0 b" k* s; m9 F

      2 B* [+ f! [( C6 I8 v7 s8 }

    • . E+ K9 h( V6 W" R0 ~+ c
      5 u. D9 @2 v6 y8 U& t5 Z. L, I/ f
            run->cputime=run->cputime+1;  
      ) H3 l$ z! n$ r0 T
      ) {7 V2 _1 e( X! J/ F

    • 6 }0 \* m9 T4 ~/ G

      : r, I: |1 q7 p7 X, V5 r      run->needtime=run->needtime-1;  : _7 A6 S( |( T
      ' ~2 |9 @( S7 X
    • 8 }- h8 [" }2 N. E: |

      " L$ i  R$ r6 g5 p; U      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/    G2 I( S2 s! [' z* E+ x8 ^2 t
      ! [" _8 [/ A( Z  f% m3 h3 w# L1 h% Q

    • ! H4 w  _: q0 s6 ^7 V

      : p9 ~5 X; D/ d  s8 v, T0 F      PCB *p;/ W6 k/ r; r9 _7 S4 c& x( i; T9 \

      ; t( E2 G8 s5 M$ i* E  X
    • + P5 [- O0 ~1 F7 e

      7 e  K% r: ~5 E( {9 e' Z3 h      p=ready;
      6 R6 @# n  N7 _
      ( E" o6 g1 }+ [& E4 L1 X" l
    • + q2 n0 O1 v4 e! \
      0 A' Q, i( [" l% g# ~: D
            while(p!=NULL)  
      1 Q' }0 Z$ O) N
      4 l; x+ J. j2 \

    • & O5 M- F% D  \* t0 G
      / {" I% q& w( k- i' H
            {  * Q; d! }$ D6 r4 u

      # W5 i; K4 h% `& J6 P# f

    • 6 @+ K0 c' z  j
      1 U+ o4 y( e) f- Z7 F# S
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    . d5 g& N; T, R

      % I  A9 g2 Y) ]( G& T' X
    • 8 q& ]  S" \, j  q; N
      ' Q0 s$ I- y. y7 A9 M$ f' P
                p=p->next;  
      9 ~5 ~) L: e: ]2 H! |: h
      4 q+ a0 ]5 u1 }/ a

    • 1 l( a5 R6 ?! j/ a
      2 o' P* ?8 V- G7 z$ e$ R1 Q, u
            }  4 w1 V+ K9 I' t- ]* @
      ( Z4 z! K1 @+ }$ \5 o8 a

    • 4 m( g" y3 H& ~9 ?  f2 M/ E

      , g. |$ a- f! K! i      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      . h" _) d, F, p! z; m

      ! m% j$ Q6 }* m  H8 ?6 F

    • ; D" t: c: B& A8 N  N4 G# r& p

      4 O6 ^) {- p& f8 y0 P      {  1 ~! W: C0 ]& b1 c. ^

        t1 a& x0 ]* m5 c: S

    • 4 L# F  u  ?) s# m0 q
      6 }- K+ p6 `: [0 f  H. u
               run->next=finish;  $ L6 C2 D8 m3 b0 \: B5 l
      - ~& }. U, ^8 g& T

    • # A/ z* O& i- T7 Y1 ~; r7 [: k3 G

      8 _/ R% l/ _+ m) ^/ g  l# ?         finish=run;  8 i2 s4 K* u" c" a+ m3 _3 Q4 d  i
      9 y1 P8 Z- V$ w  M8 I9 T; V# e/ `
    • 3 T3 j. |. v: _3 G$ S  B
      $ |/ q- u: B: o9 t
               run->state='F';  /*置状态为完成态*/  
      & E9 @0 F8 |) N5 o4 x% a; _

      " p; w3 }* h! |! @
    • 4 i7 C9 J/ `4 ?- V+ {0 ~$ ~
      ( P" V6 D4 T) |
               run=NULL;  /*运行队列头指针为空*/  
      % ^9 \8 ]( d) Y0 H

        U1 A9 o' O2 K; G
    • " x: L/ F- K1 S% X$ l+ ~4 D9 \8 l
      3 o- x$ j% n: l! @7 Y
               if(ready!=NULL) /*如就绪队列不空*/ 6 l7 T$ E# Q1 |2 v" O$ [
      3 q! h* W$ S2 U; B+ H
    • * ~% n: u! e% f; _
      - K7 i0 L% U4 t/ h
               {  
      $ m* X7 \2 Q% S; b1 M8 y

      2 `% E9 e" S2 U: R

    • ' }7 ~* z5 k' O. [' g

      " M7 s) C, N" Q: M            firstin(); /*将就绪对列的第一个进程投入运行*/  
      ; s/ |, Z) U  ?

      $ u) Q4 G) n: a; n$ ^1 }
    • , E9 d  y2 l$ i( c1 u' c* X8 M
      ' I( M" _' k5 q' H& S- z: e
               }
      4 b5 \- t& v2 U' Y7 b

      ' z  Y5 i( |0 A: B

    • + {& f5 A2 ]* i# i+ l) h3 {1 Q
      % ~! w* h% F2 n
            }  6 W8 f( U( H* U3 u0 d$ S

      7 s: ^, I2 Z: J8 p; a6 f
    • ) S0 M& q+ [' C6 |/ {6 M
      2 C" ?* ^& F. ?8 {! D7 S' s
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      + Y* I$ K5 O8 L) @( \

      3 U% ?4 w& A4 X2 ?: T- M5 `% J
    • 6 Q# a- L/ X& g- d% I" h1 C
      ! z" P0 W% Z' ^" w3 j
           if((ready!=NULL)&&(run->prio<ready->prio))  ) F3 ]: M, V0 j( ^4 i/ V5 R& O

      - M  L* ?9 b& Y( L! M: v1 d: a8 H
    • ! d/ r3 r2 D+ U- Q
      ) w  D7 u. L, C: J1 u
           {  ( `  W: r8 q) l! o3 ~, A2 H& M
      , j* a2 [) h  P! k: ~. W8 p; V

    • ! o7 q" j; k) b, K  j( Z0 F

      1 k7 v& n7 ^" n; [        run->state='W';  
      9 N/ i, P$ o0 z: s9 Y7 ]6 h* P
      5 [, g% V: K* h8 J6 i9 Z# n

    • 9 h& \) p& [6 H: D3 [
      ' ~9 P* O) X2 C  C6 ~8 @
              insert1(run);  
      8 ~) ?& |/ ^2 g( T. g* C" Z4 `

      ! p& k2 f0 {, V. u0 ~: z

    • * @, i# ~" V: g& M7 Y

      + U+ O* u( Y& c" w1 I' n# q7 H9 s        firstin(); /*将就绪队列的第一个进程投入运行*/  
      ' z: E4 J8 K5 _$ S

      : o- A8 t7 R5 Q$ R

    • ( z. J, @$ |& D0 |/ _% `. P

      . @% ]! i7 U" t4 K" l! G8 |     }  : I( q8 w+ b' ]- t

      6 ^! a: V4 Y6 c, |! C% L
    • ( R: n2 i- L- Q$ j0 ?6 d/ F/ F
      2 Q$ C% l  f7 N
            prt(alg); /*输出进程PCB信息*/  , U3 m) g3 c9 T- V) P' D" T
      ! ~6 F: r  ^5 S7 Z! J( H

    • % d0 \3 R8 E7 l2 z$ @& @
      6 h3 V4 G5 ]/ l
         }  
      5 w# F# h  o7 [
      & m" r+ G- i  `! s5 Y3 `) F
    • ; H+ A% }' W* j% B1 i
      ) ~' P+ d% X$ r0 S% E' i0 h0 q
      }  
      1 s- C5 w: c* }$ h; j( v6 j! G! t: D

      ' t/ v* I+ W3 t7 H3 M2 H, K) G

    • 5 k" O3 ]6 d' o% W& E4 |$ @

      3 G; Q0 Y& J- x, m  w. Q9 S9 }  D/*主函数*/  
      2 Q( R5 M/ o* ]7 `3 t

      & w5 `, s" t3 U

    • - m9 R3 G3 D2 k. Y9 e; x8 j  Y
      : |9 F, I- }$ c* k9 G0 E' X. |! _
      main()  
        b5 u! ^/ h6 i1 y7 q0 i7 K: ~' }6 K, T
      & N5 B' |5 @3 Q3 Q$ V8 B1 f- c

    • , r* V) a+ Q6 V+ X

      3 z  c3 w7 W8 D{  ! c8 L/ O0 i4 L3 i" {; n

      0 ~$ q/ n! b! P" {& k

    • 8 ]% e- g: B6 J

      . z  t" x8 G. D& r& l  b7 _   char algo;  /*算法标记*/  % v/ Z3 D3 m% m! n3 Q* k

      - L! _7 S0 y5 o

    • 1 r8 ^, z+ t5 k6 R( `; {! R* P
      # _  M6 I4 D6 e: ~4 [' x
         printf("输入P确定算法:优先数算法\n");  / |* U6 s( C% ~' A4 d% \5 }

      , Q1 P4 u8 h: J: u+ u  ~5 i
    • + X. v4 ]6 k, i7 _: I/ [

      & U! C& r% H- }: C   scanf("%c",&algo); /*输入字符确定算法*/  - U9 {+ D6 o( r6 m/ ]# [) N
      % W- q" B( a- Z) W! E
    • 7 E; @& d' v9 R- z

      , S6 N! @" L; ^# v0 r) s) s   printf("输入进程数:\n");  
      ' r) ~( _8 }+ i  J0 P- D8 N

      ( ^/ C% W3 \/ u' D  X9 ~  Z
    • . t3 A. `; s1 M( P/ H( \! j
      3 }0 A- b2 ?" E  s0 U+ C
         scanf("%d",&N); /*输入进程数*/  ' b, e0 k9 [* X" Q& ~; R

      ( C( K/ K+ k3 E3 X7 [( D
    •   R( U/ U& Z+ R1 ~  V
      & q) x4 k& N4 E9 v2 N2 u+ f: C) r, Z
         if(algo=='P'||algo=='p')  6 i& [6 ]( v& }/ |; c+ T/ O

      ( B) x8 l4 o5 v0 c4 w
    • ; r3 S+ Q) @9 e9 i" k, j
      * o1 G. L4 A: Q3 ?. E
         {  
      ! J! j! Y3 N! f5 J; Z
      3 _" J  H; l: p# X
    •   O) F8 ^$ h% Q8 m8 H

      & `# x2 l9 e; ~2 h, R      create(algo); /*优先数法*/  
      0 B  R; [" s( b# d5 @

      : @$ f# u  m" r4 q5 Q: Y* c

    • $ O- D7 G" P8 j# z3 T! b

      5 P; ]$ }3 p7 H/ B3 c& c6 s" x3 X      priority(algo);  
      4 c3 ]( J' K' L! _* r

      . v' R3 E0 u; `
    • : O1 r- d1 L+ T7 b: F% C! C+ Z0 G6 k
      * _. l0 o6 z% w0 I
         } & b! m  \' }4 U# Q$ A- q6 i: H# U

      3 x, \4 \4 a% V0 m9 j( q
    • ( O; X1 Z! j$ E, @- O2 v! |

      $ Y/ i" q0 k' ~% C1 b3 Z/ i}
      / Y3 z* m. ^% m- P( n

      - ?) s' d  z* I6 a
      9 T% o$ [( Z5 y8 G


    8 R2 }, ]9 ]$ g  D; |输出结果:; f. f  H3 {" w9 ]5 ~8 J8 c

    - f( G4 U' v& p% v; v
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    4 f; @1 x0 i# b  Q; Q& N8 U* e4 O7 q7 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-4-20 13:04 , Processed in 0.464318 second(s), 51 queries .

    回顶部