QQ登录

只需要一步,快速开始

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

    ) t( i: X) E9 i; I, v' a优先级调度算法  X; x: o' [* o, E4 z

    算法介绍
    ) O, F! n: H2 I. y/ u! _/ P! I优先调度算法的类型(用于作业调度)$ }; `( X$ y  i8 d% `8 F' j* p
    1)非抢占式优先权调度算法 " |5 j- f, `  e( h* Q  Z
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    6 S: ]5 `0 ]+ M4 W% i1 w6 I  F2)抢占式优先权调度算法
    8 S; p; {( K, y. s- A2 D只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    8 Y' z5 ~, T0 d$ \% M; v1)静态优先权 ; E" }% R6 t( f) N# }3 }, j  O
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。% m* {1 Z' E( k" D$ X8 E' R

    2)动态优先权 2 q; x4 l; _0 T+ `( u

    算法实现

    抢占式动态优先权:


    $ Z4 W) ?" r) d! XPS:本人认为非抢占式静态优先权没有实际价值。

    • / \5 c& m, |6 M: Q

      ! X4 O$ l9 f. l6 T6 Y1 D+ l4 C#include <stdio.h>
      6 ]( R' V% B4 G6 |" N% v. z" q
      3 z- [/ E3 u$ Q/ e& ^9 k
    • 3 M8 Y0 ?: \* ~) i
      , i  q& R- M% f
      #include <stdlib.h>  0 n9 `( ]: P: q7 ]

      / ~6 p) C7 v1 H7 g* I

    • + {; p2 c2 M! l2 v8 A  Z. s' \5 J
      ' }3 |, }) D4 X. l# Q7 ?
      #include <string.h>  * H% [! L0 x8 R: H* R) H6 x

      & p3 P( x# q% A2 H% H! ^
    • - I8 ~6 [% Z8 s: z4 ^% W  d
      2 m2 j' _1 @! ~+ z9 s
      typedef struct node  8 p% T# N& M: s" l

      $ R! u2 Y; C/ ?9 \
    • & o( I( M) P$ |6 |2 h3 g4 L

      & l6 x( E6 p; z9 ^. W{  
        G6 w: K0 A, W/ [2 T
      ( P: R. e" [1 C1 X" ~6 q& Y5 ^

    • 4 _- V/ T: e" j; R. h& w
      ( d5 K( E( x- z$ P
         char name[10];  /*进程标识符*/  " f5 h: b7 s9 `- h
      4 d  s  Q6 G  E2 U8 j. u$ X% o0 S

    • ; |7 t3 W8 r( B7 {* u- S

      0 M; O- |* l6 o  w$ g' G9 N   int prio;   /*进程优先数*/  0 c& d) i+ y  p1 _% L: ^/ r
      " A( i, n* }" K3 C

    • # t5 p) l( J* z

      2 V% J+ O& q7 N( N# a   int round;  /*进程时间轮转时间片*/  
      ( P( }  z; U( K$ M, H' b: u( o6 z: a

      - [7 y) R3 q: R/ ]" {3 B5 H6 I

    • : J$ b! Z' J% n+ _% |% e# L2 Q+ c9 a
      ; {/ U# q6 _3 `  B3 p
         int cputime; /*进程占用CPU时间*/  ) Y( t" R4 T* T, V) @0 W5 |
      . {6 O* [+ q! R- {5 j4 G) n' n: h
    • $ t7 Y8 }! B5 @- j1 u5 T/ F

      5 |& s$ g( @- g) Q  K+ w  [   int needtime; /*进程到完成还要的时间*/  
        Y* ~* o& {) E; H7 F2 m6 H
      : P; `4 m% a5 D, ?0 q
    • ; `: m& x& B8 }$ e' ~4 U1 d3 p

      ; W9 v: k9 c4 b, J( g! @! W. P   int count;  /*计数器*/  
      3 s% ?8 o& R" I

      ( t: w$ B  Q3 U! a. E; q) ~2 N7 k

    • - H% e( I/ @7 a' c5 h, C

      4 q; n+ b9 w9 n. V- f% E4 U   char state; /*进程的状态*/  7 @+ W7 ?2 |/ X7 }3 n  y8 [

      7 V# H3 h5 b8 U0 \0 s2 R4 ~) u
    • 7 Y5 u2 g- o8 X" \

      * D0 i* s% d: i) _# f+ t) B8 N   struct node *next; /*链指针*/  
      " [7 {/ x. o8 h* X4 T

      - r# i. \+ s6 R2 d9 W7 L. Y

    • 9 ?: n: l0 ^" z* l: ?

      $ K7 `/ J2 o+ Y: _2 S* W}PCB;  
      . o( a0 c/ |& s" e" V8 a) j
      0 f/ p2 B9 e5 r5 e. k: |9 q
    • 0 g& P' I  x) x+ ^( s

      . W- A$ F: _3 W) i; P- v( dPCB *finish,*ready,*tail,*run; /*队列指针*/  
        j# Q  \7 ^+ S/ [; H, I6 t

      * z0 M' n6 }0 h7 D/ D: N* f/ n
    • 0 f7 |* i% f, Q: r# o6 K

      & p( X9 S, _: i1 Fint N; /*进程数*/  
      " O  A0 s' \# T$ b+ M+ ~! L
      # q* w+ d3 m9 H  H- [' ?0 C

    • 0 l, y! `1 U; f: U* |# W
      , l- U! U8 M4 q, N4 C  ~; i
      /*将就绪队列中的第一个进程投入运行*/  0 l0 P/ N. {+ D: H' |8 N: _0 I
      " e3 R3 z0 p" X6 {) `/ q! Q/ g& x
    • 5 u7 d2 j( d6 M1 x% M6 c

      3 m7 D. `6 i, ofirstin()  , z# {* T6 s; F2 i* t! o( |

      + x* x$ X  v) s, |  ]

    • : U2 U& \3 n  W

      9 {1 ]2 C) f3 A3 j! {{  6 j1 h! f- o7 T5 r3 a) H6 b0 B

      ) }: t# E+ M% A; s
    •   q  I$ a/ m4 a- a
      : o9 }8 ^! y* B0 I1 k9 O/ [
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      ! U7 q9 P1 L. T% L  E- R
      2 x. l% B% R4 l9 Z+ l5 H

    • ; {% A8 ?, F2 G0 Z
      ' P) E: k0 v' I' H
         run->state='R';   /*进程状态变为运行态*/  
      9 G  u5 h  b1 _; L/ J5 m

      7 X- f& O; e* C0 G
    • 6 x  d$ v* n/ y- k5 p" O8 A% L
      : @! u* O+ f- A& X9 \
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      3 t# L' Z. ]1 M

      # Y+ [/ X; D, e
    • # G# }+ q2 Q8 x' ^2 k8 {  F' \* Q

      2 j1 f2 ~* Q: h}  
      ( \0 x2 U" u" i2 G  }# z- x

      ( c3 L/ b1 T& d0 a
    • - @5 X, S: L( W8 |: m* s. _$ @& t

      1 L  x- E0 O, J% y/*标题输出函数*/  0 `/ y( M; |1 E1 m
      - C$ p, S" {; E# d6 Q( T

    • , s* [3 x. p5 ?2 y
      , Z4 d/ Y& C5 k) W6 \
      void prt1(char a)  
        C4 a4 \# d% b! f: b  ?% y" i
      ) c+ [5 b3 ?: w0 Z8 Y2 \
    • ( X2 `! N' F3 X5 ^4 w7 f
      2 F# }1 I0 U4 K
      {  
      3 G6 S& n  x! P7 U, a8 j6 h
      3 T! {4 ^+ M5 I4 t# X, }

    • , U: X& P. u8 r9 Q
      0 v: h! \( S/ B- g/ e8 o# q# d2 o
         if(toupper(a)=='P') /*优先数法*/  : \4 P8 J" p+ T# g  a
      * C3 }2 p% B/ z9 f" c7 u' |7 J# A/ Z
    • . g5 ^2 V1 B8 x  H( ]
      / X. `: q7 o! F/ u
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  9 ?% H' ]  h- n3 M! Z8 ^
      / _: U4 F4 h# k( c$ Q0 G

    • ( I1 W; c. a7 e, C% S3 X) J& B0 I

      ' u% b2 s% f; u. b4 y# E% I( m3 j& ?   else  
      ! i  U5 r5 e0 `6 h5 N

      ) A0 p$ ~9 _$ X# m( E0 s& k5 p
    • , I" w* \, _0 L: _3 [: D& S5 a9 L

      7 ]# ]2 g) M1 Y8 U  [/ n5 c3 w, j      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      $ e. Z1 Z/ d- l& W

      6 Q5 x% A3 c7 Y) N1 A
    • * T$ h- ~6 l  P# m
      9 H6 R8 v8 y8 |4 G
      }  
      5 s. `% k( c% o% B9 M/ L/ [* ^

      - M# M% D. @4 t& H  e( ^( C, o- n
    • * q' y, B9 \$ m8 j. g& X; o, ], J3 G
      # H6 y% {. Q! _
      /*进程PCB输出*/  
      4 @# ^4 R+ Z) k7 y
      * T! d3 |* w% E, n

    • , p" C* N+ |; X: O
      ' {- {7 q7 e: F; P! E& b* S6 ~
      void prt2(char a,PCB *q)  * H+ q3 k3 T3 J6 T- d1 B

      4 P7 @$ Q) V- I' h

    • " s3 m1 k  _/ t$ a1 H7 p* ~

      6 l+ R1 }3 A; X. R: T% x6 s{  . L+ c' C3 W% |$ j/ A. ?

      * p, P' [" I9 S% b4 ]: x5 y
    • 9 }( s2 I6 n, C$ ~
      . v2 \) Y& e% Q
         if(toupper(a)=='P')  /*优先数法的输出*/  2 Y- |) }# T! R# g4 y$ c8 G
      ( j# J2 ]' d" D8 p  {2 O  R

    • , |0 Y" @% ~+ s2 {

      : Q. k- g2 G! H      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  ) y# e( H3 S5 Y" u

      7 m# @7 i/ Q4 W5 i2 e
    • / o. Y4 I+ d4 F

      1 J/ L! m+ k' A( z; X3 p" G       q->cputime,q->needtime,q->prio,q->state);  
      ) K8 B4 [/ M# g2 W5 a" N9 e

      + Y  i- T  r& P9 F  P
    • * u" s8 t& U4 {" c4 l

      0 H, H, J$ [& |4 j. W7 H   else/*轮转法的输出*/  3 V! m6 D& M" Z1 q* c; ^

      ! [4 r8 j/ Q6 O+ N4 a7 |8 a, z

    • 4 {+ Y. N( f' x6 M9 D
      % q! c6 Z4 N$ F8 r' n
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      % K' g8 D( [2 p6 t* B; `$ u

      % y5 ^0 j- Q7 U! D4 U1 |2 X

    • 8 V: S* v. z5 s, X6 m4 I
      + Q% U* [2 V0 c3 i* F' h
             q->cputime,q->needtime,q->count,q->round,q->state);  
      ; ^- E. h3 @5 x, X- I
      ; R! v! |- y# m7 k- v+ A

    • % Z4 a/ T) \+ [5 a) \
      / y! b5 J* \4 i  \$ r0 a3 q: `0 e
      }  0 X2 A# |- U; X$ R* @
      6 g, h, S. X5 b4 F& s9 M

    • 9 z; I0 r( \: }6 X( M

      / P% C: _1 l7 l8 }/*输出函数*/  / i- U, p9 Z; G0 Z5 M' o

      - s% S) G% x! C: j( ~1 j2 |" S& I

    • 5 f2 ?) ]0 m3 Z5 X5 t" |

      % r5 ?+ A; i& k. X# p8 Gvoid prt(char algo)  5 ?, \: x, m! ]9 C1 A
      " J& Z- E9 |$ K6 j& l

    • 4 ]5 g7 c8 ?) N5 l! J0 X# H

      . |( `1 G9 P2 c4 J9 u& H{  + b6 N9 C& {! U3 R' W0 u
      " Y! N9 t2 Z- n: b
    • ( J- r! I/ X* s: \  k+ H# d$ k4 Q
      2 B& T! S/ }( m" Y* K; M
         PCB *p;  - @9 {1 U  u( p" t& v
      % o1 N, D" {: {7 C# a0 X
    • 9 b5 c! d8 ^) _9 N
      2 W6 F" o, Y: `+ F# c4 f8 I
         prt1(algo);  /*输出标题*/  
      3 Y3 F+ l7 Y7 u/ i* V

      1 S; C( G6 Z4 W6 u
    • , A; o  K0 V0 D5 C

      , p' _4 D7 L7 @4 a' r* O   if(run!=NULL) /*如果运行指针不空*/  
      1 p4 H. |- @$ x& {# a
      0 o( l- O0 r8 z/ y/ ]( Q

    • . ^1 s  Q7 d' k0 }
      8 [( r5 Y& O; c1 |
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      * {' O9 x9 C* C7 J2 J/ h

      4 o5 U1 K0 b+ N! w- m5 M
    • 6 _+ g  ^  ?7 a' {  S

      0 L2 u; k1 I$ V( F4 ?, B9 p   p=ready;  /*输出就绪队列PCB*/  8 o; W4 @# b7 x8 ^
      & A! S! r/ c6 U/ @, A1 N! t# {
    • % T7 E; b; r' E7 Y
      : i; |& @4 X& ^- ]0 l
         while(p!=NULL)  
      * y: P: G8 S/ N! O

      - A6 H0 U* w# A: _* a) q; v

    • , P- K4 H+ Q5 q( v2 J

      - p8 k$ n; R) f3 b# G1 \  U& ^   {  
      : Z0 F: {8 M) w' b. b) W

      ) j& U4 B( B2 V. q. {5 S" @# e

    • 2 z) Z( C3 F3 G& E

      7 w% B9 d' q) H      prt2(algo,p);  3 v- s- w/ h( R
      * U5 Q( e( i9 Q; ]! h1 Q# B" i% Q
    • + n  e9 l" \/ E1 [* H
      $ D0 X+ _' U& P+ v
            p=p->next;  
      2 P8 [$ s, ^( I: [

      # u7 b" {0 [6 \& d5 A

    • 6 f6 c/ \. z: f# N0 G
      # R0 I5 \# t/ E1 z
         }  1 Q+ F6 V. Z, C+ g& n
      ' r$ H" `/ z1 O* _* f
    • % @7 z! D/ x  V% S

      4 `7 d- R9 C% E7 t' w7 b   p=finish;  /*输出完成队列的PCB*/  
      % j5 H- O, a: `% m0 D  u7 A

      8 K; v; |# Y4 H2 T0 L2 Y1 n, _
    • 2 `' x9 @2 v4 l/ j/ Z' |- D: y

      . M7 h5 J" f3 _  p" q& }   while(p!=NULL)  5 }- z% |, J+ M# G
      8 h6 L+ {7 e. b
    • 1 L: {& L' ~7 c  U
      8 N/ ^* G4 G* M
         {  
      / p3 C3 C1 Z, M) [* {* a4 X

      / a' c! Z' S! v: \' d
    • 0 o6 q( m$ }: |4 B% m: x
      + U/ x- i* c) \5 U
            prt2(algo,p);  
      9 c4 e% l5 q8 M" D# e% L' `) R

      4 N( B4 |* ^. p) j. q5 J
    • , {0 A7 Y% D$ }- Z" a. J

      4 J$ ^- V' z0 ~6 W9 T; X      p=p->next;  8 A* x+ R: ?0 e7 `+ Y  u
      9 t3 M( a" g4 k4 {3 l! e

    • $ ]/ m# l+ \  p7 f3 o4 y

      5 |9 P0 x) K  {, X6 m+ I3 ^   }  
      9 y0 {' {, Y+ @: r

      , X; H; p# p$ h5 }

    • ( j3 G: `5 T" J! `, D

      ' r! i5 g( |2 m! Z   getchar();  /*压任意键继续*/  
      # c3 _! z- [  B9 [' D4 H+ {
      3 U% X' b: u1 e8 U# R
    • $ ?% Z+ @% R- ~. u/ k' O
      9 G: F( s: p% K  c3 |" Y9 [7 T
      }  
      + `' P7 n( u7 F- U
        S5 p9 n# Q' z6 O% M
    • ) w# P9 N( c: q! o( {. j
        g; n- n+ g  f; n! Y* F
      /*优先数的插入算法*/  - V- e) I3 d9 n3 N6 ]

      + ?! N' ?8 a% O4 j( o( k
    • & H" c* T* V! d, U  f

      ! ~% J" M0 W4 j! X$ |insert1(PCB *q)  7 _, q2 A8 g( Z& @7 U

        Q% o1 o* M6 E! p6 h5 e5 U

    • 0 W) ^: U9 G* Y- a3 a6 B$ E
      ! C& f/ k/ g. }; I$ G
      {  7 n/ D0 f3 w9 ~6 g: Y# n/ z! o* u
      7 T9 a. x$ X3 Q  ^7 a! a

    • . w  l' u" |; u4 _* d9 ]( m

      ( G6 b, H3 F4 j( R: V0 T6 {   PCB *p1,*s,*r;  ; ]! l! {# t- k) |- |0 O0 Y

      / R3 c$ N0 k& Y

    • 9 f" n$ c, ]; p& l; S: ^
      , x6 `& y* C& e( r% c
         int b;  2 m# J: t4 x, M9 l5 a
      1 ]7 O& a5 F+ Z$ d' A
    • - m+ g/ e7 X6 y
      8 F. ]" u  ^& |' @8 {9 C% W8 Z
         s=q;  /*待插入的PCB指针*/  / J6 p/ C) J$ s* d2 |
      / ], v. f1 u( @' K2 F1 d3 t2 \

    • - A# t0 M. Z7 O4 I- R
      2 D3 _3 b7 l: s/ Q  f5 _) D
         p1=ready; /*就绪队列头指针*/  
      4 A. ?! [8 M" w" b4 w. X

      0 l7 S& _# d+ K! H! }$ @1 G

    • 5 S0 v% L0 A0 l: b9 X! _2 O* B3 B* Q5 z

      , @3 ^) }& Q! r   r=p1; /*r做p1的前驱指针*/  
      ! {2 x) r& @+ |2 D+ e4 y2 q

      - w6 f7 [: q1 C. l6 {9 U

    • 5 i' L! V0 j* A. b2 C! a. J: I
      - x# j5 s# P+ }3 c+ K' L' O
         b=1;  % F% G8 O1 e# _) t# u5 ^, ^* ?; A

      7 Z3 Z  N( `6 N! }
    • 5 X1 ~4 E8 i8 h/ N! M3 A
      ; _3 Y; C3 _2 x/ [$ d! t2 |. d
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  - e, z  B/ x2 W1 H; i& h. l/ K# O
      : b. A9 l9 A, Z8 l& B
    • / H1 I0 L6 W, T, m

      8 |  `3 ]7 d& @' V  ^# `      if(p1->prio>=s->prio)  
      6 Z; G+ T7 Y/ Z+ A: X

      9 q3 ]. K1 n: c- i( Z: w5 U
    • 5 G/ a6 {$ z- @; T  S* l/ [

      * h1 Q8 T, m; V0 y- P      {  & V: j/ j# I$ {$ P; v5 k- i; B
      # v' c0 y* e8 X- \, v, ]) q7 `
    • 4 H: B; U2 m5 _' k' ^" j

      ! T' ?3 h! P% J. i4 B7 D% n1 g  M     r=p1;  0 k) B6 L* X+ E

      ' W5 _0 U, n7 K

    • ! Q8 N! q9 k! ?; d4 ^% S
      ( R" |0 F  Q2 y; B9 V" G: N7 k, T: T
           p1=p1->next;  
      ! e: y, V& B3 Q! \' h
      # U0 y! e) f4 |

    • - J+ ?( `& ?/ c

      # Z2 _+ H) T! a& f      }  $ C! g, f* c: }4 ~

      + N: n1 E; o0 X, M9 e4 G
    • $ D$ c8 r6 \, ^: J, n( q- d
      : s& {& H2 l3 A5 @* w5 q
            else  # y1 O' ^4 i3 F6 C- T, B/ b3 Q8 Y
      . r! \! b) ^' Y8 k- t, m, |1 V

    • : B4 S0 J! }' C" N* S& d/ x

      3 z8 ?: v3 @$ |+ U$ F+ b0 C     b=0;  ) a9 M8 J$ Q9 U

      ; y) Y8 h, I' N. l% N& k
    • ! v. J: e+ a) e- b8 c3 B+ w
      ) X2 Z4 X  B$ b3 [2 S: P4 c
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
        D/ P8 p) ^% |( D# H

      ) T5 J7 |' |+ \
    • " L/ N0 y1 a  e
      7 ~: s, U9 x% F
         {  , l$ @& F; j4 w/ h- T
      2 \4 f4 b* Q6 y$ s  ~8 s+ A( Z
    • - L( H- B4 e/ h2 f1 @' ~
      ( ]( j5 M2 g; s2 V
            r->next=s;  
      6 H, c/ j5 }' m; k! }" N- T% Q

      4 O7 g7 T' \7 A) {3 |* I# _& o
    • % l$ W; i% x9 S8 i2 q

      1 ?" b* U0 y# m1 e2 u" b      s->next=p1;  + c8 K/ ^- S* y: b5 B; r) y( S, c! e
      7 y2 X, `- ~2 O  ]# U

    • $ f( G! e! }6 ~
      : D6 d% b  F# g; F5 V& `, F2 c# N  G
         }  
      0 l/ a; f' Y8 E* B8 A

      & N) Y& d9 F2 z
    • " w0 \# ~. L! D1 s! n  `# e

      0 p( d! i: m( m( P  m   else  ! D1 j5 |, P+ d" {+ K/ a! r
      4 r8 `% |- D, q# K7 z

    • ' _& \" s0 @. C2 C- n5 b
      " v, I' _6 O1 B3 t# ?
         {  ; t5 H8 t! J/ v+ V5 Q* @4 Z; }% ~/ N2 y
      0 i0 Y, T, s$ ]/ ^
    • 2 }% D! `4 k* j

      + V$ X% @! \0 a5 @0 i8 Z      s->next=p1;  /*否则插入在就绪队列的头*/  9 N# g  K2 Q2 V  @$ ^
      6 l. q2 R3 w; w
    • ; L/ E5 q* U( f8 g- Y
        M7 s  f) ]9 @+ ^
            ready=s;  
      , k" g7 x  L# l) Q& U
      5 X' W% n) ~: x6 |: M- z, J
    • ) y' P% l+ ^+ M  h% L

      ) d: c1 {9 c, }! @; ~   }  % R  F% v# `% x6 y4 p: `0 k
      % K1 R" Q8 B" o. s
    • & d9 v$ O* |- M( `. h

      9 J$ a) l) b; p, |/ [4 ?( Q}  
      ) o2 q7 u  M2 A- ~7 s6 J
      + Q( w9 }, H' ?# F& b: U# B) u7 o* E

    • 2 o2 k! B' G$ g9 x& K& S8 a; ~- Z

      + a5 c9 ^- h% |; l9 W3 x. G/*优先数创建初始PCB信息*/  # a) b1 Z' S4 v: }6 q6 N1 f

      6 n0 s, Z: F0 T2 i/ u
    • 1 i; X9 M$ f2 v
      9 E/ ^1 S3 r& u
      void create(char alg)  
      % \+ ~" m, c" T. O

      ) j( V0 g) ^1 e" {
    • , C, V! f" ?( V  V
      - u! B( o' r) |! I, O! _
      {  6 I7 g0 k& d, W( M

      2 e. K3 W/ s7 Y7 }/ B

    • ! q6 f1 q  Y. a: ?9 @# v5 N1 E

      9 c5 h& ?& b7 c   PCB *p;  
      " g4 r2 X+ ~' }. V- t3 l  Z9 I  j
      2 l) Z! Q* s" ]9 c3 v& b5 ]

    • # E# c7 R, ~; B* ]
      1 [0 L  u2 l9 C; ~7 A- }: f
         int i,time;  
      " S; k- s9 Q1 ]$ u3 k0 @
      , k0 A: o1 |  S& q' c; \6 C$ V
    • . O5 _* |4 x9 A2 J4 Z

        E/ u' [" J1 C1 R7 L' C   char na[10];  6 K3 r1 S3 z3 [, D

      & J. q" Y- O" c- X7 i9 W3 e

    • 3 k4 D, P! i% {8 a5 o) f

      8 r  [+ v3 p7 @  @. \* L   ready=NULL; /*就绪队列头指针*/  3 H% G, b/ f( V+ q8 Y" \& C) L

      * Q, z) B" O6 Y# t3 C
    • 5 ^- x4 b2 t6 X  ~7 e
      ( @9 h. g: S9 c2 e
         finish=NULL;  /*完成队列头指针*/  
      : x* y- j( y( k0 l
      . Q5 S) y, k& u5 A; A+ M! g

    • ) S$ ~* M9 q/ P" q9 ]2 z$ w
      5 G! U( t4 X4 m) A/ `) H
         run=NULL; /*运行队列指针*/  0 V) {4 Y6 p% o# g  N2 b. f2 ~
      8 Q+ `1 y( D0 G/ Q: B; G8 |
    •   S; n, S  K" m# G( J6 J
      " M- D) A$ R, R3 b- w" W3 Z
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  4 m& ]4 ~% W6 b0 r/ m0 B

      5 ?8 O8 ]( K' M; H% B" c
    • ; s' T3 h" Z$ g5 n
      - b  J5 V3 V( l3 W+ A1 D
         for(i=1;i<=N;i++)  * |  a' r( N9 a2 ^* b

      , \& b* c5 O! o- z" e& j$ z

    • ! R8 O' `& P' l$ O) D

      1 O( K; o  `. d1 E! @& T6 y. X   {  6 v9 s, J. R; J! H6 E

      . [' ?0 |( f. |* Y8 Y8 V7 b7 f
    •   f9 |7 W2 z3 M/ B5 T2 |+ P
      ; h& R' ]" S7 S6 l( l: O" n/ w( w
            p=(PCB *)malloc(sizeof(PCB));  0 W5 ]; R. m. T+ @' J7 ^5 p1 n

      ! T( S  W) E% e  L% v& \- h
    • - |, G, ?# I( J5 S4 G' W

      4 k" t# H) F0 f$ }      scanf("%s",na);  
      6 m1 Y( d5 O. y4 M& `( g
      * j0 ?5 H0 t* B" o2 u1 r
    • ! D) v7 x  n) {0 V/ I( }5 W
      $ ]/ x" B3 R4 J5 K9 c. @, L* n
            scanf("%d",&time);  
        O. f7 c* D( j, k. F. |4 `  G

      7 G+ N+ A0 P9 F! {9 D/ o

    • ' Q1 W+ |/ o4 H0 t+ T) ^

      ( N- c2 A( q9 D4 ?$ ]      strcpy(p->name,na);  3 U- L8 M6 L: r/ [) W1 `
      , t3 \4 @$ v5 Y+ C

    • + r' l+ v1 Q- M

      1 N& X1 _" ^& v      p->cputime=0;  
      5 L$ m8 j* \" x% c2 d4 q
      ! e3 c# _2 n( Y  }* k

    • ! f( u& C+ _, P* O; Y
      * h: S$ V4 z" _/ c# j" z5 M
            p->needtime=time;    I5 N7 T5 a' @; O
      4 |4 B0 s+ A# a8 E# t+ O

    • 2 `9 H. C: M4 E# s

      0 c* J, J2 f9 O! ]" U' z      p->state='w';  
      % e: [+ X9 B) T: `4 m
      : w, h& r5 U" G6 T* O6 }  o
    • 4 U+ i, k5 `, r/ j# j* C

      + a; j0 u- w$ r      p->prio=50-time;  9 x- V7 Z* X. N% i: R( J

      8 ~7 V$ ^/ j) a* `" Q

    • # M) F- h# _6 b
      . V: x3 R! C) D, G
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  6 S9 Y, U1 @9 V
      8 v: b. U- y* M, O
    • 1 X8 `3 w) g- C' U1 n$ K
      6 W, g) O  t0 L7 _6 j5 ]$ a
           insert1(p);  1 ]% A# x. E7 G6 {

      ' s1 e  e4 B9 r# }

    • : N4 \2 n/ z( s3 W+ |9 j' A  O! {

      4 Y3 l* _; w, M1 q$ Y* R      else  
      0 G1 h# `1 O; c6 `5 H! X
      8 i2 G% r3 O" G6 t1 I0 @

    • 0 w* p6 s% ~" a& e( w( D

      2 G, e. `. N: e; w. R4 e4 L; P. N      {  0 G! b& F. E: K4 b# z) x5 z( @
      9 j; ^$ D, k3 _% B+ y, T: @

    • , f6 T6 Q7 t& M! B$ X

      + k# _$ w1 K* U+ e! d     p->next=ready; /*创建就绪队列的第一个PCB*/  ; u( x, i" O3 d- P/ h. V

        u7 P* q# ~: ^2 A% `+ A# `
    • : O2 f6 g( N& ^1 s2 u

      3 f8 j& N3 [; Y& o     ready=p;  
      1 C* q5 I4 u- k/ p$ ^: O- M

      7 p6 c  \3 C$ b( _6 c
    • + q2 j7 |, I4 Z+ H
      * k  [3 N3 [3 v: s. w
            }  6 L. {; f  N- u5 T( g  B
      . E# v( {% X$ M! e% x  Z- b

    • 7 H8 ^! |* {1 c$ }# ^
      0 ~" k! x0 g( N& y( J+ E2 e% Y
         }  ) h. d9 ~9 O+ Q4 x$ |

      # [" @9 Q* a4 S/ N& k
    • / O! o7 N0 B% B
      ) j( X, a6 ^- I; L4 s9 X
         printf("          优先数算法输出信息:\n");  / ?# a; ?2 C. |% }$ R7 w. N
      / r- t4 i3 Q, `" w; P: [4 t, ]. H8 j
    • 7 F$ `# D* K4 I' y+ }( ?

      9 G; U( {: `! K4 ?" ]5 |) k   printf("************************************************\n");  
      - P/ |+ ~$ D3 b

      5 m" o) N& Q2 u# T8 |
    • : Q- D. s( w; t& ^5 [( Z* s

      , ?; w5 @1 y  D* T6 U9 _; N   prt(alg);  /*输出进程PCB信息*/  % x1 s, U) T, H* O9 ~# \

      * h  k( R, A* [# T5 j7 R+ s

    • : {. _8 r: e' d" o$ l. Y2 F  h
      1 j7 \5 q- z& T& U8 j$ ~
         run=ready; /*将就绪队列的第一个进程投入运行*/  
      " n* y: D, H6 |8 z; D4 _

      % N# v4 {& k4 m3 e  B9 m! _

    • 5 v+ x. ]4 ]8 P9 r' H6 A0 l
      * J$ g$ `( g  j# M% ?
         ready=ready->next;  8 z, _% T+ g( c# v3 P/ h0 {; M

      9 I3 C' R; u* z" d/ M

    • ) m- N  n& @( w" P. M* Y+ x

      , d# c) y, I9 P& c5 }* Q   run->state='R';  6 `0 W" ~( c7 ?6 I0 b- D9 j
      ; w* w8 S1 x/ U. E# P3 G

    • 5 l: A4 D9 Y* E( K
      # }8 W5 X# n- u- a. C
      }  5 L" B& ~$ _4 z# ?6 s1 ^

      0 ~, ~5 V7 x$ M; D
    • 3 i4 p" E5 u. H& n1 e) f

      7 Z% s. K5 D; H/*优先数调度算法*/  
      1 h' P3 f5 a: @- b* K
      ( c% y- O( f4 [
    • 0 g! I: Z/ c! N/ B" F6 F
      $ {( O0 i# P# q3 R
      priority(char alg)  + a% p$ [' T$ g3 V. D

        S5 Y+ B+ m& s0 X
    • % V, _8 w9 Z( V1 l% x, r4 d* Z/ I

      # {  t; A8 h) a4 W9 ?{  
      ) n/ c7 G% k( D: b

      & `2 Q2 c2 I( Q; ?. ?) {' c

    • 4 w$ q4 Y  n  O% j5 z2 c" i; Q  |

      , l5 A' V! B9 L5 |$ `* [) ~   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  5 X8 n6 o2 v7 `: y
      3 F3 }$ T  D5 e& _% h7 P

    • 6 e3 t) {* B6 K
      ' [4 e' j9 h- x1 `& k8 }: E
         {  ) x( Q- L" t& B/ ?" n' V8 i
      9 J0 T, C: s1 {0 Q
    • + H" Q! R: c8 Y* P' C! N& p

      2 ^! r: N9 h5 x: U3 g) `$ D* k' O      run->cputime=run->cputime+1;  
      5 d! I6 A- `8 u

      3 F: p% B& @8 u# g0 m4 G7 g  G

    • / I* R5 A! r# X6 T1 M" ?5 K% h

      - a9 s+ m9 S1 E) U/ p  A3 w1 x! B1 O      run->needtime=run->needtime-1;  
      ' `) ]* y% l7 G8 [8 F: P" S

      ! T$ i7 t" q7 m0 a  E
    • 0 ]7 k% `2 F9 |: g% K! U. W: C) v. t
      7 ~0 V$ G9 c( H) M, J8 D$ _
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      # m- O4 q. O7 s) F6 e* B1 `

      ; t% S1 \9 F! ?: n6 G- M
    • ' ^" X* y, u7 Q$ z- L. z/ U& z. V+ }
      ) u* i- l* J, g* o$ c5 D0 T4 }
            PCB *p;
      6 T; D2 E/ B6 o6 K! C2 B

      . P% X) f% A0 V/ [3 m7 T

    • & |* A( B' @, L) a5 I; G! f( ]
      + D% Q: L* B& v& P, ?2 s' `( a
            p=ready;  @2 x. `" ~$ s4 A! O  [, J8 L, I
        W' Q! r* Q# _. ?
    • / [1 z# B7 L$ a; U6 a+ T7 n8 [
      ! l5 J, M) i5 v1 c2 R
            while(p!=NULL)  
        z" `  Y  x5 c# A4 Q" Z
      0 L# U' y3 @/ X7 k
    • / ^  L! }5 F) u) p
      ( a8 @* F# x( P1 r
            {  # Y" A# @. c1 n: b

      ' p8 y( Y  Z1 ?5 G  l

    • 8 d+ |6 _" K+ t5 @
        {( u# V. y9 t' ~. X
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    - i: ]& m" V6 q8 V

      ( c, e3 d" z) E- z# _
    • , c  u1 G! [/ g8 j7 a) R. x1 ?

      % }( i8 n+ }5 F0 v6 i! A6 C7 l          p=p->next;  1 ]+ }: U2 [$ ]' @5 x9 c; h) v
      , O  x8 e0 l6 n* F4 X- w) |

    • * Q% W" e/ g: I. h( O- [
      8 b+ f, i0 W% ~: b# u% j
            }  9 l. f) q4 b6 c  Q/ W
      % U& i2 q. J4 s4 n2 P

    • 1 _, Y! g- Q; E: v: F/ e5 o

      . C: I$ G, H2 A1 z6 a4 P4 X- j      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      % D; M" p: I( {
      3 M9 L" U7 i6 I% \& M# y/ w( L/ c. s. Y
    • 0 A& }  d  W# I

        q* f* L7 u# g' u      {  6 X  Y; g" D( T
      3 `1 W6 k- d8 |# R2 z) M1 r
    • % d  e; K, f/ ]6 D& B: d) P

      ! F; Z: ], w7 X2 z3 F' @& Z# V/ h         run->next=finish;  
      ' ^- J( B) |# v: O# d; H6 f' L
      - m1 I" S+ j* J. E1 m0 N1 g

    • + k% n1 f' X- @; j1 C; a

      ) E4 p4 l# P& I0 g2 c         finish=run;  ) }/ \/ C) D9 ^& K
      5 {% ?$ d$ c! G0 W6 v
    • / \# a3 g9 [+ [: Y

      ' t! T7 ^7 M" Z- [         run->state='F';  /*置状态为完成态*/  ' D7 C- ?* v0 q. d, y
      . X- i' E0 A% f% r

    • * I2 Q7 a& [# Y  z
      1 b/ @* O6 `0 C7 L
               run=NULL;  /*运行队列头指针为空*/  
      # b7 ^+ k5 B! O
        q- g) V( P+ d# H
    • 5 q- G" W- d' r" L# m
      9 G* v0 N+ M0 u" e3 t' d! [
               if(ready!=NULL) /*如就绪队列不空*/ 8 M! _: S. _" b$ T! z/ s) I% P, M8 G! W

      / M- u2 _$ P: _( n0 n/ y

    • ! ]5 x3 B! y$ v4 i9 I( {
      + c; F) Q- y. Y
               {  7 l; c% j' X4 m( u, ~
      & ]! U5 I3 ?6 ~7 F

    • # B6 S7 _4 G  v

      , p! A0 m! m  z5 Y0 h( w* U  p! e  ?1 t$ C            firstin(); /*将就绪对列的第一个进程投入运行*/  $ @  T1 w- I! n% l

      ! c$ O' L0 m* b# Z2 l
    • 7 A6 j+ J7 |' W5 [; L% F
      ; \6 ]1 `" P- s( X
               }
      7 \8 I1 ~* f5 i( y  ~
      ( i! q4 x; S! |( e3 _$ u

    • ! t9 t7 U- a8 q# O- ?& \
      0 f' }- m+ s( R
            }  
      7 ?- s  ]. x% d  v8 p
      0 ~+ L# B; R3 b* O6 h2 A2 R

    • & t' N) ]  |) c2 ]: C
      " \! F% z  Y6 ~4 T" S) Y% z
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      . w5 f8 X0 J( h8 H# M; k8 i% }( B

      + z! ~7 q  `/ O9 ?$ T$ {
    • * J7 U" T: s8 |( H

      % m6 w1 ~/ z& s7 M5 m2 Q     if((ready!=NULL)&&(run->prio<ready->prio))  $ e$ B* T7 b  _% z

      , ]# b  m. {$ h* V% y8 i
    • 5 ]8 Y- b" a  M  s
      ' e. b; C. f% o5 j2 O
           {    g" e+ V0 R' b: h, j
      # N( Q5 S# l! t) _/ r( w5 r. N

    • % S- `8 R# N, e4 p0 w
      0 P0 e1 [0 G2 z, M: |
              run->state='W';  / l6 |5 j2 V# [6 B0 p, v8 i& L

      ; W( [4 Y- |- B& r  T3 I# D" F: H
    • % A! W; t* X2 O, Z& I- m4 C

      / j- X+ M( C/ Y% r' C+ w- ]        insert1(run);  
      2 t6 a+ U; h7 ^1 k

      ) ^& O0 y, S$ r( B4 L: W
    • ) u0 A7 B; q7 T( O6 f; G8 P& c

      % V+ @1 f, T; V% s        firstin(); /*将就绪队列的第一个进程投入运行*/  
      / X, U+ J; n8 z, _6 f/ l9 v3 J( R
      9 z8 A) q- H) j* U6 g4 G6 F$ ^& j

    • , H, r1 {* a8 q; p5 A

      # C* M8 k/ x$ K7 D1 T  i% v0 A     }  
      9 |- e+ z0 v6 q! O
      3 ]+ d0 |) R" f( O
    • 8 q* R+ ?4 ]- X' I
      # X5 f( s  F; O3 s& s
            prt(alg); /*输出进程PCB信息*/  
      " D' @5 i  W0 J9 W0 [. l

      6 _. f" a. x3 w

    • 1 P8 u5 G' K' S3 ^* w$ c1 E

      / K5 v) z7 k+ Q6 M9 d& ?   }  0 C* P" H0 w" }6 a7 d

      ! A* n1 q4 D. {$ o9 I5 ?* |; d% i

    • , J$ L& E( I8 i6 |# ^* y, U; C

      ) A  ~7 v; D( b) T}  
      ! q1 R7 x* R# p' M' c  J" J
      5 g7 u1 N, E8 f. p% O3 P) h
    • 0 w; T& O/ g: r$ U+ N; g/ }" E
      1 G; g" _- u) S
      /*主函数*/  7 u6 p4 h7 u( s+ C' B

      9 p) w* y3 O. @( v
    • % r; p/ \: A4 V

      9 ?, r# _- N" Amain()  
      3 m5 O" Q- ~6 C3 d2 r
      ( i* ~: R0 }1 z9 P4 W' M1 _  C

    • 9 c5 E2 g! M- ]' g4 x/ u5 H
      $ @" t% n! j$ N" `
      {  
      ' r; z& a7 b7 ?- z, v) {/ H* u# Q6 M
      2 n9 C8 p9 b6 z3 J

    • ! F& a* o* M) F! O  C, [

      & @% F! o. V# U( }2 d9 P3 H+ p   char algo;  /*算法标记*/  
      % _4 f- F5 t" R7 O. Y8 z

      " f8 i5 r* R9 m3 w/ i
    • 8 R. a. a2 A6 F& m6 B

      ( e1 I$ r% M. n" R   printf("输入P确定算法:优先数算法\n");  " o- Q/ ?. Y  y; v9 z- X

      & k. n9 S7 [' f4 w, u% Q4 G
    • 5 O! ~( U/ u8 H7 g$ P& v+ H  G) a
      # e6 C! T5 U+ l1 n- p
         scanf("%c",&algo); /*输入字符确定算法*/  
      / \/ x3 W7 i( }+ x% |

      ; T% M1 b* _- K8 h) }8 K& W. C8 o

    • 7 W1 q1 y5 S6 d1 Z5 K

      " {/ D  J$ R7 \2 y   printf("输入进程数:\n");  ! C3 M8 x: }+ M) J/ U) W, c0 [& |

      , L& p" p: u8 I- @- D9 L" `

    • % {$ \5 A  W& k2 W
      4 s/ ^. ~1 a8 o7 {
         scanf("%d",&N); /*输入进程数*/  
      2 w  t+ C9 N; d5 i
      3 R/ q1 T; V9 ^! v2 X4 C& f( t( b6 n1 \

    •   z  B8 ^0 L8 C8 V& j, Y
      8 [3 Y- {& c5 }& }( F) X5 q4 p0 }
         if(algo=='P'||algo=='p')  
      ( d* C7 }9 Z$ _* S- [% G
      6 E! z- h3 ?$ T0 _& |& ?

    • . I. m: `2 g0 N
      $ U  T7 t- o5 c) X) z# s: D
         {  
      0 C6 c) Y5 j/ T

      : f5 t1 ?& E0 N: f2 z* A9 x

    • / o( O+ }+ ^0 j  [$ C; g

      0 z8 Z; r) R0 w" K+ {      create(algo); /*优先数法*/  ' w' p# u( w6 H6 N# G! |' W

      * f" r5 S3 D1 K& D

    • : ^' E1 `8 L* g

      ( \6 u( J- r$ t- j0 e      priority(algo);  4 H" a: {  C0 }/ u# c% F" |7 p: ?

      5 B$ Y2 ^/ ]+ \! W. V6 L5 Y- X+ o/ X

    • ' ~( ^# j" m* T+ p7 O$ O
      2 r8 S# ~/ m4 U! o3 R5 w
         }
      + C8 N" I# q$ z' }: F. ^2 \8 O( F; K
      . ~3 ~$ a, s1 x! i
    • 1 G+ n* g3 }$ M, A" O: e% A9 N: Q$ @
      . s: i$ l0 H- H$ V% T/ {1 e
      }
      $ B3 ?+ Z9 V% ?9 N0 K) C' t
      * l, [9 H* L1 j/ ?- @1 c  ]7 q  p

      ( U& w5 @2 D$ S0 d$ s: I- P

    5 \5 U( m* u  E' W
    输出结果:
    9 h7 W0 b5 Y- C: g( x! U


    3 K% v4 c; `# N% q原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    7 \: ^8 Z0 s8 z4 h" M7 B$ v

    " ]' _1 z+ l; a( ~2 ]' T
    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 01:33 , Processed in 0.469961 second(s), 50 queries .

    回顶部