QQ登录

只需要一步,快速开始

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

优先级调度算法

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

5273

主题

81

听众

17万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

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

    7 d+ c3 E6 j0 D优先级调度算法- O% d3 O8 G5 o, Y

    算法介绍' D+ [! \; U- s+ a& h
    优先调度算法的类型(用于作业调度)
    % l0 i) d; w  \( l1)非抢占式优先权调度算法
    : I0 s% }& }! j系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    * i3 p9 R- s6 e; E* J1 g2)抢占式优先权调度算法 ; N' B0 W' ~* x  C6 {$ H
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型# i5 ?% P& c7 n2 ~
    1)静态优先权 ; m) F* R5 C' f1 f
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    * H  r, _; j; t8 ]3 a8 s

    2)动态优先权 , b: j: L1 p! }, H# S9 [+ _6 l

    算法实现

    抢占式动态优先权:


    0 P. x, L- M* z, [5 i' EPS:本人认为非抢占式静态优先权没有实际价值。


    • 6 G1 h2 j( m8 L( o# D
      3 ]; G6 S! Y. E& y; m+ v
      #include <stdio.h>
      0 t. m8 ]% B- }
      - O9 o. o" O1 P; J( ]& O

    • ' a) ^3 l* J# J

      " q5 S# {" q( a$ f; t% d#include <stdlib.h>  
      ! W5 s! E# ^& ?6 H  n$ N0 _+ n
      % z) |, B: S' n& ~8 r# G$ l7 U1 {
    • ( V/ `/ Y! o5 }% v

      4 w2 b* G& z: S) e  K; j#include <string.h>  + {1 q3 p! ~( y
      2 F; n* A9 v1 w6 Z! T# Q3 X
    • 0 Z4 R2 ?# j5 S) J! A

      5 p+ Q1 x6 O+ \* N7 btypedef struct node  
      5 |& r( h9 v4 w5 ^# a2 }2 B

      $ L% ]: j. q% F$ [$ a

    • " p; C  B4 _" k

      5 f3 ?  J( P7 R8 ~* g{  . ^3 z) u) T1 V; M# b/ p! b

      , E+ B0 L# y8 l) F, p% J* G

    • ) |% C# p2 `/ i% ^

      # i$ U  \/ v+ b- V9 N   char name[10];  /*进程标识符*/  
      % P; z9 }& @7 d& ~4 ~" m
      ( x$ [6 r9 o3 M5 }# X
    • ' x4 k1 g% s* y7 Z, c" M
      1 u7 L0 f( r1 S" q* {3 ^; n
         int prio;   /*进程优先数*/  + u5 o& ?- l) Z! ?

        R" J' o  k! R) |- E, I

    • " E( ~6 W* d, `1 K, }

      ( o: W7 U5 K; Q% U   int round;  /*进程时间轮转时间片*/  # h# O/ A% ~+ K) J( a
      + }$ g- |% q$ N, G* q
    • 5 N+ C' e, s% n. E- R

      & n$ G+ A8 o7 k( V: U& U$ O   int cputime; /*进程占用CPU时间*/  
      5 h" w! S% p8 L

      * x) A$ V: u  \$ ?
    • ( K4 q$ G8 u  H

      7 E  ]; _; H7 w" R: a5 N   int needtime; /*进程到完成还要的时间*/  
      5 Y) P( [0 c4 `& M: F/ Q

      . G( b' V0 z* i3 W0 x$ S1 g
    • , F% F& R, n: X& f# b

      ) i9 D% W; ~: T4 P+ i% r8 V0 T  o   int count;  /*计数器*/  
      ! T; c& I3 s7 i7 x  T

      2 }+ T9 y# s, Y% v) n

    • * |0 R/ X; T3 g3 h1 `% L/ x
      2 V7 U' k, B9 e1 t! k9 K
         char state; /*进程的状态*/  
      ( _3 x( o3 H1 ?1 q

      0 d$ _' T6 b+ O* }' _
    • + [+ Y* r$ g& [- n% a
      $ j$ |/ Y- q9 S7 c1 f/ V
         struct node *next; /*链指针*/  4 w6 v/ n: M+ T. b
        `0 ~* [! `4 _9 \; L

    • 5 z6 W2 r* n# c1 C5 D2 Y" u- {: Z5 n

      6 w# T) T9 ~/ V* u" K9 F}PCB;  
      1 F( K* I! z( T2 I

      # O5 y* }6 g" M( q
    • 2 R+ j% c; t& t  y* j
      ; s, r& [5 u7 J$ Q0 o1 }' h
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      5 b( f: U/ s3 g' I$ X

      & A! R' w5 m; W6 R0 C- f& x

    • $ B. T; |- i% H  p
      / L" e: X6 j! b, G( f+ _
      int N; /*进程数*/  
      ! a# w6 S+ o0 U. S
      1 }1 {6 s) P% E: Q. C5 H9 j" l& |
    • & J0 W9 {1 e4 m) z8 l6 z" E

      1 `9 B1 p5 W8 U$ [/*将就绪队列中的第一个进程投入运行*/  1 b2 k; x8 r0 w$ H
      0 }/ e* A+ d. N1 Q7 J/ I/ B
    • % v6 N% f2 C' s+ w- |9 U3 \: \8 \
      6 T# b, u/ [! E/ F# r3 F5 _
      firstin()  % _2 A8 J: g; ]7 W0 N& `

      9 ^! C# M* h/ \( P- b  k
    • 1 Z9 n: _# z+ t% |" @2 @+ e; E

      3 n1 I; N1 y2 n{  
      * L5 [" E. Q; ^. G* V
      $ ?  l6 Z: a; ?, B1 ]( t- M
    • 7 ~4 k! [+ L. n3 \, z% g9 Y& q
      * v8 P2 y' \7 J7 F# F
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  $ @' K, c# E/ j- k: G* T
      $ [# n; F7 E- q

    • . F/ d1 I4 G3 s: v* ~; S

      , f& }- n* `# I) s6 D   run->state='R';   /*进程状态变为运行态*/  ( C0 E" V, n: s/ \; ^
      1 I# \6 R+ B6 [+ Y

    • ' ^8 n, _) F* r* K4 Y6 i1 p; c1 T

      7 }+ q  t$ C$ ]   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      & d! M; E( v! b; O* v% B5 p

      5 J; i* [- T# e. h0 M+ `

    • ( `, I1 r' _/ Z6 m* F2 U: }

        a' L7 _# `2 }0 t& I, e}  
      5 X) `( z0 B1 h! S1 U

      : o$ q& F) Y6 G! x3 v" z

    • 3 ?; R) K6 h& w

      # P. E& N$ n% Q, _/ L$ q' D/*标题输出函数*/  
      8 ]% v4 C5 s5 O
      - u/ O; ]& p. p# e- b

    • ) F' q' a; E3 }0 w
      + t. B& ]7 _2 ?# k  x* Z
      void prt1(char a)  7 x( u$ I4 _1 o1 @4 W) \

      3 O9 Y% L, g5 k- Z% l

    • * x+ O$ S4 c5 `9 S3 u/ g- ?( O
      + M* f9 [* H- C, f; Y9 f2 P& n% Z
      {  & h1 @4 f1 w8 n/ y- u, [

      ; I0 n; K" a3 [) o  q2 N" `% l2 c

    • / k6 m5 l8 t0 c3 B5 I
      7 |6 \+ T! l9 }  L# {- k- a
         if(toupper(a)=='P') /*优先数法*/  5 D1 S! N$ |- p: h8 m, Q* F3 y8 L

      + a7 n* h" }# A( l; z9 h

    • & ~: H0 N% F# c3 `4 I

      : e1 j2 G8 |0 k6 [4 |      printf("  进程号   cpu时间  所需时间  优先数    状态\n");    z8 h" L( v( I; S( W' p
      % b! v" a- t9 [2 [6 J; P
    • 7 D0 k# T4 Z. ^1 ?) v

      & F( C# r& [0 b   else  
      ) J+ W  L- v2 e  x

      % n! s0 B7 h2 |% ^" ?+ x9 K3 o
    • * y! b0 u5 T4 w' k2 p

      # G, E: B9 ^, V+ m$ z- _0 b      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  $ p5 B9 @: a% J

      1 Q) b4 ]8 ]% h5 x* ~( V

    • & `# D; B  A# ^" g3 ~
      $ G3 m8 r, c1 u" q+ C8 h
      }  
      : p) r8 r/ Y7 P9 i1 `
      + b  q% U+ f) B
    • 4 H6 C. |0 ]3 W/ Z' M" `

      # H5 O- F' m- B' t( T( w" b/*进程PCB输出*/  ) W6 Q* `/ Z! n) A$ O8 s# ~  \

      ! O4 E9 s1 X( @- l" ?

    • 2 T- D# l; E* {* {
      / K# v' D5 U9 D1 ?
      void prt2(char a,PCB *q)  
      . l7 z: t1 T6 W+ z2 k/ m
      0 T. M! h  j: a( C9 l2 {

    • & ^$ e0 }8 h5 ?9 v" S0 Y; O- S

      8 n4 D% O3 n0 i7 K# l. x# a% Y{  
      " ^4 S% H# b2 A7 z

      2 g% S; h) P: o% _
    • 8 C1 a1 D* Q. M3 r% w6 S  f

      0 e# Y; y& {" r   if(toupper(a)=='P')  /*优先数法的输出*/  3 a5 }1 u- ?0 s9 [% d' Q1 p% k& ^
      # P2 `+ u+ q/ j$ g
    • 1 Q! `/ l  Y! Q5 o" D$ _2 K

      : R" @" l3 s+ Z3 u, o. A      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  & G3 F4 x* j; n6 U

      0 M! g/ ]  D; o, Q) S. D. i

    • 3 f( I" p: f4 z/ s( f
      * y1 r+ m6 m& O1 c( m* k  z7 T
             q->cputime,q->needtime,q->prio,q->state);  
      # A& N: m" U9 Z6 K1 n; M
      $ A5 t* b/ V+ m

    • ! Z4 S- q" O2 Y& N; S

      ( n- Z. G/ l8 D0 `! G   else/*轮转法的输出*/  + X0 {( J1 f* ^9 Q1 h: F# K
      9 ^6 b" p0 U- V( j# f5 f
    • : @+ w0 u: [& `
      / q4 _5 B, R8 q& c) U
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  ) @; ^3 |3 ^6 F/ z$ y7 ]
      - }9 e- D! b7 w
    • % Y" w( h1 H  c  g$ Y

      / r& I3 {: B& x$ e8 X" D3 E! s3 Y       q->cputime,q->needtime,q->count,q->round,q->state);  * z& P3 ]9 k3 {( e' K+ W: ~

      ( j0 o) G) f  U0 n+ T

    • 7 a. m) o  w; O1 _) O  l/ r1 T
        O1 h0 U! h" i. @- [
      }  ; j& N$ V' j7 K

      . J- [+ J* ?! i8 \' Y- r

    • 5 y" Y! r' @* f. W- A0 t: l1 A, a5 m
      ) S% c# O3 V1 r) I) X
      /*输出函数*/  5 z! K  m( ~6 ^3 s8 k

      3 |0 ?# T3 Z1 g; R" ?
    • $ K# ~4 T! Q5 K8 N6 X

      * R8 @  v" N0 J) k! `( [; Rvoid prt(char algo)  
      8 X  J: y) {9 O7 P' o
      + ?$ C& S2 I- f" j
    • ' ?: {5 e$ O9 O* j
      - j1 U6 T; u( p) a0 R, T
      {  , C- C$ y$ v1 h$ g, m
      1 d+ P  c, u0 `! H. f6 i; B
    • : {4 ~" ?! Y0 Q9 e& l6 w( M

      : j1 a1 J+ U" h; I5 g   PCB *p;  
      * P1 }3 b7 T& Q7 A/ @

      ! }# u& g3 R! ]2 e( d5 ?
    • * z& p- K" H: ?$ m6 p4 ~
      ! J+ u7 `0 t: t7 y! C
         prt1(algo);  /*输出标题*/  2 c/ G2 |0 F# V/ m" a
      8 f7 t8 ~. T. t5 \( u
    • # P( c2 p$ ?) I3 F0 Y
      ; D/ S( b+ e; K# i5 t7 M
         if(run!=NULL) /*如果运行指针不空*/  : \/ }) l8 N9 v/ r  p8 V
      ; G- ~( `/ f% E, |9 [* |4 P

    • ; c+ A0 x0 N0 y3 u/ i
      ) x! h# F8 x5 L1 w7 Q- @: E
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      - B* R2 a" V  d6 |! G% P
      * p# w% _1 q4 @+ R7 i) K$ j

    • + T/ E; |0 K$ _" W6 I0 a

      # Y7 D* _5 c$ p4 O  V4 O   p=ready;  /*输出就绪队列PCB*/  
      + _( Z$ L/ B8 x
      ! `; s" ?0 w# A+ H2 d# @

    • 3 e% h4 H* @4 M! g3 E

      2 P# l. T. `; J   while(p!=NULL)  * P) C, H3 t2 I: Q3 F% v, S8 p
      : z; ]0 o, e5 o. K- u
    • # m$ C9 ~4 g5 i9 h' }
      # U8 s/ m5 e" v; `) o+ k
         {  
      7 q+ I2 P9 o3 a& C1 b: e. i5 N
      ) O* G4 n' [- @7 T  U
    • ( f; x* U. K3 q! l) p) M' ^

      1 X+ ]& {$ i$ Z0 {      prt2(algo,p);  + U7 ^6 k+ u, T

      : Q9 P) X& P# B" a3 W
    • & Z0 e8 p1 i. G2 R3 Y* s2 t
      ; n  A* |0 G( k2 z
            p=p->next;  
      - e! ]/ X" ?' _5 r4 h! T
      5 g8 `1 H6 l# i8 v7 K) L

    • ) d$ E: B6 |4 Z% ]- t" v
      ; b5 }, p2 f  f0 S8 X
         }  9 W$ ]' ~# r; s, d& [
      # Q2 V6 a5 h1 x) ^) K
    • . b+ A! h7 O: q+ x' F
      7 h1 ~/ d2 C% G! ]6 y4 [
         p=finish;  /*输出完成队列的PCB*/  % w  H- F' X# t  V3 a# t% H+ p

      ' R& H8 N5 h0 `# A& b, `
    • 6 u* V: ?6 B9 B" p6 K+ h& L
      - E# |2 ~+ u. T
         while(p!=NULL)  
      ) R& c; J) J. g% ?7 Y4 U, J: P

      * b* `, n$ g0 [

    • , P# i3 @% b6 C  @

      * n6 L! F% c! J$ [( l0 }" ~5 g1 h   {  
      7 u  ?- t8 A- ~+ _$ W
      ' c. i% F) A9 u/ c

    • , @( \" U; i) i2 F
      . @, \0 L! R7 w! R
            prt2(algo,p);  
      0 Z; k7 j- P. E8 d3 l

      8 _( L- K! h; Y1 H- O; o

    • 3 y5 L% w( d/ T
      ! b9 f) r( u; _# f
            p=p->next;  8 |+ Y) e& \* d' k) h
      & N& Q" ^1 P! o5 k, o  i( M9 b# M

    • 1 A( ^8 _( L: V8 n+ H" x% N3 o/ I# g
      6 E) ^" |2 h& o, Q' N1 g/ u  t9 d; F/ |
         }  
      $ C8 t* P; K8 c, s+ M. t, K
      9 `; X2 ~6 x+ m# q  J. s0 _
    • ( T' X" i0 Z" M
      / y- L& o  }( T; C1 M7 y0 g: C" w" g
         getchar();  /*压任意键继续*/  / w. n/ C6 K' F: q+ e, y$ J$ v

      9 [% @: {! ~# b! P  I6 q

    • ! _$ y* R. K/ H& `; I) @# S0 ~
      7 ^! p1 c6 U! ?2 C; g* A: b, x; X
      }  
      8 l8 i0 T1 ]% _

      3 s% X" W6 N3 Q" R3 N

    • ) m2 X0 ]% f4 R6 G7 O( w
      3 ~5 y4 F' ~% N6 u: ]
      /*优先数的插入算法*/  , z! g& D( v: s$ B8 I

      # G; H5 Z7 C/ p4 {' U
    • 6 o. J' o6 b+ a" p3 p

        u: O& t, J, ?9 z# S! {% Xinsert1(PCB *q)  
      1 {. z" W( D- d: l5 J$ x
      : \5 n3 g/ |& l% N7 J
    • 6 a/ ]4 j9 m6 D, h

      - [4 D0 \* W1 k; m, T" f; I0 z  n$ v{  
      5 t# J4 c, [3 Y" `  Q
      ( x9 }. A! ~! p% ]

    • 0 }' B, D: P% y- H! V

      ( |2 q2 e4 l4 y3 ~2 J   PCB *p1,*s,*r;  0 l. w$ Q+ `8 s0 C8 ?" o

      9 b, q! N6 W. J3 O( D

    • 3 d! c$ \4 B/ k9 o
      7 j( B. ]1 P; [1 H0 u, S: T
         int b;  : q: H  S  u0 A8 ]* Q
      ' M: R8 K( l/ J; g: N& o7 h% M* v
    • 5 p/ v$ [4 c% |$ V
      3 l7 I- t) G% l+ K7 V) G+ u; e
         s=q;  /*待插入的PCB指针*/  2 Q$ U- d" y6 V0 m
      , ?* M1 y; a2 f2 ~. X$ @# ]

    • : c6 @2 Z5 G# b) y, D  D
      % ~. m4 t) |4 v6 R+ k1 n
         p1=ready; /*就绪队列头指针*/  
      + _' _6 f$ |# e& ~8 v$ ]+ ^

      0 O& X: B4 @7 H$ G( ~! l
    • 1 Q5 P8 z# A8 d- o8 t

      * Y% y5 g. G7 a- [- l( i% W/ p   r=p1; /*r做p1的前驱指针*/  
      3 i4 h' U. _7 K

        G6 A1 ?" R6 c  i
    • 1 x( W4 G! [/ D* f

      ! L9 T! ]% [- G6 V3 e' i$ P   b=1;  0 }  c4 x7 u0 ^0 w& E" n
      7 N2 Z' e3 x# V3 M! l7 W
    • , n: e* `$ {9 H1 i$ V8 g
      6 g; {1 X+ H9 P/ V5 [1 g
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      5 E, [. r8 B* y& o8 D9 l
      - v4 H9 i2 H, W& P, @
    • ! R8 W1 l# E: c2 O6 }( F; r
      - W* a4 s, Y/ t$ Y" h
            if(p1->prio>=s->prio)  
      - k. h& k! w+ ]
      # W6 z1 j  H- [! i

    • $ y" T) a, m' K: ^  X- y- J2 e

      ; B% ?6 j' b+ Q+ z1 x7 I2 s1 e      {  
      ) s* j" }' y$ C6 _8 j
      2 f6 u  g& T2 E$ b' m0 |

    •   E: h6 j' V, @8 C
      8 p; K( Y  s% S
           r=p1;  
      6 s# E( x0 j& K

      1 Y. X5 T8 \7 E, h+ T! X( V
    • 2 R7 d+ S5 g" u. r; n1 q

      " T! O* u% G# K2 j! X! O# B) Z+ x     p1=p1->next;  
      7 y) L7 l4 O3 ?; y/ J

      ' g: i' q3 ^* o+ w! X7 C- E
    • , v) S3 M! ?8 \

      8 z( e0 Y+ e2 X5 j  [      }  6 z9 R( A, q7 Z* q% U, P5 l
      4 U) V* q+ B4 I; U0 q6 X
    • & Q: f; o: d, k/ _  p

      3 P0 R+ Y2 r) }% p$ |* U( i# x      else  
      ! Q7 |8 R6 I2 u$ t# p

      . y# z+ n0 S8 p6 f* a1 Y+ ^
    • + W. Q: g+ R7 S) U, \2 d4 S/ c4 _

        L2 X, N% N& U7 r     b=0;  2 l, E# C5 J* J
      ! D, v+ u; d; E  [: X9 m4 E+ \0 H

    • 9 n. X0 S; v2 c  B# {% S
      3 N& O- U, F9 `/ n  r$ T
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      5 ^2 ~( h1 f" o* S. d4 |

      * s( C, X$ x4 D4 u
    • ) r* U- M4 f: u' k/ f3 c' I

      * ]- I. a/ ]. E   {  
      1 r/ B( j8 ?/ P% Q

      / J5 w$ q7 s$ v- ~' g1 J# r! R
    • , Q# `4 k) U& a, u

      " K  j' s3 h( l1 h; B4 f      r->next=s;  3 j( w9 s0 J: ^% E! c

      1 j9 N% V, {3 P4 l1 b3 ]
    • + V3 c4 k/ |- W( s, d
      3 h' C7 W. M# l" T
            s->next=p1;  
      $ Y' H$ e) P( h' ^
        X, Y: R! Q* ^* Y
    • 6 ^* [0 d8 V9 C* y( _, H, [( I. O

      2 r, O1 Z  d9 u   }  
      $ }9 P& h+ n' V( r
        m9 Y, t5 S2 D/ z
    • & u2 s( K; {, z' {4 y6 n( R

      6 A/ t/ y) M) T6 L5 z   else  ( K3 j) r' k+ `9 d

      5 |. H  J9 P. R9 S0 l9 a6 d
    • ( n# F) C* S5 m
      ) W) v  f. E' D, j% R: `
         {  
      - J5 f" n  p1 s7 e" R8 R
      3 ~2 r7 K4 p) x) g! Q& T4 J
    • 7 Q6 S/ {5 ~- N7 a; p

      2 d8 \4 A3 V+ O3 X/ B      s->next=p1;  /*否则插入在就绪队列的头*/  $ ^5 a  P& A% T; K, }! _( C% O& f' V

      0 y. P$ i# _% \3 O- w/ h6 ?

    • : G- d4 n  b4 A! y( _6 W
      3 b% l$ Q* d6 Z5 j- L
            ready=s;  
      1 w/ S3 l4 _+ w( \% D5 u
      8 f6 f0 G1 _3 A7 s7 j

    • & A, k4 P9 u4 }, Z9 W' p
      - g; b1 B5 U; r% s( Q
         }  $ Q( a9 u* x/ T* m

      & B% @) g7 H: d+ G. p

    • & t# I" f! f. [3 ^

      3 ^% Q; K1 K3 n. Q5 r}  
        {8 G/ r( @1 |3 s9 l- }: m

      * t- w* v" f1 s/ b2 H: x5 l

    • / J' i, J- p6 p4 s
      " y" t; o4 o% n+ s' R' J3 B  m% W
      /*优先数创建初始PCB信息*/  $ Z1 R- A# S: B2 H3 j
      4 ?% W2 M% ]' d9 M" K8 B; ]: D4 y
    • & W& R" Y! {8 p* l1 P! {! n0 r" g

      0 q# s1 \1 @/ H" {2 O- _- ?1 u& K+ tvoid create(char alg)  
      ! u- T4 P! E, U% s' A, g

      % Q4 d, Z, j  `+ f5 X& g
    • : p* A% [* k! l( k

        H; O' ?* h$ T4 e) J1 _# i{  ) d. {3 }9 C% K7 N

      . N! n2 {) ~, |6 r9 t- \, H6 q

    • 0 {1 t3 ?9 M0 x+ [7 V

      / B4 z) ?# _" Z0 f  U( l   PCB *p;  # o  O6 N, U1 k2 \6 Z  @/ G
      0 T9 M, D5 m' d& n7 T; V
    • ' {) e+ b6 H: _" b3 E) H

      ) _7 ?5 n$ `- t   int i,time;  
      " _2 k# A. f, o+ k# }
      " m! \* u& o' P- g& M" k

    •   ~/ F3 j7 a" N+ g- H  g

      ; v8 w7 i, M7 ?9 ^   char na[10];  
      " T% w$ ~+ L& h( v. K3 y
      8 G+ ^6 @; v0 ^1 I0 M
    • 8 U/ Q* l0 z( C/ ^
      & S4 s& W# R; @* ?; ^
         ready=NULL; /*就绪队列头指针*/  7 l  @& t- t: [9 P

      + p6 m5 G' M) `% C: P1 j6 v

    • ! U' _% b' {; \: |, A
        B  `9 X/ `. H6 S
         finish=NULL;  /*完成队列头指针*/  
      ) L  X& c) T5 p- f/ c; L! L
      9 s7 V0 R# s; o' v

    • 8 X4 I; w7 D: e5 C8 g' L  N+ v# r7 |1 [/ H
      : h" t) V1 A. J. q4 G
         run=NULL; /*运行队列指针*/  / l. V9 d, F  t8 A3 q( @

      6 U; W0 g/ ]" ~6 |$ [
    •   [5 d8 u1 P3 s7 \' w
      ) m2 K7 l- Y: r% A# O( n! [
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  " J/ U( ]  d+ F/ [& ~
      ' D+ W, L5 z! I' U, Q3 G; _. }

    • 6 `/ ~( g# S, C. d: |/ v( u. M. {
      " ~1 I4 p1 T+ O$ u# u
         for(i=1;i<=N;i++)  
      # `/ Q3 |3 r1 T0 O; H, f

      9 r: ?4 ^  g6 j8 A" j4 I

    • - m" W$ {7 [" r  V

      ' U! U) B9 n. F" _0 a5 a7 I' ~4 N   {  ( r" l' [0 I& V3 E, |% X4 V$ h
        E/ S3 m! p) |" l
    • 7 l9 S8 E7 B2 i5 K
      " [1 }3 n2 e3 y0 O" ?+ }
            p=(PCB *)malloc(sizeof(PCB));  
      * R  _7 ~8 f, h9 p" Z; f- M

      2 a: G9 m% w' C% e7 g1 n
    • 0 ~7 a# m3 k5 S! X+ y
      2 m% ?  K: Q$ R1 ^6 g
            scanf("%s",na);  
      ) [0 m+ R3 B3 }+ \5 ]& S3 m5 X- \
      & u3 o# V  Z, O. h% k. I# N

    • $ k3 M% q' ^8 h7 q/ E6 `8 K- [

      4 `6 |6 I: X8 Y2 k; N/ h  \      scanf("%d",&time);  # J5 D* M: L- n! O
      4 Z( @- L8 b  ?+ O
    • ; Z" Y4 W7 V5 p) R6 ^. G

      0 f. a9 c5 x" o  V) \! P      strcpy(p->name,na);  
      / l4 J7 O' ]  }* x. m- t6 P) U- D% s

      8 H% Q/ Q* M5 A+ m4 I9 y

    •   ~  q  u3 Q6 c9 k1 d
      0 g/ j& @" o# g
            p->cputime=0;  
      # b1 P9 Q* H. H0 G' A; F
      2 o5 H1 p8 ]) C0 S9 b9 _
    • ) I# ]; r  Q" Z$ K- V
      7 \$ d' u; I# l" Q. F& v
            p->needtime=time;    B* H1 d( n( c2 Q0 o( H( T' E6 F
      " q5 w/ ~1 h0 h/ i: x  ^% K

    • 5 U$ ?% `) @- q. @

      . d3 ]& H' k0 U  b      p->state='w';  
      1 [: f1 B, W: K0 p2 i* z$ z: q

      3 f, @2 W  k$ v+ n8 D9 R- D
    • ! G) r/ C( E5 o
      ( }4 x, t: ]1 ^3 F
            p->prio=50-time;    n; _* D- u. G- G5 G

      # a: o2 A* P% t" V

    • $ m$ b9 G3 e  T4 x, x+ e

      : \/ L6 p3 j$ W2 y1 w4 W7 O      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  3 V* L" _% d3 Y7 Q& H9 y
      7 M# S6 `2 n9 w% `9 i; P8 l

    • 2 H1 V  H1 u( ^. B

      : J0 A2 w# r" ]2 x0 n0 |1 l     insert1(p);  
      ! y' n- h& ^/ |1 b' D: d+ {
      8 ~6 C1 A; z4 L# s' K" V
    • 3 `" V  J- k; i. Z$ p; A. G: ~
      ! e8 b; i' [) d- m
            else  0 P0 T: A: f: B: C9 U* F

      : W+ Q/ v3 S' n8 M, p! ^; B% S
    • 8 H8 @1 K, F, ]  S3 B! D- c

      ' C- i6 y8 k& P. K. j% c1 r& b      {  
      : m; R2 w  b9 \7 V  a) y, Q
      0 d  h1 I" Q! h% t2 j: A

    • , j+ r' j4 S! c, P6 X( |7 x

      ' @0 j; ]& W9 W* S: W+ x  \! E     p->next=ready; /*创建就绪队列的第一个PCB*/  
      ) x- b* ?8 e" Y( M" Q' Q: R

      9 n3 W3 p( q1 @7 m6 A% R

    • " L0 A  j. j' t7 I

      : @6 i- s7 r" I7 ?. W     ready=p;  
      ! c8 z/ d8 P0 g/ L
      8 v( w; w. \& W. H0 V" A
    • ; p  Z( K+ s* W6 T* Z' J3 c8 h

      9 M' h6 K/ e' T! b      }  % M& D$ t% d5 ?0 p& H+ A2 [  u$ M" q/ n

      ) M3 U+ N6 _/ x1 ~# o8 O' k

    • ; [# B$ `: y9 |9 Z$ u: p6 X+ y

      + D9 ~- q: y" o: @; h   }    ^. T" U; {3 U& S8 a$ a5 A

      . z, E* [! ]* ]/ C1 p! O
    • 2 U' `# C2 m" u7 ~

      7 Q7 D" |6 j" i; F- B* n9 b6 F. Y   printf("          优先数算法输出信息:\n");  
      3 i# R4 U% R2 H6 v- S

      - W& W& C% j" n* K4 a! _
    • - G) \5 u. d# a+ F% o
      8 X: ?: J+ L( ?! S: P$ m. |) Q( w
         printf("************************************************\n");  
      # i, h4 Y/ Y$ V

      7 M. O; ?) g+ J: _1 {

    • ( u7 {1 H! @7 g. j5 R9 S! u
      8 Y! ?& o9 |& W. A: A
         prt(alg);  /*输出进程PCB信息*/    m: x. ?3 I, i3 C* R0 z

      % v/ k# j5 f# C+ Q* x4 {- A% H

    • 8 B# |. Y2 o8 y: T

      ; x" w# `9 ^5 F9 X( Q   run=ready; /*将就绪队列的第一个进程投入运行*/  
      : c5 z1 J, A, X( [. t& e7 N1 ]
      ! o( i# O' t2 @

    • * `' \5 ~2 S+ S
      4 m- Y/ v5 h9 S* T
         ready=ready->next;  ( @3 \  c+ C/ u* M4 j% r8 D
      + A7 }& t# ^4 }+ o' S
    • " S  x9 i# z8 U
      & X6 w" ]; |* j! k' D0 Q5 I+ A
         run->state='R';  7 m1 z' R+ o, D9 {# c

      , B7 K% l* n; k$ ]

    • # L# v+ ~0 A9 |. L8 l0 P) d
      ! R" v, {) {* z% v
      }  
      0 M! z* P; |8 \4 T
      ; s) `3 t7 o; |) c1 j; U0 v7 j. A
    • 8 B& C3 _, j9 j$ @' b5 v! O' j- V
      ! [- a* y2 ]6 `/ [1 l5 E
      /*优先数调度算法*/  
      $ t/ T8 ~; z4 d8 X8 m! @

      % C' x" H  g1 }$ b5 i) f( T. @

    • 1 W5 o. a# C( }2 y) F5 u9 K# a1 U1 a
      ! N6 r' O0 F. B% h' ~
      priority(char alg)  
      5 v, V: I- ]) P1 K
      0 o0 A! y! r8 {$ t1 M9 h! W  r
    • . d) D8 \, V2 }5 E8 h

      1 b; w" f1 C# P8 `{  2 Z8 Y: t5 @( g# \; d1 ~8 J7 ^
      ) M# b# v' a* r+ W
    • : [; O" P+ a( w' Y
      . k4 t$ l! ~2 [0 ^
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      ; r7 M' w7 {5 ~; ^+ @. F1 ~
      # G& ~' @$ D8 {" P$ t' U; ?

    • $ ]4 G/ F2 n+ ]8 ^! L4 n& S# j
      ; c1 d9 N& g; S2 W9 Q. q
         {  , }1 u# i2 {0 ^4 _

      2 j: c, l3 J  a. L$ a+ y; Q) G
    • ! \4 U  C1 M6 B8 K
        K' s1 |8 ?# l3 m( y9 L" ~! j) Q
            run->cputime=run->cputime+1;  
      8 z( D! q& \$ y4 l' Y
      2 @+ v; I& X+ i! ~
    • 9 u" Q! u2 k* l% A( U0 w# H. ~, F
      $ Z1 X" Z- k8 y
            run->needtime=run->needtime-1;  $ C4 |* I  l& D/ R7 V
      + y. h# T8 @* L8 O; `

    • . K# ^" K- c+ ^( b

      7 T, Z2 J+ I" `( @" N      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      # C0 T1 w$ @! y; Q
      & W# s6 K. T# V5 n( w; o1 ^

    • 9 X* l) N) v5 w) g# x
      2 y0 L9 {( n. T5 v1 G7 }1 }
            PCB *p;2 n  ^& G# j9 d# D' ]* J

      0 p3 C+ n; B' h# [: K

    • 5 Y. Q# v- \2 Q: x8 E
      , G+ A4 U8 d) C6 n& `: z- r
            p=ready;
      2 V- O* e) N) H! d- j# c. b) F4 G4 p  r
      ( F' ]3 m; z6 j/ v  N  H3 C
    • 1 G, r$ \$ y3 G$ ?4 c0 W# b0 F& P

      5 _/ F4 N7 o8 b      while(p!=NULL)  8 [8 t' a: }( m. \

      # m- {* P) R# r+ A

    • 4 T, S; @0 C( P* w0 C# u; R+ M; u3 Q

      ! v, a$ M4 }( u  V/ [4 t      {  2 `1 I: Z$ }8 k) E8 G2 c% D- j5 D# H/ Q% O
      % n& r5 h/ T/ i& p' P

    • # e  Z/ y) C4 a* w$ o; f# K" V" p
      7 A4 p- G) e8 a+ W; x% y& V$ q
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    8 ^  g& N# ]& o, g9 L5 l
      . e) s3 M1 S+ q0 |: _! M9 L/ R; D

    • # `+ N+ q1 t0 A
      8 U# O9 G2 R' A( f
                p=p->next;  5 P+ i+ i8 c6 S1 f1 f

      0 |1 h$ S" d2 {% D
    • # i$ H' z9 g8 ^+ b
      $ L% {" A& T6 {% ?* b! g0 }" E% P
            }  & {- I0 L. q. E4 l& g7 z" U/ r
      ' r1 V! ]& j9 z& L  G& D

    • + T) L0 M) N& F' Z" F: l. c' R; @
      , ~3 @: u& q1 T; ?% Z' v4 Q1 C# C- s
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      , N6 a& i: Q) b  w3 q7 N& M/ [/ }
      , z$ n" h  t/ D: Y8 f
    • 1 T; ^& x+ `. M+ s  Z: {/ X

      6 `$ D# R3 T1 L1 \) l4 @7 b      {  
      : H4 Q$ p! e1 P% i

      8 V0 N0 Q/ R0 Z4 ~8 |! J4 `
    • 2 _/ a' A. _1 k

      % ^: Z- }0 Y! w         run->next=finish;  ; ]) F" z4 c6 i
      + I3 B) X; g3 z1 r

    • % i- w+ p) v9 S( q+ H  m
        c+ m7 D& F0 X7 t
               finish=run;  : E/ P' g% N. F, g+ Q- s, _

      1 e& ~- o" _. l' K

    • 8 T; U* A0 l( _3 W

      $ N+ I# P6 x2 R# R4 w         run->state='F';  /*置状态为完成态*/  8 y* E- w; B& o& H

      - v. R0 n% d/ R: B

    • 5 Y& q% H+ c! R- V% K9 m

      * i* @5 J# s# K         run=NULL;  /*运行队列头指针为空*/  
      % b6 d, I. t+ P) e& c

      1 G4 [! F/ X6 e4 l( d
    • 4 r3 s1 \$ M; u4 b; u: @

      ) W0 T. j9 ]( {; ~2 k         if(ready!=NULL) /*如就绪队列不空*/ ( [: [8 J/ G# S7 U7 t
      ( M; ^9 X! z/ U' l5 R8 h

    • - O* I- r6 J8 r2 r& h  Q

      8 b9 s, W- n' d/ v) c8 _% L         {  . i( c3 i. Y0 d2 @' Y( f5 t; g' f3 |8 y
      " q$ H# Y1 |/ v3 z7 u

    • 8 m  o) Y2 Z6 c) z1 d( `

      / ]8 m+ v& K# {' q            firstin(); /*将就绪对列的第一个进程投入运行*/  * |$ E, v3 Y8 X5 Q( d& J; t+ s) L

      - J3 C% P, V" I
    • , x( X+ I9 M+ S5 P# L/ e9 |
      # d$ {! X( p% l* t$ n" R' _
               }
      3 R, {) ?# F$ }  e, H

      ! o. x' u8 @( E" X

    • 7 U( r6 a; W2 ^5 y. S; x

      - r' f/ f: a( M* i2 |: A      }  # s( {( j! t) y. n
      7 x) N& \# q* z4 P' T- D2 ^

    • ( }8 N8 n8 e  |3 Z
      4 d7 \; r+ U) ?  T
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      ; \# O3 q; o( r# S: l) ~; ~( @

      + I2 I! p1 }1 ]( `! r# a9 `
    • 8 l9 _( R' A+ R! W5 o9 W: h

      ( c/ K$ q( P. o$ C, b" \     if((ready!=NULL)&&(run->prio<ready->prio))  1 H/ H# F& q1 v0 J/ U( ^

      ' G, O  S+ z. p, ]+ k
    • ' h& G9 }  d- x* w- }" p

      + [5 f% w9 y0 I     {  ; o; M/ Y+ ?4 |% G& E: j

        U3 @  X% d2 N& |# |6 n

    • / S( W* d( `. a

      3 Z7 d  c& O3 [! l& r        run->state='W';  
      % ?0 H: |0 w2 A  o+ i4 V
      4 d  B) r( ^( ^" n4 R/ B6 Z
    • 7 u+ v& b  h6 i) q
      ' P& m# G7 N' Q) S( n! x+ J
              insert1(run);  0 x- I+ ]+ Y6 P+ P7 b' y
      8 j- z3 e; q% Q. e2 T5 y( p3 U0 M
    • % b0 a9 @& M$ |9 L

      ! o4 F: P; x+ j& B+ q3 V6 U' g        firstin(); /*将就绪队列的第一个进程投入运行*/  
      , q1 K$ E9 N/ _; d- f/ ]
        T1 D7 [7 _6 a: q3 T1 N) E2 s  i( M
    • ! T$ b& G3 ^( v& n  A% S. {' ~

      7 X0 G* j" a# S% P1 o3 U& J+ A     }  
      2 ~: N$ Q$ B0 k# P; B
      7 ^) Y5 V6 l) Z' H2 B. R8 i

    • 5 I' [* }8 i8 i( f5 ]3 i+ V

      8 L# \4 U: F7 C, h! a2 U      prt(alg); /*输出进程PCB信息*/  
      # e3 }  f" u; w% A8 G

      7 O3 m2 P; Q7 a; e
    • ' j: V7 S; u0 `4 T9 t
      ! z3 R& K; a8 G8 H; v' }4 E
         }  
        M& [5 _$ Z. n0 V8 ?
      ( B% f0 y# j3 I, {7 U/ l1 K
    • ' e7 a$ s% k0 K" x6 L' g

      / K  [- D6 _, J/ j+ k3 O6 y}  
      ) s4 h7 E7 j! }; L

      ) ?# M* c9 f$ x7 |. ^% h& B
    • 4 o4 o8 _& D1 P
      ' `- n+ R# R8 H
      /*主函数*/  
      / `. _3 X4 k& O6 {; Q
      ' ~; f5 C" m  S3 U7 ~
    • - w3 [8 A9 {! J% t1 N' P4 t

      7 _1 E# n: K+ O1 G# D' e4 _main()  
      & v2 r7 p0 ]2 ^/ b1 a! K# @: `
      + E1 g# e* p' K6 r" N. y

    • 6 L4 x" H7 o# c, _
      + J$ `5 _  u9 Z" R+ V% H. p' _
      {    i& D" w3 e( p/ W. g+ J

      $ Z* [, U" s" u0 B

    • 0 v- F: B; _# L5 o) f, u1 l

      ( u2 B' m/ b5 E: o' F( A1 q# E9 ?   char algo;  /*算法标记*/  0 j( v9 z  H% y; t( h. y
      ( U1 L0 B: U! T+ E) D

    • " s/ L. Q0 S9 e. s9 i

      2 k1 V+ K) x, X, E" V   printf("输入P确定算法:优先数算法\n");  
      6 E4 L8 @/ H+ c/ Q! t

      6 E" g- ~2 z; @" ?
    • 1 b! n- K6 T7 ]5 i
      : A2 l( E* R" m
         scanf("%c",&algo); /*输入字符确定算法*/  
      . o) b' N9 M/ {+ |3 D; b' {

      8 @( T. F2 v4 }4 B9 q9 g

    • ) i( {7 n$ ~5 u$ B$ y* k
      2 X2 q  ?2 M7 t& \* `5 X/ D* N# C
         printf("输入进程数:\n");  
      / [% p# j2 n5 x' v( L3 \

      % w; h5 u, h8 Y' c

    • ! H4 W, j6 i3 S: W

      ! b, |0 m, L& f/ l. t) t   scanf("%d",&N); /*输入进程数*/  
      1 O2 [$ ?0 R, X- g3 T$ x% Y7 U$ k

      5 |1 N$ n( u, B3 }8 Y2 h8 Y& G

    • / L4 \% e* m! v' i4 c
        J) s3 _+ L( W& g! m& s
         if(algo=='P'||algo=='p')  
      ( o3 q" p$ A5 @2 s  h  x$ E

      7 J. W" P1 @4 Y
    • . g2 O6 r7 y0 F9 n. s/ i. M
      $ z3 G! s; x7 L7 }# U9 e
         {  
      % _' X5 e8 B0 s0 C, `' a

      ! {  G0 \+ ^9 X4 k: J# R

    • : G  X9 Q& U, P, V& y3 J, R
      2 o6 }( s; x. O; u6 U* o- N# e
            create(algo); /*优先数法*/  8 N; g5 w6 F2 n

      8 D4 ^% @3 P) S+ j+ D6 @3 I2 O
    • / j. e: s8 g+ }" H. A# \2 h
      : k- d1 k4 f: X
            priority(algo);  - v' L" \- H, S6 U& m, q

      $ w3 P+ g0 v  h: @

    • 9 v' b1 m7 W0 t* j4 o2 J) r) A
      * ]) ]( s& D  q$ I% T
         }
      & {: j/ t2 H6 {1 P$ q( u

      " L  M4 ]" I- u! X/ _7 E' O, T
    • ) X& c! t7 V# |0 B" o2 Z, v

      - d2 |6 q" W. |# Q! N7 V, g* P}) z8 l! O9 F0 q" ~  R( N
      1 c* d0 t/ K# i; ~. c0 |
      % R  A/ Q1 v. w7 D4 x9 C' Y


    " G; @! }- k7 a' G输出结果:+ n# G7 [$ H) A0 T0 U: t) {7 k


    / D8 J+ h, M, b9 D原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    ) ^( V2 M0 P% y3 w; w5 `
    / _# J7 Z! i1 k  h, r4 P
    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, 2025-5-16 11:49 , Processed in 0.611006 second(s), 50 queries .

    回顶部