QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3152|回复: 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
    - i' t6 [# R" F6 a( F5 S, K, ?* l
    优先级调度算法3 k! b+ q& r. C; I$ q& C

    算法介绍* o, C- f+ O/ g1 o
    优先调度算法的类型(用于作业调度)  B8 f: v) P6 i2 W. B; J% s8 P
    1)非抢占式优先权调度算法 4 W: O* Y* k5 h  y/ r5 `7 {  ~: Z
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    ' `. |% i) r$ e- T: R2)抢占式优先权调度算法
    & f, p2 J1 j- E: z4 e7 m只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    ) u! Y- G5 @3 @% z% N/ K1)静态优先权 ( D' [4 ?: |1 f6 g* t
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    % x) K# N; C2 K/ P5 c( R

    2)动态优先权 7 n2 Y& ]  B! p* v0 W

    算法实现

    抢占式动态优先权:

    ! Z6 M+ g! h  m. v% }; y% T
    PS:本人认为非抢占式静态优先权没有实际价值。


    • 5 |. l# W* z% p  X# y" q
      2 }. Q4 |$ ]5 j6 r, L+ A" Z
      #include <stdio.h>
      2 _' ~$ [# T0 O- _

      ! r; L3 i8 {* F# K# X
    • . ^5 A/ ?8 _. V: a) V
      % i" V# O4 R- o" L1 T, _7 E
      #include <stdlib.h>  
      * O1 b' m0 {# Q" }
      & u0 z% }5 H- q: p" @$ H

    • 1 n1 d. ^/ M4 }8 P$ h; o- h

      * G9 W- a5 Q- _% E/ A8 ]#include <string.h>  
      ! j1 I- a# D* R0 {1 C

      . |9 m, V  \: V+ x) O0 U1 Y

    • 3 I  T( A1 b" X  r

      , k$ Q, z5 F- N5 ptypedef struct node  : {' l3 R8 L9 b! m$ e

      ; h) S7 ^! S3 O- O6 R; }" @: k
    • # A+ k0 `  ]9 ]7 n3 Y/ Q/ t# {

      . `( @$ i. P; R4 K& }' K{  
      ' S+ ~5 Y$ d7 ]8 T; t/ f8 p
      1 R8 W: U; D$ P9 y9 n) z# u  _" w

    • ( O6 ?9 P  X& x: B  ~

      4 q. F% E* y4 `2 I9 |2 D   char name[10];  /*进程标识符*/  2 E; V! h2 k! a) u9 Q
      * O. }8 f% M  b! V- e
    • 6 [/ `4 X# \  H8 z4 [

      3 ]0 o1 ~; @. s) b   int prio;   /*进程优先数*/  
      * X, V* o" @/ s
      6 ?  S- z5 ?' I* {0 c, \
    • ' ^6 J' _3 p+ M$ b
      7 l9 p6 J# e, f. J* [
         int round;  /*进程时间轮转时间片*/  
      8 ~8 D5 j$ F4 y" a) T

      : d2 O9 l$ O+ `. L# Q

    • - V0 Y! p7 ^* _: W( Q1 g/ V
      + m9 g; [8 Y9 _& d5 @5 t* V
         int cputime; /*进程占用CPU时间*/  3 H1 n8 \) P; d( o' ]8 f! J
      # s- a0 C4 _' K/ ~+ [; [# Y7 b: ]
    • 0 s& ?+ B/ J4 }* b9 j& o

      , I3 O' a1 ?6 C2 H  f* W   int needtime; /*进程到完成还要的时间*/  7 T* L, W6 E9 q# Z' v

      + H8 m! q/ q% `# d" x

    •   O* O- J( v8 x8 Q8 Y  d5 ~
      $ n9 C% G' Y' Q" E4 Z7 _
         int count;  /*计数器*/  
      / I4 K8 T' ]( n7 {- }# y

      6 q7 \8 h* B* I' {* r' A

    • 0 _7 k/ H8 R7 |1 f
      . G" S/ _; O9 |5 B: H" g6 V' ^
         char state; /*进程的状态*/  
      5 \2 d8 o% s; k7 q
      + p" i  K! [" M* b2 r& Z8 w4 z3 `$ K
    • " E! P. U( H) G- _: Z0 v
      ! q; u. ]* p) w( E
         struct node *next; /*链指针*/  
      0 ~" M6 S$ f5 x4 Y6 Y/ a! V; l
      & P% O( |/ J9 e9 I# N' h
    • & v- F  R  }# S& N* ~4 u$ D

      $ N" u" j( U3 J7 H+ L: }, l3 c* ~}PCB;  ) o# B; c) X$ a0 l, t5 m

      % k# Z- A, m0 K

    • $ E$ r# [$ g; m4 ~( E+ R
      4 Y1 d; e# x4 l8 s  c
      PCB *finish,*ready,*tail,*run; /*队列指针*/  . s+ U! W. S; k5 s
      # n/ y, F* S0 a8 ~, v. w
    • 7 r% R5 A0 e* B. |' C, D- ^. @1 ?
      - o6 b) s$ A4 _8 W6 D8 @3 g
      int N; /*进程数*/  : |# J7 r: p( T" R; m# Y2 n% s# ]
      ( n9 G0 |: G. P6 \/ H

    • ' B9 V9 Y8 y+ v; @1 D

      6 ?6 o5 s' a4 ~0 }4 R1 v5 d/*将就绪队列中的第一个进程投入运行*/  " h3 K; {, ]* e* O* ?+ X% @
        S8 K8 l9 M! a0 H

    • 8 s# v' d; D+ K$ M, z
      7 z2 H6 G, T4 o, x0 v7 Z. c
      firstin()  
      ( Q/ p6 P3 g8 Z2 E

      ) y  d5 K$ U$ ^; O

    • 1 O% l! _- D5 w

      ( w* G! k4 ]9 B1 H{  
      + i! J- t7 R: m+ v8 Y

      0 [1 `. `" z* J5 y, i8 ?1 Y$ t

    • - c/ N( }7 P9 M: y% [

      3 L. n& ~! p3 \4 u* {& s. {# Y   run=ready;   /*就绪队列头指针赋值给运行头指针*/  " Q' b+ j$ |: B% F: P7 i+ N" X( h
      ! S+ l/ I0 W) f* [8 e& ]) e  c

    • ; K7 Q6 r6 s  Z; `1 W

      " V, L& U' [- ?, E4 I1 |   run->state='R';   /*进程状态变为运行态*/  
      # c6 R1 K) H, x4 I5 z
      1 k6 t1 G( K$ y# V9 a1 R& _: Q' E1 v
    • 1 ?7 r. {5 V) `1 y+ q8 i6 z0 s

      : K4 K5 X& m* m" s; W) Y7 W3 L   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  ) R( b/ h2 @6 I+ ?7 R& |" I

      ! e, i. r+ k, g) w4 F1 H
    • - X; j1 \6 `; t+ S4 W0 G* ~8 |# j
        q, G- }2 Z0 J
      }  
      ; x3 t$ O, d8 E8 L! A
        w3 U2 C' n$ `; {0 [

    • 6 U6 F6 y* G2 ~& x

      ; l/ k: g7 Q2 {0 ^/*标题输出函数*/  2 m  a8 T2 Z- a' o) Z
      6 W) G) i% |( W  F1 e0 f/ k

    • ; }5 C! ]6 M# i% w
      ; H0 d! ^; j9 {" Q, n) b& p
      void prt1(char a)  
      ' K' A5 M& V$ z5 D; `) H+ s0 O3 W0 w4 W

      1 _  c- O' V* G8 u" v

    • ; @+ O$ {9 [' @
      2 N3 s2 y5 P; n4 t% T: S
      {  
      " U. V* L  c& c- a
      6 h0 @- z' c* h, y; A* J5 ~

    • & P' e+ B4 \  d& ^4 z* \1 [6 S; i

      0 e8 x# {, k% ^. S7 n" d" d   if(toupper(a)=='P') /*优先数法*/  / {$ s) Y6 U4 j+ L

      : V6 @; N. E3 s- y
    • ) P9 q: ]4 @1 Q, n

      4 {: O  J* x* g) z6 J      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      ( y  N/ K  _+ a% H" m. N4 |
      : ?4 G# W# ^- H% c6 O1 K) S+ e

    • 7 y8 ]0 n% ~4 u+ D9 @- @5 _) S

      + T) O6 p: Z, g) P0 V   else  
      - k: y* M4 B  W  X$ i3 T3 i

      / q$ [4 p% c! a# Z1 G$ p8 t

    • $ e4 K/ r7 S! ^5 B* I" ]
      2 a/ s$ P9 t" D$ P/ k0 o% T3 `
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  3 H# [+ G* d9 P6 ]
      9 p( H$ w; ?6 I

    • 2 F  ^# L% h. [

      ' v9 Z1 S! a! r" H& V  a' P! e3 o}  
      " P- j, B: C3 `0 a. ?. Z* \

      / I+ k- o: u* |2 L7 v, G7 i
    • : L  @' y3 E; P& W$ p
      : e, W8 s" f4 c% f3 m2 A+ n6 N
      /*进程PCB输出*/  + S0 e, _& ^; l$ n' y6 W6 [

      2 L* i9 B4 P) K9 D" m" |

    • + A5 [4 v8 j9 ]$ u" _  I6 x, r" z
      9 Q  U% {9 s) C$ d2 Q+ Q. B% ]: V; o
      void prt2(char a,PCB *q)  : J4 s8 }  _% \/ X1 g! O% v

      0 a, L$ W& s* J
    •   a% c- c; ?' M! y
      " g! M+ R. }# ~, C5 l
      {  " @+ P" _* [7 D- h
      ' d2 I2 O% l* ?5 `) W3 a; j) p4 r
    • 1 R* a  E( I; x% i% O0 {. ]  V2 t
      + }$ A( \* }3 D. h
         if(toupper(a)=='P')  /*优先数法的输出*/  ! g+ x& B0 \, `2 c

      3 O2 g; F0 ~) m
    • - g0 X/ W" k9 W5 f% A

      $ e7 R5 j: u: C0 R, y      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  $ ~7 y7 t5 z3 {$ `1 g7 k$ t9 R3 J

      % t. L! S0 d0 b2 g

    • ) N! H# u3 ^0 t; [1 X7 w2 k4 u
      % l1 l3 P6 G- L$ d! G
             q->cputime,q->needtime,q->prio,q->state);  * j* `/ O/ c4 k5 m  I6 s

      # r! J5 I* Z. v2 s) \* T8 n
    • 0 `8 G8 @$ b* N
      % c/ |6 p3 F; v% E$ z2 d! x# O
         else/*轮转法的输出*/  " l( j3 D- X$ e& Q9 E" t

      3 t0 n2 ]0 P* C% |* P. ]! F
    • % o' \  V6 x. R3 \8 s; Y
      % u6 n9 i- k' D
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  0 q( p9 J" \5 n* e
      - H# h7 R- F0 ?9 J3 }* O$ o9 ^

    • / V' N+ b- W) f" @. B
      ' S/ _/ T. R! O6 ~& W1 @1 m
             q->cputime,q->needtime,q->count,q->round,q->state);  % M: W  W6 x# G8 O

      $ D- r9 ^1 u( o$ T, s& o
    • * a8 j; f/ Z- o: l1 Q( T  ?
      , h2 _" R0 g; g" u" A: D
      }  
      " P( `0 @+ ]4 h& ~+ {* q% _* v
      % s9 F+ ~. x; X& S/ m2 [2 a
    • : r# P- e+ r: [, V3 M* X
      8 z, a  t. K' V! I2 v
      /*输出函数*/  
      ! L  F  {1 {0 [1 ]. r
      ( x1 V( f9 m9 b. \% _
    •   ?: `; ?0 K1 e

      : S' q) d0 O$ x. Y; ~void prt(char algo)  3 G, |/ f" C" C2 S6 y  Y
      , L4 V  Y: o- q4 v
    • / h) w! Y7 p" B" ]  b- z# F

      $ a9 E5 Y( M# t2 V+ E{  
      8 @) D  e" r/ D
      ; Q6 R) @* j; ?/ Q, R. Q9 n) V' @. }
    • 3 ]% e% `5 h0 j& `- m- C

      % k7 S3 r# x: d' y9 ~   PCB *p;  - x5 d% A. w( P+ U2 v

      2 ?( R# F8 b# Q, M
    • 7 x  p& W( z8 p- d/ n+ ]: R1 `# a
      ; P, I. b0 ]. a1 w+ V2 D4 Y
         prt1(algo);  /*输出标题*/  ) I8 w# `* p' |/ c* {3 [# j" ~
      6 E" _8 v1 `6 Z7 C5 M

    • $ a3 D) l# o' }, V; F0 f1 D7 u

      ; m- ^% j' T- t* Y5 \: D$ Q# |# a   if(run!=NULL) /*如果运行指针不空*/  
      4 H5 P0 e+ n" F( a
      : z# x& \/ |8 U
    • 1 D: S/ x0 x  E% e; d$ l
      ' q4 N, T# N( a
            prt2(algo,run); /*输出当前正在运行的PCB*/  6 [* I/ K+ Y0 I, b' r3 [

      3 [1 c7 q2 H. _1 T" s2 t9 T# q

    • 3 p  V, G. m$ s9 ^5 ^- \( ^% l
      # f3 Y: S. D$ o' a- {
         p=ready;  /*输出就绪队列PCB*/  
      ; x- w; U! v% }+ @& ~6 Y
      2 g0 j/ P" V- s, d
    • # V( z+ E& W0 m
      ' z% @9 w$ z2 ]* ]
         while(p!=NULL)  
      ' w! D$ l( y" g

      2 g) J0 G/ t2 `, |9 s
    • ) S& u: G- n; K2 u3 F' ~- c& s

      & p  W* v# \* A3 y   {  ' D% f8 a+ s' j% I& p
      6 N( o! m" _6 N! N% \
    • 1 A2 A: @/ k" v; q7 G; }  O0 v3 ]* k

      . T  C: H- O1 Z/ i. |) \      prt2(algo,p);  
      , a4 w4 d9 T0 z) {' ]/ X5 g* \
      * w& Z% d1 |& D; d- d
    • , [2 J* ]. A4 o1 L& ^, f
      0 A+ N5 K6 M/ G- X" d8 `
            p=p->next;  . L$ Z( i" M9 n, H+ P, C# j3 H

      : p; `5 z, J7 Q5 T" f/ a
    • 2 R* v# k2 b, z" _5 n1 I5 _0 J/ w
      ( I: B6 f+ m1 F. Y" }8 i7 g& R: |
         }  0 {; c/ J5 b" u" d! k
      ! l, e$ B7 x8 W! d( G
    • ' m6 b  {* U. O+ J0 J$ J9 e( {

      7 X6 g7 x; u1 ^1 m1 {: Y/ m   p=finish;  /*输出完成队列的PCB*/  7 f* s/ ?; Q! K+ k3 g; g
      - P& ]; |+ _4 W# B8 K
    • $ }9 R0 v: T$ M% f  u
      ! j2 R& h' Q; l, `( p; b3 h
         while(p!=NULL)  
      4 V) y% F. y4 Y2 C% r6 p/ b

      / g) j  `' k4 g

    • ' G6 w1 b: G" N4 t! b. Y# v
      9 p3 z- o4 G, @) b$ Z8 m( T7 _) {
         {  
      / K& A: [4 j5 l: x
      9 G+ N, j! U- e2 s' x8 i

    • 7 w# I% J' ]' I9 q& _  }
      0 _0 I; |) D0 |3 F. v3 W9 A! L9 }0 p
            prt2(algo,p);  
      0 p+ X8 Q, N; [

      ! [7 @5 O( T+ X4 j
    • 0 e4 T# ?: k' ~4 z- x% Y

      5 e! i& ^! p' B7 Q, n/ G4 _3 D      p=p->next;  3 x) E7 b8 L. g$ U' ^: o

      2 V% p8 q5 [" o+ d1 ~
    • 4 m/ `( Q) z. p% {

      2 D7 `/ l+ H: p  k   }  
      1 U+ V: @  D0 e" S! ]! ~
      ' z  V; P1 w: ?0 j. M
    • 5 Y+ v4 K" I9 h! q: n/ P$ l2 D
      4 |4 G6 p& i, x( q) T) C
         getchar();  /*压任意键继续*/  1 l" q' |( E5 X3 I/ G) ]: P; @
      . K; G. m3 B' j$ z; F& Y: R5 Z3 A
    • 6 c2 R0 f; G& z/ U( S3 ]

      . b' L# D: R( H+ C/ f6 k}  
      : D' }" f9 {7 }% ~% ^" z* @5 M! C7 C

      5 N  D# l2 z) Z5 j3 b
    • - o; l: s6 h& F% Z
      & h0 ^" a. {7 w  E0 ?. e
      /*优先数的插入算法*/  . f' |: S& {* G& b

      * C& h. X' A- ^$ x
    • $ W2 L9 L- T7 n

      5 n! E$ n* u* E) e' A& oinsert1(PCB *q)  
      1 g5 j- ^' Y; @, v

      6 l3 r" N1 q6 R4 [, |

    • * l1 x/ y  s' W* M% b

      - [: w. d, y1 T{  9 ]! x3 `! U8 {/ [) A: r0 [

      / d  e; j  Z2 y$ `  c2 B

    •   E- |4 K2 o4 R( B/ C0 Z
      ' F# N+ R$ O, x1 h
         PCB *p1,*s,*r;  
      - x1 x  _* E$ R, s# \9 `6 Z

      1 |" {" R5 a* D5 Q& `' N# y) n* y

    • : L1 {5 v5 t  a- h. a7 E# o
      9 P* L% R% y9 B
         int b;  
      $ t5 z9 R+ t1 g1 {

      6 x; Q6 r3 c6 S) _  s

    • 5 F' J1 V6 I9 ?5 V
      . A2 t. b1 v' D+ v- L$ r
         s=q;  /*待插入的PCB指针*/  . @3 m0 F: _; s8 u
      0 v+ l+ A; G9 Z  ]7 I
    • 7 x3 K2 r# |7 O! _8 ?- I# l0 p1 o, |
      : I3 F+ H* c% M
         p1=ready; /*就绪队列头指针*/  & j+ G' d6 v6 n9 U
      & |" W% ?( \/ y# b- h# M
    • 7 ~% h! v- d4 H5 }4 U# S* z9 C1 o# l

      4 X, o; k  ^' }   r=p1; /*r做p1的前驱指针*/  . s& o! g! y0 R
      + x% N) U; g5 `, s

    • 8 F3 Q' b% _& q" q

      1 Z7 P% k* `6 l4 V, X   b=1;  
      9 b( C8 O5 b2 o& r

      2 |6 C0 t1 r. d) R1 F
    • - y' h9 i8 O& p* v/ A. d

      ) i+ w9 i- B8 h. s& u, h   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  : p- [: @6 F4 ]9 F
        `( j, \" y. R/ T
    • : U% ?& e9 n  l9 m
      + P8 P# z+ j* y2 z. V2 Q
            if(p1->prio>=s->prio)  
      $ U' V0 e! Z! k5 m/ r8 n; V( G

      * b3 O( R# g$ Y8 P- V. n2 d0 [- x

    • 2 M$ s& I7 n& Q8 q8 h
      4 I! s3 X" F5 L* w- b
            {  2 P# l# w9 t1 ~, H. }6 S

      & a2 X- P7 w3 \8 [
    • : P$ ?" H) [; S+ O

      1 G' M+ y6 G- q1 n     r=p1;  
      5 ^7 |- q! p. k2 Q2 `# ?
      8 H7 G7 G; w6 V! d1 s

    • 7 ~4 V1 p! N8 |) Q  N! i% G
      ( J# {5 Q! K* V+ T, ]. u7 }
           p1=p1->next;  
        O) U( v" {6 ?, K8 m' L( _0 c! c
      3 u0 v# A! p! }) T$ \
    • 5 e: ?1 P4 p/ i: k) u0 T, t
      & }6 x: Q; k3 t' K  l  N
            }  
      , K3 X9 t; {' A' o6 J4 r. K9 C
      ' w- Z% i% H  V( ^1 e  n) p' E
    • 7 ~- ?5 k- _; u, i6 c
      ; q; F9 @2 B5 R7 Y+ O; U
            else  
      . m/ f7 A; X  V5 `3 X/ Z, l
      4 ?% a1 X" e2 {+ o" L+ J
    • % h/ E4 u0 O. C

      + f% O' y( @% b- [     b=0;  9 |" w/ l- D0 Q1 z" _

      ; w* b9 y* x& j3 z

    • , }! j/ y0 ?, C1 @
      % n2 V; `) v. ~1 T6 d- {$ a" d9 Z
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      4 Q, Q9 j' h; z& h
      ) }( `7 B! G" a9 |2 ?* R6 k, U

    • 0 N4 ?; i5 ?  u
      1 t: X" @! b) p0 ]' M. l( Q. L
         {  * Z0 Z$ M( z( i1 P0 _# a
      8 h  ^! W5 N6 t
    • 5 M- Y/ o; i* T: X8 @" H7 U
      / Y$ ~: c, S) Y& Y9 G1 I& U
            r->next=s;  * D7 i3 q: o0 y. s2 c

      3 F) v( k$ S) K0 ?0 U
    • : n; t" r8 Z3 R7 l
        Z& W- R4 d( `: r& S
            s->next=p1;  
      5 Y. B5 w# a7 X* g1 n2 X# n

      ( I  ?' Y3 u( ]! ^* W
    • ! W6 X* }) M; I# ?
      4 k/ z+ n( k  X4 O$ s
         }  & C* J1 U. j' K$ |

      3 S/ G) z4 x( @# x; T6 `# B/ h

    • 7 Z2 F' @7 g) B2 U5 k+ d" Q

      - b. z! r8 |4 K3 C   else  
      * i" B, q* k% p3 |% c0 q* ~% t

      6 z! H3 L) S1 k; W. h# Q; J! H( G

    • ) q. ?: o) T- X; A2 Z( o
      + ?, ]+ }, c7 Z; t. V: O- ?
         {  
        O* k2 @- I- R7 U) H
      - T$ m# d6 n# h- W* Z) I
    • 3 @6 }) i. k6 |, G' [# ^" Q9 y7 D8 h

      + O0 }  x$ E1 s      s->next=p1;  /*否则插入在就绪队列的头*/  2 y$ C) N/ Z3 M- h
      + o7 Z  @6 u( Z+ X+ E7 ?

    • 6 I# f$ L5 k% p
      # x+ b$ g2 M, H* |
            ready=s;  : @+ k9 L/ l4 }, h0 S4 D+ R

      . g' n4 X7 ~# X  S% m  T8 |* b
    • 1 E1 w  V- `8 \: _
      3 j* A8 _, @* d  ]0 A
         }  
      5 o2 I' T! q5 b1 F& ?
      9 ?; q- o3 ^. {' H+ p, X
    • ; [  ]8 k) ~  {. \1 r9 f

      - |* V5 B7 i' m% F) D% w+ P# c}  
      & b6 i' S+ w8 G1 ~% ^

      $ r( a. J' F, m, A7 W
    • / p0 {( k6 z; Q: R

      7 ^+ g4 Y7 ?3 l  N6 K/*优先数创建初始PCB信息*/  + o- _3 h7 l/ q
      ! l/ l# A, h% A. J1 V
    • 6 S. h' v7 E; o) B, a* c: p+ c

      ) I1 a3 Q5 M5 d! u/ ~9 U- L# Z$ T1 @void create(char alg)  % F1 Z9 b' D  i

      ) }& l: Z. l0 _+ }

    • % x/ p, Q! G% t6 J( h" ]& G& J
      6 g! p( e# {- H+ j4 b
      {  & R4 ]; a, {5 Z( M. [% j. f! g

      : M0 s& j: f9 i2 ^
    • 3 L0 Q; X% j/ r, S
      . y$ [2 h' M6 P  }8 i" A* v
         PCB *p;  
      ! X0 ^4 G7 s3 W2 B! u* @9 L3 F

      ) ]: Q" N0 }! o2 v8 v6 J
    • " U/ y3 H# J3 {# p
      1 x* `9 a# v7 r1 `2 D
         int i,time;  1 r6 P' k; [. f; W

      , Z: o! R' Z( C% b$ }2 B

    • ! b( ^$ o) u2 ~! u
      . d9 K% a" }& k) S+ b) l
         char na[10];  / N& o  D, f; Y6 H) b8 k2 B: C
      6 D4 Q7 x7 Z/ S. o( A# v

    • ) b: D# b3 v6 V& _) C3 c

      8 F! D$ J! E, M9 n) {$ G! ?7 q   ready=NULL; /*就绪队列头指针*/  ; m  f% D* W0 Z

      ( v; y  J* `3 t7 b( g3 H
    • ' _& ], q1 r- t# W: F& Q

      ; o- Y: M4 ?# T( K   finish=NULL;  /*完成队列头指针*/  
      9 ]2 C+ k, I! _' s( P* P% m4 S2 t8 d9 ^

      # v+ m& G3 w8 L0 s" _

    •   H. b$ e9 [. X) C; e

      $ u  P" d% H8 B7 X   run=NULL; /*运行队列指针*/  3 o# G; k$ k+ t; j6 z+ T2 c
      5 x9 M0 S% M5 ?2 I4 S" v, g

    • 2 ^6 ]/ v5 Q: c( q0 i6 [

      7 N9 V+ l. b8 p- P3 Q' p   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  & h% w) O0 G0 I& r2 y4 j+ ]
      . G6 [. k: ^8 G3 B4 j' K  U

    • , j/ F$ I, V, o: k6 ?' W9 u4 G0 B

      7 S- C% g1 z  _- g   for(i=1;i<=N;i++)  
      3 l' X! \6 \6 g7 q( @
      ) d7 m* @# ~  F& G/ V6 _* p- i) {
    • ! x, ?& X, o* b
      6 g: |) ~6 q$ E
         {  - r5 H7 M% N, U4 T

      ( J8 ^8 u0 P. B0 i

    • , g* s0 ~& u# O- e! P7 O$ Y% F

      1 g% U& K0 B: K: M3 D: |, b      p=(PCB *)malloc(sizeof(PCB));  
      , o" y$ a9 G- p$ a5 @

      4 v; F, G8 q# D1 R! V
    • . b; ]$ e% \  n' N4 r
      : ^4 {( S9 V" h; n4 z4 U( ?
            scanf("%s",na);  
      " a" d2 `1 {: J. f2 A$ ~1 R' U, }
      " d6 Z" K* W+ ^2 d. A- O8 H: f6 ]
    •   R; p: I& P% V
      ; u& R8 P8 x! a. b% w" Y
            scanf("%d",&time);  1 j  W6 O2 t* h5 p

      " s0 n: k0 L; \3 n" |: Q4 A

    • , Y: p+ `0 G4 n, I
      ( ?6 T6 q. W4 n
            strcpy(p->name,na);  
      . v% R+ r6 W8 q  l! U

      8 f) p! Q9 X! g

    • / m+ G! o8 g9 ^9 `
      5 D1 k: \% B2 g# D: M8 Z
            p->cputime=0;    K5 k, [! t" o; ^5 d7 G2 n

      0 y1 _; B" H# X7 T; p

    • 2 m( `4 T2 C# h: L; k- I
      1 w3 R5 v/ j/ Z% e9 A: [& S0 k  a
            p->needtime=time;  
      % N/ Q$ ?: Y( y) l

      , n; z0 \* U  i" u' E" c
    • 5 d& Y2 ?0 v! V; I2 _  c0 Y1 J
      5 v* m0 n. h1 j  ~0 O1 T4 Q
            p->state='w';  + c! E" j# t2 w& t
      % ]' x# W# a8 @. p! y7 v% r
    •   G# s1 q8 i& r, Y% J

        y- _0 g5 K" {, Q      p->prio=50-time;  
      - O6 {. w4 A0 P! C$ O! V+ ^
      3 s: f. F) F9 B
    • # ~; T  A* @- C; j6 O8 q" u
      1 L* [+ P( @; e
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  ; t1 h# O! S) @. j6 D/ ~

        I* Z1 |0 a8 b2 G& l  H- r. b: P# w
    •   T7 a" S2 ]4 O
      ; Y9 Z2 R% o3 a5 W
           insert1(p);  9 Q1 C( f; X8 f; n

      % Y. m- X- E( v( u
    • # i$ {# w" Q& k2 r$ Y+ U

      ) x. z( ~. M. [) s2 J: p8 ~+ b      else  & r& B) `! l8 `7 D& K, T
      # {4 M; r1 O0 @( c

    • 6 l- z" [9 `5 X% I

      ) e2 G" ]: o* s8 p1 m* g# v      {  
      0 _3 M3 e& A+ ]; U; e. y" ]" q/ f
      2 d9 x+ t8 h6 R; q

    • 0 `! b, |; D; Y; V4 P9 ~

      . w; O. t4 X# H- g     p->next=ready; /*创建就绪队列的第一个PCB*/  : e; s. n# @, V( Q1 R% g, l) E4 G4 L

      4 Q# x8 D& R, K6 Z0 x2 T
    • 9 G& v, k( k$ |0 U; X7 M1 j# K$ e8 m

      8 Y: c1 o+ M) w2 q3 a# u4 H     ready=p;  
      ' G6 D5 c9 L/ T/ |% n

      % V1 I5 M8 ]; |7 ]" j, J

    • / w- ]- O! x1 B6 g( O! J

      ; Q+ R9 n0 f/ b- e3 `      }  3 R6 n. L& `3 w

      ) w" t) M) y" m0 F6 x( e" `

    •   ]3 R4 i! m( Z8 R5 }3 a

      4 Q4 D. ?% k1 n   }  * r5 M! T6 T) G) l  h! Y
      $ g; _! ]; \$ j( r, M

    •   n; c! d& B5 n1 @( I5 E: b

      # V+ s, `& _& |1 T' G   printf("          优先数算法输出信息:\n");  ! O# v. |  g$ o) A$ [# e# P
      5 ]# y& j' W5 H( p& I7 t5 m, b+ U5 A

    • " _* h! O: o  |, x
      : ]% W+ ~: y) V, G* R
         printf("************************************************\n");  & [# H! U  s  @
      7 t$ m# a$ w5 c+ |' R
    • 7 o0 z. P/ P% o  b
      / |$ O5 f2 Z- u7 t
         prt(alg);  /*输出进程PCB信息*/    \( Z) ~  d4 b( l0 K2 t5 `

      ( Q' h! @5 ?9 ^" M2 f& T# ]
    • ! S8 Y, i/ Q$ [
      . S+ v" K2 x" X/ J
         run=ready; /*将就绪队列的第一个进程投入运行*/  
      * _$ H- S' X) b0 ~

      4 t" b# O0 R( X  X: f

    • 6 V# X4 e' [5 r" |: ^. h
      % a. K+ Q$ P% U+ T3 D& u% t
         ready=ready->next;  ( T3 p( Q8 z0 e, ]) c5 r2 @
      4 w0 w" n/ l9 `6 E: ?2 ^$ e6 }
    • ( l+ T4 M' q/ c3 v
      1 F; |0 D: z. c/ |
         run->state='R';  
      . L: ?( a- g7 L( n

      2 J3 E2 K' A8 K8 D2 ?" S* `

    • : h+ e7 Y- ^) A: t8 e) y

      ' Z! P* q: t' b; [8 s# z0 O}  ) o3 Q! B# ?; s. q7 x+ m$ D
      ) P9 v" b1 ]( t: w
    • 9 a2 X( h; k% Z/ v2 F

      : ^; r4 M+ p6 @7 X/*优先数调度算法*/  
      % j& M  g- N: J( K- E' b
      0 A8 O5 k5 v/ E" g% R
    • / H$ H0 O* y- [; w* H
      : b! I- }0 m  r9 [8 R( v( I7 |
      priority(char alg)  5 U" N6 T  b3 @3 |

      2 D; H! s1 {6 A4 Z6 e0 ?! i
    • 8 D! F! I% \4 d

      1 E( N! s* N7 r! z" f: m% K{  
      3 o5 Z+ B1 V, v1 k5 c

      $ Z; O9 p2 p" @. o

    • % ~7 K8 [7 A- v) `6 j2 l, _

      . j* F% P( n1 q- Q5 b0 k   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      % g  S& I" [9 H, [

      7 Y9 X4 |* w+ b3 [
    • 6 t6 u- t7 T8 g4 `# T# ?3 ^0 ?
      ! U" z5 |! M6 U) I$ D
         {  , l* V+ H0 p8 {5 t6 U) C

      2 j& I  m$ ?5 L# |/ g6 x: Z
    • ; Q9 q- K. v! b/ @9 E+ \
      ' H1 V* r( Z# Y9 k# g8 N" N; M7 o
            run->cputime=run->cputime+1;  : Q" u/ N, n6 T, ~8 U% C

      2 L0 I9 w, F; `( m5 Q3 t3 X: \6 t
    • 2 W. O) w9 y  E1 v
      6 B) S2 j+ t/ r5 I( Y8 C. L! k
            run->needtime=run->needtime-1;  
      " E3 K5 c' X. s) }+ M2 k

      3 A& y* K2 w0 _1 u/ e
    • ! @2 ^+ a! Y4 A* x( j, v

      4 i# W( K+ L$ n) ^& `5 L6 c      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  , U2 V8 l4 d* k0 n/ s6 ?
      / n, V: }3 I' \+ B- y5 j
    • + i1 z1 z- S$ t5 g% v
      6 T6 R4 ]% g4 G6 R
            PCB *p;
      $ D% ?4 H/ _# q0 {7 J

      . {5 k" ]1 f* t) f, Z
    • + x/ Q: b# `7 M2 d& e
      & Z& o- D! p* p" X
            p=ready;" H, o  {3 N$ \1 D* J( J5 e1 ^. e$ l
      * k; F7 n% x2 X8 q
    • # s( R( ]' u# i. p
      + G- `% P0 W% J, j  b/ K" J- L
            while(p!=NULL)  
      - c8 w5 W' U7 s$ E

      . B+ N- V1 s6 a, Y: Z  C% ?, u  @
    • / Q  O) ^, {0 i
      0 g& o) P% q; x( |7 H' U
            {  # A# |0 f! i, D: F& j
      6 @4 o" |/ ^, E4 s( @

    • 7 Q8 R7 z- {9 }  s; v
      9 n$ E# X* b" b( A) o
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      ( \5 f# d/ D* W% a3 o* V; _" D; \4 x

      * w' Z  D2 U$ m  E7 g; u; Z

    • 0 U* e0 _" A. f/ Z" H+ y, W
      : V4 D0 `5 E- J- X* \, C
                p=p->next;  % x! f/ U7 L9 R

      - ?& I! f. h2 [4 }
    • 4 P3 \) n: F$ ^/ i* Q* j

      & ~3 I* }$ z" p/ N- [; y/ {+ j6 n      }  
      ' x2 Q2 l/ N- c/ A5 [

      $ J" z4 P7 h* {# v$ _  ]5 ~
    • . \. y6 K( d% u

      ; ^& L% D: ?6 {- t  H! i+ I4 w      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      - M( R: Y6 z" J7 \' |& C1 g" _

      % `  ^1 B: Z3 X0 z  t+ L
    • + u- F$ O* v' X$ |& B
      ( {# W9 `, d$ g9 s, t8 i
            {  - o5 N+ U6 e; x, p
      9 T3 F' p/ Q$ Q( B8 W' `
    • " S+ f) q0 j9 {2 q: ?! T- r! d6 j6 n
      8 |* h  e# g2 T& k  M8 M# ~3 y& `% t, a
               run->next=finish;  
      , _- \5 k, W" }2 `, Z/ C1 Y
      * G3 Y  c# E6 |0 {9 G/ h) R

    • - O/ l& J, g* H

      0 }( _: t/ \9 I# O7 e         finish=run;  - Z1 y8 N! m* Q1 }- J4 K- d# g

      # d4 Z4 h% d$ Y- @( x) a7 m0 V  T

    • 8 w6 A: \( P: N5 x, j. J2 L0 o0 o
      * ?2 \" f5 @- Z1 x; u: g
               run->state='F';  /*置状态为完成态*/  
      # M0 U. w& W6 G
      " G! y/ E  L9 V2 f/ n

    • 8 `1 e; A$ T+ M7 I9 F$ H3 J
        J3 _8 u: Y* h8 S6 _
               run=NULL;  /*运行队列头指针为空*/  
      * J, `+ Z7 w6 @$ ~3 z

      ) z) d( ?- R% r- G# D
    • 3 J' t1 Q0 K1 ]$ d7 J- A  s

      $ \7 s$ T. }  p$ q0 j/ r% c         if(ready!=NULL) /*如就绪队列不空*/ $ F% J0 L4 `- w" H$ e8 x
      + Y7 q/ T% ]* `# {, @0 n
    • - _. \4 W4 w, M( h' l

      / a; n: f. v% ]/ v1 {& l* q7 l) I1 i         {  ) r0 y: f/ D9 @8 T, r6 }4 M

      ; p8 L+ B4 |  V$ U& q
    • $ @- d5 k4 q$ z0 {+ i/ b) V; Q

      ! P# G8 i* i% r/ R            firstin(); /*将就绪对列的第一个进程投入运行*/  " r5 n( q+ I9 X) r$ ]; L

      ( t) R: f1 c7 _7 \+ d0 M
    • . F4 Y* k# D9 T1 {5 n; N. q  @

      - k. K! {8 E/ t  z' i% ~& D7 b         }
      6 \* g) c. @! F. k. v" b
      4 G8 T9 W8 i( O9 ]8 [, q
    • ( k+ @( O+ e9 b) Y! E
      & H# r. {! ^" s& G7 L! D0 Y9 q
            }  
      + A# ^! z9 R. |. t  u: K

      $ ^4 }' D) V3 B9 x& N8 M" H
    • 4 }% A% J- r/ y9 d

      # L; `' I# D+ p/ B7 I# O$ N      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  6 v8 u$ m7 p4 V' A9 m; k* D0 t/ ^
      , }/ G2 f, G( L$ h0 u
    • 0 t. O! H0 Y- w* B  W. n

      4 R. `2 S) t% P     if((ready!=NULL)&&(run->prio<ready->prio))  
      ; q7 n6 u& I+ ^; }

      4 v# i* ~) b* O" r

    • % d8 D$ W3 e* O

      3 p3 j) g1 C  V; J3 W     {  
      # Z6 w( ?2 R1 A  C1 o% s
      $ H+ K. v* D8 W3 e0 i: {% h; o
    • 3 ^/ K( q. z. n0 H4 A! Z4 h2 E
      # b6 O3 D5 s; J$ P3 K% |
              run->state='W';  8 e" w% Q3 a- f0 i' _6 p

      % L% e  ~1 Z: `3 \0 f. i

    • " r! [9 q3 S& K: W( j5 t( w; V& E& |

        N- k/ @2 V( ^8 m1 z, `. C        insert1(run);  
      9 X9 s! |& @4 @

        [, `( \9 x8 m" n/ E+ ~3 p

    •   T) j, ]& z. o

      , L/ d, {, Q# X% b4 s        firstin(); /*将就绪队列的第一个进程投入运行*/  
      8 _1 m( ^  D! E2 a( J
      7 m- K7 `1 D2 Y! Z- _% D

    • & g- R/ ~4 k$ J! @+ t

      9 p0 H9 t. \0 p, O* E: L     }  
      8 Y9 J# C) [1 ?% k' u+ b( p
      + X1 g  @" R  d5 u3 Z

    • ! o" T+ D. G  _$ K8 E4 \

      5 C# R8 b: D. A- y      prt(alg); /*输出进程PCB信息*/  
      * V) f" T" C, B& G% a, y1 X2 X9 w6 l
      3 ^7 O# l: r( i! b+ k: g

    • " s4 t7 B- b+ c0 i0 g

      0 R/ S4 A2 B8 m# g/ q5 _; Z' A   }  / H% K5 }/ a8 e5 C% b# K$ E% Q

      ( t- M! {! j* Q! t/ J) w
    • 3 K$ T8 n0 r5 S2 W5 y
      0 n1 f2 i6 {) ?$ \
      }  ! w4 ?/ v" z2 u% C  w1 Y, v
      ) e3 G# b  q2 u' t. i/ s
    • ' U: i9 g+ W# {/ p  `* x+ X  }, l

      & j- U+ ^  c( D3 o( |/*主函数*/  
      0 {- Y) K( _6 {
      & S# F4 F- ?4 G; n. i5 K1 H
    • 8 m, `9 S- F# D/ k/ D5 v

      7 E1 V/ m. {' O0 B& Omain()  6 }; E+ {5 [! W! s# U" d

      " @' F; ], S0 [: u6 B) U1 }! @
    • % z) {9 o" |5 ?7 O( }
      ' t9 @, i1 {' [3 B
      {  
      0 G- v  J6 Q, W* Q; k
      2 j) Y, n2 g/ S; C

    • 5 a( l; G  z4 m6 r1 Y, N" K
      # S( \6 @/ z. K4 I) e- i
         char algo;  /*算法标记*/  
      5 H! `% r, q! u, b
      5 a4 m( }2 b& b3 m( Y( J' b2 _
    • 0 I: D0 E. w6 c" ^: s+ c2 H
      : V! l( V+ B) B9 [% K
         printf("输入P确定算法:优先数算法\n");  1 i% t( P6 l& Q" U

      / ~+ X/ k& S: v7 ?
    •   I2 U; ~- z6 c7 N6 A" Z9 o5 w

      ) V2 N0 f' j' O4 y   scanf("%c",&algo); /*输入字符确定算法*/  
      ( m: |  B+ p( f
      $ ?% z: m% q2 e) J! B) d/ H
    • & Z$ |. X. K1 e% y; @& U+ L( _9 u' ]
      $ \- e* I0 V, o  V% h, s  s- b% D
         printf("输入进程数:\n");  - S* O: f4 \& Q) O6 a

      4 p* e% B0 b  G" E. K* f' g  {; z

    • ) H! e5 d( s! X- t/ v$ ~5 B4 r
      0 i! T0 L4 [2 Y% O
         scanf("%d",&N); /*输入进程数*/  4 V; w; f; B0 R% X

      8 L% x2 \: I; j

    • & o/ A7 U; a6 h% _! ]& \
      5 {2 |- v. y: T( P8 U+ I' S4 R
         if(algo=='P'||algo=='p')  
      ; e3 ]- N/ I& X; X% G
      ; r9 P/ x/ t* Y1 r
    • / A& S$ G' X, c7 E7 a: a9 x: k; a
      9 ~  y1 ^/ L) `$ x" d
         {  - C6 b* N; ~$ f1 f) G4 Z6 G/ \6 Z

      4 l7 t) _" f# {# [4 e

    • . H3 [) l" l" C& i2 }

      : \3 [3 }; J) s% W7 c! [) F, O      create(algo); /*优先数法*/  
      7 J. |2 ?' }' m( p  B. h

      & B: R6 V2 X' [( j  W# s

    • 6 F7 q6 w' H5 k2 t
      7 y& o/ s' G. [9 c' `# T, n+ X
            priority(algo);  
      $ h. `/ [' @9 s' z) e
      % o- w3 O7 Q8 @3 q

    • ( J: I: p  `: r3 o( P
      7 C1 s2 X- s1 O- g9 [$ V
         } , ^2 I5 O3 O4 v& g2 Y

      , G0 s1 ]: f, F
    • $ q' }' s: J3 B( w" t2 }
      & R; J8 @# G  W5 V4 P) M! K
      }9 C( E2 g" ~8 s) J. A
      : @' v( I3 r: }! P8 ~+ Y7 c. D+ u( u

      : {: G5 e, w6 _+ e

    4 ]* h% v) i$ n) R. K' M" M
    输出结果:
    & ]; |; d/ [/ s' S. @* n


    6 r8 ~9 E, `9 ~) h- G* p! t7 p4 D原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    9 {% d( v: i7 H) o! S; ^- f" Z+ a

    - K, w1 p% Y* {" O  N& H
    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-4-20 00:12 , Processed in 0.475107 second(s), 50 queries .

    回顶部