QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3154|回复: 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
    + ~+ J, E" L8 U  B3 s* M
    优先级调度算法
    + Y2 N( n1 L* A( P9 Z$ [8 ~( j9 p

    算法介绍
    8 A+ @- z2 E: C/ v9 u3 w优先调度算法的类型(用于作业调度)
    5 i/ `3 y: O) t! v1 C& B1)非抢占式优先权调度算法 7 n2 x8 ?; T+ b  Z& u" _9 k
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    2 B4 E! N+ r# c" `- b( g/ n. u2)抢占式优先权调度算法
    0 C- ]" {' L# K. r. d只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    * F- G' ]& s  E  F# }2 q1)静态优先权
    4 I4 S1 C, l8 A1 `/ v静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
      y( s2 y  D+ S1 Q0 U

    2)动态优先权
    . @1 [( W. t; Z+ R/ \0 A4 v

    算法实现

    抢占式动态优先权:


    % z% b% t; ]5 v3 j$ j! f. E, C( o$ xPS:本人认为非抢占式静态优先权没有实际价值。


    • % Z0 D$ B; {. Q1 ^% h+ a9 Z
      + T" T- V0 S! X) R
      #include <stdio.h>
        c  F% _% T5 r* z

      " L1 ^+ M  ?6 j2 D- f9 h: {
    • 3 z! b% R; l; }1 {: W/ k

      4 ?; l9 ], ^5 N) T7 I5 R#include <stdlib.h>  # r9 A) e& W3 x" m5 I9 @6 m, M
      ! i3 J. y# k5 E4 y# F3 c/ }

    • & Y' g5 H# _2 o0 k6 q+ e% B& S

      3 D3 o: c& F# i) A: T& ^#include <string.h>  1 M/ R; s/ Q) q& a) V  w+ f

      ! }8 S) A3 Q; }, |
    • / ^! K% q% p, P. {5 p+ ?; R+ ]
      " J' q0 t  |) I9 n1 [/ n/ l, m6 A
      typedef struct node  
      $ t! g! u& h1 B: j& P& _1 F
      8 u) ^( s0 x  D2 w8 o3 i/ |+ G2 Q

    • 8 H9 H9 o$ C# @/ q) j

      $ w9 Z; X3 a$ F- m! t{  
      - J4 Z& [' b5 G# `# z. y7 x
      " _# {5 N2 n1 }  D9 n6 Y
    • / Z4 ~# I0 {! Z. M; \: a) [
      : B4 _  Z9 R2 }: Y
         char name[10];  /*进程标识符*/  
      ( o  o, p3 F$ G8 Z6 x: p
      3 U5 {/ B( j$ Q8 u# `

    • $ b! ^. Y5 c7 V6 c

        t0 Y4 F! k" W0 `9 [& u   int prio;   /*进程优先数*/  
      1 R" K8 ^: V6 \5 ~6 @4 [& v, V

      6 d0 `2 E2 R6 @0 Q
    • * D9 b* z6 Y* K0 @

      - J! [5 @+ j9 F/ Y4 W) O* c! m( q   int round;  /*进程时间轮转时间片*/  
      0 d, ^; {# D6 N( b
      % V7 |  Q7 s. G/ G+ r+ J0 _" y

    • 7 M2 u, D( W+ L  U4 L+ A2 B% ]

      " n6 ?5 O; J/ A   int cputime; /*进程占用CPU时间*/  1 A/ y# p" n5 w1 C! h; |

      + T, R, N2 w0 W. j- `/ v
    • 2 G* y5 ]' |/ z5 {( Y
      0 K* p+ V! w. y
         int needtime; /*进程到完成还要的时间*/  " }# F& [0 s3 K% u
      ' @8 U5 K6 _7 }6 O% `

    •   w3 k. I) ?" f& [% L

      9 Y" \  ^" t/ j1 r$ O4 z   int count;  /*计数器*/  
      7 D" `; e! s5 I& t& g  v8 g

        r: t( r: r% [) p

    • 6 X' T% K/ y) Z8 M+ V
      7 i# w5 t( u0 H
         char state; /*进程的状态*/  1 _$ O5 J+ B# O) W" n/ E9 Y

      % Y  Z# J# e& u% L& H8 j! ]

    • 1 s- O3 P* L5 E" S2 }

      ) Y' x& g" J5 R- {/ s# q   struct node *next; /*链指针*/  & S' [( w: w) T0 I) _+ q
      1 n+ j2 v% J4 A& V. a* n
    • ; \5 u' {, b5 {0 n" @

      : _6 N- c) `& I# w) J}PCB;  4 \6 r6 T( L; F

      ! v3 N$ C( \! s3 Z: i
    • 1 ^# Z* j* ?$ u8 q3 o# C
      4 t# S& R0 ]4 d  p
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      , u1 E$ B/ N5 I$ z

      4 r; ?3 x. k! w( C) z7 C# I
    • % |" X0 S# A; J2 a" P# N
      ' D! G$ C/ h1 x: o/ y" b, i: u
      int N; /*进程数*/  
        x8 p) H! t1 }, O

      9 \7 Z( e* F% ?$ y9 v

    •   U0 D6 d0 t) _* b9 h
      ) p8 N* x$ g& j( s
      /*将就绪队列中的第一个进程投入运行*/  
      6 e# ]( }+ {( D4 B! X' f

      ! b2 h3 H" k  ]4 j1 C3 O0 [& O0 a# Y

    • + Z# i+ z  o( ?  f; P

      $ o5 _; K3 }, \firstin()  4 S) x/ s7 l1 ^0 y: z

      . j# h7 K: y' f' o' q3 Q

    • ) E! w9 C6 ?; X( z+ p. I/ J, ~' n
      7 I2 m; s: s: ^. `6 O, X
      {  % i+ S+ ^$ H7 q/ T9 ]
      * k7 Z) w/ R8 N3 I" T

    • ( u; G1 y" i2 K+ {6 \1 W4 x& Y

      5 I& d: b  B0 l* O4 T# Q% E: R0 R   run=ready;   /*就绪队列头指针赋值给运行头指针*/  0 i: W6 n  s3 \
      + ?' X" k7 g' \' Y

    • . v' k! Z) ?' d* x$ b

      , T8 Z; {* J9 e7 b; S/ |/ \5 D   run->state='R';   /*进程状态变为运行态*/  
      & Q/ Q8 ]6 L* z+ y: L8 q

      " r9 O6 s) ]1 K: d: r' }# C
    • 4 v- F# k# O1 h, {! U

      ( y( M  s. O6 }* A   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      ( x, s' @5 f: @4 ~7 W
      7 Y1 V- Q. d; Y5 |1 R  G

    •   E. ]7 u4 I' @3 b+ Z
      0 ?  v2 C+ }+ j! p% A" C6 x1 z( Z
      }  : R$ k0 G+ H/ x  C
      ' @& A5 ^& I+ K/ g

    • 3 d7 U% X; j! ]  B0 T

      0 J3 k) x% N1 b' O% p/*标题输出函数*/  ' r- F- X+ K8 [: N

      ) A6 ~. x7 n4 Q0 O4 v. c
    • , p1 E- e% D6 {4 L2 G- s& E
      0 h5 M. I) z" t0 g6 K
      void prt1(char a)  ) A$ A: V4 ^  B  T
      3 \- \3 @# N/ |  b
    • " H2 K8 Q* Z0 V& Q3 w$ w0 d

      5 u2 G; q1 q& c: l* g" f( r{  
      ) {: c, G% ?' L+ t! L6 M% V; c. h
      - Q2 I4 X$ t9 ?; q

    • 3 x& q7 D' w9 k, u3 S+ k
      : B( f9 w1 z- s$ K; w" K, \2 G1 B
         if(toupper(a)=='P') /*优先数法*/  
      9 f3 z5 {4 Q' a/ x, d
      + F) g& O% l# \9 G

    • - a7 ^: _/ P. }$ w4 }

      ( Y5 |, y/ U/ f      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      ' G+ k( ^) s) L$ d1 E7 W
      , D! O. s; Y3 ]1 ?

    • * ?! E* S" x$ I2 W) z8 H

      ( t: n0 K* x6 W  y( }) F- D   else  
      ) L# p/ ~, b8 Q% z  M! I/ E+ K4 H/ m& ]

      : ^8 c8 l% a3 J( {
    • ! F; M/ n+ w7 J+ q, C0 h

      " R* R# u4 s/ c+ j  k6 W( b" e: m      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      7 L# [- U, F, Q' k8 T% I* B' t
      3 g) Z5 p( f4 @9 ?

    • ( F" j1 ?  ^' l

      * A5 `5 D3 [0 K/ T. K}  
      + p+ j& Y' w2 E' n1 X
      % l5 J4 F: X2 R8 z* _; ]& U3 x' ?3 x

    • . ~0 K* p* o/ R9 P

      % L4 G- \& ^( g3 j4 R/*进程PCB输出*/  
        g+ K7 `7 ?1 E  s( |6 K  A

      $ T1 X, C4 ?* Q2 |
    • 7 V% w& s2 `" B- w/ J" u; l( M
      ) O3 `1 j$ n8 o+ {6 F
      void prt2(char a,PCB *q)    \6 ]7 L7 L9 V2 H6 T* ]
      5 f! q- {3 q$ Y/ }
    • ! W% {2 c5 `' B5 C+ q8 q+ X
      % _; ~) L! {  f1 _7 t2 H
      {  : o" D& R, u# A$ L
      / @; O6 `& p  e' n1 f  ~
    •   `2 g# {" H/ [( U' h

      . ^* e7 S$ J0 l: Z. V   if(toupper(a)=='P')  /*优先数法的输出*/  
      ; u0 V" p. a9 u" Y9 a6 m" m. `3 U
      , p0 I. g; |/ j& N$ b! L

    • 2 _4 H1 {) ^. @' U
      ) H3 h$ D# u# B+ R1 F; Y$ t- U/ i( I
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      9 p* C2 c, |3 O2 E7 E

      2 [; ~( p! Z/ U' b

    • % z0 y& ~  I' }$ C

      ! J3 V" [. k: x" b& |       q->cputime,q->needtime,q->prio,q->state);  1 N. o2 H4 {9 `  l7 R; ?

      ' v: y$ d' Z( m2 ]2 X) ]' C
    • $ w& |% x$ v3 |6 ~+ I4 A

      6 f! ~& {8 o2 t$ p  a2 p   else/*轮转法的输出*/  
      3 _; l' }: z6 X
      4 w. N* v$ u* y; J' A" c
    • + Y" k( z6 l$ C
      . E: E; |; L! Z) |# y
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  8 M( _6 l; ^( p6 B* c6 y- b3 P

      / S1 k$ c$ ]; ]6 p7 S+ X" ^

    • + [" e1 |6 P& E6 M# x4 h6 L8 h) h
      9 v: ]8 q6 f' \* H( J3 c( B" n! W
             q->cputime,q->needtime,q->count,q->round,q->state);  
      $ r6 t7 E* x* j0 J

      9 m7 C; G( E$ ?* a3 G

    • , B; I( A8 o$ N. y  E
      " b) J0 F3 x! k  v
      }  
      0 X* g3 l9 s5 J

      4 S+ u+ N0 `2 _
    • * k! N6 v7 p* U" W1 w

      7 e' {/ N1 |& S' G/*输出函数*/  
      " c2 U( x. g4 _5 M
      % h) p- [' {' t0 p3 |) ~2 v
    • ' k0 a# n# z: Z* B# g, H' T! v
      4 P7 |* e3 }5 {8 C& y
      void prt(char algo)  
      ) b: D( q8 F8 Z) a. ]( ]

      : G/ V/ j" _. O$ H/ U

    • 1 `( b! A8 F6 @( o3 r
      $ `& r* i/ ?3 l9 u; K* B! A
      {  ! `9 S$ C  Q5 W; D; m$ A

      . t; l( k% A% [( y, m2 c( r- B& j

    •   O) H$ w) |( q& l3 ?- P/ i
      ' \4 o* R$ k* r4 a. f1 r
         PCB *p;  0 N: v* D0 i+ m6 N6 d
      ( {) [' r& Q6 `3 P. O7 u( I& _$ Q

    • : v2 K7 @! Q8 B) f$ p
      ! [4 X4 B; r1 u
         prt1(algo);  /*输出标题*/  
      ! h0 J5 e: q. A$ d) G: A

      ; Z- B* _/ |+ d

    •   t! g- H  _: h# ?$ j( E" h
      9 d9 p6 V3 s6 k9 Z7 |2 ~
         if(run!=NULL) /*如果运行指针不空*/  
      3 d7 ?3 h- |$ E( p2 \$ x

      8 Q/ N- H' e2 v. C4 W

    • 5 x& b: `6 E! z; p

      ! N% w( q& s3 Y( ~7 k      prt2(algo,run); /*输出当前正在运行的PCB*/  
      2 ^: J7 A' R* E5 b/ s

      % O8 N/ K9 ^/ F: Q3 O) G- b
    • 8 Z0 ?# L% c8 f  U, F

      0 A5 l( w6 j$ ~2 ~; z   p=ready;  /*输出就绪队列PCB*/  - _% R! |- i, `! z6 O2 t/ i% h
      : I% s' }3 T8 H! |! Y3 X8 N. H3 a
    • + _2 X" I1 I! C  H/ m  C' S
      5 r) a3 d+ C1 K  x2 R+ B
         while(p!=NULL)  ' G# ~, F" ^& I( L- h

      1 T5 E' m4 X8 \8 e- i( t5 x+ p6 t4 K
    • , W" O4 q& _4 T; _0 D
      $ p; R$ N- A& _
         {  + B7 D$ \; {/ a7 }$ r
      0 j' e3 ?. _2 s
    • 4 L2 |- ^% g8 d8 q
      ! W2 N; k3 J3 p: @; r' i$ E4 t& ~
            prt2(algo,p);  
      5 k$ I( c' S' [
      " Z6 d' H1 M2 k  j. ?% U
    • 1 {  b3 N3 G. ~8 G# ~  k
      1 ]. }" P9 J& W/ s& S
            p=p->next;  
      ) c' x  H# [+ y, p5 H- K
      ' {- J6 K( d* c2 j8 ]
    • ! x. l: ]; {# d/ l
      4 d5 g7 T" |" x& A4 R
         }  
      / p1 u" w) m7 ^/ u0 e- ^

      1 E4 x% O3 S  s& T

    • , O6 p8 x. U" O  M, E

      ( D& T6 B9 m8 L5 a+ ~7 s   p=finish;  /*输出完成队列的PCB*/  
      ; X+ O- m$ s" G: U

      ! H9 j3 J1 e7 y" S1 o7 v% w
    • 3 X! Y. c! k& B4 t! e

      ! C8 a$ n& |  ^5 s3 D   while(p!=NULL)  : S! t1 m2 i9 U* R% u0 A$ [% f6 G
      & z+ l' e7 W2 o5 D6 s" a2 \) }% V

    • 1 H& ~7 G* {; w! u- H% P

        C. R9 z) s5 ?% Y! R6 p0 @   {  * J# D( G+ T: W+ k8 |6 _7 N

      ) s) d, ]; e; O, h$ |

    • $ i5 Q7 g* C/ w6 o
      ( u/ q4 z7 k. b& x
            prt2(algo,p);  7 H. S) k) Y; B
      ( q5 B8 x; \" h" m

    • + M! E* j, E- P4 y6 v
      " L" P" U+ E. H6 H' o
            p=p->next;  ) F( h. @. d" w. J
      3 |3 [, X1 d( n
    • ! I2 H( t6 A8 c% V1 h

      ; J3 |" v  ~3 N& `- F$ P" D   }  
      + k1 y# b) D7 g! B
      ! D; I1 Q, @3 a& H$ [4 P

    • ! o' V, k3 U1 b4 e) P* k
      & Z* C6 z) i9 @
         getchar();  /*压任意键继续*/  , p! |  B1 C: }( R; z9 K7 c

      8 [: R# C. e" e! V! Z8 G- g
    • 3 M0 y! F5 u& a* o$ Q# h+ O% |

      : ?6 v' D: B( T& S9 X}  ' ?' ^6 b% t& [7 j# [* T% q1 |8 Q
      ' g( r% s% t; Y, y. }
    • 3 T7 }2 ~% M' K

      + Q! S- y/ P  G1 M/*优先数的插入算法*/  
      ; O+ y* Y" d! v# g# E2 `
      , [9 e4 J$ O8 H
    • / U' h& S& d2 w/ a7 B$ H0 A$ F0 N- |6 B
      - m5 x" z+ j+ X' W) k
      insert1(PCB *q)  
      . I$ f% k* F; s. _7 M) {

      " _0 [1 |5 y! d) Z8 t) t
    • 5 f6 q) ~" f& z' p

      . x4 T: T8 ^! I2 m; h{  
      1 P( z! t2 y8 x) }4 K6 J0 t
        l3 T: a5 X* \- u

    • 3 T5 ~: n8 O+ v, O

      7 F0 L+ }0 t1 d8 U   PCB *p1,*s,*r;  6 B2 ?* R8 ]4 C0 ~, G$ T8 Y% Z9 B
      7 f5 c$ A  c) l
    • 0 j+ V6 i( v) G+ M' Q' G  c
      ! K  A, A3 ]5 A- g; K
         int b;  7 \% l2 X' f/ Q: P
      5 X" w. _5 F+ x% @; [
    • : g  _9 x: \- _! \' s
      , ?8 A9 g4 V$ y, S9 i
         s=q;  /*待插入的PCB指针*/  9 R- J5 q3 @0 E
      * E0 {. ]7 y7 O6 j

    • ; e; n. z1 Q1 S1 D
      1 n+ b7 h6 D+ \* n4 P, A; @5 q9 N
         p1=ready; /*就绪队列头指针*/  
      1 Z: |( Z4 b. }& C% R+ [

      % e* _0 U. P/ ?

    • 0 R3 @4 S% r0 x

      + R7 K( a; L1 I7 n4 j2 G' B) ?7 D   r=p1; /*r做p1的前驱指针*/  4 i( r. v# W: g
      + @5 s7 C, j( {9 Z
    • ' a$ y& z7 R6 j9 Q

      " f& a. Q; ?3 A' U  E  C   b=1;  0 B0 O) \1 V) m

      + I  ^& q$ B3 x2 J( t: L: F, q

    • 3 Z5 i  }; J  u

      - C- R- |" A& _! F& A  Y6 D" F; g   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      , Z, H, r; K' B$ _2 t4 q* D" `2 T4 U
      6 B! I7 Z4 E6 v

    • ( S7 `0 h# U. Y% y0 Y* o

      8 [6 \" @" x. }/ v5 P7 o      if(p1->prio>=s->prio)  2 d8 {/ q' a& z7 k1 `: z3 a
      1 r; l; W7 A2 _- E5 K

    • / B3 G* G) E) K& v- t

      5 b' M( R" Z2 T      {  
      : P! u7 p) W) @: T
      9 S1 X8 x( G6 n5 Z1 S' X5 y/ x* k
    • : }; y! K( a+ L1 T5 d

      / r( |1 j# |$ _$ m  o8 J, M& }     r=p1;  2 V' p& ]" }7 \3 p% m# `7 m6 U0 r

      6 g- M3 r  b" `9 X: _0 \; R

    • ) L" E6 p, ]" k6 V

        a; F: o( q6 f9 S) v/ Y. P) j     p1=p1->next;  1 I( g: K+ e* |' C
      9 ~' p9 j1 v( X  E. f+ w' c! k+ K
    • & M' a  A" m( P7 y" Q  m7 V
      - V* J1 ^- ~+ L; e
            }  5 H& ?% V+ S. O& G7 ~& V
      4 N- U' Q4 `! g

    • ! P& q7 v% T; n# g2 ?4 ^

      ; }1 V- q4 G0 `+ I. J' R7 ^      else  ) J1 z. N. ?$ S9 E& D

      , S5 ]0 c' S, ^2 V+ p

    •   L! L5 r; {, w$ j( Z

      6 M" y" i. b- f" U1 q6 n     b=0;  
      # b0 |7 A% x# p3 V3 e: g% f
      & s' A6 Q! a* b5 F' I4 A! o" X
    • * J+ H6 ]6 z! n8 d
      ! W% q- Z' X$ T3 v9 ~: p
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      4 D/ ?2 j' i! ?, Z: i. z

      ) a: A, C4 v; ~( l! V
    • 5 `4 z/ D. d* M) o; ]0 x, n9 Y; w% _

      - H. s6 R+ m9 ^# A& {   {  
      0 l3 }2 a# y0 g2 Q2 U/ y3 F) f
      ! k7 G4 ~8 f* N- f# M3 r

    • 8 d; t$ L3 s" X
      # P. q# z! w; I
            r->next=s;  
      8 h! a" ^2 _; Q: t

      - t" D  E4 f) l& R5 x

    • ) k9 I9 ~9 _" r% y" p

      0 B! e$ [: q9 `2 c      s->next=p1;  ( q2 e' T& M6 z. a* z8 J( ^
      2 |: N: Q; }" y$ V. E4 ~9 H
    • , I- j7 Y: C) Z( v0 C( i7 n

      , B0 Y, x; r; g: ~   }    m) l* x$ \# Q; Y1 j

      1 L/ o' U0 K' R: N

    • ' {1 D( w0 C8 k3 p4 M) d
      9 `% a% n7 @0 U3 b
         else  / c' _4 |3 _% r

      ) m/ ]* V- h0 X- A' }' L  [* ]

    • 0 H% }/ n. R! I  W4 V2 Y
      # G( P. s# H2 {+ h0 x
         {  8 q8 |+ q8 [6 h4 @# K5 j- e0 Y% N, E: C# v
      , z- e, u) _2 L6 q& ^7 G
    • + R! v5 _3 o) l1 K
      ( h. \3 w- {% M# ~. B- b% R
            s->next=p1;  /*否则插入在就绪队列的头*/  % O; U. i/ r: u; j# l

      / k# o. _/ [, v0 a2 m
    • 0 r( q0 _4 q% [. C

      0 K7 |2 E8 X1 G9 b2 ^5 a      ready=s;  3 W! E  y7 t  c

      * P8 z' b) y( R' n; h

    • % }# J8 _; y7 l4 G+ t

      # f4 [8 E& o4 |! o   }  * l1 e1 _0 U% Y* Z, T5 K- S
      & c3 X+ x6 D/ H8 v( Q' f' F

    • 4 e! _! D+ D5 D1 q+ A- x/ e3 L

      , D, u, v/ C* Y( B0 `' e}  ! y% C( _2 q& h9 u7 Y1 l
      2 S, v! p! @3 l; y) J8 ~

    • $ q( @3 X& q; I' s& {

      . T! I& d$ S- |8 U- G- _% B/*优先数创建初始PCB信息*/  2 ^, c8 I- ]5 h0 p2 ?) E) k

      9 F& ~, |1 ?0 u5 [
    • 6 ?+ X: u5 N/ \& ~; O3 j: x' \
      8 X9 p7 ?5 {& Q; _$ O( l( \
      void create(char alg)  & F$ w& m7 K/ _. w4 B3 T

      $ c5 A7 q) j+ n1 Z2 G7 {

    • 6 O5 [4 S2 f  F9 [0 j

      . F) ^: h5 Z, ?- O9 g{  " m* r5 M% Y/ A  N7 Y; @

      ( J5 j% A) J2 z3 D" s% ?5 w- w

    • ' A( y! O) O& E1 M/ B4 D% F

      ! a, K3 y6 t  D4 L$ {% z% k   PCB *p;  + Z8 p3 K5 t6 B3 G1 Z3 L9 Q
      1 }8 R1 k* g0 K- u) V

    •   Y  a& ]  W' M+ J3 m5 V

      $ L) l+ v6 q. C; ]* E( T. u9 c   int i,time;    O1 P, p. W# m# N% R3 p- I! B
      * B. Q1 Y! b* q% W( B
    • 6 l+ C, P( [( w4 k8 F5 M3 k8 U  \
      * d( R/ w. V3 h; J: _- Y
         char na[10];  3 u1 F, w7 A  I  X1 {* N9 Y% L

      7 Z- V/ p; T6 q/ s8 s2 @( p4 F  T0 Q; q

    • 0 d: z& x' J% D0 p, X
      . M8 T( h2 l4 c3 _  ~% y% M
         ready=NULL; /*就绪队列头指针*/  # I* j; V: f& P! k8 k
      4 t% f7 t% I- R5 H# \, c! @) e
    • % B4 F; I4 s7 g' ~; g9 X
      + j7 R2 _4 p7 Q3 \2 A( y
         finish=NULL;  /*完成队列头指针*/  
      : ?' n/ t* i$ @! V
      0 f# ~& c0 U& z% C+ f% s
    • , @' {4 M% i4 @6 k8 ?8 A2 h

      6 n# ]: x/ @: T8 c: g& N   run=NULL; /*运行队列指针*/  
      : b) i- B0 y, O' v+ d! X$ [2 W

      & f3 n4 k/ O" K. Y

    • 9 w; e+ c4 s) h7 u. r- T( Q

      ! t2 R! x. A$ a: R0 a8 R: w; x   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  . Q9 ~# i5 `4 S9 `% B; q7 k0 V

      ' O! v3 @, W: h2 x( g
    • . h* N* Y/ f% k, E
      8 N6 {; h" H4 P  L3 ]
         for(i=1;i<=N;i++)  
      * d' R: K" x/ B1 J3 E7 _
        h9 K& B* @+ t1 b
    • 1 i7 D% X1 l, y/ Y  E

      , m6 `# X8 Z7 s+ f$ z& Y   {  
      / U" b: o( ]& B5 a3 I: W) m

      % V. l4 h) ~7 h  B2 h

    • 3 x! X! ?) c/ j% e

      ; r8 H( D/ H: _5 ]% e      p=(PCB *)malloc(sizeof(PCB));  
        B! q1 ?0 I+ M" ^5 R& z# @: P

      ( _$ b2 ]& p6 g' S' B
    • ! z& V- @2 G# ^) Y: U* t

      & h, ]$ g$ _  @7 P      scanf("%s",na);  5 k0 B0 o6 K9 u8 Y4 H
      + O* G! k# Y: P  H3 g
    • % ~4 F/ T3 G5 A

      . P$ i5 ]: t. M! P. k8 |+ a/ Q  L( T      scanf("%d",&time);  
      ! X" j. ]0 o. L# l
      ! u2 B& K- a. m" R4 w' O

    • $ j! B; R/ D6 M- ]

      1 @: K+ N7 {, f. z' `2 g: {9 t      strcpy(p->name,na);  
      # b8 Z/ Q% N; p  u9 T2 b

      0 {' G% L' g" B1 b; e

    • & P4 b6 L7 _: R

      , I9 d; O: `3 @# \      p->cputime=0;  
      " F8 u. e& z: h7 Z- z

      ' r# `  \+ V5 a9 |7 W
    • 8 m. F8 e  ]* `8 ~' g0 D- i" K$ W
      6 W0 [1 w  ~3 `9 E4 c/ \9 _
            p->needtime=time;  
      , r0 x2 s+ _& m4 |2 s( k9 z% x
      7 h" L; q( C8 @+ s* D
    • ( V8 E7 ^& h. ~$ z; g' k. j

      5 C9 Q5 K" O! B; p' g& q  q      p->state='w';  
      * ?( @* a- T( F
      : {" N/ o  d' x$ t% o5 @; {
    • ( d! S8 l! d2 P

      / W3 Q6 U* y9 Y' Z. v      p->prio=50-time;  . P+ y5 `9 t' `

      $ i0 X( U2 \* Z+ d  A8 Q
    • 0 i- T. G* N5 {' k/ [% F
      3 L$ F7 C( F: K* X- h( A/ r
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  2 ^: |% U  R5 r+ t. ]& o
      ' _. |/ _. N; {+ j5 g2 E! t( T
    • 4 T! f2 O! {$ l! s2 c6 ?
      4 O( `/ d: A; R- o6 O
           insert1(p);  ! S" y+ N+ E! P) H2 @: ~# ^0 ~

        k! e9 J* ]9 ?. o

    • 3 o) B7 \1 ]& S+ |) y& P( l
      + _2 u- l3 W  X- a4 |! Q  V
            else  8 |' B5 R9 ~5 y( p" }8 G
      $ ]# ^; p  `  z. q* ^
    • 0 M6 k( m$ [$ \

      ; V# l: H' u- d7 a! q      {  
      # Y! f5 B7 E8 |5 ?

      3 u5 \: }) q% O9 g2 {

    • . N( J/ T& T7 M
      & y4 g0 Z2 `! [, }3 S! i
           p->next=ready; /*创建就绪队列的第一个PCB*/  
      1 N8 P- r( w' a2 S; ~
      # s- T' q1 h. n3 b9 v& o

    • " `/ y5 U9 ~$ O. {; |4 q9 S

      2 O- E( G! a9 m+ b- `" e' e' T     ready=p;  
      * z1 f8 d( M/ r- {# f& @
      * c3 V) e. S( f, w4 X* W" F
    • $ r7 F1 t! ]4 R' W- f. C$ f$ f

      # T/ K3 [" I. {, O      }  
      ! H4 \6 N. s0 h, {4 s# E& f# |
      5 j. K; \$ {0 ^7 e  _4 }

    • 7 W) G; O& }8 @1 X
      , w1 ~1 k% o$ S
         }  ' }, e, m6 X& m) j: ~$ ?8 n, w! S
      ; f, O, Y- f! @2 P2 B# U; r
    • ' x& n8 T/ \! ^& c5 R
      * B' l+ B; U+ Y0 E8 M. u1 [
         printf("          优先数算法输出信息:\n");  ) h5 k3 _& I# O6 K
      . m0 N) F2 i* s9 `* N; H
    • 9 y" m2 {& @/ V2 t% D8 l& Z+ q4 ^

      0 d! B. [, t8 ]   printf("************************************************\n");  
      * Q# F# w" D$ D% o# y" X3 @
      . `2 d' ^* o6 v+ l0 X

    • 2 [# d" o% L6 X# ]* }; W, a
      + c* H' [/ q) h$ F- Q3 k5 N7 `
         prt(alg);  /*输出进程PCB信息*/  
      5 f2 E3 v- B8 K1 c8 G. H+ Z
      ' a+ |* j6 u9 e, |0 W( [
    • & ^2 t3 e+ Y4 Y! v
      7 ?- ?$ B  \9 A6 R
         run=ready; /*将就绪队列的第一个进程投入运行*/  
      4 M! F2 T9 ^: h  k8 ?

      4 i. p. V2 M) q+ ?. v. B& x

    • % y& r3 f9 e& s7 t
      6 d$ ~( r' f! t8 O) F; s
         ready=ready->next;  2 ?" x0 ^% `* K9 v& E; P* D
      9 I) ^( w( a9 }- v+ S" ^1 ^3 g3 v
    • " V  z+ V% j2 k" g& m1 g" |. j

      7 ?% S6 u" F9 v, X7 O" a8 k$ i& K   run->state='R';  
      ; x- k1 J0 V2 R% u6 x1 B1 b0 C
      9 ^! M8 U; \9 b9 o8 g

    •   F6 Y& K8 {6 ?4 U

      ( R  V9 Z: R1 I. X  x% n# n}  2 B, N7 L9 y8 J4 [  v! @- u! T% d
      " y. X5 D2 [: I8 X  Y' T* J5 g3 O
    • ) O% V. e+ m7 E/ F* v: \9 [: Q

      / q& H3 w( R* ^, [' ~% n! o( W/*优先数调度算法*/  9 Y8 ^! x; e3 E" O7 [" S' Z8 m+ k
      ) w, a' o) Z2 A: s
    • : Z9 N9 ~: w' {+ _: D9 F- @

      / G+ ~# P- m8 t! x+ Z' ~priority(char alg)  : w$ F5 c) S. U4 t+ V4 U  l

      6 K3 ^4 _0 Z" m2 O2 D1 s
    • ' E3 e7 O" N: N) d  ^: S
      ' V% O9 z2 d% D" u
      {  : A4 f- z+ p& ?% U

      6 V5 E9 W3 g- N  W

    • 8 h( y0 b. Y0 S5 ?% t) U. G. I' K
      ; f3 A5 Z8 k: V1 H
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  2 S7 s5 Z: |1 Y- U$ {- I. Z

      , u9 i; B) O  R0 l- ~

    • 7 n% H$ }& v& u5 c8 F  D; t( T

      * P+ K2 @0 m4 h8 a: f! L   {  . f$ o4 L9 h( c. F/ f" D

      ; v# w  X1 r' F$ y& K& a

    • 4 W/ |) N# Y# A9 C+ u2 g" D' n! l, b
      ; U0 w+ @2 B& }( R1 F( B  ^+ [
            run->cputime=run->cputime+1;  6 F% f& p% v" k: L- E9 i9 \1 _

      ) K# H3 ^0 L  w5 O  v& u5 {- V

    • ! d7 i* t, v* q/ I& ]% M& [8 y& }

      & F: d" t& X2 w) ]( `      run->needtime=run->needtime-1;  5 z& N0 h+ c; q. w* Q5 r
      * i9 n1 ?. N; Z  D
    • * r5 i5 F, _* h# Y! u4 ]. v
      3 m& y( x. R" l
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      " s6 A! s: u: k8 ~7 |" M* }- U

      1 f% b9 ]$ x9 b% V
    • - u& D* B. g4 W) N5 o

      - s' |1 V& R1 R4 N& ~8 K' {      PCB *p;
      - c+ _: V* j* `+ U, t

      9 C! t1 S" q1 a( Q! A: g6 Q+ V/ y
    • ! i8 ~) [; r! o3 o6 q5 V' a

      0 a+ G( N6 D) }      p=ready;
      ( S" f* C* p  t. C* l/ ~; B

      # h" d( f' e# y) M& k

    • 0 N. F3 F# w4 b! g* h' n0 O* c) ?

      6 h1 q  N/ G4 Z& L* S      while(p!=NULL)  - S$ O1 H, J1 C% O

      ! J' `! P0 J3 h/ S5 r. f
    • # D- g+ V6 c+ U  j- [# }0 g

        @! N9 H: F7 ]" U# R" O% ]      {  % `! `7 R) g* x; z! M' w; _
      , v+ t# v! l# d! U
    • 3 s6 L; B7 [( G$ h1 y
      , ^( _  i1 o: P" a* i! s, |
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      * ^/ }$ f1 c  V5 l+ I* u

      * w8 c. N( z3 w6 Z0 S+ O1 n' q3 e
    • : U9 l& _; C% h! p
      2 `5 ]: F  k2 X. x; N5 t) y
                p=p->next;  
      - g6 p0 n, K( B- G
      0 j; H5 h1 v% _4 U

    • ' s$ b. _" B& S- [2 N6 g3 ]
      & n1 J% w" \5 W6 M
            }  
      / `5 L0 i; j; U( W" X/ j+ q7 d

      8 o/ w% \# Z: M. S, {
    • . h3 s8 u0 G$ V4 _8 L/ \

      1 c  B" \: Z$ Z, e3 l7 W. D0 n$ J# Y      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  ( y. b: R- i; d/ ?8 d' e4 ^# e
      & _" k8 u: d# B: b% A
    • & s, u" }" Z$ @5 q( ~

      * D# H. y- L) b2 k; u! O5 k      {  " p9 y4 [6 e3 C0 l  l/ U

      - q& R8 Z# ~0 I5 z

    • , [/ D& T0 s% o! R# Q
      . A0 E' l' b  E
               run->next=finish;  2 |* A$ {8 B7 Q, [' x
      ; l% P" J" d. s- [/ T- g

    • - r( d" e% r6 @# K2 S" S5 N% W
      3 u- H: E; B( Z4 P
               finish=run;  % |7 F0 O! N0 ~: j: b

        {* c5 K( m: ]2 _% k4 g8 r2 u

    • 1 R9 S$ c  e9 |: u" b( j

      ) Q4 z9 L, a/ b. \, H5 R2 D         run->state='F';  /*置状态为完成态*/  : g- ]& E! o# y+ _7 b5 _2 A/ c
        Z+ V9 x! U, N" Q, n2 W
    • : G' [/ j  |7 W& q( `$ U- h2 Y  y' H

      3 n+ Q& K* [; _1 h, B: m         run=NULL;  /*运行队列头指针为空*/  
      & I( l* r9 i+ ]/ }9 k
      . [" P( }* \; D9 ?3 W+ T
    • . G, d1 g- ]! I  @$ H" p2 `

      * r; d! {' H; Z! b( P0 k         if(ready!=NULL) /*如就绪队列不空*/
      + e  u8 q$ @2 u$ v
        _( |8 {/ h: E
    • # B) R# h& x9 b- ?
      / l  g7 V) c  D$ ?3 }3 l$ U$ n+ D
               {  
      $ M- x3 U* ?5 p# W* E
      , b) h) j' `. i; F  N! g. p
    • 6 T6 l1 E7 ~1 Q* K& E: I7 N) G
      ( [& d+ _2 J$ b  |
                  firstin(); /*将就绪对列的第一个进程投入运行*/  & w0 {; o  _, w6 A
      + z) u4 ?) u0 ~4 u/ I

    • " V1 f% O2 p% @$ w8 J! e; Z

      5 K/ Y6 L% Q2 R$ v5 J  R, M4 j7 L         }
      9 S6 J- h, f0 ?6 K4 u2 d) h

      1 l7 S: g. g6 C: M
    • 1 d0 M& B) O( h: x" V/ W: B3 o

      * H. ^4 {+ R: n- {* a) E      }  
      ) j2 p4 F% l4 I; |6 w

        ~4 t. s8 ~. w/ m  V& S9 H

    • # l3 _9 e2 O) @6 J
      5 w: U5 o6 C, Z# T
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  6 F: G2 x' V. s5 a  W
      8 A0 Y% `" c4 o' l9 ^
    • $ i  D2 j- w% i3 a' y1 s2 A' R

      : X+ j- J; Y( N& t7 f# y     if((ready!=NULL)&&(run->prio<ready->prio))  " W, n! W! [  e
      , ~7 ?9 D. V0 o

    • 9 ?' G: x& P9 y6 `
      5 s) O: n: c4 {' s; @! S/ f' }
           {  
      ! ]* A8 ]% R! k% c" p

      ; B  b2 W( O, X, J2 J5 K7 K
    • " {; F+ G+ V: O, v4 v6 z
      ' h3 z) g9 x. {
              run->state='W';  
      9 u( w9 y9 v, D$ l9 B8 s
      % v0 q& O! `0 Q7 u1 p

    • # W/ ^. X2 l# d6 D: l) {

      + {  v1 J! d3 s' ]7 C        insert1(run);  
      7 w) x2 E* M# E

      % G, d  s7 j# ~% D! ^/ g: I2 s

    • - ^0 h3 R1 p5 @1 g6 f4 u
      $ m# z$ |$ e' X" i4 l7 j; g
              firstin(); /*将就绪队列的第一个进程投入运行*/  ! E/ Y9 K2 d- ~: @
      ) z6 \3 v8 L# }7 s  F

    • . h$ y( ?, [0 s3 k/ f( z

      - ]$ H' {  L3 ~3 D# X# J4 ]. P, E     }  
      - ?. G5 Z0 u" t0 r* c( x

      3 o, B6 v3 d4 c4 G* I
    • ( i8 M* Y' j/ J, K* h  j

      8 p& x% S* X9 Z# H! J" P% f9 k+ E( w      prt(alg); /*输出进程PCB信息*/  ) }, b  m7 J3 z" i9 w1 M2 |0 r
      0 [# G# H9 H; O
    •   }  C, Z. S: A2 Z8 q4 i

      1 j* Z  `. R. N, O9 k   }  
      6 C( N% X& s3 Z* W

        F5 d2 I. @8 h0 |+ Y; Y8 c
    • : Y& r( K, `9 Q
      # Y# U7 P; m7 A4 L" Z
      }  : x5 }" b( v4 U1 }

      " t/ m% M/ V  E
    • - P% q* A. w/ H: @

      2 D7 d1 k/ [4 z' A- d/*主函数*/  
      / U: Z8 J7 ]% w1 X6 ^+ G/ O+ ]! U
      1 I- l+ e, J% D

    • 4 n+ P( Y: N# Q1 N3 ]- n
      , c4 b9 R4 H0 s8 L8 G8 s
      main()  
      & T+ v2 p  j! G; b
      " ~. L/ Q, m0 s
    • 4 e) @% K* ], E6 @7 u$ p
      9 C( _6 U8 N$ j" {8 O( T
      {  
      ! G* @& A6 w! I4 o  t* x3 O, @
      * v, E& i: a4 m( G: V/ f$ J

    • , J6 C% R3 D1 P

      0 R' g6 i4 N! ?6 \8 j3 Y2 |- p8 r   char algo;  /*算法标记*/  
      " i, ]  [( p9 f$ d0 k0 i$ o% X
      ( K+ ^% b# v* s  [! B# ?1 h

    • 8 c% z' Q7 M' x, a8 B4 n5 p

      0 z1 ~. y; V- i8 A7 v/ J# [   printf("输入P确定算法:优先数算法\n");  
      ( b0 C/ D+ ^" P6 d$ Q( _; F4 A; Q3 T
      ! g7 a. o- E- L, d

    • $ v9 [# a1 p/ p4 @: c. y& m  a4 E

      ; t/ X0 ~" Y0 T* K   scanf("%c",&algo); /*输入字符确定算法*/  4 ~5 r5 Q% `  [" X# z4 y
      8 f2 H) g+ E) v0 _7 E3 K
    • ; ^" }+ n# J4 X8 M8 C  d  o

      1 _% s  n+ P( u7 ]: j  n9 @' x' h4 |   printf("输入进程数:\n");  * e$ ?% f, g, ]9 q& S

      + H$ y! i( ~+ _% q! b9 u/ L
    • 1 h5 z1 y4 J) V2 S% a* D

      - g9 l0 _& {, R" L/ i% u- f; m   scanf("%d",&N); /*输入进程数*/  5 D. z/ I  G9 `) p- q" b

      ) D7 v7 \% W- }: n
    • . V) Q1 R6 v7 u& ~9 n" A* i8 V" a. k

      0 Y1 T/ U5 E' w   if(algo=='P'||algo=='p')  " X) ^" `' G/ G; n* L

      . r' @. z! c3 J
    • 5 O0 T, l! [* W8 o$ @! f
      , ^! L/ O- v- D# F  _$ F( k8 o
         {  
      9 j  Q  J% X7 u) L8 P( q/ ^) |
      2 j# F* T- [5 {- j' V1 H9 a
    • ( W" Y; H5 J7 L. P& a
      " C" N) e8 n1 g) `3 _! N; R( J; B1 B
            create(algo); /*优先数法*/  
      ' i4 m; v4 y' r) o
      ! W3 I5 R' C$ s7 o3 Q1 h

    • + d" H" _, J3 f, S& l, k6 h

      1 R; U6 G$ E: H# e- T9 {- \) g      priority(algo);  
      ! N: s! ~) m2 |
      " o, E; Y  k3 x
    • 4 }. K, }) S5 @, p7 C/ a7 A
      ) s+ P, O  j) S& D9 m  f+ u
         } 6 A- V: U$ _1 l4 o

      0 p# R% z% |" h, q- u5 d% u/ ~) j1 V
    • " d  `" j# h$ C# ?, A& [
      $ V! X0 ?0 ~. }' f
      }7 E* |) |* G/ a7 W9 `" G' z
      0 ?2 ~  z7 L* d4 W& g$ _
      ! M% n! J" O5 Y0 T. A

    ; q9 {( y1 `! J4 n3 N* b
    输出结果:/ c  G. T1 [/ n- v4 F, _


    2 P* ]# h  K" R  m8 w4 R  s原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    % r$ D$ e8 ?$ x8 B( n+ x  K

    1 l+ F7 l0 D8 K# o+ G
    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 05:56 , Processed in 0.479176 second(s), 51 queries .

    回顶部