QQ登录

只需要一步,快速开始

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

    7 S4 g/ b' T! u优先级调度算法
    1 T+ B1 L) V' M+ T. I( u

    算法介绍
    + |9 M7 ?2 o6 t2 H2 d# p优先调度算法的类型(用于作业调度)
    5 K6 C( n+ }" H0 O1)非抢占式优先权调度算法 $ R4 ?) Y. t, [% L7 I" A
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 - \  E. m$ A0 ]* ~3 h" Q/ j2 K5 O- t
    2)抢占式优先权调度算法
    ' |- x7 F- T0 A- j. A只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    : s. `9 X+ C( e+ E! v! p1)静态优先权
    ) c2 v. I0 F" a( F静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。! ?; U7 H6 z7 L' y- k- V

    2)动态优先权
    . M. i% E$ m0 k: p5 \8 y

    算法实现

    抢占式动态优先权:


    : h( N" O4 n6 L) @( c8 W% tPS:本人认为非抢占式静态优先权没有实际价值。


    • 2 j( t7 q3 O( P! g

      ; S) L" w4 D0 g2 h, u) b#include <stdio.h>
      2 \) w' X7 J( U# i! Z
      # [" ]4 _- m* q/ \# R; ^4 g* W

    • ) \- W' P: g0 s8 m; w8 v" U
      + `) T! n+ Q8 d; ?- L9 U+ D
      #include <stdlib.h>  
      7 t) }2 F, {7 l1 t3 H4 L
        \" H- A: i) |, ?5 z4 t
    • 4 y0 J9 ]7 J! z9 L
      5 i; y  q8 {+ K
      #include <string.h>  
      0 Y, ?( q# a% l/ W

      " Y" N/ `$ l  `& N' p& X1 c

    • 2 j. U! i8 g; m  t4 m5 P

      : p. Z& A1 S3 O. X0 ntypedef struct node  5 t, Q- l+ J1 `6 R& N

      9 T6 F2 }% P  q' ^' H7 x( y

    • / n, f) Z9 @1 n1 v7 A$ C8 T

      ( q2 Q' i! y( m5 q; O% x& c{  
      1 B& J+ R+ ]; k$ _# E' f7 U

      " M' \; H. m8 y# I3 z! r
    • 5 X/ |8 l% A, |. V2 K

        B; a. j/ `& K2 d/ r) g   char name[10];  /*进程标识符*/    i9 V- p6 W& ]: p; T
      2 K! _/ z  x" O7 q

    • 7 S9 x- r8 W6 }

      4 {( u7 G3 |0 E$ V& |   int prio;   /*进程优先数*/  6 d- S' U/ ~  S1 e

      7 a- t% t. C2 d0 ]

    • ; W7 a& ]  y2 y0 r/ {4 d

      ; b' C# G& D& Y   int round;  /*进程时间轮转时间片*/  ' k! [$ a6 ~# \$ t6 f  ]$ N
      . S3 c; w" M8 A0 N2 C3 J; t5 P
    • $ d/ A* V6 }, k& o5 }) P
      3 Y# i" ?6 R8 x$ ?. m' x) n4 x
         int cputime; /*进程占用CPU时间*/  2 V, F( x! b9 w7 o* m6 D$ S

      9 c% b" ?- }! H  A0 T# X, P5 W% [% }

    •   I, U" v, w& @$ a& e
        M7 j) r" z, i
         int needtime; /*进程到完成还要的时间*/  
      + ~3 b, d0 {# o, p6 Z1 w

      " ^7 ~& y: j* V9 {

    • 3 ]4 @, _5 Y* W: n
      " v8 A( `! Q) @: v; v% z/ ~
         int count;  /*计数器*/  
      8 _( U  J+ _& v# u; K3 z5 p0 G0 T

      ! H# s- s4 I) c/ \/ v  N
    • % ^: t# t- k* V7 f; M$ J) F

      + |  e8 R( C1 T5 ]! j   char state; /*进程的状态*/  
      " f" K; U. {  I) b% g( R2 B* |
      ( }' i3 b6 Q$ \, O) u

    • 3 Q1 d* d' i: l6 x+ P( w4 r  E
      8 f3 T  a+ j( |4 d
         struct node *next; /*链指针*/  3 c' W. ]+ H5 v: c6 _. l

      + |) Z) O+ `' M8 j% U- J- U: ]

    • % g  B7 D5 i, R, ?  G

      ) N6 e$ p* V: C* J: x2 }4 G}PCB;  4 Y$ A+ P3 \% ^9 L: p% S7 D

      0 j2 W5 w2 Z+ {9 b  f# ^& N9 u# c
    • 4 N1 R8 S6 a- f, [5 B: x* @8 c; N$ S
      6 x' z; K+ Q" Q& {' ]
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      5 g3 E6 |; W; h6 V" O( \! F

      0 D# Z- ]& R: K' O8 T

    • ( m( N9 C; z0 f% m" d* p( L

      1 k! ]0 S/ B( _, ]$ R" O0 Cint N; /*进程数*/  
      ! d- M* s  D5 x' e  G+ Q, z( A
      - r2 w$ w) C1 V0 _- m$ @& D

    • / E6 u) A' x+ s* O$ U
      ; [: E2 F" b+ @' f% M
      /*将就绪队列中的第一个进程投入运行*/  . K* C' O7 m. [3 k

      5 d" h& t" @1 F5 A6 Q# L( ?! N. y& s

    •   ~  P8 K  i  a6 @4 n4 i5 m' @

      8 o% b+ ]& l( V" c# P% a& ?7 Sfirstin()  
      3 L! V' A: Q1 o* U( B
      1 d, s* a% k. R* O* e. u, k
    • 3 Z: O- j% U9 B: I& y; Q$ ?! {8 H
      ' ~- g$ U1 b( b/ h4 }
      {  ( F6 J" }% v# E6 E4 b- K

      3 {  a" d  A2 b- G8 Q' _
    • 7 |3 C& Q( \' B) E( r5 ~

      ) I; w& [. F" I& b) G5 i   run=ready;   /*就绪队列头指针赋值给运行头指针*/  + h6 O! _' w; e6 A( Z+ T
      ; n. u# _0 M7 P& E) C

    • : _( r% F* q: K4 F( U
      * g( `8 {* q5 i5 g# g4 b/ @6 C' q
         run->state='R';   /*进程状态变为运行态*/  4 }! |# g+ L  V6 q! X" a/ ?
      , @# h8 G0 [+ `8 e0 n8 b+ _
    • - a9 k+ C1 ~, v% \

      / ]# g7 T8 c5 R6 E   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      , a: Q# a* g5 S$ c
      - `5 n. x! N2 t! `9 z
    • ! C. E1 u- B  K

      6 F0 j+ S! S2 S0 P' G% ~6 e' j0 S, B}  
      " i. G, ?# b" V& C1 k" L$ x/ M6 D/ {6 P
      - D! M' s2 J) c. u3 O) w

    • ( {# V* a$ Y9 ~; X6 S) J$ J+ Q

      + [6 D+ W. M% C) f/*标题输出函数*/  
      ( `9 ]& n8 r6 {6 i4 S, S# |

      5 v. ~1 k- ^& e4 b* }# E
    • - Q# b2 ]" w, \2 j+ R8 C) W- k
      3 U0 Z7 E, q& {  l3 `; x" Q
      void prt1(char a)  
      0 P' o0 C% ~# F- D0 ~. M9 [. u

      , I8 M2 o, p  E) P# F; X0 A
    • ' m! x% V* q/ b# I) O- m
      ( ^% i: b1 L  s% v/ F6 J# x
      {  4 T; m7 |8 a. H$ B( F/ x
      $ q2 l' B- T$ @8 a+ w9 ^) [1 B& p

    • # _9 h' v/ l; K! ^2 g4 b$ _- z5 p
        U5 l+ h/ Y# l; H9 J$ @' Z) F
         if(toupper(a)=='P') /*优先数法*/  
      - K  v- S+ v( M8 v3 W0 [( T2 r& c2 n$ @
      & `. l1 X( [2 E& Q
    • / ^5 l" r# v" t; F( \* ]# a
      & d* I8 L; S. z. o9 H
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  ' L2 ^' t' W2 W( B/ x1 f
      # n; I* [" j2 W1 o. p

    • - N. A* k3 U9 ~* \; y

      ( p# ]& C: Y( Z! |( v) Y( m: z! N% m( Z   else  8 K) G  o) w/ v1 |) U- v. u+ R% |
        Y9 m7 W2 l5 c& `. j' A) `  ?
    • ! U) _' V2 D4 n; Y
      & j  u7 a( A. z: U6 ~; w4 v
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      0 p; U3 }+ l% ~' M

      % m7 ^1 U8 M8 s, w* r; E( g
    • 8 N$ Y4 C. q1 J* s- k  Y# p

      0 Q/ R4 j% k- d! k; z$ L8 |}  ) R( t. A$ B4 h% ~. f! V: Z

      $ e* F, _+ y. @$ g3 Y  T: W
    • " q) a+ R8 v% ]; F. T" |+ {
      ; ^3 H: E, c, E3 }2 |* p
      /*进程PCB输出*/  
      . c% S9 U5 t( Y3 h
      $ z6 l6 D5 v0 s$ x! n
    • 5 y7 H, O9 l, x0 D1 _6 b  R
      0 X" s/ S, y6 j
      void prt2(char a,PCB *q)  % X4 c# ?4 u( P" ?6 F3 ?

      + i+ u, ^: `  g+ g+ w1 g
    • " y- X7 Q8 R. k7 V
      + Q& p! K* D1 |+ v: B% g+ p
      {  & P* I) O2 ~6 I+ ?# \, \; \
      9 D8 i) C) X; `: S6 e
    • ( U8 s! c) H6 x# k/ _
      ; P& ]# M0 X8 P* ~: e( ]
         if(toupper(a)=='P')  /*优先数法的输出*/  ! r9 r/ X: \8 l; U: a- C
      $ b: f- S4 H" q: R+ R: t7 n

    • ( r. E* H/ Z* z
      % r3 f; s3 }3 A( \
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      * c- h8 P# g- d! y) r6 y- I
      " N+ R5 @4 M3 m: ^, D( f4 P/ y

    • : R+ h3 v2 H  }3 p, d4 Y$ I) ]

      2 O! Y* ?; k* `! {* U% q5 m! |       q->cputime,q->needtime,q->prio,q->state);  
      : }6 l) z5 f* `  ^, z# E
      7 D) }: P% Y0 V) l% H
    • 9 s0 J3 E6 @; O

      0 ]0 Z, t4 R2 F, E4 c   else/*轮转法的输出*/  9 q5 b5 P  w$ O' U$ o

      $ W! a8 @; P0 M! \3 |! O& D3 W

    •   q2 ]: r: u+ t. V" {) A6 O

      & b: ~3 Q$ \# ^) X& ]* i, e      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      7 w- H' h7 W! {3 Z5 [
      3 e5 _1 t$ i4 u& u: d9 a
    • * p. m" f8 |( K' Z

      8 j5 ~% l2 ]4 D+ a3 x# d; D& j: i       q->cputime,q->needtime,q->count,q->round,q->state);  
      - E' z( b9 u5 C% z. o3 N( W' F* Z

      ! L& R$ g3 O- q8 }

    • & Q7 [4 G' }8 ?

      9 j0 l, d2 R3 E; c* R}  
      1 O8 R) D# d  i  _

      ! E# R9 y- Y6 }6 v

    •   k6 ?$ E* k$ t. J7 L, {
      ) O3 `) {. g1 {$ |  K8 P
      /*输出函数*/  $ Q! ~. ~/ `4 e7 J, d9 E
      : _& l3 _* ^6 O  L/ P
    • 6 y: D# \. R; ?# M$ l2 [

      % b. U. y) L& O1 O7 Z1 v9 Y3 kvoid prt(char algo)  7 ]8 Y) y1 F. N( D" q
      3 F+ T1 c2 k9 T2 ]3 U2 z
    • 0 [6 G3 H7 w* z( H: J

      7 a4 e$ X* ]$ F6 |, y{  
      9 V! Q0 R6 @. _2 p: \  N

      ( p- O4 n9 M: p! s9 S9 M6 A

    • 7 e* Q0 A  }6 k. Z- F: U* [1 n, j

      % y; |. \8 N- u. m# o, t: r' F   PCB *p;  
      * t2 o* w/ n& c) B& I2 j* P

      : I/ y8 S0 C, A, K7 E

    • 9 n' n1 b1 t/ j1 e5 D" r! E
      7 a" P+ i% C1 S0 n! h! S7 J
         prt1(algo);  /*输出标题*/  ( k- F7 ^7 [: G) L# P: u. |
      # V3 z2 w* q1 r) E) A1 {

    •   I0 l4 e  R6 D8 E- e8 w% c! ?
      . _1 l6 M( C4 i) o
         if(run!=NULL) /*如果运行指针不空*/  " Q: f6 l4 V) u5 W  V# l
      / p9 z3 ?  o7 ~
    • + F  x1 o; e( ?
      ' t5 O; ^9 p; h$ J' z! [
            prt2(algo,run); /*输出当前正在运行的PCB*/  : \+ c3 F, b* ?' R# l/ U* m
      / I' O, _: r! Y4 q3 ^' I
    • 8 }. Y" }& F# @/ u' d3 K
      8 Y/ W3 Z- n! l6 {3 E! W
         p=ready;  /*输出就绪队列PCB*/  
      ( X7 a% c( I# H7 X3 [
      0 {$ Q6 p- g- |- O
    • , Y$ p  Y" M; ?2 O

      " L7 n: s  n: r   while(p!=NULL)  5 D, W% g% \7 I! Z% w  X
      # R0 l) x' S8 y7 X4 v

    • ( [# z* Q: X! j

      8 s. N( B( x* g" S% w   {  
      , B+ m* N! S$ S7 U
      ' q( A5 F: \5 ?8 T( ~% U
    • 0 j7 A* Y+ T0 a) h
      " J7 `5 {$ c/ a+ F* @
            prt2(algo,p);  
      ) E; j& m4 A3 [+ b& ?% ]- j8 V

      . F: t. }9 e# }, b

    • / ~( F$ Y. d/ C# J
      - G3 e8 @* `8 u# a3 }, ?
            p=p->next;  / x# G# G$ x0 {- U( b7 z8 K( y& d# q

      4 y: |% C4 S7 S: X! s
    • & z: C& {0 ]2 T( b4 R* P/ O% z

      4 w9 [( G+ b6 K   }  
      0 m, A9 ?$ h3 `$ l/ t" g

      ! Q  q( {9 d5 I8 [4 U

    • 8 G9 ]- d5 ~( K3 x- B) S5 d
      # D; G) K. {4 `: e  p6 S
         p=finish;  /*输出完成队列的PCB*/  
      : Z4 A' t) [% Q7 g
      3 M1 r8 G. }5 k" H; A

    • 4 L) C; G7 H6 W( c  O6 |; `

      : ^2 \) L) J# ]4 Q/ q, D   while(p!=NULL)  
      0 A. T! A/ i! ~

      , v3 l' l6 a! `: v9 ^3 I5 ~. h

    • % @  s1 c( V9 h5 s, t) S5 {
      ' D( }' U0 ]6 |6 F* o
         {  
      3 u  O3 ~  Y# M- m! R

      9 w3 }5 v, M6 g+ s* Q+ X' \! z
    • 1 \* f# I, ^$ S+ D7 s
      # d- I* e0 W! Z8 y$ U+ D
            prt2(algo,p);  
      ' Z4 B" \7 K* @, B+ }2 F4 K
      3 S, ^+ r( L/ y4 H
    • ( v: d, L+ W" {, Z9 v2 }" Z" P" u

      / U( P) W2 f) ^% @% b  M      p=p->next;  
      ( F3 Y9 Q0 b3 W2 z; K6 |6 p

        G# o! ^  c( w; ]

    • & i& |# e7 F% n( Y

      2 d$ f0 H: v6 i, [: e  [0 u% d   }  
      ) f" O3 r4 E! F

      % x+ s- m) q" {5 o% R
    • 5 p  [0 A+ z7 P7 W/ U4 |7 n9 O

      4 f; n6 I& o1 b# o0 a  l/ @. T   getchar();  /*压任意键继续*/  
      # j+ K/ Q9 U) W, F  B; t% a0 g

      0 `$ F: c! R5 _# T

    • 7 A0 q8 J4 q4 _  ~
      # P1 ]7 B7 |2 d* {  d3 l
      }  
      % f9 }8 e2 D: k3 o+ ~9 {
      . k+ N0 P$ X6 ?: L; G
    • * q) g' {  N. ^% r6 _
      5 D) o6 F: W! L" I! T
      /*优先数的插入算法*/  ; I% m" K5 A9 W* r

      ; u/ [6 e' Q* w+ ]; f
    • + r7 W: Q, `1 D% G( n

      8 \! F+ P- A$ ~) h) L4 ^9 x8 \insert1(PCB *q)    _. P, A8 L/ `$ E
      ' S7 }. f5 L. c0 `5 w" Q

    • % Q& U8 u7 p" C. B; r, b$ u
      : k2 {7 A) G  @/ W3 {+ L6 B
      {  
      ; r& J$ p. C4 s' o
      0 K7 ?& I# v7 q" d# ^

    • 2 u& ~. z' E1 c0 V3 y
      ' R7 O5 @: f9 {8 d* j
         PCB *p1,*s,*r;  4 w' n* ]% P2 O
      $ G5 l; {+ _# d6 ?& I2 O
    • % Y) o5 {) j) d# k* ~

      % D6 T" |" @2 @* v, N  }" p2 {3 s   int b;  ' @: o8 {# _8 K" H) c  Z0 H
      7 V- u$ f/ }, I3 I7 [; h

    • 6 [7 _( z5 c4 Y+ E" u
      0 V% L5 i, m% D, J9 M/ t' }+ Y# y
         s=q;  /*待插入的PCB指针*/  1 S5 z- X6 L0 N& M" N6 d

      2 M' S) r  u* Z5 d4 x
    • ; {# \/ k- ~1 s3 }6 t& F

      1 |. m6 Y5 y' a8 G; h3 N+ F   p1=ready; /*就绪队列头指针*/  
      / I4 G! l, a+ Z+ ?& o! q3 m! a, Q
      + ^4 N# N& a3 ^7 L, V
    • ; @7 a# G! J% O- i; A  u2 W0 R

      2 S& }  k4 S# K. u. _# i   r=p1; /*r做p1的前驱指针*/  * z0 q; J! p8 ], }* q; p' B( p' U
        H# @' w0 i( T9 m& h- o- x

    • ! V; }8 g. ?% l0 e) @) b  z7 \) N& d/ Y

      0 p! p5 i9 X2 Z! T2 _- |   b=1;  $ T# X$ h4 i7 l2 ~1 m. ?, Q
      ) u! x, ?# {& W0 R' h7 \. f
    • 9 H1 h, t8 o) w/ M  n
      $ a; [7 B; T! {8 [  @: a  q
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      6 D, h  }/ v' B; j9 |- h" C6 P

      ' Q8 }6 _: X8 ], v# y

    • 7 r! z8 n9 S9 ^+ w6 P
      ' ~6 ~: S+ h7 G" \, {
            if(p1->prio>=s->prio)  
      7 e2 |/ q* E7 _. I7 C9 n9 W( w  A" I
      2 X- D. v( I  V5 G7 c/ _

    • # W# W9 Y/ L  G% q8 f8 F- V

      1 e! H% J: \9 T- }$ ~" m1 p& _      {  " {5 `/ h7 o2 R

      # o& v; T0 h: B

    • . @! ^; O6 v2 o) r( `% z
      ; g6 ]: J, ?4 f( t# ?
           r=p1;  0 v, L6 e, {2 J5 g' C5 K
      4 z+ p" r$ Z) B- a; Y) J. C7 y

    • 1 D" |2 Q' [- r: s

      ! U6 y1 [9 f9 R8 G/ W1 y" F     p1=p1->next;  ; }: r4 E. s+ \$ |; a
      * g: G, S& J& f# ]8 q! T! {* `! p# a
    • + n1 i( i8 M/ h# Z
      ( e$ x! y& c1 G3 K' u
            }  
      8 n/ e# e6 ^) E- Z0 Y

      0 n+ }) q9 g# j- i

    • 3 n7 {  g6 {- n6 w+ B

      " t& T7 u; Q! O7 @& U; `% z: s      else  % f6 ~! i$ }. G; u9 H' M
      2 ^, _2 `4 ?0 t* P* x& @0 T1 B$ V

    • 9 a( _( _" U$ H5 n

      0 J5 L0 f( q) r7 w, i     b=0;  3 k7 Q4 a9 z  n! A+ v* f
        D. x* V* d2 C0 f9 _

    • 5 j" R; L/ }' u1 b9 P8 i! K& @+ a
      + }, H3 `9 m9 ~
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  2 j9 E7 R8 r8 z6 E1 ]. z" t
      8 G0 [% F: l1 f/ X

    • " G" s6 n( j) \% }

      / j. U; H2 X, T  e$ }6 h" S   {  
      8 |' |6 h1 J/ u% s
      - r" c- ]  }" B3 a
    • . U8 G$ e$ r8 Y- n& U* e0 W. \) N
      . H/ J# {* _& r9 p$ j& g
            r->next=s;  5 ?! O; U* S1 ~! P

      + T( Y* v% ?6 F% w& r4 L2 b
    • $ [; n6 o' [9 D" t7 n

      8 W- S- I& F+ E# x3 z      s->next=p1;  
      & u2 @3 j6 R  l) X3 g& m6 x) Z7 e
      & h3 w. r" D, x( N+ {, S+ a; ^
    • : n2 s( `$ Z% h3 S

      ! t. h/ }& @* P+ |8 a   }  * o- v+ o/ H7 r6 p: ]# U" p

      9 p' \6 J7 A+ `3 w( {; M

    • # l. F% V0 P5 \7 N  W/ ?

      ; y8 h2 u. }# {; Y. I4 C5 R   else  ! v& K5 A0 t3 o* n
      4 u- g* J, j* Z2 C/ g. q
    • 3 J, j2 w0 F$ j1 G( e, t3 I

      $ E. V8 ~0 \+ M3 |) g  W8 e   {  
      + m, L- S- U2 W' _4 w
      # b' Z: |/ o8 `6 Y7 \* C- ^) ^( v$ k
    • ( e$ d$ V6 s: C* K  K0 L4 ^

      5 V: M: ^8 k$ l      s->next=p1;  /*否则插入在就绪队列的头*/  
      / |: @( j- G, ?# S
      ' c0 z1 J  u7 `
    • $ ^: E% U& w/ W  i  L' c4 |4 J
      $ _: L# f" }2 M; B
            ready=s;  7 p1 C* |3 }8 K7 L6 ~  S% C' Y1 Z
      # D) u; j" J; f3 G
    • / Z6 D3 W3 |8 e0 j- `
      , N; x7 @# |4 ?
         }  ; k, l/ t4 T9 i8 n5 m
      * x( p" c+ o. W% G
    • 1 K9 l; |' B: Q5 D: b0 g

      , b9 ~; p) W! `}  
      5 e5 A- M# {% H+ R
      7 n4 G8 w: k/ ]5 d. R. e) h- w& G

    • $ \" _  ]4 [) j( r
      ; ~  W: s; o* S0 a
      /*优先数创建初始PCB信息*/  & z+ j$ z2 N4 M" L, D+ D* ?1 U
      ) T6 b5 B9 g4 W! ~

    • ) @- B. D* w2 g
      : y* w& `% ^. P* G+ K) x
      void create(char alg)  4 U' f. G* W- g1 Q: U3 A

      7 j7 |: P! g- z* E1 Y- O

    • $ E( [+ Y- k6 r& ^0 X2 i

      7 C& ?, C- K8 L3 t# \8 G! a! n{  
      2 {( o7 j- n$ }/ t- d
      1 i. f. T1 C  Y, Q; e
    • . J$ \( r3 G! L+ u: w7 z

      ( D2 v9 w! Z  G   PCB *p;  1 m* j, A4 |  P4 ~
      4 N: Q5 `1 a' J$ c4 g7 g7 l) g
    • 2 Z+ T! K7 D& s

      3 F$ L) l* Y- C' H% A9 z   int i,time;  , B" \* T( I8 d; b
      ' [0 x; V, f# `" J
    • # k) e) u/ J* o0 P3 E( \) P' r
      7 {8 V0 u& M8 c' {1 b
         char na[10];  
      . ?- }. \( b6 b' L  _

      * \3 E9 w! M- {6 N% Z$ R2 `
    • 4 V3 O  u& m' V- K" d, g2 k
      8 S$ X2 T5 E% }0 Z
         ready=NULL; /*就绪队列头指针*/  
      # i. X& }* ~/ c& e! I
      + g4 l/ ]$ T( N0 R+ O

    • , E8 c" \8 Q- Y) G. Z- ?
      4 N! m3 q% `9 C6 `/ U; d
         finish=NULL;  /*完成队列头指针*/  2 P0 F# S0 D6 L: S( G2 \' I

      + ]5 J# ^1 `6 d/ _6 ?  L
    • * v) r9 z0 G; A- S
      $ x# s) B, M6 x% V# G6 n
         run=NULL; /*运行队列指针*/  * f6 {; ?4 p8 g' Y, E5 }* V
      / J! I4 E2 ?/ s

    • + O7 }: ~' l7 g
      9 ?& A& f8 t* b" P  L+ c, O
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      & B1 G% E% ~1 C2 G* ^9 P
      " x; Y5 v  m; l# x" f" N, ?( P4 z: O+ t

    • . ^' k& r: {8 r. F& i/ Z7 x- _3 [4 E

      # }6 b' S8 i6 \# o& ~2 o. n" B   for(i=1;i<=N;i++)  , L2 S* T2 _% t' Y9 C1 @; e1 i
      8 X/ V- I6 J2 i  _, q
    • ' s2 r$ D, z' O! P% S$ q

      - @/ h4 f6 D4 P: \) Y( ~   {  8 k1 y; V6 o2 x/ z+ ^, B/ Z
      2 `$ @4 l7 ^( V2 r+ i/ A

    • # _! e2 Z+ b* V9 Z4 P" Q8 x

      - ]5 b  N4 i; \: J5 E+ z" A      p=(PCB *)malloc(sizeof(PCB));  
      & \% T( {+ V+ x$ w0 i

      % f( N1 V, o  h" _# l9 e

    • " u1 `$ |1 T- h

      1 R: V- V2 ^7 i' d" p      scanf("%s",na);  % M% k; @! g* N7 `6 F  m- J7 b7 z

      7 q1 H; M  m2 P8 f7 J* ?3 `6 e* `, k
    • $ Q/ K8 A+ [5 U. u. h

      ; p* s- @* L/ i      scanf("%d",&time);  
      ; w, |, m) d: U

      7 x8 a+ T  [1 g4 h6 p( M2 l. {

    • % o2 M4 ]2 `7 ^# [
      : ?: a4 E- k% T( ]5 M5 z
            strcpy(p->name,na);  
      5 Q' k- a3 m) Z% g  n  P$ D

      - D8 Q: b5 |7 {1 s# m5 }
    • ! \6 C. e/ E3 G5 r( ]
      , A# x1 @  y; I+ ?* ~; h0 w8 ~
            p->cputime=0;  
        k1 j% i- D+ l3 r/ r6 u$ n& `

      8 t: q3 p2 ~: t/ @" q$ |
    •   D4 y9 Q9 e& Z# {

      , o' I  M1 ^( f* ]5 [5 p* F      p->needtime=time;  
      # T  G1 R1 H3 S5 O( J7 Q
      6 i. {1 S3 n) J( J
    • 6 r, ~+ P  |) u' A; J

      9 }% z) v4 L& `% `- b      p->state='w';  
      6 B8 H) S7 V3 ^# @% s1 K

      + q8 H8 l$ M$ C

    • / p2 T% G7 v0 }" X

      # B% V. t; }  U" q, Q      p->prio=50-time;  ; m/ R! b) b# d3 v! W/ ?( ?. O
      6 K  L/ l' R! `' |# |/ \2 ?

    • 9 }& Z$ Z/ q  \! `
      , t/ _" q3 n, ~  T
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  / U5 q& Y3 y4 M( u
      7 A( f3 I; Z- a. a
    • ( V& X! k& K5 r0 z6 q
      * y& V: A$ F) k! c1 g0 e! g
           insert1(p);  ! j$ d3 ^# P% t
      9 r5 C+ _5 f/ M% ^; z7 _! D

    • 2 B1 ?# _6 I, y  S  w0 R
        i- o7 X( A1 e
            else  
      : |3 ~1 J1 m. ~/ L( M) [' t
      0 C3 K. S7 e- t7 Q

    • : M, ]" C3 |: F) _9 k

      , g7 j4 h# z5 O2 Q      {  ; F( n8 \* @3 x* }, [. E- F, x0 L: j

      & m6 a  Z: c, F+ u/ d" m
    • ( C9 d1 d" w. T6 u3 @& N

      . l: V2 E; Z+ U1 ?" S/ W/ S     p->next=ready; /*创建就绪队列的第一个PCB*/  " {3 W/ {1 @. P4 p
      , S. b0 s7 _  [( }, r
    • 2 C5 h4 M) d" k" {# q

      ; y  d. C6 G+ m4 y3 b9 U. O     ready=p;  
      3 w/ }# A+ P2 K, ]0 |. d1 ~% b3 o
      & V# f1 P; X; D# O5 j# X% u
    • - N4 Q1 `9 {* `7 c5 P
      : f1 Y" ^$ G1 b6 I  }
            }  # W+ X, g  x! `$ _+ H8 h4 c
      ) Y4 L2 T3 D3 T' ~2 z
    • ) F" z7 x" P' d8 d' S
      ! A8 g$ E4 S) c7 Y2 J$ a
         }  
      9 m7 R8 s8 c6 t* Z

      0 A  E" l# f9 }) b) O  h: @  J

    • ' b" k0 J' |; T

      - \5 C! ~' A; D& N& f5 H   printf("          优先数算法输出信息:\n");  % S8 J# X7 h% q# T
      4 L& A5 n  ~# p, x$ B, y
    • & Q, f2 {, v) @2 x4 Z
      0 Q2 \4 F+ L6 C& M5 e7 F% |; L
         printf("************************************************\n");  
      2 u( d4 M7 T9 i" ^0 {3 b1 [
      . ~8 |: C) @/ {3 N  P8 e; h
    • ) y/ A- @  M' C6 j

      6 S" x+ U* M5 L   prt(alg);  /*输出进程PCB信息*/  4 d7 Y4 Z5 P+ T" b3 }

      2 ?8 Y# B3 o. j
    • $ ?3 Q& H) ]2 w( i5 s0 U1 ]
      ( D( ]1 K4 v+ Q+ M  m
         run=ready; /*将就绪队列的第一个进程投入运行*/  
      9 [5 l2 R) O* \. G
      6 o7 k  J# [9 i, x4 B3 T
    • : h: {1 p3 _0 x
      . Y4 B" U: D$ o
         ready=ready->next;  
      # V5 E' Z# h$ O- q, s' {

      2 e) W' ~! T: \- o* ^  m

    • 8 S$ o. w% ]* _+ B* f* S

      : Z( d  {& c3 c* C1 y* A  }   run->state='R';  
        p1 P# s- f% ^3 y! {

      " \+ V. i0 x9 m" W
    • # z$ C/ U; S2 C( Z7 Y& T

      ) e, J, V6 v7 R/ q}  
      * v  @: L% y+ F2 M  ^

      # u. S) A( Q  s' z4 |5 }
    • 6 \. q, M( }% ]8 L! D5 V& @. Z$ d
      6 H& N9 ~3 @$ J' n" {8 L; j% ]9 k
      /*优先数调度算法*/  
      ( g/ z$ ]; a; c% g' \: o# g6 A

      : \; w4 x" I5 k) |( ]0 b" F! g8 l

    • 1 @, P6 r5 D, T
      6 E  O" z  E- ?3 O2 Z3 |5 a
      priority(char alg)  9 W9 D  v( H8 [. I% a5 x* V( v
      $ V6 B5 V6 Z( }3 M; U8 ^

    • ' T, R3 r, @  r1 s- @

        T% I% U( \% Q& g/ o: s% D: U7 `{  . a  _% }* x2 r8 ]! P1 q4 b/ P

      . f$ Y* L" G6 j% ~
    • ! J6 M* X( x+ y/ t
      3 v6 {2 Z3 H4 L4 B" }& x0 R
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  1 p+ p0 j# [! j  Y; s! f
      . P/ n; |( V  {' I
    • 8 A5 O8 j% S$ e0 }9 M
      9 Z! ~2 w) {3 ~5 f4 y
         {  ! }- b2 {, P# k
      6 z2 y; P# @/ @  g

    • ' O9 l+ o  b* V. G% H7 G( s6 V

      + A5 f% q. D' }$ d      run->cputime=run->cputime+1;  5 K& Z  [1 s" D: G2 L1 l
        `" s2 v) R' v/ n8 N; |" G" a4 Y
    • ) y) `: N$ b. p+ W& H* {
      $ i6 k* s7 J8 j8 B
            run->needtime=run->needtime-1;  
      3 u+ \: J9 P, }2 A; D. V3 O( I/ n
      : O1 l: A8 s) R, ]
    • 2 M  {1 u7 H. W  v! u: t

        I8 [* X) h  z5 V      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      9 V5 D' ]7 H* N9 C

      ) R7 \* h0 C" k$ }' t' A6 G6 E! S

    • & p* x1 Y/ A+ G- |

      4 Y) ]$ k. L( A5 B' `+ A: ~4 e      PCB *p;5 ?& L* A* B4 y1 W: L/ r& |6 F8 ~

      , J, l6 B2 q  o, z- p4 A: m2 I
    • + X0 T5 Y' k' H8 _: X7 ?

      + ~4 q) N1 h0 X- s" c; r7 Y      p=ready;0 h9 N" E8 i9 g0 h

      * }0 t0 W6 C) e

    • $ K) z- h* M* R

        o5 v  v  z2 d      while(p!=NULL)  
      & Z( O" ?( _9 I2 s- E

      - }4 x1 Q) X1 u& ]* v8 c. ~$ |/ G

    • 2 p  ?; k5 x' s1 Y$ \
      % h8 v4 |* ?2 n
            {  
      4 ^+ I1 B) `0 K4 n. g* i0 L
      % i; U7 u# l; T1 W
    • 2 I; U  S$ A7 ?- l- z% W8 \
      / ]7 C2 D+ Y4 b$ ^1 t7 K( c
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      , q4 n# t, F0 \; r
      * T; n- v8 n0 g0 m6 x
    • + s- i* k( b5 z7 a( X

      $ z6 W. Y0 o- U" ^( q8 m) T; x          p=p->next;  
      " u& f, k% c1 l) z1 z

      . e& r! J0 V$ G& ?) x/ e
    • % s3 H  w9 j7 p

      0 L( |8 Q0 C( `3 v* G, }; T8 f# O      }  
      0 `/ s9 p, b$ a6 k+ T1 s7 ]9 `

      ; d0 Z, K5 {  F7 Q
    • % h  g0 X0 P+ O5 Q
      6 Z4 J/ f4 T; k! M& f: u+ _1 C
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      # p- Y( y% X  i2 x! {
      + o2 z: w" T; a0 x, L
    • ! K# z  g' T; H) T8 a/ S9 D
      . U8 U5 w1 n. E( G
            {  . m4 t9 o% r/ y4 i
      ! A. h( ~) ?2 }( f

    • 7 T5 r6 j8 {1 \: j/ }( u( h

        P* @6 I' s3 e" n$ w) G0 T         run->next=finish;  
      : W0 L1 P& v  ?9 k( X  X

      , _( q$ }" g! }& P. L) H) [
    •   d! z6 j% n, J7 Q" U& }! M* _  B
      : c6 I! M! k" @' k, j
               finish=run;  7 U+ I& s2 y9 \7 ~
      + ?) ]8 b/ S; L1 J/ }

    •   l8 j# I$ H6 L. o' h8 X8 C
      + M0 d! a  S4 z) X' m# w
               run->state='F';  /*置状态为完成态*/  
      . O" Z; h5 m0 p
      & c) T6 y  \: e

    • & z9 J- Q" b$ M+ W
      5 I- J" u. w% V, h$ i/ W8 `7 {
               run=NULL;  /*运行队列头指针为空*/  ) @  _& |- Q6 n# g- G9 @# Q
      + A1 k6 h, u, i, J2 o! X

    • 7 Z4 V. m  L3 J+ j$ R0 `/ {. z) L* C

      . L. J4 Q1 E" _& o( C: o         if(ready!=NULL) /*如就绪队列不空*/ 1 i* }. X$ x$ x; X) F& ^

      : @; U& o7 h7 v8 n( U2 }1 V; r& a

    • % l9 j( V' z( k5 D9 J" N
      % \% a! x5 m+ @" F5 R/ d2 I
               {  
        }. {# |4 s' l3 O3 _- l" m
      " |- t4 O6 J7 k6 o

    • 4 \8 J9 _: d0 O/ Q. h" K+ x8 u+ l
      * o( R& u8 J. J& T  C' D) d
                  firstin(); /*将就绪对列的第一个进程投入运行*/  " p! b& R2 A3 y  w7 d' v

      8 K. e5 W: F8 w
    • ' r7 H. ^0 d9 N) V; d
      5 E# z" C9 ]! F6 z4 ?) F6 H
               }
      * ~; \# s; D' p4 P: B

      : W7 [7 |) `. e! p6 O
    • 1 Y# H- N, x! {! f- D. }! u
      5 ]- u* o9 t4 f8 j8 Z8 z( k0 L8 z
            }  7 L( N! l& V8 d! D

      6 K' g; _) q7 S- a* ^! b3 }6 n
    • 7 V  {9 `( J2 D  D5 Y) p

      * t1 ^& E( t0 h/ i  p& e      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  1 _8 u& V) l8 t6 @
      ! U$ _8 n* z  q" u0 H8 x3 O! E

    • ' W1 s. U2 b( @: C9 R$ E! ]
      6 j4 y, N8 c% h! q6 ]
           if((ready!=NULL)&&(run->prio<ready->prio))  
      ) J6 G* P/ y- z, C6 t9 c

      + {8 ^8 T  d/ l3 k: w$ _1 y

    • 4 N/ D+ T1 t* K! |
      % I- E, |+ I, x) d3 h
           {  : R7 T7 v7 u6 @: Q! B' e

      " ^. z: J. I6 c. A3 J

    • ; Y; |5 X7 L# W; a0 S

      + Y7 x, C9 C5 C8 b        run->state='W';  
      8 D1 u7 e! ~$ G9 g; l
      / |, e4 m/ M. g6 Z: m/ z5 i

    • + V( U# r2 O0 u! I% d3 O/ L
      - ?# r# n& `$ E7 ~
              insert1(run);  ) B) ~3 r, N; |" T' E  c

      - r% Q0 W  h, E; Z7 Y$ `2 @* A

    • 4 c. H2 X- W* p% K6 u% L- R
      % A3 S( J- M1 |& q+ g4 p
              firstin(); /*将就绪队列的第一个进程投入运行*/  5 c1 }' z. c1 _0 X7 V, q/ ~* z
      5 Y1 ]+ j8 x" D9 J- b# A" K
    • 3 o$ x. \* \  H( e8 V1 p

      & `( Z: O4 B% b$ [- Q     }  8 G( c5 o/ L) L+ Z4 H

      : g( }5 p( _5 E

    • 6 W1 O! k4 B! ?4 P5 o2 x
      1 i1 N7 o, V+ n
            prt(alg); /*输出进程PCB信息*/  
      # t  [, h# H" @% `

      ! N/ ]9 d0 J4 `9 J3 n% i

    • 4 B" O* U3 l9 N  L2 \
      ; l1 k4 a' v7 |7 r# c5 k  Y2 i/ |
         }  ! H. e# e' W# p+ X9 R# ~" o( l) z

      ) m3 ^# {! r% {' m

    • 0 R: W- K/ l) B: v8 G

      # X( g/ {1 ?- l; P! |2 M, K}  3 ~: e6 U: P& f( v' @
      ( {% c7 Y* j9 b2 j" Q. ?

    • 5 B  F  b! v( A9 t
      " h- U8 {# _& z9 h+ q" c, e
      /*主函数*/  * n, t- e/ O* b
      " d5 p, l4 S6 L+ x) r
    • 9 [/ c  O& M; S, k) r- Z

      . w) N2 y7 f" ~! E3 _/ a  smain()  
      ' E1 v. q1 c/ @+ q8 d& [
      ; y# @0 e1 p4 q/ c& l/ T
    • & S" S4 I( S) X+ A1 Q" K; q9 L
      / |1 o0 R7 Z/ S
      {  
      * ~( D1 E+ x+ R$ W: d3 w  a- M+ z
      5 |( J  K, M9 i0 C3 j

    • 3 D0 |5 z" \8 \6 [: {- A' J
      5 F( d/ \" O6 s8 t3 [
         char algo;  /*算法标记*/  
      2 F( w6 h8 L1 e2 K0 t

      ) K4 Y& k  E( R1 C; W
    • 8 {( S( m) m( ~
      ' p4 W# p! D  l8 _* S; a, I: x; d" U
         printf("输入P确定算法:优先数算法\n");  
      ! N+ H+ q8 M* j, d' P) {

      ; |0 \0 O/ A2 m" z

    • # ]# Q/ U9 M: _/ i- N, {
      . P6 D2 l) O) c: J; }
         scanf("%c",&algo); /*输入字符确定算法*/  
      # @7 K& j4 D7 H( A* T, b
      : q; ~8 y+ i" F* P( G2 O& h

    •   K) V. @5 \8 K0 b0 S4 m
      - H6 j0 X( t- P+ K7 o9 [; `6 P
         printf("输入进程数:\n");  
      ! J# M) x( V0 u5 S) |! P$ g

      ( V1 ?+ ^3 Z8 r/ U

    • 8 z3 M/ I! a( o
      - D2 e5 p* o/ {0 k% T
         scanf("%d",&N); /*输入进程数*/  & k- n" h8 o9 D2 B$ H
        q& A  c# V+ v) P

    • " f/ X3 d: }/ Z. ~
      4 _4 `7 X7 m9 ]$ O9 U
         if(algo=='P'||algo=='p')  # P2 \- e' ^# j8 i! \
      : [$ @9 L  Y- A4 [1 A% B' _
    • ( t4 P3 f( r9 L5 m9 K
      $ t2 k3 K' X7 {9 R; ^$ n+ {' ?
         {  1 P0 o2 q: e4 p- W

      3 j* h2 ^. z) m3 t! f! A! ?
    • ! b1 H( D  {4 }9 ~4 i# @
      # H3 B. l# L/ _' d/ h/ Q
            create(algo); /*优先数法*/  & Y1 m! j- O  b" S6 m9 r2 W
      3 c: y0 {$ F% L8 h! l6 h. [. H* F
    • . W: \% `- ^0 `8 _. q- H" \% P- @

      ' H* [: ~$ A" E! X! {0 `7 ]      priority(algo);  
      & q# d4 }& ]- u+ b1 o2 n6 T+ q& B

      ! g" U" o2 F. G9 X' |# m6 Z

    • ) t/ F2 X6 m4 t5 n/ p

      ' q$ `3 M5 j; E7 Y3 X* I' V: e   } ! y0 r0 [& Q) C# m' H' }
      7 {: a: f5 s+ v7 c. f% I" u* y, ?
    • ! p  |- z* r# I5 W! [$ s8 o( S

      % ~' Q, _- V  P1 Q6 g, ^}
      4 y5 b8 X9 v4 W2 t5 i
      0 R* h9 ?% a) C! ?
      % V1 J- H" x& }$ Y$ [" p, q


    / t1 S, V$ y+ c, D输出结果:/ `1 |" S6 f1 s+ ~- }


    0 E& d6 k" d, }5 g原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    * ?: r" P  t* W. K
    ' U+ z9 _! p$ v; ]9 |0 ~
    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 20:46 , Processed in 0.375383 second(s), 51 queries .

    回顶部