QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3204|回复: 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
    ' p( ^( e1 p- N' @3 r3 M
    优先级调度算法
    * v' L8 ?( j8 Y3 u8 ^6 G! I, S

    算法介绍
    & b, M* M1 f) M/ Q! w* Q优先调度算法的类型(用于作业调度)8 t% n. S$ Y6 d
    1)非抢占式优先权调度算法
    ! p1 y- p* ~! t" s  N8 Y系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 , V4 _$ D+ j7 V
    2)抢占式优先权调度算法
    2 n" {" O4 A* L! N" r/ S! t只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型4 l! |( |" Z  Q
    1)静态优先权
    $ U$ w! i" G; X0 A3 U1 y  b. H. c静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    3 v; S5 [5 ^- Y; E3 q

    2)动态优先权
    9 }9 @2 x- f2 u# a3 m

    算法实现

    抢占式动态优先权:


    & b+ b- `8 C; V) {2 S# RPS:本人认为非抢占式静态优先权没有实际价值。

    • 0 M7 D( r9 x& L

      $ ]+ ~  a0 T- q* n* o: E#include <stdio.h>
      ' S5 O/ Q* N' i. v

      8 @: {8 c/ G& ]& W2 x8 N: v6 L3 O$ S
    • ' G7 ]8 J6 G7 i9 D7 D1 c

      " w' ]. {/ E9 A1 L) v#include <stdlib.h>  0 b  l% a. @- u. {" t; L
      * q8 e3 t8 k$ E+ S

    • 8 l% |; \" K/ K# Z5 d/ n; A
      3 w4 ^5 |& ?% g; s5 H. ~2 d
      #include <string.h>  % |0 h& S0 b4 }1 ?; G
      ' {$ H6 x5 B9 v( N; `

    • * L7 ~, u- o( c% k5 g

      * m, {  h1 v. S: J* Q) G6 Ktypedef struct node  9 z. a$ l' d- e  ^$ u

      9 U* Y! W/ k0 s9 Z7 \0 D

    • ! b9 y0 @6 K: l

      ) W: g0 I% x4 G/ x$ h: B, \( D  A( C/ K# U{  
      * y: m8 r) ]0 O8 C6 k1 ]0 v1 j

      : x, t6 d4 s# A+ F0 L. G

    • 3 Y  S, c% I& }4 u  m
      5 @$ X3 _9 ~( _7 Z* V  s+ V
         char name[10];  /*进程标识符*/  
      0 i2 @% G% S& k4 e! k- W
      # r9 x$ x7 k% M9 g

    •   d: `& J4 `1 I6 m

      ; w+ l' K  d0 I9 g' N   int prio;   /*进程优先数*/  8 Z/ w8 W+ G' D" o
      ) G% l$ V1 ?1 K6 K4 P! \' f

    • 8 K* E% f2 Q% }+ f/ |

      % |2 x. K# a$ f   int round;  /*进程时间轮转时间片*/  / ]( e. O+ [! @" E/ g

      8 w" y; m/ y* [8 E
    • ! a" Q. N( x& q" i0 y) {1 @1 a
      8 D( X* ~& r9 O$ P5 Y0 |
         int cputime; /*进程占用CPU时间*/  
      % p* P, c9 Z6 f
      9 A# ]1 B' v' [5 b! j1 A" m4 ?, ^

    • 9 m/ }  O& K! h: S
      % |0 a( A+ ~# A( G9 m! l
         int needtime; /*进程到完成还要的时间*/  
      % Y4 o+ n2 L4 ]  V/ V! Z

      ( K. d' P! p$ T) e6 x

    • # r: e  E" Q1 k5 z" O8 h( w! ^# j, V
      + C  V1 y. _- _3 ?6 x2 u# s
         int count;  /*计数器*/  
      . r) x* {. t  h2 K, ?7 s/ s* m# k

      4 k* F3 }% W" }* n# n/ c( h( Z

    • $ K% f/ i! D& V( E7 M

      * c. E/ y5 `" }! r% R9 X   char state; /*进程的状态*/  - t1 i7 @, G% v0 v' g, r% G
      4 E/ D4 y, j) u

    • ) f8 p* r* f5 u6 j$ }( c

      2 J: k/ ~) s# C& ]. s6 \+ g2 Q- r) E   struct node *next; /*链指针*/  % C0 ^, c# A9 e0 |7 z$ h" `
      % ?0 j/ N2 G0 b! b0 ~: I
    • ! f' l7 Z3 A" x1 ]- Q4 f

      ! `: N) U+ x9 o7 T1 n. o}PCB;  # R, W2 N( T8 R4 _2 `
      - y. T1 G  ^* y5 |9 }9 m; \: s& @( V6 V

    • 5 [; I" k: |6 i- Y7 H: i- F
      - z+ W/ F5 A( f5 `9 f5 L
      PCB *finish,*ready,*tail,*run; /*队列指针*/  , f- K' l1 W% ]" m% |! l
      9 e5 R' h1 @/ ^5 I7 K/ O
    • 5 N9 D9 {+ G9 ~1 p4 b
      ( p$ C  q' m0 h5 C  z$ U
      int N; /*进程数*/  
      $ F' H$ m  `; [) ~# I5 |

      1 [% T. t& l: ?) b4 G+ {

    • 1 n! z4 R" N+ U* R, X! D# g

      ; K  ]; @* a( |7 D3 ~  M/*将就绪队列中的第一个进程投入运行*/  
      / B) A5 g& J1 I6 G# ?% ?$ z
      6 j: ]1 U, W- \7 O  W0 c9 y
    • % x8 _' h+ z; `1 [, c$ k
      ( R& C$ [+ s6 X- e& [7 K9 D( A" ^
      firstin()  
      ; y' L/ d. I' c( T  `2 }- q

      ( f3 u: T# W$ m$ D; z3 l7 d8 v
    • ' u, g$ X! U* V3 N
      7 o# Z: y7 e2 @& p- T
      {  
      9 A* U- h+ K' R: t+ q
      ' {: _/ j, C0 c0 ^$ C) S5 j
    • * I% W3 _, l9 ]" |  V
      & Y1 `( I, \5 r8 E
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  . w- ~+ l7 H( m1 H- W! `8 Z

      9 ^; [5 _8 l$ ?5 z( a$ i, f
    • 4 U5 H. J/ H5 M$ B" q6 q

      3 D) p9 X: J( i5 ~/ b+ l# p4 ]   run->state='R';   /*进程状态变为运行态*/  - D" A9 U- U4 R9 g' {

      7 M, Y3 F8 z1 a$ Y
    • # W) ]+ P, d3 `# d- C% f/ l

      - ]3 N4 m$ q3 `& d4 a1 ^   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      ' b, m) h: _; N! d0 B$ q4 T3 j

      , F! c* L7 c2 c: H
    • ' _' n0 n" {2 e. T  [
      $ q$ @5 E# G) ]  B6 T0 o
      }  $ ?# k9 M3 J6 e  W

      . I: I3 k8 u% \

    • * z+ V  |- G" s# ]9 C# b

      + F6 }" R; t# b+ ]! M! x/ D, `/*标题输出函数*/  
      : C. M; T4 V9 i# E+ q- K9 ^# S3 a

      ' {- ~1 z2 y# J

    • 9 q. t& `; l& Z% }2 J4 \; S8 {8 [" o# M
      & g1 |/ F3 e% w" L! `
      void prt1(char a)  + d* C' U* c+ ]" c5 l4 t
      6 |0 H, W& Q% w8 j) a0 _" P" ^- T
    • & _( e! _$ s  t# c4 w, ?9 H
      / X$ o: l, S/ |( ~7 T9 u( `
      {  
      ' a/ q$ u4 l# F5 J# u& Y1 M

      3 q1 j2 j. R$ m1 F( b' T
    •   h% O$ d/ p8 Q4 A" i
      9 T3 C( J) l8 |/ R2 t& ]2 p
         if(toupper(a)=='P') /*优先数法*/  
      # Z. A: m: a7 _0 i/ C2 P3 @0 \

      5 P+ S4 F6 P4 {- \6 e; }

    • % ]& g8 I- m0 Y" A( |* m5 h, v" ?
      ) |# l1 O0 Z  \
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      ) z9 ^2 r0 M% [) [4 A7 a; I/ }

      % \: m$ u0 U2 X* T, {, a
    • ( [  t* w  i5 v& V$ o# u7 j6 o. ^* ^

      $ J2 S4 p4 k3 d0 w6 D" Y$ l   else  
      8 M, a7 W4 g1 h7 w& a, [

      . v% ^; o2 F3 S

    • 7 Q2 J/ \4 ?* Z$ M* P9 O

      , K' e: h. A& Q0 o      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  8 U" ^% x  A$ M5 @; F- K/ j

      7 |+ b5 H" h# _0 [! \

    • 9 l4 v8 |6 O3 g- d! N; v0 H
      + V" b' D/ G" ~7 X+ `, Q/ D: o+ U
      }    j; C  E9 T3 s9 L* m+ D
      ( s7 q. b+ v: K! ^, o) f

    • 5 A" y4 ^- @. N% `
      6 W& M( ~8 g2 d4 H  t8 O1 ~5 F* k9 l
      /*进程PCB输出*/  
      ' h* u4 H9 u, H9 T: _" X- `
      1 z+ O+ m1 i2 Q  y( f( b

    • 0 k8 T3 ^) M6 Q1 v# v) ~

      ) h* l9 x% n% s9 n9 P4 H! c7 mvoid prt2(char a,PCB *q)  1 Z2 e6 x% t6 `
      7 i) R! ~% Z' y$ |/ C

    • ( G# ]) i, t8 }; E9 w5 j1 I; D

      - X+ f  ?4 Y5 Y1 Z{  
      $ e2 ]" W) r7 I) D, c
      + |; \, x: N- i" T' G+ h; E  m7 H
    • " R$ }" M6 l- \6 L
      ! ]0 g/ l0 q0 N) P& H. u
         if(toupper(a)=='P')  /*优先数法的输出*/  0 _9 W/ q' S* \' {+ ?- d
      5 j9 @; E* J3 d; a4 h8 O$ d1 M
    • 9 o' n6 r. H9 W7 P8 q4 \7 [# }+ J
      5 Z) o1 z# e6 C0 s
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
        \, d/ z  A/ G) A' Q( W
      * \4 A, I0 I, ?3 }
    • + ?$ }2 S  h: S8 P0 |0 r4 ^7 _
      2 o& l& N1 d5 }
             q->cputime,q->needtime,q->prio,q->state);  
      $ ^. r, W7 ?5 ~
      8 q" B1 [6 A- P$ n8 \8 @& W

    • : Y7 u, R! S4 B  f" l) T$ k1 e- `
      2 P. C: f5 k# W1 s# D3 X
         else/*轮转法的输出*/  ( k1 `6 V) L9 g8 K
      ) \  v' N, ^+ x. D( L

    • 7 p) d9 z$ H5 @- L8 J  z/ J9 o1 k
      9 m+ l/ ]- Q7 p1 h
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  9 ~' i$ C" J0 h" ~! ~

      ( ]$ ^; j. m" y" u0 g& p4 N2 [

    • 1 r. \. {5 F- t) J9 T' |( j* d* b

      9 w+ t/ f2 \) w3 s' @       q->cputime,q->needtime,q->count,q->round,q->state);  
      , S- v( r2 c9 `( ^  q& z  u% x

        V! F0 ~% ]& _- ]% F( B5 G

    • 2 Y7 B* w" g3 k. U
      ' O; k* V- P' e$ x, c. g
      }  7 A" ]6 A3 R  g; B  p) \
      . l" E0 U) f- Y/ Q

    • + i% @# c( _$ t$ J/ s) @4 U
      ; h% z- q$ w: R
      /*输出函数*/  
      - G" F, D3 S4 N3 ]
      # H" w# [7 O5 E

    • + r. x" H" i" Y+ J5 z( x
      5 z$ }" C) S/ ]+ h  u: w' J
      void prt(char algo)  
      3 u# p, x2 i# v2 ]  @& a

      7 E; M# v4 m0 `# Z; g, r" F
    • : a4 H/ {3 }3 c, k4 u$ z" r9 ^
      ( ?: K% T  R, z0 u" t1 n
      {  
      + R; Z+ }- h7 r/ Z9 U

      5 K( c- e, N; g0 I- r  i  u2 G
    • ) W  G% O9 W. ~6 g7 G" u

      7 k5 k) ~/ O3 i1 C   PCB *p;  , f, l2 ?. Q# Z5 x4 W8 [

      ; C5 O& M. Q9 `5 d+ O

    • - `; Q9 C9 Q! B; [+ J# n+ J5 S

      . A. y$ S4 n4 f$ R6 V# ?$ f& B% o   prt1(algo);  /*输出标题*/  $ `; B- X  ]6 J( C8 K) c2 W

      / j7 ?' g: M* j( t4 s
    • 4 g: {. n0 f( y: L! R  E

      * ?7 h0 d, C7 q& ^1 I   if(run!=NULL) /*如果运行指针不空*/  
      : f8 G4 Z9 N$ L9 X3 U5 f& {1 U$ `& b
      3 z4 X/ w6 b1 v' Y( i+ ~& k* h# @
    • & r8 F: C, p" z5 Y

      , [# W& N# T% ^+ U      prt2(algo,run); /*输出当前正在运行的PCB*/  
      4 C0 _" p( v4 o2 y& x# K5 V
      + X! ^9 }5 n' v$ ^3 n4 e- K/ a
    • 9 Z+ Y7 m( F/ }8 z7 r% c

      & j: n* Z+ y% C- L* q% H; m   p=ready;  /*输出就绪队列PCB*/    O$ [% h# D" z( d1 S

      , ^. p. o. @6 L" B, _2 L
    • ( q, K- g! g/ F& Z/ ?5 y

      ; u+ `% y( a# R2 c$ z4 x/ u$ o   while(p!=NULL)  
      + s1 k: b1 e+ f' C% o- @

        ?* R% u3 {+ G; n- G  n
    • ! G2 M  s4 Q, {/ V, R

      7 x3 ^  _; q( J# d7 W   {  1 k# P2 h" `& ^
      ; W9 i; {7 R0 _* @3 c
    • 8 y( Z0 N7 O9 |4 o+ f7 h
      ( z' H+ F& u0 D5 J5 K
            prt2(algo,p);  
      / J& g; P9 V- y4 c$ C+ U
      6 B7 q* o) ^; E& b  f7 I
    • / ?5 C+ P' C3 M/ a4 ?& i7 l
      / _0 A3 W( B/ i  o1 U$ d
            p=p->next;  
      ' O3 H) C0 q$ O+ K
      " u- K' I) @* ?$ i
    • 2 B1 S2 s+ D2 o. }) S

      . X" [/ A, @* n& R3 C   }  $ M& E3 h: L' s2 Z8 Q! G; v
      ' A4 o# b2 o7 E7 L3 B
    • 7 {5 O% J8 Y: X9 O* |8 y" K2 K
      ' \0 b& ?0 M6 ^
         p=finish;  /*输出完成队列的PCB*/  " g; {: [9 C2 G1 F2 V0 m( e
      . h4 O% j% g/ Q+ C( Y. m% q* C
    • 3 W1 R  R+ Q9 `

      - e! A$ Q9 K, B* I$ p* X   while(p!=NULL)  
      - A4 |7 |8 }& y9 E( Y
      . Q* N3 Y  s5 _% p8 i, A

    • # B! `6 q- N, x" f6 r

      : H, ]% E4 A) Z3 H   {  ! U! H1 D: g$ w) I
      & V/ W; L$ v! Z

    • ) b! J, \" _% ~1 n' e  e! N; t" h, p: a
      , m8 g* R7 d2 p8 e
            prt2(algo,p);  
      : d; ]3 E1 `1 \# _

      0 S8 T7 l$ ^! D: d. {) Z

    • - c( \' }$ a5 A# \* r) J

      & D7 `1 H" V; T      p=p->next;  5 j- O6 b3 [$ l1 D% N; y5 E

      # B( b5 U! c9 w+ p, o
    • 2 e: a* x) J1 u: ^$ U1 ?

      ) W- w3 m2 q* B+ a! Y1 D   }  
      / {' l7 F, d& x9 [& k

      & c9 f4 _+ [  n5 F5 L' C! u0 g

    • 3 ?0 J- t  v& \( P

      2 g% r  J( a0 Q  u   getchar();  /*压任意键继续*/  
      * n9 U  L8 L/ F2 K- h9 u5 t' I
      % P& Z+ A" C2 X4 v9 Q
    • 6 T7 b9 i, B1 l& M; y
      & b- f) u2 i) `
      }  4 x) W' l" ?2 i/ P6 G6 i
      . t6 m& v- L/ y1 N5 x
    • 3 P1 ^; |& N* |9 A0 ^
      ' c: I& p+ `8 C, \
      /*优先数的插入算法*/  
      - K( W: r3 U8 y5 J" W

      ' ^8 ^. |# v# {) H. T3 S  r

    • 9 w" x$ {; t; E) R2 p1 [! J& d
      8 W9 m7 V7 B' H- d6 Y
      insert1(PCB *q)  
      7 O  g- `0 z! W% p% l, W

      . |" ^( K' @# Q0 c. U. g% y

    • 1 Q, C7 N$ Q: ]" l( f7 k* k' V
      : F8 H! K  M$ K! M& A
      {  
      ! B/ C4 f5 ?: l2 p) J( _
      ) K& W$ |. V: k8 M: F
    • + w' _* V( ?  F) u2 X' E. u7 k
      4 q( A" m! C3 l, p% L9 Q  l3 i- H
         PCB *p1,*s,*r;  & b  M8 H2 ?& C8 G) m' [6 r; l5 o
      . y8 s" a9 T" }9 S8 T5 N  k$ X! j- a
    • $ z; A+ {% [8 H0 B7 Q+ h2 q

      5 S1 O2 D4 k0 N2 Q& e# c9 `   int b;  
      5 W& K$ N4 b+ i8 R

      ( ?) u, V/ J  H/ Z' M

    • / w- x( Q# d5 S' ]% ^

      6 u1 v) M+ H" R8 f8 f" R   s=q;  /*待插入的PCB指针*/  
      ' e) C3 [/ g$ @2 J9 l  |; l

      ! p9 V$ b- z" P3 P8 q6 f

    • ( c1 s+ J* p3 p8 P4 N2 c4 s& D# I; U( r
        ?$ T; z+ P; C7 \
         p1=ready; /*就绪队列头指针*/  
      8 M- Q* h0 d% s! S8 X- Z, ^
      , k. u9 K, y( d1 \9 l3 X  |. D0 |& m

    • ( f  R1 B$ s, A% l- X
      4 B+ H' D, A, G4 j$ W6 w: S3 ]1 M
         r=p1; /*r做p1的前驱指针*/  / Y; b, i/ ?/ ]4 L  \
      ' U/ D1 G# G1 ]7 L' F3 L/ ^- _7 c
    • ( ~9 {, m, \& u+ [$ v+ b# _

      4 `1 y9 D" ]- u" a! H" G0 ?   b=1;    \5 U& f0 [8 M$ J" y
      ) b' ~9 B2 M% k' f

    • 6 g4 |! L* s! C% O5 G: f- o

      # g( o- Y6 c! j+ U   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      " Q& ^, W! I" I5 }3 N7 S. G
      ' N* B0 O- M( h7 A
    • / d% I( G5 Q  _% R$ X. X; e2 `6 J
      ' v- z" ?5 k" l; l7 a7 u. t( i
            if(p1->prio>=s->prio)  
      8 p6 C* b% R; l& F1 a

      6 B3 T1 ^9 @7 M: x1 [- q' S3 N

    •   `! Q, u  {2 R$ ?
      . I  T: ]# P$ L, c
            {  9 M) H9 r/ i5 A( L) k
      / u4 e- l9 K& ~1 f
    • ; R/ r8 u+ Q1 x- u1 \" q
      # y2 C  X* l1 \6 }  I! F
           r=p1;  0 K) Q+ |, j( S; ^' w
      0 l. D; X6 W, F6 v  _" J& M; g
    • , o) r1 D9 Q, u8 O% e
      1 X) q1 N0 `* ~
           p1=p1->next;  
      . o8 |; {6 ?& l4 h

      ( s+ O) z7 s5 ?) P

    • / I( _; `% m3 Q: U
      * q# d, g. W" K/ I9 l$ Y. s' b
            }  
      6 `9 g  U3 p1 R8 s. ]: t" @

      4 v6 }5 _% Q% M5 X' X% U

    • ' P+ P$ @  }3 U& x5 d# T; C7 @

      ' O& _) L* {2 j+ f  x      else  5 S' f6 n& P. P- u' b/ m/ t3 }0 A# c

        V$ p9 ]  K, d. y
    • 3 a0 C. R' V$ A6 {6 `

      ' f8 m3 `1 h: K/ g     b=0;  
      4 D( O! S  T; l; x
      * i) t$ f: @4 x0 z
    • , a8 b# g4 E* p; a
      2 ?/ q; a/ `: h' f1 d- `$ J
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      + @" W3 \. t" D) E+ `2 E; ]

      # D- |# @- z) z$ I& L1 F  U; |

    • + N8 w; P' z4 Q* S; R3 O

      # P8 x$ L% P6 g8 g   {  1 P, G8 a* o  g. v. [# \
      9 a) p3 }+ G( D5 S2 A8 p
    • ( L. ~% f( L& h0 b
      ( V- @3 T: o7 x; A
            r->next=s;  
      5 }! `% h7 H% h' l* _- A

      , [1 p) d4 D8 o' ]8 i6 R! A2 q
    • , ]4 E; ^* Y( I6 r  X$ [8 _
      $ A4 t5 f* O) b8 U0 D! x
            s->next=p1;  " R% Z1 z- p. F

      9 R1 I$ y8 Y# \; K7 I- j
    • : p2 e6 A1 [1 y; p0 _8 D  }
      $ [$ X  J1 O% y- T
         }  / \/ ]7 j9 j, o0 K9 t& @- |7 P
      ; V1 w1 z. C7 L3 M$ f) [. U. L& r

    • 6 r5 o5 e8 ?4 m2 }( a
      0 ~* ^9 m$ f, r+ G9 P3 B
         else  
      ( s! t( T" M/ S; _# y4 }
      : e- \  b3 T5 j9 Y: e8 q4 y

    • 6 C7 z6 k, G$ [1 I5 ~) P
      & S0 B) H) r% [$ n- v
         {  
        Y: n" t' u7 f/ n" C
      9 C. u, p! f* ?( h' u* t% z& B! Y4 T
    • ( P0 i" {9 E/ w8 a3 u

      4 p6 I0 z, y' D! R0 J      s->next=p1;  /*否则插入在就绪队列的头*/  
      " [. b: A/ h( b* j' H, z) |
      ' r8 }" j$ g/ X
    • 6 Y) l( o: {& M; B8 i8 s' U+ D
      - i1 z) N' |, \- u
            ready=s;  - Y$ X/ X0 `6 Y# f; H. y  B/ ?4 W- d
      6 K3 d! B! Q/ @" Z' h
    • 7 ]1 }9 b4 e* u9 F# r+ z
      + r( p; h+ N* C+ P
         }  8 W2 b4 }7 n3 x/ e4 z
      ' e3 T' T% V- ~# D" q
    • 0 h3 f/ \+ w9 t- L' |

      6 j( l5 q! b6 V1 K4 p}  3 Z" \8 ?' Y& y8 ~. B0 V' k

      % I) \2 _" J' h+ J
    • " p" O1 [4 J4 t0 N: |5 t; i' N+ i
      9 u+ H% x: ~" H) c: O. j' B, u$ e% l
      /*优先数创建初始PCB信息*/  
      % @4 y) ?$ F; c

      9 q. G5 a' n4 j4 G
    • : k( |' w1 Q* M

      8 r# t$ N* X" ]& n# ovoid create(char alg)  ; @# D6 \) m" w- z1 ~
      + g5 D3 B5 H# a# _

    • / A2 O+ W3 O) w0 Q

      & m& U2 Y1 l( e: W, ^: H3 Z{  
      . m3 V1 |! O% u

      ) |  k& W( c' P
    • : ~& Y  F( W9 [) \& _

      5 o) J) j0 Q+ D2 Y" C   PCB *p;  
      - s& a. |1 |. \+ G& K8 F

      " e- a0 H; B1 v4 N

    • ( J, L7 ?" B$ n! g+ a6 h
      3 l; G6 Z! [+ N) p9 K
         int i,time;  
      6 D$ M, s) j1 j4 W
      7 A! v: B4 f+ b4 j8 Y- V! j

    • 2 m( Q" a6 U+ E
      8 y, R% _" s+ R+ `: c% R5 w  k
         char na[10];  
      : Q# h5 I( _5 [& R: k( S
      , {$ [* s5 m! C9 g2 }4 j

    • . M: i9 x0 O1 ~1 t
      7 c$ d4 _3 ^2 Z
         ready=NULL; /*就绪队列头指针*/    u; O4 K# z' Z- c( Z6 D
      : H$ ]: H. i; E9 q+ s' O6 g; ~/ V

    • " q0 l: \: o! n
      ' Y8 P+ C$ i1 u) V! ]* S
         finish=NULL;  /*完成队列头指针*/  
        w  S* H5 O4 U* U4 v
      ; P# u+ |/ \' ^" l2 Z# u

    • # B8 a6 S& v: l  @6 t/ n7 q
        X# e$ m3 g3 C6 n+ o' ]
         run=NULL; /*运行队列指针*/  - t3 l" p1 Z. F% |9 S" {

      % `7 n* I' M2 N" v! j
    • ! t" m+ f# I: X( n* G! E
      . q. z: Z* ~8 Y
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  5 V7 v! \; T2 ?/ s2 a
      . Y5 z( _* g0 o$ x9 [* @- a
    • ! k' C' C0 E  R( o
      * B: U' y. _5 U9 [8 K6 m  j
         for(i=1;i<=N;i++)    b( a$ M" Z' v) B
      % e' p7 G4 J! B* E

    • ) D, O- C4 P; j. J6 Z( h* r; S

      & f9 L! b! Z9 j   {  0 C; s8 }) n/ o
      . |% H3 n! Z% ^7 J! m8 p, m4 X

    • . G4 v% X' q+ Z6 e6 T8 D; Y
      ( u* X6 z+ }; t* h
            p=(PCB *)malloc(sizeof(PCB));  * I4 w3 U2 J" E
      * v# K9 n% w( b: V8 B
    • 2 x8 u0 Q4 q  P/ I( ]3 {
      3 e) b- m8 ~( e% A. w* r
            scanf("%s",na);  
      5 g  A8 U/ {& R* O# b, [
      - ^4 `( X# A. z9 m

    • - E' C0 l$ _; h2 D! d
      # m% Q# M/ C4 s) H4 U8 ^
            scanf("%d",&time);  & k' L# a4 K6 A4 x1 S

      , k, c' O8 a. v' P- t
    • ' z' K2 P# V0 c8 r; o, @

      & x& p! ~# l# b8 w2 m* K      strcpy(p->name,na);  
      # e% x* j8 \) ?, H5 l5 i3 W

      & X* a4 K% Q4 k0 J3 @. c/ ^

    • * Z$ E" e3 \* u( s1 ~1 Y1 V

      ; I( u) F+ n1 D  m2 C) ?* a, N      p->cputime=0;  4 S% B4 b( B5 M( ~  q( z  u

      0 R" i# s) p7 [# a, w

    • & z8 ^" f; I# ]  G( p9 {0 Q
      ' I) A9 w! [4 s3 R4 ~
            p->needtime=time;  ) `% f. r) S. I/ d  M

      ! ]. o: l/ ]1 k0 i8 ], w; `

    • . a$ }1 z' b6 P7 R8 o" u; R" \( v
      0 U: y1 A" G7 M% o5 c+ P
            p->state='w';  
      & c  D9 G% I: U; j+ Y' r, M/ L  E0 l

      ; [, K- ]0 s. |/ A
    • ; a2 \2 T1 X* X) @* z2 z6 P. u

      . r  ~* L) }/ Z7 O+ o/ L      p->prio=50-time;  
      ) Q3 K/ m- w3 H. x% o
      . [, B# W6 _- p* b1 u/ e" {4 U

    • ( U% S! N8 H- J

      ' @2 W* {; n" U" Q. p      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  8 T4 s. G/ W/ e# k& G0 W
      1 k2 k' }( j; U- v) E- b; N

    • - b; a" x+ a& ~/ _- |' P0 k
      - L$ D% K0 \" v* l. a
           insert1(p);  : Q! \9 V) Q& x7 I3 q

      $ P9 h  R) F& E
    • - M' u0 o+ P, ]) u
      ( A! D% B5 N+ y1 P& _# s1 S
            else  ( A' {; V3 J9 V" Z9 D; Y# [6 W

      , Q( t- y5 u# ~6 x' c% d

    • 7 d/ X: D5 U& W
      : O# j9 o. M& M
            {  
      / E2 z+ F: ^2 V" p: m) u
      1 H! U: o. j: w
    • & q; E, q$ {' V( P: l

      ! g) {1 ~  k2 D0 T2 X/ `     p->next=ready; /*创建就绪队列的第一个PCB*/  
        u+ r  I1 b, z

      , z' v8 A/ B+ S. _; v( o0 \; x

    • - _! S/ R/ a( H

      ! j0 R2 W5 O$ F# z     ready=p;  / }& A% _2 {/ g: {1 d5 t, X; ~" D

      ) w% P" L+ A8 M# X

    • 6 R/ X$ F/ k& J  J  G

      ) o" Y* g/ P) g% a      }  9 s* A% |+ L4 G& e
      ( h! R" [- D* j. v
    • 9 e( {- H* ?+ c7 T6 b; f+ N

      1 L" y/ E7 Q  s# Z3 e# k2 |. B   }  9 W  Y- v9 i6 K( z! h
      + b' ~+ }. H8 U, i
    • 5 F5 G4 i& u, [8 m% E( C
      1 S: g+ k+ r, M0 }/ x: e
         printf("          优先数算法输出信息:\n");  9 o& t4 b3 `; N
      , Q+ g' O7 [# }

    • " e; u9 P  d: v) N4 l2 R
      , b8 f% k6 A* K2 m8 a- r' @
         printf("************************************************\n");  2 w% X: _/ Z2 C. G8 _  P

      ( r. k2 l# f+ a( v
    • - M8 d1 m; n7 ]: d
      ; m) a0 z+ N2 L% @$ K
         prt(alg);  /*输出进程PCB信息*/  ' T! T9 n; C) E: z
      % A9 w; J7 C8 Y0 x- p( q

    • 8 x0 e3 Q9 v* u- c; L% K1 i

      5 p$ |* a2 G' o- Q. _3 {   run=ready; /*将就绪队列的第一个进程投入运行*/  $ c/ L. G$ @# ]/ c" U
        e4 }. W" m8 t$ a. s1 v' [& ]

    • 4 F9 I* A7 W5 d3 u3 f* Z

      3 ]! C2 S2 \6 Q7 R9 \6 y3 q   ready=ready->next;    N$ _4 Q7 e5 S* u+ n. h4 z
      - G  e0 ^  u2 D+ W* Q

    • 1 D8 [4 Y' o2 z0 z5 g1 f
      ; l+ ~3 d8 E: A3 z
         run->state='R';  " _# [# y# c. w5 d. N5 A

      " \' O. v9 B5 n( W" O( ?

    • + \) _1 ^% n5 P

      5 j) U% v2 ^* x9 W5 O}  ) [/ f' b) O' R

      ( [  U( ?( t; q  B
    • * `  a+ z. e. h$ K# O9 F& {

      5 k0 l. f/ W0 Z/ ?/*优先数调度算法*/  
      5 |6 C& W! t+ j# }* y
      + c% \6 k( o( c4 l
    • $ j* ~* i) Y  K: [
      3 `% I8 [) i" x) D  V( `0 W
      priority(char alg)  ( f) |* _  ^& f" p

      : J$ k; B+ C1 V

    • 8 q6 D. c4 U, j/ u

      9 ]  r) N6 O% h4 r; T{  
      9 k4 W8 V9 R- ?6 L: Y7 z

      ) n  h9 E: X& s; H4 g$ o

    • & G# E6 T0 F4 m! j; N
      * d. r$ M/ R7 o; B* ]
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      $ H! V/ `; K2 y4 b  B
      5 b: M- e6 U: Q3 z, ]( r/ z% E; k2 Y
    • ; F9 s: H6 G) ]
      7 @4 i% R" J0 W9 i; ]5 y, v
         {  
      ) y9 g6 v0 m6 ?/ X: W

      8 P" o& A* C, Z( H3 W% h

    • . r0 Q0 ^9 l# u% r+ ^+ I" _4 T$ g
      ( x$ ^) q6 |8 d
            run->cputime=run->cputime+1;  ; X, q2 n, o/ g# [" p

      % `% z+ E8 n: p6 k8 [8 e
    • : H- u& N0 w+ M, S+ s7 r

      ; y5 v9 z% P& e& c      run->needtime=run->needtime-1;  9 G9 f8 ~$ _9 q' u3 p  Y
      ; Z; r# z1 @! ?4 v, Z7 Z
    • - j" h) {- {4 G- S# A2 L

      1 W: n4 \. {' i9 D' @% a      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  ; Z( r& f$ S$ i6 `& x3 j  W; ?
      * W8 n( G  _' \

    • ) t  c! ~$ Z4 j9 E

      2 e# i* T* S; _: ~      PCB *p;' z1 `$ P5 S- Q- n6 E5 c' _

      6 Q8 j% U& F% D8 b% i
    • + [: k5 j8 ^1 H5 w& V6 ~

      0 T7 K& P2 L' P9 S      p=ready;
      2 `: i; H: `8 z  q" t/ o) g
        W: j& j. S6 `) v% X( D

    • 6 }  h( n) c) q6 k3 ^
        k: ^* n& _: a6 h0 q- {9 N
            while(p!=NULL)  : t4 q* O3 P" E

      " A/ Z4 e  h/ R% w1 L) X
    • & O5 @# Z/ B. H. ]5 C" c5 {/ q4 H

      ; D% S% P+ w' B( \  `      {  0 P; y' _( f/ J" G9 f( r9 b
        Y% S* s$ \+ ?+ ?
    • 6 d: o& F7 a8 x- y6 ~

      7 n. M* E, e# x$ w( k8 ~          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      / }& x" U; `: b4 N! K
        `+ p, j0 C9 X$ H9 ^. X" |# ]4 `

    • + U5 H; D4 K$ e/ i4 J5 c0 v$ `: y; G* |
      - F6 j5 k4 D3 g: \
                p=p->next;  
      + R, U& F4 R) `7 n1 v! i$ y) A+ N% n

      4 u% v9 N) Z4 {. A2 m
    • 2 w) g+ H7 X( f

      " Y: T! N6 e+ t1 I2 c% G( U      }  2 P0 j: [5 W! q7 D, E8 _; ]/ p2 O
      ; V8 }' R7 W3 _- ~& F' ?/ c' t
    • * S) z; \5 a8 O; X4 y

      0 t9 L% e' b, C! X$ [      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  " S. |: _$ m* H: A& Z9 c( m5 E8 W" S
      - l# `- i+ n  J' l( k: U& `

    • & p) t2 k( j0 @/ U0 \

      & q& L# `; y3 R; N/ q      {  ; I) E% ~& P  h1 a, {$ U

      8 W* Q3 P& @. r# T

    • . l1 O0 K8 d# W0 l2 T

        Q9 \) U& M; G' j8 h* l         run->next=finish;  , ~  U4 n; b5 M7 B3 j# |
      9 [5 @, L0 P: v6 L$ T" z2 ~

    • / `* `3 c0 U7 A+ [* O1 l

      ! n, Z$ ]. ]  K* I: h         finish=run;  
        d. s" X- ]& A+ J

      . f1 _2 B1 \, M+ p0 j$ m

    • 3 Q  C: g! t6 ]9 A
      " D4 i1 B6 ^; T) H1 A+ p& j8 p
               run->state='F';  /*置状态为完成态*/  
      & u3 c% U/ l8 @( x/ {

      : {% s* s. M. q  m+ H. Z" h8 U$ r

    • 7 J  O* W  S+ t' k: T, d% A
      ' S* a3 h& K; f' l$ R; L( ]) o
               run=NULL;  /*运行队列头指针为空*/  
      2 E- D0 w/ @7 ~8 l1 W7 R
      0 D4 s. r& n% X- X1 \2 j( n
    •   [- T4 c, i, i/ F( [" X/ O

      * K- @! I9 {$ W5 J% y         if(ready!=NULL) /*如就绪队列不空*/
      7 Z9 [; z8 \; m1 Q- p: [- C
      " }+ M0 K$ b, Y9 v+ E9 A% S
    • # S  Y# A+ ?  y  Z( [

      - y, M) k. W; I         {  1 u1 d6 `' @5 @" n+ G

      # P* ]' B$ O- l( D7 K
    • 0 b; a) }; _8 G* r, F! w4 m
      . v4 J' n8 [7 j1 i1 T' \
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      - x' j3 r0 |8 `3 t
      - _& }+ b& K& y6 E) |/ f! O6 K

    • % E7 h2 P  a8 K) X3 l/ J

      0 g, c, t  ?$ ?0 c' u: ]& s2 _* x         }( C! n1 f, I9 c  x3 Y- D4 ^
      $ M; M7 s/ L, }- h2 c  n% l
    • 1 K5 |8 ]4 ^6 N+ E( c; Y- x
      # w/ U# P, |9 g* y
            }  ( _! L% J  i4 g3 l) G
      ( m% k- y$ C7 R& \1 C
    • ( e& [3 q. d% @3 I

      7 D$ q& F( S/ `  h/ ?8 f& f      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  + N$ a: b; i6 p

      4 X& \5 P, }' d3 ~% l0 P$ P* A
    • 9 \2 d. r6 K# u/ @) ~

      & Q0 R$ V( i: l* G2 X" k     if((ready!=NULL)&&(run->prio<ready->prio))  4 ]1 Y+ V$ T. n" Z0 ^/ V
      ! n$ r" K$ P2 ~
    • ) V  i$ @, c: @

      3 H( w" g2 A- ]+ H7 H     {  3 C" x) X# }; Y( W$ P

      ' T# I  q  t( i, @0 P1 C
    • ; F0 m& O" N3 h
      / _- {* w/ |3 e( w) s2 a6 Z& `
              run->state='W';  
      5 D$ E2 B8 \2 T

      1 K' f" b+ y4 r* Z6 X% r3 u
    • 0 n9 {' O3 z* U* K; I4 P

      . `$ b% t7 h( Z; @7 u  x        insert1(run);  , e) I5 t: R3 {! M$ M2 r
      % y0 j: W* I: m$ W" b1 V( y
    • 5 W3 R2 `7 {: O. b1 S
      4 S) Z: T- t; K( u
              firstin(); /*将就绪队列的第一个进程投入运行*/  7 a/ Q3 e5 o' X# D

      9 g8 {1 ^/ ^3 ^0 V! q
    • ! l6 I3 U4 j; B

      0 V/ h% _6 B2 A$ F5 R/ H- G; B     }  
      + P+ K" y+ z  \7 {- ~2 l

      " b" V# A! I' N8 a* c1 z& Y  a

    •   V+ i$ ^8 a4 f+ U3 \

        Z& c/ F) U0 B5 \      prt(alg); /*输出进程PCB信息*/  1 R( `; j% {# U  m
      + I2 x% Y! ~  F, X4 [/ [" w4 s9 D

    • : Y8 _7 I+ |8 z9 h) ]* z6 r

      $ w5 _; ~8 \2 A( W   }  
      . p" |% t  A9 ~

      0 I2 l5 `. b: A

    • , c" e0 v" K2 l: C
      6 `" n5 s1 Z4 D
      }  3 m# }; _! k- J" I
      " F; T+ ~& w% _: K. o4 Z; ~4 K5 j

    • , I# v) ^3 ?  ?# j( T! J! V' F- C* U
      2 Y- T7 V( {" k. p1 h2 x. t, `9 D* Z# p
      /*主函数*/  8 s: i" T( L4 b0 G" J, G  s
      ) T0 D; \- N4 C9 u7 P! `" F# S1 h

    • ( k( I4 @8 P- i0 j

      7 ?/ a) L$ d8 e3 H6 Fmain()  
      . }- ^; v3 }# O3 |9 B# }

      9 {: U) p/ _4 |& I6 o
    • * ~+ p/ |; c/ B2 ?0 E

        d8 o8 \- }% P# H{  5 m$ g; m" c1 y7 n* s% F

      ' d/ o  }/ h# X* @+ r0 L

    • + X, H2 v/ K. M+ Z7 w

      . B, O* }7 }$ v1 F   char algo;  /*算法标记*/  
      ) I1 F% ?+ E% s( L- |+ F

      3 S0 m1 g$ r3 t* m2 h& V; u
    • % w$ e# c5 \  a  q: R& M2 l
      * z( I: t/ C5 k" M/ l" R
         printf("输入P确定算法:优先数算法\n");  
      - O: ^6 t6 M0 S5 A5 l

      6 n" `6 V( I5 t" {" d5 V/ r
    • $ K/ k) K! R) ^4 {3 S" j

      ! d. q( u" _, l% l   scanf("%c",&algo); /*输入字符确定算法*/  
      # E, f* Y/ B! P5 p

      / n% G! ]' g4 @) H! S9 ^
    • % p6 O) S' b  s4 [7 {0 [
      ) [& U( w2 w, q& K
         printf("输入进程数:\n");  
      1 h; Z1 R8 d2 f4 b5 v1 i+ V

      % [/ \( W8 P3 f' _0 L  M. T

    • 2 B8 y0 j/ w- Z! @8 w
      4 x6 h: I- Z" e6 M; {7 F3 P
         scanf("%d",&N); /*输入进程数*/    Q8 Q1 |! W# q  h- o6 P
      2 y. Y9 F0 x* N  K7 t

    • 7 s% N0 V8 s7 [9 i. K; P9 `

      , ~( o7 C) p- y# a# t   if(algo=='P'||algo=='p')  ! r" u- t, B" j, [
      / {: Y8 _7 Z: U- V! {* J. T# g
    • + r0 Q9 S5 e5 a+ V: l4 P

      + d$ y. B* \! s# O! v% R   {  / a; y% U3 c: D% g$ X- |/ B
      : _! U7 M* ^' N. Q; @$ t8 L
    • , b  m  \' u3 d- j

      4 M; g' y8 `) v6 {3 D      create(algo); /*优先数法*/  3 f* p; F+ |0 F0 e
        q- p4 E; Z; @

    • ( n" d3 t. H9 k% V+ @& f
      ( l! q: d! w0 B- C2 O6 _# }
            priority(algo);  5 T$ d/ d/ M' L! z

      9 L+ Z: c+ R5 P9 G$ h
    • 0 t& y$ S5 k# C+ g4 X

      - a3 a: _+ B  U- v# ?   }
      ) T4 S5 X5 v! q9 |
      * ^  g0 B  R! r

    • - j: y& A9 A: f1 s0 `" }
      " k9 q6 y5 n6 o; b2 M
      }
        `+ C9 Z! e$ a5 t

        N+ q* V' z) {! ~1 b5 Q' ]9 B8 B7 F9 c


    8 S, B& R; b; K& [2 M输出结果:
    7 M. u  n: _: @4 C# G; V

    * [* w9 p4 f/ l7 j; d( A4 w' Z
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    ' Q, _5 a& C2 j. j, c/ O4 f/ H+ r2 ~# {
    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-9-8 19:09 , Processed in 0.454641 second(s), 51 queries .

    回顶部