QQ登录

只需要一步,快速开始

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

    5 j0 e8 B% \2 X/ ~优先级调度算法( \' ?6 b6 c6 x2 R; ]" V, v

    算法介绍2 I) Q: X* Q8 }6 A3 Q4 k, F
    优先调度算法的类型(用于作业调度). m0 \+ k2 J/ H- l+ f3 W
    1)非抢占式优先权调度算法
    - h! N  `8 i( _: C系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    , v( T5 N0 |9 {3 v! ~2)抢占式优先权调度算法 ; }5 O! R* D% t0 z+ v/ G
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    # j& {! V9 Y8 q1)静态优先权 ( H1 ?  q) Y# x0 p8 H
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    : b/ o/ y3 A5 c5 C, w7 I, b

    2)动态优先权 ) D, r0 T0 X; T5 e4 Y

    算法实现

    抢占式动态优先权:

    2 B. R% F$ W# u* T
    PS:本人认为非抢占式静态优先权没有实际价值。

    • + f3 i$ a: Q9 u0 G' X- ~8 o
      ) z- W+ W$ A. w8 |
      #include <stdio.h>
      & y. }1 W# I: `

      & C/ C$ C0 p$ N, M7 K
    • + y. G* D  ~' P: q1 m/ f6 |1 n
      6 C. O8 O; I# u2 }2 }
      #include <stdlib.h>  
      0 j0 m2 ]& k2 m- z
      1 y* r9 {. @! E+ C# ?4 m- c4 Z" O
    • / h, ]0 e" v+ |, `$ }% K6 `! _
      9 l$ I! Y6 l" e% C, _6 i: [* ?
      #include <string.h>  ; K, f* _( z, o: Q$ O

      : u; V3 s7 Q2 o' D5 `0 ^
    • + c0 ?1 Y6 G7 P8 c! p
      , Q+ T9 S7 w& N
      typedef struct node  
      ' ?& Z8 T; [* y+ ~: F4 V

      8 y2 E. \& Q% m# \3 ]0 n
    • ' v& x6 t: c) _3 [/ ?
      # c2 A1 J6 o7 m3 t: ]$ e
      {  : L; z* Q# b- @' H$ u9 k" _

      . P0 l. O5 \5 V; |, A
    • 9 g1 G" y1 D+ C5 P1 U: S% c9 A5 @
      ! _# _5 O% J/ E4 i# ?
         char name[10];  /*进程标识符*/  . @) e7 D- I' e1 n) ]) u5 i

      ! o5 Q6 g% X! d7 Z1 _

    • + A, ]8 `( G! {7 G( e  H# C# b

      - h7 U; W+ A- ?3 j/ u' H   int prio;   /*进程优先数*/  
      : d+ e- v& P, G! F, \) W$ h
      ) I4 H9 F4 Q7 g' ]1 v" S( E

    • ' a( r, }( ~8 `" i; T( ~  j
      1 G. k" }4 O4 j: D
         int round;  /*进程时间轮转时间片*/  
      * [* P, D0 U$ f. y* r5 C

      ' K+ z6 p: e+ S, R' \( H
    • 5 T7 q8 {1 Y6 P+ n; o" A- {! U( X1 P

      * ^' w' p7 ]. p# h4 {% W/ e/ Q% V" J   int cputime; /*进程占用CPU时间*/  5 X% H4 `2 n: Q: i, J, a! }+ C% z

      ( ~3 x- M; K% r
    • ) E1 _8 G  d" o/ a: }+ B2 F
      , R& K- L& R) [2 E: A8 ^
         int needtime; /*进程到完成还要的时间*/  
      2 b+ m1 a, G. s  J
      + l7 v3 k* H+ ]2 X3 F
    • 6 b+ F1 y; E: \7 i" ]' g# E
      # ^2 t3 J/ E- ?+ p$ \
         int count;  /*计数器*/  
      & A9 @/ K) L' W7 C6 K9 X% g

      . }" M" a5 {- K* |& ]2 N; c
    • , Y% E% g8 {( |2 w

      - ^2 f0 v/ o6 k$ j+ \   char state; /*进程的状态*/  6 \% s$ w# l/ q
      ( l+ |$ I/ K9 @. V: ^

    • $ X& C) [9 d: ]# m& t7 V

      7 k* l% t' F8 E( x. Z1 ~$ S6 x( i   struct node *next; /*链指针*/    d8 Q- p6 T. b# f0 m. B
      8 T" X; n6 H3 X; D# F% v
    • 9 i8 R7 T3 ^; a. [: t" o. A
      ( }9 j/ Q; S2 ~! K3 A1 l5 e
      }PCB;  
      5 O7 a' f* \8 D. r! n8 |  U: [6 c

      2 Q; a( `: W* h7 j2 _5 f
    • 3 C$ |; R; k1 ~( }; M8 S$ _

      8 A# g/ E) T) Z! w' iPCB *finish,*ready,*tail,*run; /*队列指针*/  6 S7 P& }; [+ T. ]# ~
      . s( a) x% u/ E, a7 L8 |0 |8 V

    • 8 u% o1 Q7 }; v- r
      & t7 i! H6 [8 `; W
      int N; /*进程数*/  7 }( {' o( n; t) A
      * Y9 V1 ]% x, `, _% x0 K2 z
    • 3 [: @- ?4 j+ L0 l( I: o6 M

      , q8 e* x5 f9 |5 g2 {( G+ @8 ?  n; S/*将就绪队列中的第一个进程投入运行*/  2 q) f: Q8 }4 x- B& O/ i5 K/ o3 ^

      9 o: |2 v' e9 s1 v$ Q
    • ! T, P* x  U/ }" t- \% P

      6 p& @1 ~  F# V1 ~. Jfirstin()  
      , G7 }/ D' G8 `  G+ X3 n/ E$ C' L

      6 @, Z. p; v: ?8 b, v) Z" J
    • 5 O/ t* s; x) N7 G! d6 {

      ! W6 T/ O& R7 J: A( t2 h6 m4 C{  7 u2 J; p8 m* b: _+ }, c
      , E, E5 _- t- R9 m% t2 d+ H. l+ U

    • , r/ p7 b# c3 x! j
      5 v$ i$ A- g4 t
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
        v0 t& q* w) J9 A

      * t: ?3 J9 C% @+ h. `, f
    • + C3 w( _6 f2 n# Z: ^9 q5 O& R  L+ T' ]

      " t1 U4 f; A  R. k   run->state='R';   /*进程状态变为运行态*/  
      / y. c5 {1 t; x- O% y1 q( q

      $ H* L9 n7 |# O8 H6 w! O" t* F
    • # P9 r+ f9 @& a; H4 |, R

      ' [, U! I$ _  |, w* n5 O   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  ; W4 d+ z1 \+ Z/ d

      & L- Y- k- v+ ~3 E0 A% h9 U' o

    • % h+ v3 \3 B2 Y) d0 ?  d2 y
      0 q. b4 h7 C/ g2 f# K+ q
      }  % V0 [; ^+ j, t

      " O4 m3 }6 L, n; c" L3 r0 L

    • ! r+ c0 y4 ^# h; |; G, L
      1 b3 Z' I& e8 F6 V5 A1 r$ B( \
      /*标题输出函数*/  
      . x7 b8 ]6 ^7 Y; O3 P2 r

      + w- S$ X1 D3 ]1 L9 t' c8 r0 x
    • 0 o0 x4 N& F. K! J, D' B

      . a; _' k7 V8 L1 k7 Xvoid prt1(char a)  & K) m  D% b0 m. I0 q

      6 s. Y! T2 T5 m5 s3 i
    • 7 {/ z. K3 J9 I* L# S
      - M1 Z* W4 q9 X1 p( p
      {  ; b: d0 S4 v' w

      % v0 b" y& \5 R$ T9 O; H7 F5 z* K

    • : d2 f1 r* L% h5 q
        K/ U  f; p9 y; E  Q$ O
         if(toupper(a)=='P') /*优先数法*/  
      ! J; q- A" K5 n( }3 Y

      ; q, s- I# |! D; t2 u, S* J

    • $ B% B+ f" b, m+ q1 g7 c+ k0 \

      5 m2 l4 p! U4 Q" Q      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  ) \5 \! c- _) T
      2 v. ?& ?% [5 _3 e

    • . z: ~- b9 }: C9 P3 P/ C' ^
      & w3 K% ~; R/ g8 r
         else  
      ! ]! L0 l% M4 l3 r& C/ p$ D7 ^
      6 h# ]1 p. k2 L+ V# _
    • 7 }( p9 j9 g0 F5 z8 X
      ) G$ G$ L! t+ Q- X3 |
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  9 m9 W4 U+ i( W: j# O  x6 A
      2 b" P* p' z3 U4 p, ~

    • / {  k. j7 v* ^' f) R0 a1 }& ?5 V
      * P2 k, |; I0 w* Y. n2 {' ~
      }  
        z% X9 m, y1 A! l: W0 d7 j( ^4 L

      ; z, x& k9 l- W6 Y
    • / T+ w7 T( Q* n- {, {' _8 @6 K
      " `  u: {- Y0 @* i/ L9 |/ Q5 U2 Y
      /*进程PCB输出*/  ! I  K5 v9 M& C

      5 Q6 @6 M1 s4 ~( U* y

    • 8 D4 K, D6 j6 l% ]% p/ t) v% o; b
      * [2 l( W* D2 ]
      void prt2(char a,PCB *q)  
      * }+ w5 o0 G' I+ S8 {5 B7 j
      " I" j  ~5 `. C! W3 V0 {

    • ; k7 n; ]6 V1 V

      , V* [) u+ |9 _# ?% M2 f( W* o6 w{  - x# ~8 ?$ q, V5 `3 S& p0 }3 @
      % F' S) n+ x( y0 p# S
    •   o1 F; q/ q7 b1 q( b
      + X9 h& C7 \: O+ f& p
         if(toupper(a)=='P')  /*优先数法的输出*/  . |: K4 n! G$ N& z7 N7 H6 o
      3 e' Z1 L2 t. J

    • ( Y" t8 l6 a) ~5 f9 W6 Q
      4 e; Y- _6 ]) {- N  ?, ?% ^, O$ A- P, l
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      , ^0 j7 l1 D5 K. e: O
      1 C# j. g( C- L' ?2 ^' \3 M7 R* h

    • ' ^4 i% _1 l* H6 D" V" l

      8 A1 P  W3 b! A4 W1 c6 M7 ?; H       q->cputime,q->needtime,q->prio,q->state);  8 ~- Y# n2 v+ J; a! H
      7 f/ j9 f3 K5 x

    • + c% _/ H3 M, U: f

      . ?: w8 \" s% |: P* L   else/*轮转法的输出*/  % f4 o( h3 z5 W3 C
      2 W% k% V2 w6 W7 o& ?
    • 0 w- E; h) B8 T7 C' E1 H

      ! d! J2 A8 x% \4 ^      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
        t6 U* t) ^6 w' V2 j

      ( c/ K+ e  q, y# [, V* W1 X4 F+ k5 e
    • 0 K' t' J: [0 [

      0 `$ h" ?% j; r8 `. J/ ^       q->cputime,q->needtime,q->count,q->round,q->state);  4 s" ^% w- l* T6 y0 o" S' q; V
      0 g) ]+ B0 s& z
    • 0 J& p+ [/ E. J* p# W
      # S# S4 b) R" z, r
      }  5 D% a. J+ Q/ g: V" A+ H: q7 ]( `
      8 E# W8 |6 [. A6 f5 C) e( |$ {

    • 4 P' x# Z$ n3 g' p# a- f: E) b

      # A7 R' F# C/ _( X' [- ]1 S/*输出函数*/  ) `9 O7 f" W8 C8 H  D3 h. D2 z& |

      & }2 ^2 I' l+ _: n) x1 ~
    • + r6 c1 V; b& q9 Q$ \7 c
      ( h5 [8 e* ?. V0 W- G; @: n
      void prt(char algo)  0 S. Y7 b# U& E1 l2 q) y
      & {, ^' E4 o8 |* w; h; ?- ^7 E' K
    • , \; l  r, V4 w4 ~6 A3 i" S
      ' P! f4 F& \2 P" i
      {  
      / ^+ r. d9 \1 S& t  K& n
      % E( O0 D( J; @! j- Q6 p7 A
    • & Y* w2 ]6 p- i( l. M6 h

      & g# C* j( \6 X- E. r5 k2 Y   PCB *p;  
      5 s2 d" a; \! e/ h: ~) j5 `- Q: o4 D
      4 M* f. {: C" ]1 [" p4 {% q
    • : x& \& Q- @* U. R& h; j& W

      9 U1 x9 S8 I& U( I, i* [( S9 Y% a   prt1(algo);  /*输出标题*/  1 b: j, o$ O% f- y# A8 U

      7 z' g/ T* r8 u0 `  Q1 g" p3 z. \2 z
    •   g$ i! E1 R" p% ?. k8 L
      0 t( ?! ?+ b5 @7 ^7 n6 h) ?8 Z
         if(run!=NULL) /*如果运行指针不空*/  : h% E$ }9 f$ U5 ^5 r0 u

      4 S' F2 `& Q+ h" h# a# J" q

    • 8 Y: E) \0 k- [7 v

      6 _2 N& k! |; {% j9 r      prt2(algo,run); /*输出当前正在运行的PCB*/    H* w% X0 w! t/ E! ?

      9 x8 O8 ?( Q' Q
    •   |) }3 |( n* ?6 e( r
      / C& b$ d6 d5 p( V- v$ ]
         p=ready;  /*输出就绪队列PCB*/  
      ( O4 \+ T! j0 y, q& M

      * p5 p% |  I7 G/ ^& O+ f
    • 2 x+ G/ q. b. w4 k' J

      ) a& D* ?$ J7 G) F5 K1 ?3 P. G   while(p!=NULL)  1 K* v7 p* s" \/ u

      % j) |8 p; j' X/ b; R
    • $ J( {8 L( k) U/ y+ R% Y# T

      ( ^0 ?- B. `* v% N' R   {  
      % a9 w5 i" T& x0 m. q
      ; G, c) v/ k+ Y% [. D

    • 2 I+ N# z/ o: I6 @3 i5 |3 ~
      9 X" ^4 ?/ x! p7 X& ]  ?
            prt2(algo,p);  - L( [! X" d1 v% ~. U( w- B8 D2 ?
      7 h" W$ ]# L2 ?, e( W( X
    • 9 m8 Z8 l5 s4 y. j9 ]  @
      5 U: \4 ?2 }% k6 W0 b
            p=p->next;  
      ( h7 ^) E' T  J

        F0 t9 G) l/ Q" S. e

    • 5 N5 I/ X, B+ t+ Q2 d
      5 f0 K9 y: x5 K! M+ g8 X$ L4 n% U
         }  1 n. N: F6 B/ o: @
      2 S0 n9 M& }) d) o& z& ^

    • . U/ \, [3 _/ ]

      / L7 H7 x. a4 |6 Y, F, A0 Z0 ?   p=finish;  /*输出完成队列的PCB*/  ( e! t6 @8 G& P  y& c

      & i: v$ b" K0 n# W7 z
    •   G+ Q6 R! V$ u/ H: {5 ~

      + s( `  ?* H! u8 c   while(p!=NULL)  * ~  I- L( P3 b" B, g4 ?. Y
      ) F; A/ R0 `0 K0 H

    • 0 }) y0 X3 @2 @, Z0 I, Q
      5 O$ k8 G4 c+ ?2 K/ k
         {  : G- P1 w0 E8 ^% o! T3 s" d

      % ^1 Z1 ^9 A; `1 Q8 A
    • - U2 W8 `2 Z: K; i! [- R. o: s
      ' c$ [+ H1 `- j, ^' Y5 Z& E
            prt2(algo,p);  
      + W$ P. S9 B, j8 d0 k& F1 k
      $ r3 C# |; m* L$ E1 r; T( X' w# y+ |
    • 5 i, E! M6 ?0 k; J4 c7 D6 f3 ?
        D9 _( ~% |/ q7 R
            p=p->next;  % `8 l8 Z- a$ n6 r: }& a

      # `9 r* P9 C; P: T3 f! }, N
    • 0 O& x: b# H  T4 Z
      - z% b' L, ?0 B# `/ ^' e' k' [. z
         }  # q0 c# G4 |0 c. d
      + q+ y  W* s2 G8 W' S

    • % m! v9 P  k- E* s+ Z1 ?5 K
      $ i- N- n/ F. N' m
         getchar();  /*压任意键继续*/  
      ( X* \/ e2 D9 j6 g" X9 L( S
      ! l7 K4 G8 q! Z$ C; w3 N6 y
    • ; Q/ X# q7 Z0 d5 s3 K4 |9 |5 a

      ! X  f( x' g. i}  
      : v+ f4 Y; }. J; V9 q, B  A2 q

      " [* o/ y5 y5 ~
    • - v* M1 X5 |; d# i8 M8 p

      6 |1 M# P0 J  C2 ?  H0 E' i/*优先数的插入算法*/  
      - v& o% ~6 [0 u

      4 K4 b# |: w6 E, E; D6 @( j$ L' x5 F

    • ' a! [, g3 W, y, Z2 |+ H0 v" V

      6 h* a4 G% R' d, h  E9 u6 p7 ?insert1(PCB *q)  
      ) x$ c/ T& `0 O
      . J: a9 F# K# A! F! |0 W- f

    • / T9 X( G3 x$ p' s- h
      8 ]+ ~5 v( b5 I- r
      {  
      & ]* R5 m, L& a1 }8 Z

      5 X0 F, M) t! z2 @' k
    • 3 Z" N0 ]* ?" @0 n. g5 f/ ^
      0 R2 ^$ f9 J2 h" A7 i
         PCB *p1,*s,*r;  0 z4 e" [0 b' R

      ' e: w  X& O* m4 g- m$ y

    • / }. x) L. x9 T/ s7 g! O" d

      % c! j" N) \  o" O8 k   int b;  . N3 h- O/ n: o4 k; A
      # Y/ ?" c5 N0 H, N" P( k9 x

    • $ U' U$ E3 h$ b

        ^7 f# T# Q2 i8 w   s=q;  /*待插入的PCB指针*/  
      ! l0 ]8 e6 q7 [; T

      * S3 z1 s5 @; ^

    • 1 n" x* ]; r: f3 p# @- x5 k

      ( o- N" `- I. {( m; a   p1=ready; /*就绪队列头指针*/  
      2 q! S4 s6 x" y8 m/ c& h( z# D+ n! Q
      2 l2 B$ Z& w/ ]# P( T, C
    • / x' t8 |: s% t$ o$ F" r4 W
      $ p3 K7 h$ J4 `# f3 b
         r=p1; /*r做p1的前驱指针*/  
      6 l# _" {7 @( M6 n
      . H) o; y2 j& ?9 Z0 `

    • 8 o9 w3 c' Y3 A. r9 U: v9 m' S

      1 S. J1 M( `' [) d' M" e3 q   b=1;  7 ]* |4 Z# D  D

      ' j: ~5 L# }9 o; ?: @# q* U
    • & A2 s9 Q0 R5 i$ _) i5 t

      ; q' P0 X$ }9 L6 S; ^- ^7 J( S7 V   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      " o6 l" d4 g/ Q7 @' `) @* Z

      + x0 S$ e; e3 G# [) I& ?2 `1 t

    • 8 C' ^; R$ _) C( d

      % {; f7 r# d' k3 \; Q' O      if(p1->prio>=s->prio)  ( D3 G8 H. z. w( P4 V8 @! T
      5 ~2 H8 g  q" g+ G) h+ L  Q
    • ; h7 c3 K0 K8 U2 }) C

      * Z8 @) _5 P: n: I* p      {  
      2 @$ D% I$ L% Z7 t  o

      ) F( l7 f! Q; W8 A$ w+ q  e$ W
    • - N7 u6 q* o) T3 t, ~. l

      5 b; R5 t7 X1 }     r=p1;  
      - U7 o! O* A) K) S3 X
      : `; F) ~7 z2 V7 l: w% ?# {: t+ ~

    • 5 y7 ~+ A, j1 p, G& B* e; `

      8 P0 b. z' V% I" F& M' O' t* A" ~% l     p1=p1->next;  
      + o, Y, T1 V: w' k8 `
      ; n; L; G# Y' |" d* t5 S, A
    • + ~( e/ `; G0 r& u1 m$ K
      - @0 p/ r% ~4 _
            }  
      # r( u+ Z0 w7 H

      4 e/ \& a  m9 b, B! U  m1 M
    • ) N+ }- I0 T$ v! a& r4 a
      1 W( \6 U5 C1 e
            else  
      & W% y- h. z4 y; K1 t" t& |7 |

      0 r2 k& n5 w* O' ]# k3 x
    • 0 e$ V3 @5 v- P6 b: b( b

        E+ T) G1 s1 k& O$ h, j     b=0;  
      6 F8 C1 V* C6 r4 F' J4 \5 F

      . A8 j$ _! x+ y
    • ( \3 w' W: ^6 u& \: Z9 o

      ) T; p. a$ C8 G0 I- P1 h   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  # @' n+ k6 s1 N( U. q
        e0 e* _5 g$ J0 m

    • & w$ [* R3 E0 {% H% w3 _

      # B4 \0 @: e0 n   {  
      ' ~% ?- @3 i, }! U0 ^

      ) A1 P" w  P( s0 w- u' C: p% F' K

    • ; p* @2 b- @) l* ^  h0 @  V. r7 T
      , u) J3 P4 w( b5 t! {
            r->next=s;  
      / d0 r1 q; {7 F& t7 ~) o" |
      4 a5 S" d& E) y
    • 0 a( `; W! L% a* z7 r( O

      * E+ N- X; R% J      s->next=p1;  
      * x3 W9 e" r. w; D1 v1 d
      & L) H' [% x0 b  I

    • 9 }4 w" X* O6 m( r( u# K
      8 A1 Y: D6 I! h# z- D, q
         }  # M2 e7 S4 C" P% s6 w' j" ]. f

      7 V1 |' k8 T8 v  f7 e; w0 }

    • # N1 X1 _9 ^2 Y

      " p% y6 |( a3 B0 k( v" {   else  " ^: v' E5 ~8 Q+ Z' K2 o8 T
      - w6 Y8 M" v  e
    • ; p# @8 [% L# W! e
      2 Y! r8 v6 W; `% a! ]
         {  $ C# T9 g2 q% N

      5 N# Z, A' C2 ]. K, \. r) C
    • , \/ v) U8 o( _2 J2 `

      , G1 c# O) T% P: Z2 s      s->next=p1;  /*否则插入在就绪队列的头*/  2 M1 H! e  G- J0 x

      : J. q5 D' O0 w2 _6 e" N/ c) m; p
    • 9 f3 {- N, \2 \$ B: E& J
      + _" v/ `7 o& h& t& Z& Z% i
            ready=s;  , J% q, Z8 o/ T4 K
      " |$ W3 j# P/ A4 o$ G( u
    • ( H  x8 G! v* I# C, ~

      3 I# R; i+ \  ^" ~9 q   }  & ~8 r9 l: C) W& t, @9 U, V

      ; W0 p$ x- F/ N1 ^

    • $ w/ v6 ^4 l; T6 @' s$ S2 x: c0 N

      8 t4 H3 @' `+ ?4 T6 f& A. J}  7 P+ \2 h# }9 k1 v3 B8 X

      7 K6 \4 ^* |" p4 Y( o8 B) B
    • 0 q  U! B& F5 x
      2 W) z2 @& X8 t# }
      /*优先数创建初始PCB信息*/  - N' p0 H3 e2 Q2 {' o6 U

        a6 P/ P" N; O# @- p( \" o: W. `
    • 0 p& x8 [: {& d! O( w/ [

      + |( O1 x) A8 r: p6 Svoid create(char alg)  ; J' i% }3 `3 i* I% G- j. N

      - D. K! E" _% l# X! T- l

    • + i. E2 @% u' N, m2 X4 D
      " h( I+ V2 H4 k  d5 n/ l
      {  
      ; ~* _) N1 n3 Y% ]
      " r1 k7 i) g# O8 D: ?5 h
    • " T' @' ^  }8 e7 @" P
      # ]. i9 k( L! |* f' P5 M
         PCB *p;  
      : }" V' f& i: |* d
      ; l1 G% `' Z' J0 P8 s( t
    • & d. u( m" W8 [: h9 ~9 C2 y
      8 e1 c! Z2 k3 m. y7 z
         int i,time;  
      6 C& k9 V5 O, H6 L2 J

      $ W1 b5 b2 Q, j; r
    • ) N5 |; v4 f8 q( [) A& F
        D6 w8 E# X3 Z# g
         char na[10];  % X1 F4 k2 S5 n3 S7 Z* D+ e
      4 x! X8 p: V0 R& E$ G  i

    • ; K% E5 H* W; V8 J

      $ T" b9 J* Z1 [9 F% a   ready=NULL; /*就绪队列头指针*/  & [% a1 @( O4 h
      / \2 w' O; h% n7 o$ m; e

    • , [" u' x& ~/ y5 j3 e0 K

      ) p. S/ n+ y# z   finish=NULL;  /*完成队列头指针*/  
      ( R' N- }$ D6 p) H3 u  z7 J% S3 x

      ( C2 o5 D1 [7 C' q) l
    • " N( k4 E& p$ E2 H5 ]1 v- r
      : H- ^0 |) a$ [0 [' a. J& s
         run=NULL; /*运行队列指针*/  
      / K- \5 J+ c/ G5 E
        T* J" _) @: G: }6 x5 i
    • , R: `' R0 l# p* X$ s' Z
      * Q5 }9 @$ ]7 W5 g$ `6 D. I
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      " ]' a! e) j5 N5 a2 Y; e2 j/ X

      4 X! L/ \& b8 X4 S
    • ( e1 Q" l5 Y% ^0 I

      + Y+ l( Y; B1 C6 }6 @   for(i=1;i<=N;i++)  
      0 s" R7 r- K$ E$ N3 Q# }9 Y

      + w  H+ R9 e; L' B; ~( L

    • ' S1 `( {0 B3 t, a5 W# N5 a

      ( a6 V# r9 ~* B1 O   {  
      $ n! B$ h7 R/ o* U3 F9 Y0 ]# m* n! p

      8 C2 W0 A$ j! i+ f
    • ( [# t( o$ n8 O8 _5 G  v- l5 I
      & h; o/ |& q3 D2 S7 J, a
            p=(PCB *)malloc(sizeof(PCB));  ; f; B  q: o; O: l* e0 Q6 i
      - d6 k8 j  @9 I
    • % \8 B) N; f0 o' F$ C, Q
      # `, O& p! X/ ?' L6 r0 |" k5 n
            scanf("%s",na);  
      7 L4 e1 B/ X4 _# c. t6 l1 _

      ; h' I1 Q  u* Z" S

    • : ?) Q$ f& r: Y: ?; P0 b
      2 g8 P9 ~4 t+ }" }) Q
            scanf("%d",&time);  
      / v+ g# I+ [2 R' F

      6 q% I) R7 G1 ~" H0 r) Y

    • 6 K( C4 C' \( t/ a% P! T0 C( y

      7 b6 W; L( h% k6 ?7 M3 k      strcpy(p->name,na);  - }$ V/ b0 Z# y$ E$ o" E

        _% ?0 H6 y* a0 h* G
    • & m$ t" t0 S- o4 w% k8 D
      / p6 j3 ?4 v( H4 }9 Q" \/ v4 M
            p->cputime=0;  ) d. B( `" E0 {! l3 K. b* S* z8 e
      3 U. c. G! K9 v

    • " ^# ^& R5 N0 F! U# c
      $ E! C* Y9 ]9 B
            p->needtime=time;  % ^  x5 {) N5 F1 s. Z$ v
      8 l- U7 V5 f/ h' ~" C1 a) q7 W

    • : C9 ]* W3 e! ]

      . i* u2 ?! r3 |1 S- f' v      p->state='w';  - H- Q  N8 T4 |# R

      ' E) M9 S4 P2 ^, {. s' z: Q
    • $ g/ y" S$ }9 `' O# Q! M4 B

      4 |" N0 O% K- q7 A) d4 @7 A6 h      p->prio=50-time;  
      ; E1 A$ Z4 Z/ [# q2 V3 j
      % N5 k0 G# w8 x% v' ^3 N; @

    • ( }# A! a4 n+ l! X

      3 R$ O: k! P; x* o* c, g. Q      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  1 k- u' Z4 g6 k; H% c1 Y% n" _) E
      3 ?; R" m4 B& w# m& U
    • $ v& w/ ~/ T' V: ~: h8 o

      5 h! u& n, j8 v6 h     insert1(p);  $ I2 f" |" _5 m  u, h  u5 b
      , q# r, R8 C* r" ~+ e, J" [) c: K
    • ' v) @! `0 m5 q# Q! F6 Z- k
      + g6 d. Y* j  w3 F, z1 R) i6 A+ u
            else  
      6 N2 u3 u9 i+ z7 o) l6 O7 c

      ( x7 i4 W& E+ n5 ~! S
    • & i) q" h2 C, \4 h& b
      7 \" P. ~" \8 L0 t! ^4 S
            {  
      ) x. t3 K% ]0 U$ h2 v, d

      8 o3 }4 u/ k( b7 \

    • 6 x1 m' Z5 J1 }. z

      , I! L9 ?6 Y8 [! t4 @2 }     p->next=ready; /*创建就绪队列的第一个PCB*/  
      , m* g+ A+ z! n8 c
      $ u9 s6 I. s+ n; y/ M7 [

    • : _! {- h' {& T3 r* Z7 q) i

      # ~, r7 Z6 O; R5 Q+ f; J1 M4 E5 ^. h     ready=p;  
      ' ?6 ~% e* K5 W- W2 N
      / t( w- L3 E1 v9 q1 \

    • ; o; p% O% t0 p* H+ ]6 \

      , U8 D! V  F" w! n+ o7 T, n# z      }  $ q+ [6 j" V* L1 u& K
      & [9 \& Z( o! l( s: J

    •   X& U6 ?- r, ^% D  V4 Q) \3 G: A; b- ?# w/ K

      / M; K& R' ~& u4 m* w; v   }  1 Q7 B( E. O, c- F& H4 B  y
      7 o: r; U+ q8 f1 u& ^* {, |  A" b
    • ) n% U9 s2 x$ b7 Y6 _6 Z
      . L2 `+ G8 C9 R+ w) o$ @/ ~
         printf("          优先数算法输出信息:\n");  
      ' P6 {% P1 A' m
      6 [# w* r6 @" |0 G1 U( u/ [) n
    • ! |" W  Q4 M! f! A) ?* U

      # n. E9 D; \8 k$ o' t# I2 Z: D   printf("************************************************\n");  2 g: {1 \6 J4 q3 P- H4 C" s

      7 f) t, v. g7 K+ A
    •   q! N- K: _* j, X+ J) q9 Z, u7 O/ I& h
      / r% p( L1 H2 Z$ h) g
         prt(alg);  /*输出进程PCB信息*/  
      * A/ \, o0 y5 Q
      3 @/ a9 S# O% s* F
    • 7 x& P, V* M! N

      ( h. V: p% K8 m! B' e* f   run=ready; /*将就绪队列的第一个进程投入运行*/  ) ?. V% `7 w8 }7 n
      * u2 u- K4 g1 F9 ^! Q; Z7 x0 D
    • ( e+ S7 b9 X  X6 z
      5 L* V. Q' a+ l; G
         ready=ready->next;  
      6 C5 o, t2 _: p* ?4 _; d/ p

      0 Y8 w+ w% F+ N1 i

    • & E: Q6 B0 t; |1 L, W0 N

      6 t1 ~$ p+ d5 O   run->state='R';  
      , b+ @, Y- Q& u/ q

      7 K+ R5 H# i6 j, ?3 L4 P) }
    • & k2 C- }( u, O' _' Z9 H: U" x
      6 [0 ^" B& ~& j. v! c8 _
      }  4 Y* q9 Y: U8 {

      9 }8 `( ~; U7 v: n

    • ' G% ]. J" i. Z0 C0 T, j
      ) V' Z* S( p: D2 z" @, y0 ^
      /*优先数调度算法*/  
      ' Y6 u% `1 S' [) V( G3 F' L3 Y" N
      . V. D( G" J0 I% c

    • . G  ^: p! A1 Z

      4 V! a1 E  e5 r3 G5 zpriority(char alg)  
      8 [4 J% f/ a9 Z  p- G
      6 Z# {: B4 z; G* `: r0 ^3 c9 D
    • 2 A5 k% e" n, o9 I5 C
      ! @/ \, L8 d8 g3 Z
      {  
      ! h2 q# X. J/ y1 h  B

      ( E9 L8 d2 Q/ X! f+ u/ Q3 J  t- F. E6 U: ~
    • ! C9 ~. `* h0 `. @$ {

      7 K+ @6 m: G2 n; ^( m   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      7 b. w9 T5 J5 g8 f9 X
      . p! Y1 y1 g* |, w5 E/ j! R
    • ' U- i% x3 J* `$ ?- i1 f
      ( \+ A% E" b! s; E
         {  . d! w- v  ?6 ~  q+ q
      ' U9 y7 u9 R! U6 v, {8 c) Y9 q

    • 4 `5 E! M+ l$ V/ e3 C$ [4 J

      " i; ]5 I8 D7 K7 Q# o- H4 Q      run->cputime=run->cputime+1;  
      7 L- s* O3 ~8 @1 K1 n! v" v* `
      * N* E1 [8 y$ e; W; f% X
    • ' J% T" a+ ~1 q# }8 q9 r
      " X( X/ N3 j, n8 Y' L
            run->needtime=run->needtime-1;  
      & F- n( I4 k% M, w/ d8 Q- M3 E/ i8 f
      * M( D9 R8 ]. w1 H( J+ i2 g% m

    • ) d0 `% ~+ y2 g/ m' H) ]$ `1 |
      3 N5 }! D* J( A" H
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  / `) R2 {7 b6 y
      / t! @3 z* j- l7 D9 ]6 K  S" M$ Y
    • ; u7 @- }9 L$ g
      4 {& H8 n" \7 G9 B$ V' |
            PCB *p;
      : u+ F3 n" X$ d0 U* n

      * H7 J, t# f2 W3 g5 n
    • ' C! w6 J; N  C0 _
      + M+ i9 H7 M; U6 R* {5 g/ z0 X5 a/ C
            p=ready;
      ; N4 r; j4 N- m8 |- ^& R7 x
      % ]& b/ y/ F% j
    • / D& ^3 P  Y6 B# `8 `) I

      , x+ ]4 N) K: T7 D7 {# @      while(p!=NULL)  / F: U* W2 s  A  e
      4 i" _0 R+ M# b9 F4 \

    • * h; G8 L  u! g$ ~. l+ w
      3 Q  I' W% s, ~* i. N* `9 O
            {  6 M8 M3 h7 W' _% C4 Z$ U

        n# n! F( L+ l; l; U9 y8 K
    •   E9 Z1 o, B- H3 U1 _* F" |1 J$ B
      / A. o/ m: `1 ?6 \. W
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    $ K$ n# _. I2 d% x6 n( C# L6 R

      : K+ s6 U  e5 ^0 t2 z' X% e$ c
    • " P; F8 v" N% F/ |
      : l/ M! p+ o3 A7 Q8 u2 g
                p=p->next;  8 f( \/ K- o* G
      , ^7 n, {  B% y; v; s9 W7 A1 J$ f
    • 7 N  H3 j" q3 Z* l; h  W: H

      * E8 {4 a4 S6 D7 X1 h, A      }  
      ' C6 [' z& N( H. L% s: O7 b+ J* M
      9 O8 x. s6 Y8 w% U

    • ) i4 \, K& w3 H7 m0 ]# ^
      ; k6 G' w# {' K- q# B8 x
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      & A# B9 |, I  N! [8 Z
      ; j7 |- D5 R; s( `' {

    •   v6 }& x4 u, x% i6 h+ R7 x
      / F6 l/ d) ]- A- r& {) D
            {  
      8 M1 t0 L, T4 q/ I, m; V

      * e. ]* X' x% Q0 \( @; }

    • ( O+ H3 `/ ?4 }5 N: a
      , k2 G/ M/ W9 U0 \# @! {$ l/ o
               run->next=finish;  3 P& U8 O% o$ t8 |

      ' B, v! H8 ?% O5 _$ g1 Y
    • 7 m3 M% Z" s: G! {7 e

        M; C1 ?5 l4 @' O; t4 N# i         finish=run;  
      7 }8 g0 A1 C# f4 l2 c. i

      $ p4 u/ F1 x9 E
    • 4 Z& ^  y0 _4 k' U3 O

      0 E) H( S" `, B$ M. X$ R! O' ^         run->state='F';  /*置状态为完成态*/  % y; i( Y9 ~$ y; `0 H

      - N: c7 W+ a6 D; h
    • " H& `0 T$ J  T& W4 j7 J
      3 Q7 J7 Z/ V# q! P3 s/ w
               run=NULL;  /*运行队列头指针为空*/  
        s- p$ {* V3 ^5 a& _
      5 B/ c  r8 H  |  s* s* j

    • 7 n  R, w( B/ k
      3 Y& z$ ]) y: H9 x
               if(ready!=NULL) /*如就绪队列不空*/
      1 @: j, W) H7 ^+ u

      : J1 C$ M) k# n5 Z+ J5 j+ x

    • : D7 m/ ^5 \6 c7 g( o

        ~: ]0 |& d' F, G" f         {  
      $ |2 I0 j- c1 b' d6 ?
      ) ^1 n! B. W" o; d5 {* h- e

    • * F$ i, S7 w# Q& E- U9 Q/ X

      2 H6 y( t! V+ i1 X) \& [! q9 i            firstin(); /*将就绪对列的第一个进程投入运行*/  ; W3 v! F: D  @! s9 Q  X

      $ _: d& a# T8 w: U
    • & G. N4 G* J  y, @

      ) K/ o# A9 }! j- r% W1 H         }% ]- V! o4 U2 m
      . N: a5 z/ H8 J' d" B# i) m( [( X
    • 1 L5 \' r9 K' A6 T) b) |4 C0 |! {
      # q$ C0 ^+ M8 X. t* w: g5 y' v, j; G
            }  " c0 w8 T2 S+ i
      & |0 J( x( X$ N- n3 I8 H' B+ L
    • 1 K) i6 s+ p2 f  ^+ ^

      $ m! A- h# c, L' w4 |      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      1 s( T+ T: S8 a; Y
      & a# J, M$ N# ~8 W- ^

    •   H/ ^- `6 ]' v2 t2 u6 ?6 c8 _+ z

      , |1 n. X$ Z+ O( u+ _     if((ready!=NULL)&&(run->prio<ready->prio))  . q  F2 j0 r  v; b

      & M( d1 M: _1 K

    • ( @" D# l5 h9 u: ^# N
      ' I9 v6 n! U$ a  \1 Q! ?; J
           {  
      5 d- n; t) l7 T( ?  l
      2 I4 e8 w, X; a' a8 e6 q, a
    • 3 _2 X5 l# L: E- @+ A

      : ~. @4 g8 R; p* O        run->state='W';  7 p' n" o: J  L9 W0 D, ~
      ; W8 ~) n/ T( g9 t+ }) U; N, \

    • * w2 ?8 K3 W% O; I, l: \3 f4 i, Q

      / r5 K. U2 ~2 M' b  n        insert1(run);  
      0 p6 s% f- F4 W/ ^. A  _
      . J7 r: L5 A! f7 l' v  ~- Z8 r

    • 4 h2 n3 _  e. w( @; N/ X0 ]2 g

      ' ?* y" r0 k+ i! t0 ^        firstin(); /*将就绪队列的第一个进程投入运行*/  3 H# @7 Y( Z4 h6 b3 N8 |
      2 i: W6 o; I1 r! V4 ]; {5 @# e% [& Y3 W

    • 3 s& U, r; {1 t' N
      4 i" l, I6 `3 s, ]
           }  / W3 ?2 @. D0 {2 Q. d
      , C! R6 D% l- e/ ^2 r# o# R

    • 2 `7 |6 D  s* Y: r, G- G

      ) A/ N8 h3 n7 a6 j0 U) w& T: [      prt(alg); /*输出进程PCB信息*/  
      ! K) p$ R# [' R5 U% V
      / v# ^5 j  s* G: f" Z  Y
    • " _; [: W9 N# C
      ; o; H4 E. v2 @, b
         }  6 }, ~9 A" @. G9 T! V1 Y2 f

      2 Z+ l+ t5 k( h+ x1 w1 f3 @5 k
    • 3 N& |$ @/ ]  v
      2 x) a4 a' P; V. ~
      }  + \9 t! E' w) B/ G( r
      ) X- A0 f0 L, B6 t

    • * {4 ]9 r. T( `9 M% T- E

      " ^0 z: [! q& z2 y/*主函数*/  . V& T% ?& s0 `* o+ A

      5 W' U  P2 N& P8 h/ ]0 j/ [

    • , q; k) C% N0 y: p& Q+ y. |7 X" a

      0 x: y0 {" l5 e$ Z2 V. Gmain()  
      6 y. a' i) s3 T$ V/ G6 h
      . Y$ b% v" D, `1 G9 }; J
    • 8 g3 N+ p9 Z* u0 H, _" r

      ; }. h% m) m9 Y& k( S2 @& x2 N{  / a! s& x+ B" L1 C3 \) |3 F- F
      8 L3 N+ t; a. X7 W6 o9 u- G- u
    • ; U. D2 w* A5 e" O( x: j" \

      4 r' ^- m! \- ]5 W   char algo;  /*算法标记*/  
      ' @" f$ r1 j' Y1 z' k
      " h/ F% F( F6 Q, e/ v0 m
    • 8 ]! P1 y6 H: ~. Y$ _
      " B8 n/ d. t, d
         printf("输入P确定算法:优先数算法\n");  1 T" p1 n% v% v& `2 z' B

      5 _: i4 V8 p: ?* F3 ^+ H
    •   j8 P0 e% B5 r6 v, Q! K7 y

      5 e* q  K; ?6 e7 X" R   scanf("%c",&algo); /*输入字符确定算法*/  ! y: s9 y: [* o  P* n6 x/ g

      5 D. h7 ^! F" F. \- x6 F

    • . Y  a6 d  S; w' i; A" v
      # m8 p' `6 w+ \" E
         printf("输入进程数:\n");  0 w# A. n" K# {5 a+ h0 m* T

      2 ?9 Q8 \: ]! S+ P' U
    • , r8 B6 ?. t  g# d2 j% i- s7 Z
      . L4 K3 ?+ t3 Q* l( l* c; b7 d
         scanf("%d",&N); /*输入进程数*/  
      1 g' i3 h2 K2 c& w$ @% v

      ( z. \9 c. r, }+ i  R9 q

    • 3 w; j1 M9 k. `( e
      % U7 c, m- C. {6 F) _
         if(algo=='P'||algo=='p')  
      ! h/ o  c% h  h* M! q
      0 G" M- t/ T5 P7 H
    •   W. o. J: v! ^

      # g8 _: P" ^/ i. i9 N  V   {  - a6 f' R- u$ d5 Q* `/ U. z

      : w- ~& C. U" D9 w' f0 S

    • 7 c: }; u3 N7 w

      + Y4 p% t; d" n) W      create(algo); /*优先数法*/  
      1 g/ z' j/ u- q3 \' q( c5 M

      1 r' j" @0 Z: K

    • , w  Z' c5 n4 X" I

      - o% o# \# Y+ ?) ^      priority(algo);  
      ) {& N) [7 h% F9 y$ t

      + H" F9 a" E7 q$ X1 F# Z
    • % L& p/ k6 p5 d$ E  C3 c9 @2 H' s

      5 B  \+ H( v0 H. S" C$ w' b' a" o   } * Y; y) q3 @* F( l

      & W  h0 B! ?. ?9 N  n7 y
    • ! S, E; z) q' e5 `( h, r" B

      ( |) m4 i: s) D5 O8 c9 Q}! C4 ~; s+ u5 w3 r7 o! u) M3 ]3 X

      % q! D* X" E; R3 f
      4 N  {6 g! x+ x$ N

    : l5 m' V3 Q/ T2 Z6 w7 ?
    输出结果:7 D, R, ?4 Q6 y; K

    + b! y  V  B  }% ]
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    $ C5 x% _/ [7 d) R. [; l/ D  o
    5 e0 t( D- b; f2 I
    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-6-9 18:02 , Processed in 0.352716 second(s), 51 queries .

    回顶部