QQ登录

只需要一步,快速开始

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

    * N) M' A2 m8 f; H' _% `优先级调度算法) n% F; B6 e8 h) _! h3 z$ G% A2 ^

    算法介绍
    + O; [+ [4 U- i% i8 V) f优先调度算法的类型(用于作业调度)
    0 B! }" E. M% P- F- y1)非抢占式优先权调度算法
    - a! ^) M5 ^+ k8 g系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 0 n- j3 \/ @6 {2 d3 x
    2)抢占式优先权调度算法 ; k5 e1 f' b+ ~; Q; |5 K
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    ) V3 G7 C& c. O/ C8 o1)静态优先权
    / X9 d8 m% _# C. a" J静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    # X6 E! E4 d  J0 e- S  J: S

    2)动态优先权
    2 u; J) N9 G! Z

    算法实现

    抢占式动态优先权:

    0 U8 I3 g: T9 J8 ?/ ~
    PS:本人认为非抢占式静态优先权没有实际价值。


    • + M/ V& i, v$ k! ]1 F+ p$ x
      6 X/ E3 A" Y! G1 z% u. o
      #include <stdio.h> " T3 R8 c* h/ w* }, z! ]6 Z
      0 M' m, x: J6 e6 B2 v0 p4 T) d. h3 L
    • / e( K( x& f' D! O
      4 X5 r" C9 A' O; q$ `0 b, O
      #include <stdlib.h>  
      # x7 D+ N4 }  b0 C: D
      * |( T5 |4 E. K/ u+ t$ v
    • 3 |* J8 j( k. y+ f6 {6 H
      ; s$ f+ d( D2 L$ n0 O6 a- u0 j/ o
      #include <string.h>  # r+ K$ `0 k) Z

      , U- g! g( g* a$ ]5 R

    •   i9 l- s0 k$ x  ~; W

      7 I/ B# w* N! p  C! a8 ~0 ltypedef struct node  5 [# p% {- o) _$ \+ ?
      ; T7 y% @3 U; c0 R: `

    • / Y6 e" h0 p. Q" a5 v$ e
      ' N3 Q; `8 Z" @6 e2 x+ s
      {  9 \& E/ [' _) ?8 C3 p

      9 }( [: k4 d8 K+ w, Y2 n# ^$ L  B
    • - e- r4 G0 s- L7 S5 r
      $ F9 X9 ^8 X! k9 Y$ @' E9 N
         char name[10];  /*进程标识符*/  * Z: \8 e* ~8 H6 C( `* _# C- q% d

      " d, e' ~7 J5 j2 X# G. o* h4 d

    • 3 N3 @! v0 ?9 o( O( L
      * W0 h+ v- M2 m2 B$ U
         int prio;   /*进程优先数*/  * T1 G6 ?1 r! o# Q( ?
      * w# l2 A. T6 h0 Y5 U7 r! I) O9 o7 m( j

    • " V/ `9 r$ Z4 l& P

      . o3 A5 w* E5 C: N- y$ i   int round;  /*进程时间轮转时间片*/  ; H. E, \. H  m
      0 ]  K" E8 ~5 |0 Q- v& ]
    • * w  j% S( s6 G' W1 Z2 @) g
      # C2 k. Z  {% D2 G* O" ]
         int cputime; /*进程占用CPU时间*/  * g" V  q$ `' J) B: P9 ^

      5 G; o+ W  |% A/ E9 z

    • & @  i5 C, X; `$ B* L4 J- C

      2 p" `$ E' U5 ^7 u$ f0 v" n   int needtime; /*进程到完成还要的时间*/  2 x* V: O3 ]% r1 K
      2 y& V' L5 A* D5 \4 @. F' ]
    • 2 C# F% `8 A) T# j  B
      % O( _/ x4 g4 {$ P8 b8 _! e! s( F
         int count;  /*计数器*/  
      8 w, T& n7 ]7 S, s7 V) G9 Q, k
      - E4 @( E; L& C3 v" Q( t  s  j
    • 1 l/ p) r) i! _0 d; t
      ! s. H6 Y( _7 y
         char state; /*进程的状态*/  . D8 z% I6 X7 A9 Z" k

        r# p/ l1 b# K& b" R
    • / ~8 x( N1 M- Y5 }
      / m9 N' k0 U$ }/ ]; ~
         struct node *next; /*链指针*/  % E! f7 Z  p: Q
      0 R, r0 O) u% H6 `' e2 o4 L

    • ( \6 c$ D7 ~! Z* V# Z# c7 i) g
      , ]9 R+ ?6 r) B4 ]* v
      }PCB;  - V/ v, H1 S6 Q+ Q0 d

      , @7 `( ?/ A6 ^# z; b& h7 n: F# [
    • 0 y1 {/ ^. Q! ^. b# x6 h

      ; G5 N" t/ P  K4 v! V' z2 J6 RPCB *finish,*ready,*tail,*run; /*队列指针*/  $ y/ m1 g- l% m# z# g2 n: L
      3 F. S& C+ \4 I6 s' }6 I/ z

    • ) r8 P$ l; r: [' n, J& M: v

      ; s  f5 w* j7 V' ^" [5 ^  r- uint N; /*进程数*/  
      7 m6 H& s0 C; A: x7 \. c
      8 L, d7 A4 F3 a# _9 A0 g
    • 2 m8 [7 [) p; W; V2 y, L

        A/ S6 J' M* P$ f$ u" v6 n/*将就绪队列中的第一个进程投入运行*/  ! C: ~$ p& J* K# i/ z* u0 a

      : Z) P) K9 b7 U9 n- s. x: h+ u5 m
    • 7 ^, H, _& H2 {8 |- g  Y: K2 v
        m- L' n' s; _' X% j" K
      firstin()  " ]( j0 g: A( H! h: r' @( j

      " Y) c7 Z4 W& B# [" K

    • : w: s* {- B6 W6 E/ L  {1 F
      & e/ e1 {! a# j9 }. q
      {  
      9 Q' O( N: M# g. f6 d' Z9 m1 I  k
      9 J' w' c5 y$ q$ x/ f! G

    • / O. i9 Y  j! _1 j8 j& i: T
      2 C2 A% |4 n1 r2 H% T
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      * [( E* G3 t/ W. U5 e+ r- W$ I$ |; b
      9 t1 W- w5 N, }  w5 u& ?( T

    • 4 K: A( R( h0 k  F% Q

      2 [7 w2 t' u- S. ~  b+ a. t; D/ E   run->state='R';   /*进程状态变为运行态*/  ! U$ N: b; ^' i! H0 Y$ W& A# p: s
      / Z) {* K: l  ~: [" O9 u8 l: w8 w2 b
    • # F" m) E4 n4 r1 d7 o; [

      1 C; Y( J4 ~& r" m( p/ r4 v5 n5 |7 |   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      4 w6 Z( L- v- l7 p
      & Z8 N+ I/ X0 S/ b5 M0 F
    • , E: C& x" c0 {# k
      + g  f& d: s( A5 j; k" V; u
      }  
      ) E9 _4 I9 L+ l/ N$ R$ z* U  z
      : x9 M8 {0 A" t* t
    • 3 `( J5 W" P( o) y6 l3 [

      . l$ E1 R. z+ ]5 Z/*标题输出函数*/  1 j+ M/ _: [) I8 s- e

      5 X0 l; }2 x0 Y: l# ~# J

    • : ~! \7 e, ^0 g; q; ~5 l

      : c' L' r5 {. j1 K6 ~9 avoid prt1(char a)  . R8 R$ a6 {' D+ ^" _) G4 X  _7 Q
      ( A/ o! c0 z* U* a! v
    • . y1 Z: {) \3 X( W
      ' o4 R' a! \8 w, C$ {* ?
      {  
      7 \) y8 O! T/ ~9 [5 X. j( q2 l& [

      ' e9 k4 b" n& @3 p6 E! i- S

    • ) d( n$ l6 Q9 ^2 L

      ) ], I; R3 e4 x& d" q' l   if(toupper(a)=='P') /*优先数法*/  ; M) Y3 Z" R! F5 u

      3 N- h  W4 Y% o; M/ M

    • : F) V  [# r# t# p2 J
      / d$ @9 I7 q& M% p7 S
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  # s1 U+ s. i. m' o

      . Z) E7 g$ {0 V7 L' V  p- k

    • 1 H$ M2 m7 c. y6 \) ~0 @1 P
      5 E" S! f1 l9 ~3 z5 ^
         else  % m2 O. L& c6 d5 o3 A) X: F

      ; F" [/ r9 n6 N
    • 9 f. E7 j* @; `$ L" U6 [8 Y4 U: a( b8 A  U
      2 b: t! u: v: k
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");    u8 Y/ w& C' o% ?% a
      ; l+ E$ q4 p( ?, S& d

    •   u6 c! a% ]/ n* w$ c; x7 O

      6 p8 i: t5 W& G9 G}  9 X& W2 B0 y: z" i; l9 n
      * G% k1 k1 c6 P% g

    •   W! M; s2 t2 B& P9 {

      7 v: f" U- L! {& m: _/*进程PCB输出*/  
      + M7 j! z6 n% T3 z. G0 Q+ \- \
      % n5 i7 g, n9 E1 K  U

    • ' B4 t. y* t4 L/ o5 W% w. a
      * e' Z$ l; r" Y% X/ l
      void prt2(char a,PCB *q)  
      * }: q, P! U- m; m1 T7 H. O4 B

      . c/ g7 [' x6 `6 X/ h+ Q7 t
    • + t2 @7 u/ t7 q0 y
      $ B" ]2 _( a/ u% G8 b! m* y
      {  . z! D3 @/ Y5 ^2 s# e
      4 e: v8 l- t; [$ j- v

    • + v5 q7 ^( O' _
      6 z* p! W! T( j1 a  S+ ]
         if(toupper(a)=='P')  /*优先数法的输出*/  
      * l& F, ~6 H. ?3 Z1 X
      # t# j# \, W8 ~: ~

    • / _, h$ ]! ~0 ?6 I0 [1 Y

      , j1 I& Y5 l; s2 k7 R/ M7 u2 N4 P      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  - T$ B" }2 k$ ?+ m: [* _  Q
      " q7 k6 P' f% W- m2 S' j% f

    • : p+ q  f! R6 [# {! f6 H

      4 I' ^; u4 y. T( B% s! c       q->cputime,q->needtime,q->prio,q->state);  
      4 Y: V. v4 s/ h. R  f# |

      1 }$ q5 ~5 ?* J0 v
    • 9 `' U. a; N' ~; l) y; S+ L7 Q* E

      # a& s! W( H! c3 q* E   else/*轮转法的输出*/  
      . p) ~! ?: w7 b* O- G; {4 k

      7 g$ P3 q) g# ~8 `

    • 7 X7 v  f3 j5 C- x) E( E! C1 g

      ! S9 u  k; |8 K/ ~5 z" }4 f      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  4 k/ q* A8 [8 r4 t( y. Z. @1 E; Q

      8 l- [" r2 v# N/ |- f! x
    • # L% Z' m* ?' f* w1 y. C( Q$ ?0 H. _

        r. y4 {1 d. y) r: N6 k       q->cputime,q->needtime,q->count,q->round,q->state);  4 u* j' o% s- ~1 P
      ) j3 o7 T! D$ @2 @0 W$ Y
    • 2 A3 F7 l4 B8 B, p9 @
      * u2 H) @8 O- s
      }  ! z$ X* Y8 S1 ^( N4 E

      + L5 I4 w7 P- [/ y/ ^9 p

    • 9 Z# l# Y2 Z* ?' k# a! z

      , U- ?! L  b# u' b1 r" Y9 _/*输出函数*/  , j$ Z+ a8 {$ B2 h
      3 F, q: b/ k9 N1 I" R- S
    • # w. |$ _" s  _" }9 @
      $ P) f4 D- Y) Q! d( g# T
      void prt(char algo)  % R' l( q6 B' T5 T5 k. O* a  k
      / C7 d/ F. s+ ]7 ~* V; ]

    • 2 `$ j7 w6 ?5 X- ?
      " j* @7 C4 T! R
      {  
      " t5 M( Q* M4 k7 l9 k3 [3 L

      & P8 z+ s2 @1 X) D% A; _' \' ]
    • ) G: |) s8 K! M& h8 m  F* b8 t
      : }/ Y9 g) k& S" P+ w
         PCB *p;  0 A/ r# _8 e( M! B/ S' w

      ' m& a6 @1 b+ S! T8 t0 x& _
    • * {* j4 B1 h# r4 a$ `. L" R3 q
      ( K  f) H8 _8 e
         prt1(algo);  /*输出标题*/  
      2 Z3 _( P+ Y4 |5 s. g4 o6 L
      6 X2 L6 I3 {) O; \( x' }

    • 3 }3 U) t/ A$ w5 n8 J( u

      3 M: i4 ^" j4 s0 {6 S   if(run!=NULL) /*如果运行指针不空*/  ) C$ m; _6 g1 b( @" H
      * ~0 P7 z* G1 Y

    • & ~( o! `7 l. i8 {

      + c* H5 z% e0 ?5 v& [8 x      prt2(algo,run); /*输出当前正在运行的PCB*/  0 \7 q" D' l7 l0 A3 b
      4 U( ]3 h% l5 x. d( G5 r8 F4 D, U/ D

    • ; {' m  a2 ?; [. [2 G1 `
      3 R" k9 V! L- O( Z. h6 V; p0 _+ ~* W0 p
         p=ready;  /*输出就绪队列PCB*/  
      # f: t8 O. w* T$ @' L# r

      9 w8 O' H2 S5 t" A8 P3 V7 D: n6 F' ?

    • * ^% d" X, g2 x5 x. v6 q$ ?

      + M# m% F' T9 A3 T! ~   while(p!=NULL)  1 R4 x. |; E1 U5 h
      5 a$ S7 ?* G; R0 D1 I3 `  I8 J

    • 0 b+ G* q! d: O* T4 e% P4 k
      , D# n4 {7 \2 y+ n# E# c: P! O
         {  
      2 m! m1 V. h# R: |( ^9 |; k: a

      ! m* H9 t& X% w7 k

    • 1 T& g; c. y. f% H- l& x$ O3 G

      ) C) T& `8 T& r( w) x; M      prt2(algo,p);  
      2 S  I: U; j, F2 b* z6 W2 K$ C
      5 C  D' w4 M" }' ]

    • " [* i, o" K6 ^5 j7 L1 p
        Y8 Y, ^- N$ z8 T8 s5 d4 `) v( `
            p=p->next;  
      " r$ o7 T* w( g' M8 L4 X
      ; s% M& K3 F# [
    • : j3 S) @6 s. w* o# k! }
      % C9 h$ U% K0 W5 |! J
         }  
      $ V/ u, M7 z. o3 ?; E

      3 Y3 r: [$ O/ I+ z2 y

    • 5 {8 j: J" W/ {" [( T) G: }' w
      7 P# K" C. A8 z  j0 B
         p=finish;  /*输出完成队列的PCB*/  ) F# u6 ^! d8 [; O
      + H( z0 k0 m( O9 Y( T% c: F+ Z3 F

    • / `6 W( v: L8 J* D

      . R$ X# u$ ?$ w3 Y( S   while(p!=NULL)  8 ?- u. c$ M# y$ T: u

      / o9 r" b- h2 L5 j7 J( G7 l3 X
    • * c+ }# e8 H8 M
        f2 t1 R, h% P4 H$ A4 Z8 |
         {  
      " R+ a8 T0 v$ Q+ t! S6 b: P
      ( [1 _( H3 @) `+ C! a# G, O3 ]

    • 6 N% l; ^3 H! r. G) C9 E- Z& F$ r' ~
      ! b" |$ e/ q" ^/ z
            prt2(algo,p);  
      8 q; k9 Y+ \& t7 m) v( A0 r0 f
      5 F& g8 _) w7 c* F
    • 6 W$ B6 H  k$ p9 }- M0 B
      2 E. W1 `+ U4 p) c: ^# j8 u
            p=p->next;  
      ( f: \; K, _0 U) l
      / Y* C8 r; \1 M, C4 \9 B# E

    •   d: \# o+ M, g" m

      & e& _. d$ G6 v6 P   }  
      5 b3 s. S0 ~1 F, n1 u; L
      ' `$ V. k5 F/ k; j; G' l* l. b) R5 M6 P
    • 4 D3 f8 n! A& B9 `% e# _
      6 D) i+ Y3 W8 ^! C+ U
         getchar();  /*压任意键继续*/  4 K' N1 S$ _3 W- X% C! L8 m9 B1 M
      ) |5 z( u! e) E8 C/ D- T
    • & l: F& T1 n) V9 T% s" }
      ; {  b- \, l8 g' j# J
      }  * Y$ C, H6 F% E4 D( \
      " h  x$ ]5 L. o

    • ; k$ m2 U' p3 e& a

        ~! m* o' V! i( T! S/*优先数的插入算法*/  
      # t3 J/ T( s  t/ I5 C1 v
      . ^3 m* G& B; a  B; p
    • : p3 _7 f" b5 ]' U6 C; ]' O
      7 O2 p& v. s4 l/ G& `2 v
      insert1(PCB *q)  5 S% r9 l0 p) a

      9 Q4 u0 J9 {" J5 h& H' [% q
    • " y. }" S. e% l0 k9 c( D
      * K1 @0 J% {: R( _. ~3 ]
      {  
      " `: R2 U# A9 T2 g" u

      $ e2 k6 f) T* M
    • ( \/ L+ e9 _9 e  Q, h, |
      3 \) Y( B- h1 c  N: h2 ~2 ^
         PCB *p1,*s,*r;  + k' r" `+ n, T

      / `1 s+ U1 Z9 M+ _
    • 6 X) R: e8 f  D; R1 x8 h

      . \- z1 o1 d* d4 @1 s1 ^   int b;  1 t  R. a! y2 C4 U! @, h

      : ]2 S+ v+ q# ?& W6 Z6 Z+ Y2 n! X
    • , J. e. M# t. S. {2 ~
      2 [( C% I, N: `
         s=q;  /*待插入的PCB指针*/  
      8 E0 S, r1 W& I, c% D  S0 E
      2 `2 f5 D9 @# d& L6 C1 r

    • . e4 G3 r$ b  B

      3 v9 ]" q2 P" \/ F+ T8 N6 G0 ?   p1=ready; /*就绪队列头指针*/  + ?; r  j2 y! U
      ! j1 f# }3 `/ r; W% U

    • ) c& v) A* _( ^, o9 s
      9 l6 f7 w* d. }; C# B( ~* H7 ?
         r=p1; /*r做p1的前驱指针*/  ' n8 q% [# `0 N) n4 W2 Q* _1 W

      : m# l- h% }6 d# m) F

    • , U1 Y, j# n7 z
      + v8 O1 x: `6 w6 j8 d; x& ?
         b=1;  
      9 [. I, _8 K4 n+ A) Z! n
      " A! L- c' B/ m# U3 @- {' p

    • 3 K/ K' S4 X! p, [: X3 J

      " J, j# @5 J- ~& f9 N' p   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  / N, v. e: J' p4 B4 W( e
      ( Y2 `" d  q# n/ P; b9 b
    • 7 r) I- ^2 s. O
      1 N# j, N0 |% y* B& r
            if(p1->prio>=s->prio)  : C- o2 O1 L4 v. @

      . ^4 k" u" y( a" l
    • ; ~# D0 p9 w/ e: A, D+ `

      # O: E- }- l! e% v# A& l      {  
      3 I8 ]# ]+ t( Q2 d3 e

      # U/ J5 }. Z% P3 f! _: m& N2 [6 T( W

    • 8 u/ d1 Z6 S: X4 u( S- `$ v5 e
      & @6 l$ x9 u3 h$ J5 I
           r=p1;  1 d$ H! n/ ~7 H& g6 W& X

      , h, C: \  R# k. E$ E1 K, k

    • 0 T! B% q1 d+ q- Z* R3 K
      6 E. Y+ Z4 s! l! e- j0 [
           p1=p1->next;  
      1 c$ b. q" @# |/ U% y
      " r& r0 s3 y9 l7 F: h' ?) `

    • ! j# N9 W1 E# S* X
      4 N) C7 R# `2 ?* p7 k( n! t  d
            }  
      1 `3 f) E* w6 ]" m( O  ~3 ]
      " y: v* E2 Q8 |# c/ ^$ w

    • ; D) x7 M' f4 U2 Q1 U2 X

      # r) ^- f& L9 T( T      else  
      ( k7 C5 ^. J& w5 u; p5 w

      : @7 g& O& v0 \( a& r4 y' l

    • ! o) T, r5 m+ O+ D! ]: v+ p* z
      : G% f# W% R1 A+ x) S
           b=0;  
      6 M0 j; ^+ w- x' D2 i  Z
      7 n% E  z5 ?& e4 f' f
    • : [$ M3 t% S: @( M; x6 i6 N

      3 L- j+ a, u% U- R   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      0 a6 H% b1 B+ y' Y, s# c) Y) z: Q

      5 i: d* Y0 W1 P3 R

    • ( q+ j5 u! K+ G5 F& {

      0 n+ C$ s: F0 |# G   {  
      ! P4 o! G% u8 f! `

      1 `. b1 A+ h- f; y6 R- I- b

    • 2 X% z3 l. ?  b+ k. Q7 v) J
      2 S5 D; o( q; A9 c; z2 u) B/ }' I$ c% J
            r->next=s;  
      1 @% y8 s6 a! R. V- h, u' c
      / j. U+ M9 T- Z  n$ x" {" v& v3 ^# M' i

    • 3 c2 Q, O2 {/ a

      0 K1 x; h" K0 ^0 V4 S      s->next=p1;  # q8 f) ^) E) {3 ]- X

      2 }$ D- K  N- c4 U& u
    • 8 o( T# Z! i/ O# Y; _

      : e5 @  V( [7 t: b  ~+ x6 n: v   }  : s* V6 O  ^4 t

      & ~) h  r5 n- w* b( M  A) q3 S0 X, I
    • 8 t$ M1 M0 |% g% B# a+ b1 `5 ~5 `
      ! V$ n1 Y& W/ P# z* ~5 K
         else  % E8 P* g# @* U1 h9 O

      ) U2 R! Z' S* v  o/ t2 l; ]

    • 8 o* l8 A: E5 d! m) q& r. U

      + Z7 j* R) ]; `8 f& m' [   {  
      $ Q: f8 J# f7 p  S

      0 f( ~* Y+ n: I) E; A
    • ) |2 B. m  A' u5 W9 f" e% _, e/ a

      . i0 R4 L3 [" ]& o      s->next=p1;  /*否则插入在就绪队列的头*/  ) `8 {% S, J$ l* G& b9 T$ A
      $ a, Q  [  Y: E: k  |2 ]

    • , o: ?3 P3 I4 T* _

      : K! O  f' K" P2 V" W) I      ready=s;  " E3 m* c3 @* r

      1 j9 r3 z; U2 L3 h5 o+ _

    • 2 U. v* Q1 E5 H" Q  C5 s1 I& ?) [

      ; J# f/ K/ _0 ]6 z% }# v   }  
      7 P- o$ s' Q+ \. S& @% y' }- t
      " w) l( m8 m4 `. i* T
    • ; N- |9 u: |! Y
      " p" u/ i! J) V! u+ E
      }  
      ) O5 k$ h) R' @; ]" m7 E7 }3 W
      # X7 L( N9 i! C" w/ K) U& Y

    • 3 C3 i5 {& ~5 ^8 {; j- r3 W6 t

      ' X5 @6 W% \1 J* C- v) t4 {) s0 \/*优先数创建初始PCB信息*/  % f5 p" w+ H( }& ]- K
      , T" M8 T+ q* C2 V" r

    • & C8 T5 C, H4 x

      7 a! \5 n9 i/ V: cvoid create(char alg)  1 v7 V- [4 @  U; ^% A

        I" M+ S" e& v

    • 3 k1 r$ l# m* f" @

      3 D. c$ ?. T; }6 N* J2 `{  
      : T5 u. Q# @9 F8 p+ I

      % \% ?) b: K( P, R& ?, i# g
    • & x" j# _. ?- @- Z& @

      + i1 j! X# `! @& |1 l  ?   PCB *p;  ; O7 w& c8 C+ Q5 A4 Q/ ?

      4 R; p) a: G" u; m& S, m1 ?/ |

    • 9 C- n$ t! }2 t7 o, B2 e1 O" }% a" S
      : n' _4 M6 r, R+ F
         int i,time;  
      % s$ e' Y# q3 J* z) e( x+ |
      3 j& ~# C0 n2 G% ^( n( {7 w
    • 1 A( m8 j3 F+ S2 R/ h2 g

      - W3 n# D: w9 Z# S   char na[10];  6 J8 e& u/ w  j, m2 `$ `; b: b
      3 i& ]" l+ r2 H
    • ! M7 h. W# V4 ?5 M2 F

      5 A, O$ V2 t# R   ready=NULL; /*就绪队列头指针*/  
      0 d+ D: u. l# U: Z" Z
      / N; W! i4 p. c6 I* Y6 {( e9 M
    • 0 z0 S$ W" t0 _: z) y( a
      6 K& W4 ^, U) S, q6 U) F
         finish=NULL;  /*完成队列头指针*/  
        j6 _+ Z1 Q3 }! b+ @+ q# a
      4 D" \# L0 S4 z

    • ( f% f1 `7 Y! k0 H% d- P+ D

      ! ~2 U' |8 Y4 @# q   run=NULL; /*运行队列指针*/  
      2 {) ~( b, ?, O2 s
      7 J( q; F  u6 q! ^
    • 8 o) \0 l7 k. Y- p8 Z6 Y4 a) j

        o: D0 O6 Y  ^9 }  G   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      * G' b, j* o6 E3 w+ f4 L9 z4 |2 @6 m

      ! l& L9 U$ T3 N, ~4 _- t
    • , e9 c" }# e! N0 j

      8 y' V8 m( \6 u: i$ k, x6 l   for(i=1;i<=N;i++)  ( N$ s& T- f, p& K& O
      ! K! L+ E+ T& _' d  _- A
    • ( k( M; b- {1 q0 b
      0 _) }7 U( n. H
         {  ) z- c8 y. S+ Y! t
      ' z; ]6 ?: b* O/ ~6 P2 ]
    • ! d# n8 Q) S, [

      # ]/ _) S4 I4 S! z      p=(PCB *)malloc(sizeof(PCB));  
      . ~) x3 \+ z6 c' P0 `5 R+ J
      + V& ^$ x# c" Y# d

    • 1 |7 B7 H- z* @. a' O. m; Y

      8 b, q7 K. ^( c8 w6 l3 N      scanf("%s",na);  # ?, O6 c5 V' v( t' L: v' T$ b

      - _7 H$ p/ g- Z, \) M+ D

    • + [2 m! ~. t' B9 j

      # O# L8 P- I, L/ f( z. u3 X' u      scanf("%d",&time);  
      % Z- s$ w! ?$ x

      + j  m# T% t" }/ ]6 e; k

    • 4 g5 x* B) ~" Q) L  L
      ) ?2 o" ?" m9 [
            strcpy(p->name,na);  2 X! M9 y4 n  B( B! [" p

      / d4 @. [+ N/ F
    • ' V0 |4 h# r8 n

      4 B; I, |4 C2 |5 {; ~      p->cputime=0;  
      $ g1 a" P3 H" m) n0 _

      $ `8 `2 {  s* l7 }$ d$ [4 K0 o7 X
    • ) z, I4 K& s. J7 |

      5 H) P4 N% t" G7 C1 v, H+ @+ |' b* ]      p->needtime=time;  
      * J+ e$ ^3 e% t. t# Z: s% w7 b' h  r
      * b( M- y0 H/ U" ]# ~/ e
    • & s- z7 h+ @/ n/ q, o+ @
      , l" p/ J2 J; f) q6 c6 `/ {/ A
            p->state='w';  7 O% w' b# c  s( G6 R

      9 }" k6 _, P3 y$ h. P5 ]8 c
    • - W0 B+ X4 o2 Y! s3 |2 g5 Z
      8 M/ n- O1 {' @
            p->prio=50-time;  ! @- t* a- W5 x! `
      & o9 d- F3 W3 P2 J

    • + x2 S& N- v3 V& \3 _
      ; T( c6 z' N: O6 b% `: G# l
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  - g6 G9 i1 k/ @# F* q" u
      9 k3 G' O* a" l" _% s. X! I" u

    • - j% ?6 \/ ]! x$ }

      ' ]0 e/ E* h$ v  V) {3 x2 d     insert1(p);  ! n) Z6 k! e, w. q2 S, c
      & q% M& N( d7 v/ J
    • 4 i" a5 ?8 {6 F2 H  l. E& g+ X

      , e9 f' L1 E" {# M( ?      else  3 L; `' P0 w( \/ P
      5 o1 k/ c  k3 _1 ^

    • : \7 Z8 m. l6 R7 K( b3 j

      3 _* O' P  ]% Q3 u/ V# H7 z      {  
      : k! o. H1 h: c& q

        s3 a9 v6 y! d' Q
    • . T4 ?9 D8 k: V1 K- E* t3 Y
      6 y2 `2 h. s. o- `9 W2 [3 y
           p->next=ready; /*创建就绪队列的第一个PCB*/  : S$ |8 ^' k: Y

      " `+ n9 _9 o8 Q/ y+ c

    •   U$ ^) m1 w. i5 N1 g) Z0 F" P

      , v* e0 V" ^. ]* M( y     ready=p;  
      ) }: _! I0 ]8 @$ T5 t4 E/ i3 y

      " }( e2 H$ M- Z: G' @" G
    • - L% ?/ E! T7 `+ U) r9 }
      : A1 f' J& n% ?% p
            }  7 g2 y, f1 H! M' P" B/ R
      7 ^' `( r! G, i' V5 z! x9 G

    • ; U2 q; h) C# |
        g- d# L8 k4 J* \% u
         }  
      & p3 n! e  H6 U5 ]  w6 ^
      + h: }" B! j& q# n3 S

    • 7 _3 b- m* J  y, x
      $ x+ u7 B% Q$ _2 m1 @' t0 l6 S
         printf("          优先数算法输出信息:\n");  : e4 G. @) c7 M5 x8 j- C5 I
      6 i3 D% k7 `" V6 B
    • . o' M% j3 m4 s6 @8 s/ a7 F) D

      - q# f" f  B! I/ L/ D   printf("************************************************\n");  * t/ s! z/ i) t, n  V5 B

      3 Z2 Y2 G! h$ `& k7 D' k8 P7 v& L
    • 9 Y! ~- }0 Z' U& ?8 J

      ' x# o4 V0 [  `0 N! q$ E   prt(alg);  /*输出进程PCB信息*/  
      & f" A* l# P; T% U/ n9 V7 ^) g
      2 ^' X5 }2 g! K0 O& g- h

    • * _/ H) i6 H1 Z

      & Q* E8 N2 C6 V   run=ready; /*将就绪队列的第一个进程投入运行*/  ! r0 \3 X% n( {9 z/ w

      7 z6 S1 _$ h9 Z! T$ N
    • 7 C( u! b$ B: p" P, ^- Q/ _! C! T

      , b2 ?7 n5 F% ]. ~, w9 u  |* b( u   ready=ready->next;  ( ~7 U# x6 `! N9 q" n2 Y
      + l, I, [+ |0 T2 @. u% Q
    • 3 ]& w( H8 |8 Z  I4 I
      " t0 }" s; b7 |! ^0 x$ c# ?* h
         run->state='R';  
      + X- a3 E/ E" A2 m, e* `
      0 p7 Z) h7 ~2 S

    • ( \6 Z; i8 L3 `' b6 o

      8 `# B+ a5 ^3 P}  
      9 |% ^- k" v1 V
      2 x1 J: i- a" x2 j, D

    • ( D4 W/ I  C7 J$ h

        q1 b8 ^4 q# g0 W; `- Z- x3 _/*优先数调度算法*/  
      3 R9 x7 m! G9 j8 k; p0 u# b4 C9 n

      " a) r) F- E3 o; b1 Z
    • 7 J: T9 `( l6 u3 \- W

        t- L$ K. j# z) S3 B9 _priority(char alg)  5 @, p) N& U) S5 I4 s' Y
      5 y/ f1 c( J8 A. D# N6 @
    • % ?% K6 T+ K5 w# w8 c! f
      " ?% X5 F# V1 r' N
      {  # S( Z: ^% o$ b; ^' d" j3 r

      # H3 ~) t( T6 @: L4 r
    • + C4 B! k4 T* l+ E4 U
      : h  a" ]' r1 X3 k
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  , b7 ~7 ~1 Q, G; ]

      8 ~8 x* F5 z0 P3 p

    • $ v. h6 q) u) x, R- z

      ( [8 C  S9 |3 u' y" t6 c   {  . h- ^: }9 N- {+ A3 {, C7 j  J, @' O
      & X4 }. I6 @. ]' j+ B) h3 U5 L  E, [' F
    • - x2 n( J. K9 b3 F
        Z0 W& R+ `2 b; k' r+ f( u
            run->cputime=run->cputime+1;  " Y6 L% Z5 x2 p4 }" O% _

      3 J7 B+ y# E$ o2 O/ X
    • - \4 M: S& s, O" }

      ' J; O1 l; F; l% Z) e" m; B      run->needtime=run->needtime-1;  " c* y0 v9 q) s; ?% j2 p7 E9 @' Z
      + ~% S* A; k+ b, H/ X8 {6 ]

    • ( p8 s( u1 p! B3 I. Z
      / J# I/ N. c& ^2 ~5 _: Y. M& O3 z) t( L
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      & W, l& ^7 l! H5 T. E( p

      + ~, g$ B7 q/ h3 k
    • 6 G  }8 h! @+ N4 \' }
      / x$ t7 F6 H9 {) O8 m8 W/ s
            PCB *p;
      9 R6 U' v  r  G# {& V4 }6 J4 O! F

      ! U  L9 g4 A/ x* z# b8 A5 a" ]
    • 6 ^- @: s. K& ?/ h5 t5 J  Y

      ) ~) M) f# X. t- b2 t$ [      p=ready;- T/ P" j0 J" Q2 L- o  y
      0 [- {# e% D" W1 [: @, _
    • " `) d+ }0 v) X4 o1 p  U- J0 ~
      % q8 X/ q4 {/ L) |4 J4 g
            while(p!=NULL)  ' X1 Q* ?* F" e! i+ G! G
      : E  b, Q! e4 i
    • ! _4 r$ h; p6 z# _* N# W% C; c

      ) a) _. Q- Q# \( y      {  $ _- V5 [  \7 o
      ) B) C7 {* D$ X4 o- @, c0 B, x

    • 1 D2 f/ I: [( F. O! i. K1 N

      ' D/ ]" _$ u1 E. ^" W8 y2 U          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    ' D2 e/ _6 a/ i+ ]
      + w6 }/ L' s' |/ w
    • % f) g2 l* d4 Z3 B! L) O# `
        `  m, m. `' V% y$ f& I0 e/ @
                p=p->next;  
      . f$ n  n8 |  l: }: z
      ' N/ B/ l5 j% y, o6 _6 {

    • 6 z( z' e! [4 }6 w7 f7 o7 `3 j

      ) D7 u4 e- B( T! R3 _8 B- z# x. j      }  ' o# k9 n+ h9 y  u  p& j
        I- m7 L: R4 j/ U( }' W8 t
    • & _7 E0 M1 x0 H
      / p( o, I9 n: z+ C" W1 v5 m- I
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  1 R5 g7 A+ h9 f8 c' o& Y

      & P9 I. }! D1 H

    • - O  h, z! E( c% H6 ?5 m

      " e( B8 O+ z2 Y0 J; [; W1 j      {  * s) C/ }2 ?3 B2 X1 _0 z3 i

      & J; `3 z' T. E$ m8 G

    • 8 a4 V; O% Q/ n
      ' o$ Z1 R. M1 a& U: V! q' K( Z" u
               run->next=finish;  
      9 g2 L/ Z* [3 {! ?3 y& G
      " m! l! k3 j% W# O) |+ Q  Y
    • 4 z9 V. e8 O' n. Y+ l

      ; I- a* X8 X, A# Z         finish=run;  
      ; }( K3 w7 f+ n! @

      ) l. b; Y9 P, u- k: |: ?( F" S+ p7 v' s

    •   ?# d  H' a7 y5 h) B4 A
      $ F7 O7 X" G7 A( g+ V* ~+ K$ J, D  v
               run->state='F';  /*置状态为完成态*/  " J3 g% p& _# m, [( ?9 a/ l* F

      ) d' {5 q8 o* F0 E

    • % b+ M1 `- |% o7 z" L

      3 d3 z- X. _- \( v& T         run=NULL;  /*运行队列头指针为空*/  
      ) E3 |2 J7 _" W0 V& D2 w4 b: S2 O2 k
      0 Q0 L+ J  U/ c) K" _& z
    • / }" D/ d/ k3 z1 G" n

      ; u+ P. g* Y' ?: B' y0 R) f         if(ready!=NULL) /*如就绪队列不空*/ ( N% I  `3 e+ ]* @; ]+ c( O
      9 L. ^# c  d3 z. L& \1 L; [

    • 3 \) @! o, L# W: ^& c8 [' b

      2 C" M# J7 h( h" \" z         {  0 ^$ {& a- N# v# A. I
      7 B7 `/ K7 W7 [3 R! z% f) }

    • / }" O7 n' j7 S. r* a8 X& U" z
      / j( ?; a3 e% h) V# N9 z
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      * o: V' ?* d) l: p5 g& W+ B& d9 E, c

      + C* l2 i: q: B7 f( k% u

    • , x8 E- e8 K* R; Y% [8 m2 I- Q$ W( ]
      : B& H* v! N% q; Y  A( @
               }
      ' ]# \3 z! I( o

      6 l' a& x7 D6 q4 ~; E
    • 6 l9 J( M% i$ ?) {. p

      / n0 U; J, d1 @6 s# ?- n      }  
      5 S+ k& a6 M/ |) F6 D' j

      9 j& S, l* Q8 s7 b3 Q+ @

    • 5 F/ z  j% `& C" R0 f9 E3 R4 `! |
      4 q; O/ _* N3 {, |4 Y' B  u
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  4 @+ O! _+ z# l6 N# Y
      * }/ \+ s+ _6 {$ p9 _
    • ! C7 F1 S# _, Q" h
      : m7 Z9 Q, \+ z/ R8 U8 |  x6 s7 G
           if((ready!=NULL)&&(run->prio<ready->prio))  
        V; L: f: D9 ^. R+ t
      8 |* k: L3 w( _# [2 m. D6 R- v
    • 2 x' N5 N+ j" h% H! j
      2 b" z- Y7 K. s( l  y$ x8 m) H
           {  + [( y% A' g: e% P1 a, ^

      . P" W* O* D+ O3 D' y. z
    • % K- S' j4 [3 O+ C; S

      ( [- D1 q' J9 V5 I# w0 ]! n; j0 E        run->state='W';  
      1 l( M! G2 g( W* X4 m6 O8 U
      # B: \1 @3 @! `! j7 |

    • 0 j  H4 p- g4 E9 l% q! G( B; p
      % c7 L( m( f  R. @
              insert1(run);  
      + O; x, L8 s3 R" `

      ) v- F* s7 Q( e. A

    • 7 C: p! M+ F2 q. {1 h" O. r. j' O
      " n. v: E* ?. C7 i
              firstin(); /*将就绪队列的第一个进程投入运行*/  7 N3 ?$ v: c  h3 P# G

      + N7 L9 T9 U/ S
    • : M0 u2 [- R9 y; b, _

      " ?0 S% a0 [, H/ Q* F( T+ U4 r     }  
      # V1 c2 Y2 L3 a: }
      1 h: U+ f5 A# p- L: p# f3 t7 ?6 @* X. i
    • " W! t, c0 y) A) K& I8 T, b
      1 M/ D' {' @0 c  c4 j) H& d- M( L
            prt(alg); /*输出进程PCB信息*/  
      & x( F1 K: j2 C$ U  t
      ( {( I; e' [1 u# O7 E3 a' B0 e& p1 e

    • ! [6 f8 O3 X4 D
      ( _3 I. T( ^% A! ?6 l# D
         }  + D; d" t5 b4 x  P3 }, W
      . w8 |, c" n' H4 G* v, n$ n: W- {
    • ( z3 s7 }# W$ H! Z) X3 Q

      ! `( f; Y# R( ?1 n( o% c9 F}  
      ' f6 ]9 F0 p  a% ?( V% _' ^. P8 T
      0 ~# Z* u6 j. x2 q
    • 0 |/ B. b+ C- b. z$ S
      * e. z) R4 Z% {: K$ }2 _
      /*主函数*/  * N; r" c# r; {
      # g/ e4 k7 ?- M; L2 z$ A7 V, \

    • 3 m0 _: a' [$ H  S( \$ _, x

      6 p! p/ \  L1 h; |+ A* }6 }5 f- J7 kmain()  6 c5 M1 v  x7 y# @! w. D
      & A: V, B% `+ n* p- K; I, r$ R
    • , e2 M' A  E$ u+ P1 e

      + m9 T7 {- q# U+ i, @  k; l$ G; P{  4 @: F9 n- E* _

      ! j  k  `- u' ]: _" Q. c7 B' K% n

    • . c& A2 y) q. d' u7 O$ U

      % Y# r1 M) g9 g) e2 S   char algo;  /*算法标记*/  0 m$ t* h* Q. v% [5 c4 q

      3 U8 v2 o/ m2 l4 q- H/ _3 z

    • 9 p- f! N) D! B( y( A" x

      - n& e/ M" r3 q' W# B   printf("输入P确定算法:优先数算法\n");  
      0 [* i1 T0 f; g  t4 W4 E2 Q

      & q6 P7 h% a+ c) `: \) d: n3 A0 F. L

    • / h$ v* @3 Q- T, [

      3 K8 q7 ^; g$ B0 r- L   scanf("%c",&algo); /*输入字符确定算法*/  * b: k( a7 I: U% B2 i

      1 N# I+ x: e) k. j

    •   U3 Q+ S- f: M( ~

      * `2 D& b5 D/ ^! \; V' w* `   printf("输入进程数:\n");  3 Y" f2 h1 U0 {7 B
      7 ?  M2 r9 E" K" A" N! h1 D2 R

    • " u9 E0 Q3 i* }& Y

      ) ~) j" |4 U. }: T: N) `: L   scanf("%d",&N); /*输入进程数*/  
      8 _4 c! K& X7 \  x/ @* O) ]8 p

      - D( s. i1 O7 Q, f% `% @

    • 0 G( l$ V+ K& Z, t

      . u. m( w$ g3 a3 f$ k   if(algo=='P'||algo=='p')  
      - e  A$ Y5 A9 _4 ]+ k6 p. h- s

      4 [4 b3 W! w; f& E0 e
    • * l9 d% P! L$ D) B9 [+ ?# k, D( j  b, C
      ) B6 X, h/ n( f5 w0 L! O% F( f
         {  ' o3 S4 L# Z' o* Z- H5 V

      ! P* M! w, z7 n3 a

    • . e6 k! e, L6 z+ O$ N
      & Z, c1 X: Q" N; R6 N5 H" w9 i
            create(algo); /*优先数法*/  $ j/ c/ g/ y5 W# d/ M
      4 H, U' o' B' h- X3 ~) w
    • ) V7 l* f: l$ y& z$ s9 w8 c

      5 X! L" z4 z9 c5 h      priority(algo);  
      6 i2 n2 B  s8 x
      1 g) M) `/ m3 `. [7 f/ @+ s
    • 4 R! b, Y, ~1 i, a: D8 R: e# x
      4 W% r* t% d3 b* h
         }
      9 e* W; y- u3 y& W) S( O3 v0 Q

      ! z1 J& ~. F+ G5 p9 i& {

    •   D9 c+ {" w* T8 M. d+ W/ Q

      ! V# w) m# l2 x. {8 [}
      ! V! g! \0 ?" d# v# {- p2 B( F) a

      - R% Q4 I3 t- Q2 H0 V0 C7 H
      , e8 C; X  m0 f, e2 y! y

    6 q; A' ^5 ~: t. A0 _& h
    输出结果:/ P* {  A5 Z3 S! P2 Q


    $ k4 N/ j7 E0 m% v* v: @/ I原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    0 E( F/ |0 Q  X, H
      q& L6 V& _* ^+ Z, s
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-11-1 08:25 , Processed in 0.245881 second(s), 51 queries .

    回顶部