QQ登录

只需要一步,快速开始

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

    , E1 p) K: c) n7 X) i优先级调度算法; \# h% E3 U& x3 |

    算法介绍
    ) G- Q# V! Q' ^- z$ `* X- y优先调度算法的类型(用于作业调度)" v! Q0 t8 q6 y
    1)非抢占式优先权调度算法 1 B( Y! a' j$ h. X& ~
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    ! Q! w7 j1 `* J6 l/ ~2)抢占式优先权调度算法 $ P% a5 m, r6 G# r" l9 K
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    # a8 y0 M7 V2 m5 }1)静态优先权
    " M' T0 r7 `  \- [2 t静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。8 M' F$ M2 A9 @& y/ \( Q

    2)动态优先权 $ Z/ f% `- F. f- [' w

    算法实现

    抢占式动态优先权:


    . B1 C( W' V+ W$ u: hPS:本人认为非抢占式静态优先权没有实际价值。

    • 6 N8 Z# _3 y8 ]+ A5 n% U. q

      3 t2 d9 f1 G# t# L  @$ h  T9 {#include <stdio.h> ' f" N: `( g) [

      # O, _+ N+ x% u' q- x2 R# J  t6 Q

    • 2 E# u5 u) Y/ v- u

      . M/ Q& {+ N& h% S& s% z  K; r#include <stdlib.h>  
      % M# v: F2 c+ p5 q6 F9 C2 n

      % M$ d+ @9 y9 r* _
    • " ~0 O) t: [: s2 w) P$ h
      5 d3 w$ {) T& L" Q7 k' i" a
      #include <string.h>  
      5 p4 {# T2 _8 m5 k7 \, I  u
      6 Y9 V" Q( X& t( {6 V. u! }
    • : X3 A6 U; }- g+ E' |2 t, `9 \

      ) j1 w/ p' p, {& ^* E: L0 Ftypedef struct node  ' P3 G* V2 Q( `1 `+ m" N# Q+ u

      : h- L) s' Y3 e
    • ( ]' L/ |* K$ n& P
      * S9 e9 ?# B- o# d( v
      {  
      ; m0 ~& u" }/ h
      1 }7 [$ ~* U5 D
    • - K8 `" [0 }0 c1 y
      8 m4 X. m, j8 O: K7 t$ y# q
         char name[10];  /*进程标识符*/  5 I6 E  w+ _2 x: C# a( z& ^( ^' r" \

      7 V6 y: n$ B' _6 T3 D' f+ D
    • , K7 z6 X1 S9 ~8 r) H3 Y1 f, m
      1 d- |1 X5 g, P/ g4 R+ i
         int prio;   /*进程优先数*/  9 H6 \0 d, `& p% d. j) |& F7 B

      & T" ~& I+ O$ w1 j5 m6 p# O

    • + o) L4 K" S4 a2 I6 f6 |

      ) g+ C$ y  d5 N3 {) P& B   int round;  /*进程时间轮转时间片*/  $ M) G( {4 y, k. }- r
      + E: i) g6 Q7 W. h

    • 7 E+ k  A2 t3 p5 S6 j5 l( b2 [4 t4 L

      2 Z1 a4 l; R3 k+ ?* J: [4 Z9 j+ A" m   int cputime; /*进程占用CPU时间*/  + I; b; J& x( v1 _1 T
      8 P4 W, T) n& ]. e1 Q- _

    • ; B1 d4 U) v6 v1 x+ _5 ^+ Y

      ; \! ^' t% Q; ?+ J   int needtime; /*进程到完成还要的时间*/  : ~: t, _. J' O6 Z. Z

      $ Z% u* _& F2 K1 Z2 z$ `5 J
    • 4 v1 M' E, h; R/ i" B0 C# }. `7 L5 @4 _

      ( ~8 Y8 B. x4 d   int count;  /*计数器*/  
      9 S6 S+ U. ]2 |( ?) V
      , b6 e8 Q8 T' S, s
    • % [; a6 k8 ^. P$ W( {2 t0 x8 h
      ; p( c  s2 ^- k7 S( _! g
         char state; /*进程的状态*/  
      8 T; k- p, |& Q5 p1 a* x6 ^5 r0 v
      7 m' E1 i9 S6 f- j

    • $ A) c  \5 v7 s& u8 I. t4 C! q. U, T

      ! x. J( a! ]; x# d1 c# ~  C   struct node *next; /*链指针*/  
      2 ~& m  p$ d2 @; p4 f/ K. |

      7 b+ j" T/ E/ j% C+ m0 k: t, j2 T- [

    • # ^2 j7 P0 ?( t( O7 v2 v
      + i6 I1 z7 D3 O' E3 S
      }PCB;  . f$ z- Y, Q# v
      0 b% m+ s' @. _2 p# ^5 C* ?$ d

    • ' K: c" o9 n  f# ^, ]

      2 l- O+ x: n: k( B' TPCB *finish,*ready,*tail,*run; /*队列指针*/  
        L5 H: d) H) ?2 Q- w5 j' i

      * f6 t/ u: X2 b$ j% e+ `+ k& B% R$ k
    • 7 J, Y3 b9 I7 o% k) f
      ! e  `# f8 K. Y0 r2 ]7 b! m& [
      int N; /*进程数*/  ; `4 J+ F5 m/ Z; v7 g- B
      0 _0 A1 F6 l5 F( V+ W( j

    • / l, P$ s3 J3 ?( m: E4 W% J+ i

      $ O0 V+ b6 w/ z. v/*将就绪队列中的第一个进程投入运行*/  " v4 Y5 ?- O4 H$ }4 d
      0 F4 P! O1 M& R* i  N: v8 F

    • 3 ~) }) ?' N4 ]6 ^1 w

      % g6 `: l4 V1 s/ U2 A& Ifirstin()  1 Z4 [" k, v. ~
      / L* q) d- y8 a& q

    • ( |$ a  x. ~2 L
      0 j! |7 ~0 A6 k. K
      {  & |3 T4 Y  q5 i4 d& z
        G& u& h' Y+ X* V5 F' v

    • 0 Z* N! x: Y5 K/ J" h9 U( I
      ! A$ n9 ?% b8 g' v" E/ a
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      4 T' u8 H: ]! s4 e, ^, b+ v

      * B( T+ [6 x! J
    • ' I7 c/ ]4 q) B

      7 `( k# U; l- x) C- z   run->state='R';   /*进程状态变为运行态*/  8 d1 u/ }0 Z* U/ I: W$ F
      8 Q* R5 A& [: h+ ]) p
    • 5 b7 @) z/ L9 d6 u9 v& E& P6 D8 D; f

      9 w& y+ m# G: U0 L* V1 o   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      * U% u5 I7 u$ H5 ~. V' ^/ P
      $ ~9 H5 F! E. m5 \5 e
    • % a7 ~# O& ~7 S! B% l/ u

      7 I  M3 ]) {% c7 d& `9 c}  6 A& @3 ]/ \2 G: }$ C; [
      : k# V0 D% V* _2 X, O

    • ) [( l+ W5 ^) O/ t

      4 p2 Z) z1 w6 R2 N5 V9 \/*标题输出函数*/  
      $ B# \9 Q# f* ~6 [: B8 I4 z
      3 ~% s" I$ ~/ g7 u
    • + N, [! v2 e9 F( q; o( I) v
      4 }4 d; ]7 k9 p* U
      void prt1(char a)  5 ?. _% G# X2 h2 v% \
        m1 t6 @8 E0 C$ z  f

    • + t6 r$ s0 n1 W8 {" V' R
      6 D, R/ b7 H- h- }" T( T
      {  
      3 i' _+ O# |9 b- H8 t$ f, c6 S
      4 [: q& [9 H2 x" P! J

    • 8 L  ~4 j! \( q6 J5 k/ ^

      & T# l6 _# [7 G( `+ a# C4 T$ ^   if(toupper(a)=='P') /*优先数法*/  8 I. e! I) U# h# O
      2 k; t) N- z' E  b: w8 D

    • & V1 [% E; Y. e7 R& D* M  y) j
      ' K* y' `  C$ f" X- R
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  ! d$ a& I* E% p- g

      ) B. R1 K% [2 z
    • 4 O$ w" p' Y4 X1 d) n$ c1 c

      + Q0 c- B/ m  @2 p, D   else  ! Y! N" M' b& p! V8 U" O
      . c; B: I3 e7 {% p

    • 5 A1 O0 F7 j% {2 O

      - t# J' n* x0 S3 g) \5 P& L" B      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  3 h. a: {, X8 s4 I

      2 g( p! S$ u; P( [5 Y

    • . F' V9 e  i( |- ~. ]6 K

      4 C# W+ W8 {# y9 `! q}  
      0 u0 [) |. W; \; U6 }( y& x) @8 W4 N
      3 u% B! r- r2 a/ p

    • 5 t+ H" [( X( h0 K, i: t

      & v2 o& o) b& g$ H/*进程PCB输出*/  ) ~& x/ K, G+ Z

      3 G, ^5 L1 g; k7 s

    • ; n4 b+ V( F: R2 ?2 w

      7 @' a: h+ X) E( U  m6 r  n$ l; Mvoid prt2(char a,PCB *q)  8 l' i$ J( O; \6 z# W" {3 c# f+ q: i
      ' Q. k1 C% [1 c3 C) M9 [0 R, W
    • 4 t' H# H7 r3 `1 G# `
      ) V" ]( I) a( w  |' V% ^. z* x
      {  
      4 e( X3 @+ ^5 i" k

      . X7 H/ m' ~2 M4 ?6 ]6 M4 z  Y
    • : L  D( \) t1 s

      * \* D: [9 Q  M   if(toupper(a)=='P')  /*优先数法的输出*/  . y+ h5 l7 [0 Q! R( r
      ! e& q9 @" F8 H& w& b2 g
    • 2 k" X5 a; Q) ]7 p/ p0 K! q% p: G( O$ G
      4 p  G9 t3 V1 Y: J/ s
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  , d5 G5 e) f" u1 ~! J
      . T; e: n6 L) m+ V0 G8 T
    •   \2 h! V+ q/ j$ h0 @) R
      ' l6 T, ?+ X" K/ q7 M6 A$ X
             q->cputime,q->needtime,q->prio,q->state);  % v( {9 [. D6 M) i3 h. c" K& V2 e! R
      0 _3 B  ^3 e4 s& t. b: m. C
    • 3 t6 Z0 R9 C- A' |" x$ @
      / k# r0 @4 v7 c5 Q  P
         else/*轮转法的输出*/  ( V) [2 n0 E7 U

      1 W2 X) f9 G" ~- U* |8 o

    • , N4 x/ w: l( G$ X$ k, V
      $ k" a" ]6 M) o! W. \
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  1 l: T2 n" L+ `  e$ \4 }7 X) Q
      & O8 a2 S$ f1 m4 l- o

    • 9 z" i/ M+ @( w# N; O* X

      & N) @# i9 S! G0 n( J       q->cputime,q->needtime,q->count,q->round,q->state);  - m) b% x& p: @- t$ w4 ^) h8 W

      . O9 A9 r2 a4 ]( d
    • ' C- r4 B: h; ?# q, V
      # v1 |* k4 z4 D) H
      }  ( Z& y7 R% T$ t4 H2 F$ Y5 w  ]
      ( ?! [* H9 `7 h: x
    • 7 E: c4 j3 G! o4 g, C- D

      & J6 c7 c: s+ R( a- c/*输出函数*/  
      4 I5 `. ]- ?( Q' a$ [; T! }' `: ?- @
      9 G1 u: W1 e' K% O* M+ r" ?
    • % W( Q) H) E8 b; W4 q

      ' E3 n/ `- k* |+ v) Qvoid prt(char algo)  
      8 \8 f) i# ?8 P$ T* R1 k0 u

      1 j. l* C1 }! Q5 R7 c6 c0 K

    • 0 d" B+ p/ a3 \1 s

      , I! [3 H5 Y. C0 K7 R  {{  
      6 C) _7 P' K: e0 h. l" t7 s- }# U

      6 O4 s6 E3 R7 h- \. z3 w
    • 5 X, d, @7 A+ `# h! v" n8 m
      " o0 j- _; _$ I7 v6 H4 G5 ~
         PCB *p;  
      & |: i$ q' @9 L% e1 x
      5 h, `: ~! T" n: m( Z: y
    • ) i# E+ c/ ?( v, j3 y- `5 w
      ) r' r# P4 M' R" l) D/ X
         prt1(algo);  /*输出标题*/  
      4 {  C" b! A" A( D

      & k0 x$ D6 f  q$ Y0 D
    • $ [+ `0 j5 \1 I& N( v. ]" ~
      . g% O3 P5 g4 G5 d
         if(run!=NULL) /*如果运行指针不空*/  
      ) a/ O$ q: A9 i, {2 A1 K$ ]

      1 H, N5 T& w5 e' g

    • ' k6 g) K; B0 R3 d

      $ @7 Y0 ~! d, r, ~      prt2(algo,run); /*输出当前正在运行的PCB*/  , e1 S; \' d  ~( S5 F4 \7 o6 w

      # s' a/ {; V( S7 {: ?9 o8 u: V: M0 T6 r

    • + Q) A# r1 b# U6 r

      ! C3 t, [, G7 b; d# T   p=ready;  /*输出就绪队列PCB*/  9 G8 K; j' }" J6 W8 \& [% [
      3 y/ [- ?% E5 L% a1 c

    • : L0 U  }+ v: c) W* Q0 V* m

      5 e7 e- x7 K) z/ O$ u/ ?   while(p!=NULL)  
        W$ m' g" S& J, t' z
      8 x& R  F% G; G( x
    • , f7 G# i6 i; W+ t* C$ t) K
      , X7 j* D( h' i  y
         {  0 t1 h8 u3 D! e$ g) s6 Z
      & o7 P# J6 Y; j; A: Z) E

    • 7 I7 p5 s9 z8 o; M# u

      + d* o2 X+ z& ^/ {: M      prt2(algo,p);  ! l! `4 F1 H# _8 x% |! ]

      / F  x6 N% e$ r3 t
    • 4 E- {) ~& u& \' `  p  ^
      2 s5 R& E4 B7 e9 G. @9 Q' U
            p=p->next;  
      6 a/ x7 V, e: o$ [8 H, }& G

      , @! z9 r& {9 Q: n$ v

    • 8 W' b8 P  ~' y! X$ W5 [
      ; p! ?' \. C9 [0 r- k3 I* d6 x$ i
         }  ' J2 V6 l" j8 H5 j6 l
      ! _' x2 R- N- }3 g8 m" r. f( K

    • 5 h2 ^6 e# a; F" [

      $ B$ B0 m# M$ [0 f  Z   p=finish;  /*输出完成队列的PCB*/  
      6 |0 k- S* X! }% a! F3 Z
      - d: t  J4 }+ R, f$ c
    • : B2 U4 I7 d' S' N8 ]8 i& n1 [

      / n9 p- X4 h; `; {* [/ Q, c   while(p!=NULL)  
      / m+ t1 m# Q' D6 L
        S# C0 w: e3 F7 K4 N* Y

    • ( A1 {+ U" w$ I- w

      4 V  u5 G/ z  c   {  
      + p3 [7 H; w& C* V! Z% R! ~4 F

        _- U. P5 w2 Y

    • 3 ?8 ?( v2 ]5 Z) x& L

      - z" t2 W7 o8 u+ {; d      prt2(algo,p);  
      2 T. h" M' z# O$ |! B! r( x
      3 x0 q# F7 }$ t5 j0 |/ M- T* }

    • ; ], I- t) J4 j& F% C& U  L4 Y' C
      , O6 O& \" J0 o$ t
            p=p->next;  : B6 k; R! k2 ]) e5 Z

      + e8 J8 ^" K! O( e# U9 `
    • . ~5 e/ }* h9 v( U7 [! R
      8 P' K; V, h2 Q; r$ P( Q% x
         }  
      / P4 {- J  j$ B( T" K* N. O- G

      6 u+ l  J5 Q" O0 S$ t: v

    • * G2 Y0 a4 G* W% P2 V6 N1 [
      - v- t( s! `, G3 V
         getchar();  /*压任意键继续*/  ) x3 T/ V# A# J" [4 i$ r  n

      ( A- J( S# p; ]. l
    • 0 C1 _! t# v$ h1 _

      6 Q0 ?; n# h( o% E4 g/ r# X}  6 ^; k# Z' y' w& E# s. u! r0 t3 ]" S

      4 d: S& w) \! @/ N1 p& x3 O
    • ! ^5 @- z1 o6 l6 c7 h
      * W9 o# I8 S8 z3 K8 C' C( c
      /*优先数的插入算法*/  
      ( z/ d0 _7 T& f& k% f

      8 D; e3 C) t( z: K( {3 Y

    • 0 w$ H: I+ V) {* A  `
      ; J7 y- Z! r7 C: H; o% ]: D
      insert1(PCB *q)  
      ' Z/ Q2 s, P5 n
      0 G" S2 S! U8 ^" ~) [6 A( V
    • 6 X0 y3 _. I" I" s# B; y
      ' j, e8 b& n  J1 Y
      {  3 [' ~# r1 L2 l

      ' {8 O1 {3 [) \4 D

    • 8 K7 |# O7 o% l# p/ A8 T" C

      * a# S. D6 ?$ U8 s   PCB *p1,*s,*r;  + |$ r4 r' a+ k6 x9 ]

      ( t/ M0 Z! C" i
    • 1 W$ k4 D3 ^9 T3 `
      - }2 H- o( W' t
         int b;  5 O0 u9 e1 k% T, h3 U( s5 `' ?
      ) ~' c$ {: f+ v' L& n% U

    • ! r% {2 i. F# k$ ^0 |9 f2 b$ r
      - E. Q' Q+ v7 ~0 H7 e. G
         s=q;  /*待插入的PCB指针*/  2 i/ U! ^+ {! `" ~/ k

      # j+ k+ M, ~! y" Y
    • 0 i) n8 x( r8 A' O- ], ?

      1 O0 e. c/ O) G  ~5 k   p1=ready; /*就绪队列头指针*/  ! s' U! M( o$ C" E# Y
      8 X( H% K. |6 ?, T+ ?5 I
    • , X. Q* u3 j% p7 j
      2 l% M9 `6 L* ^1 G8 ]1 _+ o. ^- _6 R
         r=p1; /*r做p1的前驱指针*/  
      5 p* c7 Z4 \/ U! \6 }: Q9 V0 n* y9 q

      $ g" [* O7 |$ @
    • 2 |  H+ m+ V7 v8 ]9 U$ a, C
      , h8 `. ?  F% i
         b=1;  
      * j1 r) u" H- q' l8 J" Y+ t
      ; \" I* I9 N  w+ ?2 ~! L
    • : c9 @1 F: `" L9 D( u/ |
      + O3 W" V. l* @+ f
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  6 Z5 s4 L9 H: \1 Z. z# d6 ?
      ' p+ u. C$ m* m

    • ( h5 V! P$ k& J" \* Q" v  a
      0 [( q& l4 _0 _  V
            if(p1->prio>=s->prio)  
      ) E# V7 l" f% P0 J4 T9 {
      6 y" d4 Y" o  m* b- N: N0 _
    • 4 d. Q; J$ X* r& V" \) J
      0 l- X/ X$ [/ |2 C2 e7 u& X5 {
            {  8 w; F& s, b' e$ ~# y. b  j
      + Q5 k$ L# t. h) ~, {% j
    • 6 [( M! i, Z6 \6 z

      ' o6 I& e, S9 u" T; K! Y     r=p1;  0 @3 \1 k$ x% ], E
      3 a- V1 M) C' n' c' F7 r% {/ X
    • 3 e/ U& M+ M$ J# h# b1 C/ i
      , C  s- j5 |4 j/ v9 e0 \0 R- B2 Z
           p1=p1->next;  1 H! L" D9 T4 c7 O# e. V
      " x7 \3 s/ q8 l7 k# l( b

    • - k2 V' h- A- Q5 ]  l, W* d
      ( `0 o% g, \6 D% Y  ^
            }  
      % Z8 C9 U2 ^; M) K# i  S# z; ]
      ' X+ Y  G/ O8 |7 q6 C

    • , ]4 n9 |! j/ I8 P- I
      5 `. l' f) l; L9 k  ^
            else  & x, K: l1 G! n, p* b

      8 ]* f) I7 E# Z

    • 0 }+ X+ l6 B3 L' F
      5 F* j* d3 ~, H8 K/ O
           b=0;  " T* G; c) K6 {# S4 ~0 d5 l8 G- S
      / ^& |" j- f7 _5 _

    • & H- C* K1 S+ U2 K8 t9 |

      0 A/ L/ s2 {' H1 Y- N   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      ' y7 E/ _" F2 W, p2 F( R

      % z: V$ K7 b) x$ [# h

    • ) b( M: Y1 v- o
      9 W- R2 f' j$ o: n& l+ V- r
         {  3 g" F. f6 a) r) q$ i+ a0 F

      ; }+ [1 Q. j: m0 X# q! y3 t+ h
    •   b3 @! o$ G) B$ \) g

      8 G; Z" f0 {/ P      r->next=s;  
      5 d/ H- [7 k" h2 h8 `* j1 W1 O. s3 T

      " p9 ^7 k: f/ _
    • 0 x8 B& |6 K  s/ s$ o7 j9 B, t3 p+ [8 }
      7 t9 k& b7 c1 P% q" V8 c9 V
            s->next=p1;  . F8 C' s/ c/ N7 G/ d7 g  [
        F5 b% W! R1 N6 ?9 f$ W6 a% k
    • . a* f: y9 f1 t) X9 P- Z2 ~8 [, w
      4 j3 ]# ^: |8 Z$ t! H$ Z* o
         }  ) ?) M  A6 x( U) N9 o4 \

      & P# k( c/ y6 [  N: Z! b1 e( d

    • 4 E; M# ?+ L- y/ [
      % n6 Y; N/ U4 k, l; g
         else  $ ]2 ?. t' Y0 f& C6 B0 w

      : d# J# Q" H8 x4 j

    • 9 |% e* a2 U8 \: b1 C3 V

      ! A; {' [1 ?" A( w" p   {  
      3 L5 j% Y) J: m# ~! H- O

      - A  m$ z$ n8 X, d
    • / }' D# h5 X# J4 E% x
      7 t; W( ~4 Q7 h, D- [
            s->next=p1;  /*否则插入在就绪队列的头*/  
      . W5 n$ [8 O5 m6 d

        \* {* v& a6 ^- j6 B* V. P

    • 9 i0 z! h6 V/ K6 ?1 f9 z

      & X1 j: b6 w2 }5 [      ready=s;  $ J/ n: L' Z& c

      , [4 S( A( }5 k$ v* y$ f* y7 e
    •   C' |7 n3 _1 m! x. W3 {) P. m8 q

      ) |; E3 w, O5 t" Y( r- K   }  # r" {; G* Q" X& |! |
      4 o' a$ @9 V' U2 A' w0 ]
    • 1 k$ Q: }7 |0 ~
      0 c: _6 V9 U& k7 f$ g( K$ X
      }  
      2 x; K: G% B7 R3 D( E% ~2 d1 X5 k$ ~

      $ j  s; w: k. V2 G& q1 z

    • ! _4 M6 Z! z4 u1 i* j9 O; R
      / \. J) }6 T9 Z' J/ c
      /*优先数创建初始PCB信息*/  
      $ X( c7 I- V! W, x, U8 \" G

      ( _" n! ~$ ]) k* g

    • + a' ?$ t+ e  N

      " u9 k5 y; u' v6 Cvoid create(char alg)  
      % @) \5 z7 ]- k6 S8 }9 D

      8 }- z9 A& q/ }  ]* m  i3 v  C
    • 1 G; A: J5 \. g7 e7 y" N& D

      * Y/ K) E/ W' F2 u6 C{  + q6 C4 s# p% A  V8 ~

      0 R: j( u+ r- ^+ J$ Z

    • / {. j- P/ t2 _# |/ I0 u9 a
      $ g4 s2 c: u% B. d, ~. {
         PCB *p;    q9 f  n. z5 q+ b

      2 b$ z( q! q9 m: D8 t

    • ! W6 B0 d6 A5 J) d( t

      $ O' f, Q9 r. ?. \; }% o+ |   int i,time;  # ~& D% E. j& K

      , x8 W, }* ]9 _# x% P$ |. A2 v
    • 2 V) K( b" e' S
      " ]4 |2 w2 Z: N4 {$ c' U6 Q, v% [
         char na[10];  
      . h' ~# y6 g$ `1 K
      ) I+ J, s$ |, l) J% o9 S6 g. ]  o
    • & {9 X  q/ r* C+ A4 v5 g$ E" c( E

      : f/ j# N. F) o7 b& l  j4 C) I0 Y   ready=NULL; /*就绪队列头指针*/  
      ( e* R$ X* L  p/ Q* f0 d) {6 @

      , D4 X7 v  g0 d  V2 s
    • " L! D6 E2 @( b: e8 V, g) y/ B
      ( O: Y; T  N0 `" a: @  y5 s6 y
         finish=NULL;  /*完成队列头指针*/  
      * \$ r) W* K1 c5 p

      7 y$ ^; F7 c$ C* T( R9 U
    • & C0 V# Z2 m# C: n' m: b

      5 A, u. x6 z  \+ t1 _7 M5 k   run=NULL; /*运行队列指针*/  1 a6 }) R6 I/ Q# C

      9 G# G' \  {6 p

    • . g) Y- H* r; D" d

      8 O1 q" U% V( m* y( g1 w   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  + X! P( O, B! I

      . P; U* h& K. J

    • % b* U' _% Q1 D# z8 I

      + ^! D0 q6 v9 i+ G& R# a5 S# y   for(i=1;i<=N;i++)  
      & \( J8 i% |: M4 x  V! f' I3 O

      6 [8 _  j( V  H% `
    • 8 e& Z9 l7 k3 K7 ?8 x) @& Q6 Y

      ; d5 Z& @) r5 r, {" m   {  ( u- N2 k6 C2 Y+ n" h/ [) ~6 |+ o: m7 m9 S

        c5 U  z8 ^4 s) ^! M5 L
    • 2 X( q- R  z5 L' J$ [! T
      4 Q' t* r" m  r/ b$ Z  l
            p=(PCB *)malloc(sizeof(PCB));  1 \! y& X+ Z# ~
      - |6 H; l; x: w2 V) d) E5 |5 M
    • $ t8 o# B- a5 t% G
      . W& c8 L7 z- [( I: y9 y
            scanf("%s",na);  
      5 I1 T4 w) A3 B! s% d2 i

      ! Z9 F. ^! @0 I3 l# t6 ^  i
    • , b3 H8 Z! h1 [5 H6 e* O7 @

      # V2 U9 z% q# X9 z0 V2 L7 [4 {% p      scanf("%d",&time);  
      6 B# U2 j7 W7 y2 C
      + L( S9 w& W; J4 I0 T2 l' I+ w+ x/ Y/ {
    • 5 _( H& d; k0 Y! ], f2 \* Q' o
      9 t6 E2 d% g* ?" E6 L. A% D7 J0 p
            strcpy(p->name,na);  6 ]# i1 ~! H/ s0 P2 d$ S
      . ]$ C1 ~7 _9 T- H" B+ Y" [
    • - e9 s0 r! P+ A3 K2 l0 f: e
      ! i) B0 j8 n1 p5 y3 u
            p->cputime=0;  4 i$ Z7 j+ F% {# i" U$ O
      " N* o2 ]% ]8 K

    • ' G6 O% J" i9 k  X

      . y+ w( d- J+ {% O5 ]      p->needtime=time;  " ~! X- i$ l+ j9 H/ l9 V
      9 @# V. {9 y" W
    • % z+ m* O4 d/ ~
      & [; h- r: @" C! ~* N
            p->state='w';  / r- u. q% _8 I

      % @8 y/ L+ t5 c  g( I- ~, `

    • $ ^) z# B: `! b3 K8 ]$ h$ \% F, W

      3 h' h, [. i3 n3 ~      p->prio=50-time;  . c' }9 b1 q6 a1 l; B* Q

      9 h. h5 D! p) ^, i# r

    • / [) w' C! D$ J$ v

      & T' g3 G8 \; r7 M2 x! p. W. l2 J" F7 R      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      / g/ h# [2 H1 S5 q
        T, c6 R2 I- y" b

    • * h7 o. o. l; d6 [/ s7 O; B

      4 _$ h/ F" u% P3 S; p0 j& l     insert1(p);  ! h) B, ]' u; q8 ^
      1 ]# G8 W1 d/ g) ^1 C' R
    • ! Y$ P1 F$ G& c! b' y' x  d
      * a5 j  \; N6 N5 Q# d1 s+ @3 L
            else  
      $ t  x, F, _0 H

      0 G7 K, P3 e1 s7 ]/ X; d0 `( P' @( m

    • 0 d. T" k6 y; ?6 Q$ z8 [% O
      + d1 T' r8 |5 _8 i$ b' f$ o! S, B
            {  
      1 S# o1 m0 Y1 t  B4 y8 ]  w

      : H" E" Y( ^( j* d, g

    • $ ^1 H1 ]5 L$ U! {' Q1 }% T

      3 F5 y$ \: ~, @8 j' ~     p->next=ready; /*创建就绪队列的第一个PCB*/  
      , O: l* D! t, `5 Q9 g

      ; K- f, Q9 L. p

    • 4 @. ]) _, m+ V
      - q& N4 X& }$ F8 M$ O& K) Q
           ready=p;  
      4 ~# u7 v( k1 n5 Q  {& c

      / x: E/ `/ N& ~

    • 8 P7 Q' p1 m+ V3 n, U9 b( s" I  q) R- Q
      - g% s$ _3 Z2 i& c8 i
            }  
      : S- l0 k5 G6 h3 s1 Z8 A, H5 D. q

      + d* @2 R( R$ ?5 _

    • * F/ R) ]3 x$ K! I0 j( P7 a& ~
      0 w( c7 n9 C4 T# S# ~7 P$ E6 R
         }  8 E+ b) B4 D- O  b0 e1 W1 G8 h: e

      , _3 H/ k2 B  k: j
    • 5 N' q( H- N- l- E8 P/ S
      1 l/ l% Q- ?! q% j
         printf("          优先数算法输出信息:\n");  8 T' Q0 `' M$ ?  w+ ~' W
      4 n+ m( O8 P, I9 ~. u- B$ d. L

    • 5 H' o6 S; ~% H- {' q/ k* I% v

      # V9 [! |7 X4 C0 ?  {   printf("************************************************\n");  
      8 b) [3 s* Q$ K9 B7 Q
      . s! V4 i, W0 ~4 ]) F

    • 5 s, O& O6 a; \! B! w# w: X/ R
      7 N9 M# N- z, y4 q; e
         prt(alg);  /*输出进程PCB信息*/  , K4 p  t( o/ p" y: W+ `

      # h! U$ ^' @1 g- o5 s0 Q2 q1 c

    • ) R1 T' _" v& `, d( p; x
      2 ?7 M& N1 W  a
         run=ready; /*将就绪队列的第一个进程投入运行*/  
      . b* ?/ P8 ]! D6 d! X& I

      8 q. [( c- b6 X& C! D( [3 \4 I
    • 7 i$ F7 X1 F6 D9 V8 |* o. B
      / J4 Y0 U; y0 \8 V) ^
         ready=ready->next;  
      9 w6 {, D# R! @, |

      # E; q  q5 o( l4 O2 T6 b( w% |+ g$ i
    • - z0 P8 P" [& W/ l
      9 q3 s) q8 f( j$ }" J, Y+ n
         run->state='R';  
        N6 \0 U* M  i9 t4 A
      $ A; L& w& i4 S7 h% m% ~
    • $ W. Q6 L+ ~" |: a4 \7 F

      % T6 ]6 t2 H6 C) B( b8 {}  
      # H9 {, q$ @2 P$ i
      & h# H% l1 H4 G3 o0 l) X

    • 5 o1 Y. }: x" b7 T5 [9 S

      ( I- a  d. C7 r  Z9 ~/*优先数调度算法*/  
      7 w, H/ {. h9 j9 D
      7 z/ a4 E# f0 F4 K1 E$ a1 O

    • / P; z) V& J6 C  ~9 {
      5 s- c# e$ Y: E7 [' E+ T& l
      priority(char alg)  
      7 \* Z/ D& g1 L% |: }
      9 u9 P6 q; j. c; ]( y
    • / I# ^: N! {4 Y8 `7 ?
      / E: R( N  m1 x
      {  5 g+ {  c) W- N! v! W
      , z, Q6 G" w0 q* Z/ C) D
    • ) M3 Q) S9 n! j8 s, w
      3 c' k) e4 s; C' p8 A# l
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  : P4 d2 Y* F  P1 I! m. v  {

      2 R  q. L4 x0 O" b, d+ E
    •   l; p0 u8 O* d( H7 w/ j
      / l1 ^$ ]7 p# s! I8 b/ `8 v) y
         {  
      . E3 [9 @/ ]( H$ q- ?2 j1 _# U* z
      - M. m' E5 K4 g2 l5 y* C' d
    • : ~1 }; b& P7 K$ S$ K# w$ v, U% ?

      / h$ o# j# g/ _5 y) _" `; X      run->cputime=run->cputime+1;  
      ) n' H( i& E6 V: ]0 X; N

      . f  n7 c+ B5 t1 [. h6 w
    • 8 P- [9 F8 @$ C9 y

      % N8 @2 v9 {  A+ L) k6 y      run->needtime=run->needtime-1;  
      ! g, e! ?8 c* p6 Q+ b/ }7 R$ E
      ( R' E" Y5 d% @$ T- p
    •   _4 U: A5 N+ ~; l! d
      1 B' ?5 y& H6 q
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  9 ?2 U+ `8 u8 Q8 U: ~2 X
      5 C$ W# x1 X4 `, V' J

    • 0 O. I! l( V+ r
      2 K! v0 f. Z  g0 f3 ~
            PCB *p;
      2 [, Q5 h/ ^, f7 A$ p3 `
      3 {$ e3 T) T0 o+ D  t! q
    • 3 V8 ?) T2 Q0 C- I

      7 H* v( j# M9 A1 y2 ~8 z      p=ready;
      " h" p/ Y4 P* C" X( W, O- B8 C
      : c/ z6 U& \0 M; ~3 h; w
    • 9 u% P* a: [: ]" V2 Z5 f( w  ~+ u
      2 R+ |3 ]7 y2 k( y8 L% ?
            while(p!=NULL)  
      ) @  _0 T/ _1 x- V/ T* z
      # t: @% p# a" L8 o1 ^* V! h% ^

    • + B) M! t8 p2 T2 ?- Y' k
      . e5 v  U( a$ y0 C  ~8 {
            {  
      ; l5 Z, Q9 c  H
      2 z. n6 H# N, F9 P3 A

    • ! ~* A( m; i' s: V& U5 V) U
      ' z+ i7 c' t. [' ?2 M8 H/ [& Y9 g  v
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      ' T* r; Z, x1 f3 j8 v1 z* e
      # \8 u" A; ]9 |
    •   u. ?8 c; X8 `) Q8 r# W! Y9 T
      4 d. n6 Q- Z, H7 Q/ R
                p=p->next;  
      + @6 |3 B" j/ C" U8 d- P4 s$ Z2 W9 T; q
      0 A: Q4 g& ?4 T& z* L$ L$ n
    • . v7 y+ V2 ?  S# G4 K; g
      5 V6 S# l/ ?/ A0 s
            }  
      1 J8 h3 {2 @- c$ s- Z8 J
      : P9 p8 i+ A- t* I* a6 Z

    • ( |. [8 y* [: N- Y: j% B

      & ]8 j* F7 k0 {0 l% x8 g; Q" }1 W# [      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      5 ~4 M- C& j! z, L
      1 [7 f, }' s, {1 }
    • / ?' F# s  p7 z. `2 ]2 O+ ?0 @6 [

      9 t, N9 a  I( e$ V2 o      {  " G1 p/ X- y) y) k- v
      , n* o8 R0 n0 V9 ^
    • 2 d% \' y1 e" z" O( y$ o
      ' [6 R8 W7 {' u. i
               run->next=finish;  
      ( J) z& C1 a! ^; F) l. d5 g

      % U. e/ B3 N7 t/ c* S9 H& a; Y

    • 4 u3 j8 ^2 E. e) k
      7 C! g- c, g6 e* Q/ r+ W( K+ D
               finish=run;  ) K6 \, Q) {& G# h* y
      1 J! v9 S9 R8 ~5 R' H
    • / W, U- F' ?- U+ i3 S. D; J

      , [# K* K/ B8 \# h         run->state='F';  /*置状态为完成态*/  
      1 S3 p# @) U) [/ X( p4 V$ M* n
      7 Q  ]/ q# G% h  K4 l& `2 p3 S

    • $ N# t$ D" T+ O7 i4 W/ t

      & @' m/ X- x$ G+ P4 e5 I         run=NULL;  /*运行队列头指针为空*/  
      ( x" C9 Y$ Y7 C* X) B0 n! g/ i- s
      / s. ?7 l" L' A& A  s0 b
    • 2 Z* H& i* j; v! j- r
      " T0 g; x. N3 V! O5 V9 {2 q
               if(ready!=NULL) /*如就绪队列不空*/
      9 ]3 p4 S. c4 M2 D$ K( U

      ' N$ P! e! w1 g6 N

    • 4 B5 {/ q% {) c0 O3 c& b5 X

      5 y- v7 _$ V' N4 g         {  . v7 s6 x" P3 J* l2 E
      & `* @( _, H/ `  H  \
    • & E% T( `+ i" m$ D/ v
      4 H- G8 |9 O4 o1 |, j5 j  |
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      9 i+ }" @# V0 O9 [/ P

      9 }  S5 W% v/ }( g- y/ }
    • 5 r  y, R! [) Z. s0 j

      5 ]! s8 A5 H" k0 T2 f         }
      6 W1 M0 H5 _9 l
      & J# @. w! W1 q- q

    • ! \: ~% F* |& D9 j; w
      ' w' s; g+ u' W$ v6 x$ d# Z
            }  % {+ B. i7 e! w7 Q: f4 G

      4 T" F* ]& E3 P) T: Q( f7 {
    • # G# x( }1 L5 d& J

      . Y& T0 O3 G' j+ C" {6 j+ Q' Q2 N      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      / n# j* Y$ N# n5 ?6 U! }* u
      0 ], O/ [5 p8 }" N; P7 G

    • ( z- l8 X% b* a3 |9 F5 @" a
      ( C1 {0 S3 n) U( m. e6 H
           if((ready!=NULL)&&(run->prio<ready->prio))  ' |# l. y; Y/ C( e* y

      " c8 P) |  b9 e
    • . X5 c) w5 d8 r" \7 @& ]' X
      ' J& {# r) B" R% b0 C& `& ]6 ]
           {  
      # O+ ]* u; F* G1 j) i+ \
      6 V) s0 _8 E, N

    • % m& i2 o1 ?- w  V$ y( W
      ( D$ a& A4 |+ s2 N" D( T
              run->state='W';    O, s4 y. j4 |
      ! Y- ~) B+ ?0 A7 w

    • # N) \. C2 q9 H# q8 N

      6 v2 I' J! q5 u1 N        insert1(run);  
      0 T2 h4 }, K) N* N- {. k. b2 [
      ! s/ d: k6 W! p" }
    • 6 O+ ?+ c" h3 ^% O9 Z2 R" f! F

      % A9 o' x; K8 s% ~& G; r9 ~        firstin(); /*将就绪队列的第一个进程投入运行*/  
      4 V( K6 t4 a2 H

      5 p$ @& O. x' K' ?- p  L+ x. h

    • 9 a! Y4 x* o- b7 w5 y' b: M2 f' S
      1 i# ]2 g7 {8 g9 K; H& \
           }  
      " ]- }1 n/ \7 [7 a8 s

      8 g9 E* k0 b( G2 p4 ?$ L2 N- M- h
    • 6 [) B' W; l3 t( g- ]

      9 s& v0 v& ], E" b' \& ~      prt(alg); /*输出进程PCB信息*/  
      8 Y8 U0 G: Z7 o/ G

      & j6 m) O) ]  ?/ A1 h- v+ u

    • 1 o2 B" P, D6 H3 c

      # f6 p9 y( a' Y3 l& \2 z   }  
      5 A& ?. _# e% O( H# h7 C9 O8 a4 j
      : l/ o. R  C& Q: C  T1 r

    • 5 g* ^+ o' H' @# @- B

      $ W# C# F% O2 O5 I2 C}  
      6 R/ Q  {/ r+ j  W* I
      ( v% R  a+ @; r+ I* I0 ]8 X

    • % J, C8 u! y. \4 O
      ( i. N8 C9 K7 t5 P3 {8 ^- I$ _4 V
      /*主函数*/  : n" m# R7 {/ I4 Z% p

      " d0 K  X7 g7 |" Q4 ]

    • ) ?! Y% r9 N7 L* \" k

      % Y& }. H7 F  E( |# k9 ^8 omain()  : p+ L5 Y1 e, s, l0 d6 o  q2 o
      " M( o; \2 r) D2 }

    • : R( B6 l* x) C- h: Z
      " a  i. Q1 r( `8 n
      {  9 D# \6 ]4 @4 |' V

      % s! o) K5 _+ _* M4 i3 [) Q; z
    • ; f/ a. S7 v# r7 f6 M

      & c0 e6 F' H( }9 b6 C   char algo;  /*算法标记*/  9 k# T4 Y9 C0 P6 K( f7 Y9 s7 Y
      / Y. C' M) l1 `* p; K

    •   z) x# ]' a) D* Q& {+ @8 S* T
      ' Y  V8 l+ B$ V, U$ P- V
         printf("输入P确定算法:优先数算法\n");  - z8 v6 Y5 R' @1 |
      ! ?+ G2 w# a/ @8 j# B# P5 v

    • ' ^0 S8 ?5 H' q. E9 {0 B. `

      8 h1 M8 M( B! r7 w) {# U1 ~1 a: u   scanf("%c",&algo); /*输入字符确定算法*/  
      0 a0 E; h  k9 P% a2 z8 P; M

      8 V' s8 l& R: N; f3 w& m
    • 2 l+ e+ _' r8 r% |, P9 E: T

      8 j1 w- R/ z( w- k+ n/ x/ Z1 G/ s   printf("输入进程数:\n");  5 X9 t. s9 m  @& h8 G, g8 g
      / m9 c% F. a8 v( D3 z" w& r

    • / |4 V& j/ G+ k4 _2 {

      2 y+ D& j( {7 ?   scanf("%d",&N); /*输入进程数*/  
      % \" ^; A4 z4 w( z

      + x: b$ X9 U- y
    • 9 y" o9 ]6 a' H- Q& O2 ~
      6 _# f: H  n( ^7 Z# q5 c
         if(algo=='P'||algo=='p')    X/ \! W2 J+ b5 A& s

      4 L3 `, e' U- [8 w# `

    • . q7 h/ M6 D: M
      + v* e% {1 n) d0 m$ i6 R7 _) Z
         {  
      % W; d; ?; b! m5 `7 O3 }
      ) c! a! F% J0 u9 Y& R

    • 1 n# {) K6 i- t. @0 _9 [
        ~! H/ ^, F8 N" E( i; Q
            create(algo); /*优先数法*/  
      $ F) H7 K3 [! C! X" E
      . V" n5 l) u0 }% _3 @" [
    • 4 G# }, |; I7 u, k- x& ?" n
      , ]+ E2 e6 b7 [) b9 r5 K
            priority(algo);    r4 n9 N: X6 N; ^2 A3 f: W
      + ~! ^/ ?3 o6 O5 N- w" |

    • 4 c$ @0 I# v7 @

      ! K$ `- V  W5 E5 v; ~   } 5 B; q8 T# V; V4 c

      - X6 R" E) m3 |" {5 H
    • 9 w( m0 G  t% q% k& Z: o; @4 \' k

      # e/ i  f! ?* N1 U% o8 J}
      ) e' G% r! P6 _9 `

      / I" K! D& o- P5 d6 W7 n0 _0 k# G/ G: C* n* ?& t


    + J- H9 {; ~0 s: k/ y; D输出结果:
    2 [$ {( y; J+ T. o


    8 o" K! _. j" }原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    % V3 B( Y% F3 S! ]
    ( d4 E4 L" T3 ?) }$ P6 F! I' R
    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-24 05:12 , Processed in 0.559054 second(s), 50 queries .

    回顶部