QQ登录

只需要一步,快速开始

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

    ) A, {. }  u4 H: V) S  K优先级调度算法7 \9 ~! H7 R+ x0 g  u

    算法介绍# z8 r  i  }4 J# ]- Y
    优先调度算法的类型(用于作业调度)
    ; B9 U8 C: W2 H; d; c" H* c# {1)非抢占式优先权调度算法 9 p- S1 }+ M9 T9 r  N2 R5 S7 ^
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 9 u6 p3 p2 H4 ?$ E) A) }
    2)抢占式优先权调度算法
    8 w0 I. F1 R& M# ~只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型) D, T. [# r5 T% G* F/ h$ Y! n
    1)静态优先权 1 Q# m/ Z9 S9 m1 y0 t8 H
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    ; V# ^4 u2 C& f3 K7 T

    2)动态优先权
    5 Z0 C. P0 {4 ]. w% k5 T& s

    算法实现

    抢占式动态优先权:

    3 D3 }% _- i( P1 J8 B4 R2 `
    PS:本人认为非抢占式静态优先权没有实际价值。


    • # H2 ~$ \$ ]# Q- l
      6 H4 H# R8 e. a: d0 |6 h: \! V9 i
      #include <stdio.h>
      ! l3 W! O6 B9 |* \& @: N% F( S2 q

      7 r" N+ M& y: M# @3 D
    • . u- [* x& a% M4 h$ i

      " ~* R, h, A. p+ b0 D3 |4 N' M#include <stdlib.h>  9 l( p# b% n  P& v
      & H& ^% F4 U6 a+ Q$ g
    • ( I/ U+ }8 ~1 t$ H% K5 F) e

      $ Y# t2 M: U5 [#include <string.h>  
      . x, F% C  L! t5 m. u9 B5 S$ u! Q& X

      * b4 A! k: U$ X: E- e1 f: n3 |
    • : f9 a( L7 i2 o% l
      5 E, O1 Y. H+ T- y$ f- s
      typedef struct node  
      & }# L+ |$ G0 j2 k

      9 o7 P0 h" a: n/ h
    • ( Q6 E1 t( M6 w" k1 U0 ~) t
      ! ^  x6 B# [/ T& ~% G0 f7 C
      {  
      2 Y& s( F! H# q/ O# i' h
      * i+ L2 f" J0 ^% ^& V/ Q

    • 3 S( {: ]6 K/ r' P2 l

      : y( @3 {1 m  a, B5 c   char name[10];  /*进程标识符*/  
      ' K* }& f9 P( B! Q# n# C

      " P( p5 A( ~0 t7 Q/ n

    • ( I* M% X( Q+ U- I

      8 o- p. Y# U& w1 p6 Y- {   int prio;   /*进程优先数*/  
      & |6 X" P# m7 ?0 a  ]* l

      3 P# I  U* G# x1 P2 z
    • * e2 A  L" B+ n
      5 R( Y  a" q) S+ a0 A& p! |
         int round;  /*进程时间轮转时间片*/  7 y( z6 P3 o" I" M

        C$ d1 Z% J4 f/ }7 p

    • 2 k* X' i: |, v2 B( D* r2 O& Q+ x

      6 q2 s; Z' d# H5 n   int cputime; /*进程占用CPU时间*/  , X' z3 J) G+ P  n1 O4 [
      0 ^' h4 n- e' j

    • 6 e) Z2 K) S) U3 K

      # }( R5 k( f8 E! y   int needtime; /*进程到完成还要的时间*/  , L# g# e% Z! Z1 t

      ! p$ E' W$ x  t/ \. S( V
    • ) S# u# {* w5 H- {
      # e* N$ w& O- {
         int count;  /*计数器*/  ; \; z6 U2 @/ i
      ; w- \/ w- m- ~5 M4 E1 z
    • 4 @% P2 G& j. P' n0 Q- a5 w
      " H8 S+ U" K7 H: Q1 a7 b# \: |4 j% @
         char state; /*进程的状态*/  + S0 o9 E, r' ]& Q

      6 B# X8 Z! c4 G9 F' |8 {! E2 T

    • 5 c* c3 z9 l/ M. E6 E  _
      0 L8 [. W. W( q+ h5 F: m
         struct node *next; /*链指针*/  
      , d7 J& }2 x: z  x# ]- p3 n

      ! w# S" `4 n; u
    • : \% J5 m) P! F4 B6 D: n- c! [

      4 j* _9 m: d$ D+ j! B}PCB;  
      * f- a- ^- X, y; ~* R

      4 m5 y' z8 L# p3 P
    • 5 h" }5 T6 o# y( G

      7 s! K! B9 v" h! h7 {, H5 RPCB *finish,*ready,*tail,*run; /*队列指针*/  , G7 [, g) S/ n& O

      : U4 ]8 s6 G; P& Y
    • 2 V0 q6 m$ [3 e: A9 j

      % \7 n5 v* e5 ^7 K& J: F% Iint N; /*进程数*/  
      - e: p* x* O( d
      + u& f/ y6 O9 P

    • ( @. {; b1 ?: s; \
      8 P0 M8 O1 u& J& L: I4 H: x
      /*将就绪队列中的第一个进程投入运行*/    k3 `8 x6 k/ b
      8 P/ Z4 t7 {, |( j

    • 3 ^" R6 n: F2 A9 C2 o* k: l  e- S

      % J2 G8 b3 m0 i& y" L, E* jfirstin()  / r" e1 `! j, |6 z1 X$ d" G+ @7 q* g
      7 i/ X+ x  u# C  A: J

    • 4 H; T- A9 J( H( [6 m5 t" |
      3 m5 X1 ]7 [  h; d; `5 O/ K9 G
      {  
      - k" x: O" L5 i# s" G9 W5 ~! g

      # X; A; c/ w$ R6 Z5 y* S
    • 8 E+ d3 l& ~1 o

      7 V: `. V5 p) y. @' k5 y   run=ready;   /*就绪队列头指针赋值给运行头指针*/  7 Q/ a9 h2 Y% N! u2 H

      5 k. L" U) I) E/ g6 }7 t9 X8 s% \

    • & F% d' Z3 ^, B& j- z: m0 D: p
      ! U$ r# q; `% |- K( _8 T2 U
         run->state='R';   /*进程状态变为运行态*/  
      2 _: j6 e; q# f& e2 |7 I, x
      . I7 c+ X5 v, h5 u0 b

    • / E6 t! J/ F* G. y( e
      ' O) j" [7 j, Y- p$ M3 }
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      * l2 y/ o, C$ y$ C  y* S
      4 E8 }* T3 p1 K

    •   t9 q0 W' e3 z' j, b+ W

      % w+ W7 R9 X0 W! M8 r4 n}  3 G0 f# g) m; B  r( O

      1 q, |" {& O7 G/ I/ B
    • % A' [8 i! L4 t/ o/ |# @0 l

      ( W% B  s& B" l( m3 R9 T4 |  l* T9 S0 `/*标题输出函数*/  6 D/ l+ r+ c$ ~6 g0 y! X
      " @, `+ H! J; d: j
    • ' |6 b. ~" Y' C9 x6 R

      : q+ J$ l  \& S8 f# M% G+ k5 s% C! Wvoid prt1(char a)  
      8 D: J  }' Q% @6 a/ X$ u

      8 J+ q2 v$ n) [3 j

    • 5 z+ T6 s0 S2 w2 Y: |/ T6 }

      $ B8 _2 h' X' L$ ^: L{  
      8 R$ u( H$ I9 X3 _2 ~8 Z0 g4 W

      , q1 }7 l2 t" c3 ], ?" o6 j+ L: S9 o

    • 2 _7 P/ K3 y1 F+ H4 L& ^

      0 D7 b1 l4 k; V" U9 `! \   if(toupper(a)=='P') /*优先数法*/  
      + ?6 M# y: i% M4 L7 s# V
        a  b* g2 U* p
    • 8 z/ N$ i; n- H& H5 w7 U1 \
      3 {; d' z" g6 ], y$ s
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
        k# h9 q+ M' H6 C( G

      0 D& T8 Z7 D( z* }
    • / ^% ?( X$ v9 w& }
      % ~0 K" |8 p- t
         else  9 h2 e4 C. x# S  `
      - W. g* g9 t& b2 t6 u7 F# R

    • 5 k; w& B5 d0 C- P

      ; r1 L! J4 k6 S* M* q/ [$ {      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  " I! f1 v! ?$ K1 r! z, q

      : D* q0 W, ?2 q# t! }# C

    • : b" p, K. g. H, J' q3 w4 s* Z0 I
      # }( c$ q! E+ R8 C/ y
      }  " B4 p3 g4 ]9 g- S) W* V) ?8 c

      0 M& @! Y% q* W! X! l

    • # G, t3 ^  C( Z$ h7 g* j1 H% @

      + w! F1 ~9 X! l6 O: ?% L  v/*进程PCB输出*/  
      8 J0 H! [7 W: l9 M: \
      3 x8 K7 A7 ~. e3 m, w; o9 @' H
    • ) J9 d( I* j& J& K/ [% q7 [) ?% z* H

      0 p3 \1 {. d! G4 s- \* svoid prt2(char a,PCB *q)    b% J/ |4 S  o

      $ A5 e: d$ p- g5 \
    • 3 z9 l0 [8 M, n! R

      3 q4 f6 D2 |1 ]{  
      % F4 H" S+ o1 F3 Z

      + r8 R3 V: p- G, d7 R1 M0 ~

    • 0 C  r3 k; \8 H0 x$ @# c

      ( D* e. F. J' F0 P5 U4 A9 M   if(toupper(a)=='P')  /*优先数法的输出*/  
      ( U, c8 F8 I8 m

      3 V( C" w/ P2 C( s
    • ; U: i/ j: M& w5 H

      4 m) K6 M* ]& N      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  8 S6 `4 i& F4 A
      ! {7 [% t( J5 S2 B% Z+ ]6 {3 u  i3 W
    • . D% p! q( S1 Z! q+ f
      7 t4 m8 x% s. G0 z! K8 _
             q->cputime,q->needtime,q->prio,q->state);  . k5 h8 ]# D  ]6 N+ ^+ L1 A

      . ?' F4 ?1 e& {' d0 y
    • # J! [' H) J) M1 L
      . b' ~+ ?; D) m3 V5 E# v
         else/*轮转法的输出*/  ) x0 W/ W: a2 v
      $ P, [6 c, Q. z' U! Q
    • ) P. C# U/ I+ @; z8 Z
      : y; R0 M$ Y+ m0 H: @( u! `1 s, T
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      , C& N6 D* u0 P3 \% E8 j

        ^/ P& J9 D8 U% {6 ^
    • . T# Y% p, U/ W

      - N, k2 E7 M; _       q->cputime,q->needtime,q->count,q->round,q->state);  
      % A, @! }5 P, K8 s! g& R
      6 T+ c. I/ M* w2 H2 @

    •   E+ I! E/ B# O8 {
      * f- M7 `+ U5 ]! T/ A# {* n
      }  : ?+ L; h* n6 H$ k
      7 N1 L* Y; n- H6 {- C% A& |( x; b9 s

    • ; n! U" |3 p5 }  O. N+ }

      ' s5 Y8 X: A1 e. R/*输出函数*/  4 _( b  O6 y, s
        `; R  I- a9 b9 e! ?' e. Z. j- D
    • 6 ~+ k: _9 K9 i6 n% ~

        P6 ^# G; \- Q+ O. E( tvoid prt(char algo)  
      - ?( `, f& V4 J9 A
      . k4 ?1 [. L! r6 `- v4 c0 }1 e

    • - Z1 n, R1 G! C! O! s

        t8 A' v2 y9 {0 n* @{  
      0 s& f1 ^# C; [5 V0 `

      8 w1 e: ?" a6 t
    • ) _' k4 B, x* j: i

      ; S( Z4 E" v5 s: x: |- t   PCB *p;  
      2 J: L( l7 [& _; [) l! B0 @( ^

      0 Z  E( Z% ]) W( i, w% l
    •   k, _2 f: i( p6 Q- l  \2 A" Q  \& U  q1 p
      8 e1 q6 v( N9 `* a+ F( W
         prt1(algo);  /*输出标题*/  
      & F; X7 Q: [" d. E6 w5 X' O1 R
      ! ?/ m) r6 \3 t2 ?, I% T- F* U
    • ; @" P9 L2 X' C
      / @1 h2 l7 }( V+ o' _
         if(run!=NULL) /*如果运行指针不空*/  
      ' z) y8 h1 y% E
      , ~* S$ a3 M7 q
    • + ^$ s2 p2 n" h" g1 r& t$ T& U

      0 q5 R2 O4 E. q) i! E1 q      prt2(algo,run); /*输出当前正在运行的PCB*/  % v, w- e/ d' E

      ' E7 o5 z) Y5 P% Z$ H5 L3 B  t
    • % \6 z) {& m0 Z/ p

      7 @" F# y. a* _4 O8 O) D' z! w( d6 I   p=ready;  /*输出就绪队列PCB*/  ! `: S: c! }3 T6 |0 F

      , j" v) ?2 d4 w2 }2 `0 w" V

    •   s* X# ^4 F/ I  H9 D  I# s

      . ?0 G6 W" n- ?0 e2 j* ?   while(p!=NULL)  % o. i: X4 K2 b% i. d7 C

      1 t/ a. X4 u* t1 B

    • 6 s' b" _' f. v, q1 u. \/ _5 G

      5 f  Y5 [$ L! y- M! R   {  ; Q- H9 \3 u* i7 w

      6 W! E$ O1 I" ]; y: O, t: w  q
    • - |) L4 e1 V' `2 \+ c! j) y, N+ t
      8 r7 s- E: A8 T2 O! T( i% ^
            prt2(algo,p);  
      $ q' E2 a* Z2 k! [8 @

      : ^/ K4 {- s: m' p$ {

    • " N! m4 d  n$ B, Z  _& x" I5 e

      + ?8 o& A$ i% ^, o2 C      p=p->next;  3 w( O# F% S) `3 N0 Q: I

      3 _4 [$ Z! A2 k
    • % u% _& t) h/ P

        r, z6 L+ u$ k/ S   }  # w4 s8 I+ [8 j: Z9 V& K& ?$ Z- W
      0 M0 D8 T1 D  Y/ r1 ]

    • . L6 T5 D* W* k3 b

      : s: G2 h2 e" H( b: S   p=finish;  /*输出完成队列的PCB*/  & Y) _# p9 v& B3 U
      0 q0 s- c6 C" @3 F; X2 E) b
    • 9 G; H, e) W. C' ^- G; ^3 _' Z$ f
      ) t: r/ L) [! \. R% g. e
         while(p!=NULL)  & n( r5 A4 H8 b' E5 ]! g

      $ w. I2 Y9 U- w: O# a4 o) t3 y
    • # c2 @/ |7 {/ y4 ~7 N

      2 B9 r7 l% y: H  J   {  1 ]% Y, ?! q; ]8 f& S

      : n- {& T2 c, a) @& O9 J
    • 1 L: t' d' M3 [  S* j

      + ~4 Q3 {6 {0 f: ~7 s8 \# n  `1 O      prt2(algo,p);  
      4 ]9 E# `) x  B0 G* c! L5 `

      4 A4 p1 ]( z& B7 x
    • 0 ~7 M1 P# o! k3 x! j8 }
      6 o$ K! A# [2 Z. b6 s8 ^* j
            p=p->next;  
      0 t) j: O6 G' x: X3 G% W; O8 g
      , z  t  n* h6 \  R2 s
    •   ~9 F2 I2 U- p
      " K1 a. d3 f. Y6 i/ r$ b5 R, n/ U( y
         }  ) o' t) I, n, U
      9 E7 `% M5 P; r$ z- e
    • 0 c* o& @& [6 b, E5 o  u' Y

      9 a3 F# y+ L! T* \2 O* V, T   getchar();  /*压任意键继续*/    H* i9 E  s0 E: y

      3 i; T# j/ @* h/ w* r

    • 2 b  f8 C! y" |& w* x' ~
      & j* M6 {, v( M) b, B1 {8 c9 b
      }  7 T5 X  ?( I  {- R! o

      0 d7 l/ Q8 S6 i3 S. s" _" @& R
    • - t4 Z( h: ], K9 n3 Q0 Q
      : }$ I9 f& `/ _+ v  H
      /*优先数的插入算法*/  / y3 ~) L9 d* k, v

      3 Z' E( g5 T4 m2 Z: z" a+ ^
    • * a$ R2 G' u' H) a8 ]

      2 t, R3 P; f1 N& i. }9 Jinsert1(PCB *q)  
      : B2 }( |0 `" q) M! t& y: D. E" i: P

      . d  T% w% q: Z$ F8 y, v
    • ' ^) n; i( s8 A" {

      , G9 c8 C: z% d' C' L# u7 L3 j" C{  2 t' J2 s. H  W+ O& N* ]' J7 [
      7 U3 v, Q) Y3 o# g  T( ?- U
    • / n( P, u. i! r0 w# ?
      2 R  ^& C5 y; y) M" p5 V* a. ?0 I# u0 `
         PCB *p1,*s,*r;  0 l. y8 H, I3 ~: o

      4 c0 f" h8 Q. c; X% c  T  C
    • * p* |+ r; b* G3 @' v1 n. C& V

      6 r/ y% ]  \' e1 v% O   int b;  4 G6 ?1 v+ }7 S% D0 i
      ( S- ^1 z3 _% [9 J: ~% s! q. n9 ~
    • 3 Y. O% \$ C5 O2 u$ u$ }

      4 Y8 @. c5 V6 r   s=q;  /*待插入的PCB指针*/  
      / g4 l  f2 }9 A; N
      $ ?1 ^8 U4 X, d* w- X" q7 H) s2 b
    • ( w6 n1 G% g3 ~9 m1 E4 E% Q

      ) j3 Q/ D. f, I5 @& {8 W" Z' W   p1=ready; /*就绪队列头指针*/  - f# C7 q6 j  l6 D  C' i) V5 z
      / Q, x0 h- ]* _- M7 }% n9 [; `

    • 2 v: g9 ?# Q! P- Z7 v

      % j% p+ P! B- [1 g& a   r=p1; /*r做p1的前驱指针*/  
      $ ?4 A4 O0 J  j0 q
      ' d+ w3 r" p' ?# T6 N# `, S
    • % ?  O5 A7 x0 ?6 q% n2 Y2 d

      5 m' I1 u1 D- Z* u0 c! ^   b=1;  ! p. j4 f- }' H) C, m9 \

      & N# `& R9 n! T' {) w, ^3 N

    • 4 t9 P" i" m  x5 Q5 P
      0 H/ c* x+ o" h6 ?0 N
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  , O' R7 O9 I) U
      2 g" O  S' K" L" E4 h
    • 4 m2 e" a; H4 G4 N& m+ o$ P

      . ]7 i) `. L1 |/ f' }8 L      if(p1->prio>=s->prio)  
      9 i0 c7 ~" C: L; ~, n

      # \: l0 b. [6 ]- P) y5 E

    • ; B$ r# i( I) l, X- c* K3 D

      ; v4 |, p# }& y      {  
      0 r3 D& o9 M6 _' Z" h8 g  Y$ D

      ! m, \* _3 k$ S$ h% p

    • * X) X& ?# H* z# ^2 a

      + R6 P' d  m+ `0 L- v# e     r=p1;  # P+ a7 J) x1 l; K$ z

      . s; C- T7 M0 J& D
    • 3 r2 q) ^; r. U+ a
      2 f6 K* B% z3 R3 c) z5 I1 R
           p1=p1->next;  . ~/ O+ t" b1 W, o0 f" C
      1 |7 E% B8 q0 d  p, b5 ^# {( b

    • 7 V# H2 g; f% B% ~6 [: ~

      * d* J( y% r5 Q8 W- c6 u$ Y; P      }  & R1 T9 w9 Y' \# s) e$ G! u) j
      . g( x: x( ?! V9 i0 f3 f

    • $ f3 z  s3 D/ ?; I

      * B8 e7 _/ ^( q      else  
      $ V1 V2 Q" p+ d+ l; a1 o3 \
      ; U2 p( y( c6 @; A4 T

    • : y6 f8 c$ U7 g

      ; Y% G. o6 U4 W, H( L8 j     b=0;  ; j, K. m$ L; h" k  h
      4 M* o5 w' t& k
    • 7 x9 Y4 g, w% G8 b0 \* l) `: E) Z
      - x  [! \& q6 U" S$ ]9 V5 Z3 @2 f
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  & B) x. k. n6 A% J& w

      / c4 |9 Z" `2 N! Z& y4 p
    • - a4 P8 j& c3 D# R0 u5 Q
      ( r( `3 ^! G* a4 K3 p" g2 Q
         {  
      / Y: d4 `$ v) k

      0 O* N  l9 c) |- x0 @# }
    • 3 V  v% F7 Z6 T' @% Z2 N

      * w! [5 V: t. {      r->next=s;  
      $ {% L& [$ F) ^5 [! z! S! \$ b

      0 H0 E( a! N4 p
    • 4 l; `+ U. A9 l- T) Z5 O) o  _

      1 ^2 h; z! q2 }3 y      s->next=p1;  ! E& {  R- O# ~: o

      1 `) F6 \& E" f8 ]; v! o& j6 u$ _& R8 D2 d6 h

    • , d9 \! {: `. H2 b  ]' S5 G1 [* v
      7 W2 \" x: y1 t/ S- c
         }  
      % @! o0 h- T, b4 S- l

      ) o7 H. p4 r. ?4 m3 j+ z% y- v

    • " l% R, g: N  z7 l! n2 E, B
      ) t8 e5 Z# F5 x" E- p3 d$ k
         else  0 @2 p! \% S/ S. b

      ) D" ^# p  J. c- H

    • ' Z3 s# X0 x( M8 v; X7 {* a4 h

      2 D4 n5 [2 c: O( I/ V   {  : N4 S3 e: ]4 h

      6 Q0 g  l1 g* z, k

    • $ h) C7 P' `' c6 M) b) A6 o* g; w( l

        W# }# D9 E) H% C, W0 ~6 _! t# q7 ^      s->next=p1;  /*否则插入在就绪队列的头*/  
      ! b8 l. e4 K& [! i

      ( ~. m6 g+ i4 P7 |

    • ; W6 s/ }+ m; F% _1 }0 ~3 V4 E
      % V- }* C( w) y4 d% ?4 Q7 s
            ready=s;  
      2 H0 p7 d* Y4 W. V4 W  q- j

      * J+ K* b" [" q1 S3 G7 n
    • ; a) L9 w: i* N& J- X

      " M, B% X2 r# h! B   }  % ~; O" _4 {7 V1 Q7 g' u

      : B% I' Q0 [# V( _2 }/ t& }

    • 2 w1 f  v( q% c$ @+ W

      ! V! V% O( `' X}  % n! X8 l: w% l( t
      1 t- _: R) @1 c3 |% C7 q/ `

    • 8 Y; i- y6 E, L

      1 T" I7 U5 [% \8 n* ]. O/*优先数创建初始PCB信息*/  6 T3 r8 n  u: x- d
      $ X/ v$ x5 Y5 A+ D% i0 Y# S
    • ' X  G+ x% H" G* D; R$ h

      % P8 o' F' H! p+ ^9 Rvoid create(char alg)  
      1 X' G+ l& w3 k  S8 P* n0 C
      ! C3 \: m- n9 ]  A

    • 1 g2 _# x' S; f4 ?$ Q$ g" f" }  P4 Z2 [
      2 {- @; Q' w# l2 n! E: `5 D1 D
      {    }# \3 G+ I3 `5 k
      : |: o" `9 T1 R

    • / p; K6 X# U" v: t1 x
      9 U0 @4 m& H: _, q) \
         PCB *p;  & V5 ~" h. q% r

      : Z0 b4 k/ ?' i- T1 k7 _. T
    • 8 ?3 j! \) F( o4 C9 a% Y

      # l4 L# |1 ~% a$ s   int i,time;  
      7 c& b, R; T5 ?9 G
      3 c, y7 W: q% y

    • 5 Y/ |0 ~  u# Z( R; l/ _: g

      7 X1 I$ ]1 y$ d8 m+ P1 L   char na[10];  
      6 s; \' J: }( d
      % ], K- w' L9 m2 h* }: b5 e
    • ; s$ x% [# c, Q* g- g  C: N$ y
      - t1 b( b& ]# n
         ready=NULL; /*就绪队列头指针*/  
      3 C" b# o, b. ~

      " i5 r) f/ H9 T, c; e1 q
    • ) }( U1 d, k- f. S; P
      , G9 \$ ?' A* P; l7 [9 y. @
         finish=NULL;  /*完成队列头指针*/  9 R; [. [1 Z6 A! ]$ U( `: B# ?
      & |: x, g6 ~) E) G

    • # v$ F  |9 m  Z! }! {
      3 {. O% f3 g( k! J2 p4 Y! x
         run=NULL; /*运行队列指针*/  - [. @3 c5 a3 V1 }
      ) `4 E9 _* B! e0 s  K3 T

    •   T2 H3 q- b$ Q+ v
      7 q5 o5 P& E! U1 |
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  8 x% u* ]. K$ R3 J. y7 ]

      " C4 b7 ]  f! x8 h1 X
    • . F- p! ?: ~$ k
      * R$ e! q  a( d8 t
         for(i=1;i<=N;i++)  
      + S, g, U4 k  s6 \

      2 M7 z1 r5 B3 ?: ]8 S

    • 7 V4 J. b7 Q/ M, L% J4 s
      / U$ o6 Q. L- u6 Q4 K+ R/ t8 g& m
         {  
      . e- r% `. ]7 }: n0 k  V2 t( ^3 N# H' u* j

      " {0 |' N4 G' m1 n) A
    • / o' [* e# Q. v6 \

      - |/ r% ]5 u4 N, B+ E6 h1 ]      p=(PCB *)malloc(sizeof(PCB));  / ~. m8 v0 T" J- N' v5 G& r

      + g* Z9 h. [5 K& ]' T) [
    •   e$ V+ l3 w8 e' D1 h6 h* |

      # {: a8 ~2 F! Z! t: {      scanf("%s",na);  
      * S2 `1 T- W) `8 ^7 M

      4 J& s/ z1 V( T8 f% D. D& p! [
    •   Q" Z" F0 F  e' R. c1 z; a
      4 E' N; H% m$ w& r% ?
            scanf("%d",&time);  
      5 v1 b+ a! w# [- v% c+ i
      7 [8 p6 ?4 I7 x" R! Y
    • + d/ l/ g6 e3 I" |
      0 g6 c" L  F( x+ t! `3 _  Y
            strcpy(p->name,na);  
      6 g- C% s1 f! `  K# G. e8 N5 k
      8 y* H# X: y$ w
    • ' J& @% j) X2 Z  ~. I
      ) L: }+ N. s& L
            p->cputime=0;  # U' z+ x/ d6 A  o6 V
      1 q' ^- y1 P) R& }

    • 0 H3 }0 i/ s) A$ k" x8 }8 _

      & ]2 H6 O9 w# d4 p      p->needtime=time;  
      ) }3 D$ `8 V; n! p
      0 d: a( f$ U# L  D

    • + e0 }# R. {, k; B3 J) U

      2 ]7 V. \* b1 ^" |/ }$ ?      p->state='w';  % g& i1 F3 K8 ]5 ?2 n& G

      ; `( t- u& a( A

    • : T) i# i4 ~1 p" ~$ @

      ; `3 S0 y- x) G7 x/ ?; G      p->prio=50-time;  & F8 L1 i# ^+ U
        _2 c" j4 V: V* u  t/ k  m
    • 6 `9 k. f! ?8 q. R+ w

      1 v2 H7 [5 q  [# y      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      ! ~, N1 S4 n- G  `9 M6 @
        P' k" x! c( k& Y" p8 {

    • . t' a$ g) t3 c: P

      : \' X& P# ~; O8 j     insert1(p);  - ?! g# i* z- F+ H6 S  T

      * N+ e( Y) ?5 w5 L/ f' R9 |

    • - X( V- H+ ^. s* v% R: @2 x/ d
      ; f* @+ w* s8 q0 S6 D1 h( {3 j% z$ C+ n
            else  1 d% w6 W, J4 Q, _1 D- n  P$ `5 P2 @$ v

      , f: K4 r' t3 v# \

    • 4 J9 D% x) {) x2 _' B
      , C* D- R; F: ?' Z2 h
            {  9 s, G. @1 P! h7 G0 E3 Z
      $ D2 w7 ^: o/ C0 M  G; j+ U8 N

    • - N; i) R  L, {% j! v
      : N# M# M: U( i( T! {# q
           p->next=ready; /*创建就绪队列的第一个PCB*/  
      0 Q; W" N( A' C5 P
      ) ^% ?5 J- Q* g: T; g+ s, s4 F

    • : K( D' M/ H* {) ]4 w

      + D4 g4 M; k; A) k: Z+ ?8 K0 _' L     ready=p;  4 p8 b' q/ M' E/ j
      3 \$ x" J7 D0 k% T5 t6 u

    • 6 w' v$ z2 o* u: }) C) N5 a
      & C8 [' W: z4 J+ V. Z3 \: R+ R& E( ^/ A
            }  * C$ h' I: r; x0 v6 d: r2 V

      % h! x  R; K- q& q9 y) J
    • & Z9 i  M. \  |8 _7 @4 b, K7 B

      , F" i# ^6 d  ]3 X1 }) [8 _   }  
      2 M! A1 I: V- }5 _! m+ L
      1 g, L- t5 S: Z
    • % F# w3 s, f* W9 }3 b2 e5 b( s

      : J( ?) @; r/ H$ }' j   printf("          优先数算法输出信息:\n");  
      8 B; l* E3 L% `, \" g, ]
      , ^& N  \. k) G+ w: F& ~3 s- ~
    •   x9 M4 W( p2 a0 v- x  |9 ?! h4 v

      / L4 I0 V- A! H: t1 X   printf("************************************************\n");  
      ' f. e1 ~5 ]- Z2 S5 k& `) ^
      5 z; n2 w- P% W; a5 \! t
    • , Q# L8 ]. y. A5 p/ [; B. O

      # F' ?( f7 s, v6 \   prt(alg);  /*输出进程PCB信息*/  
      ! l. L3 e2 O- I, N' b0 `

      ' r7 O! |" @- ~& N; a

    • ' i0 H2 T, {% O; D. L+ l6 U+ {
      9 L. B4 L6 t( Z* V8 i3 G* i
         run=ready; /*将就绪队列的第一个进程投入运行*/  
      5 a9 `( k; Q) N2 }; k4 ~0 G

      9 x( C6 V9 u% e

    • & W7 v  }; }- f: Y. q8 d& j+ t( T+ U
      4 \# z' X" R3 V' L
         ready=ready->next;    a3 f% G! H& H+ @; Q

      ' B. ~$ J8 K0 I1 X8 J7 g; O

    • " ?; t- y3 G. |' d& p

      3 u6 i9 H3 a  R   run->state='R';  # ^, E( g- K" F: K5 s: i! C& e$ T
      7 `3 z, M0 j9 ]5 ~- ^3 d, ^5 h

    • : f4 `- e; B. M$ f

      1 l* Q) J  G% F6 N% K) D: N}  
      7 U' g; M; G; r8 ]5 o1 q  j
      * v  j1 n3 s9 M  H0 E
    • $ V* B3 @  c5 G' _  N. E
      % ~+ Y, R  j1 b- V9 J+ M+ Q
      /*优先数调度算法*/  2 i0 F" d) n+ Z. [1 b

      ; {$ S  u3 t5 c; |- e+ V
    • ! v4 w- x7 T' G4 @* O, X& a2 Y

      3 q8 K: ]7 O. h0 ~% t  A4 V: opriority(char alg)  
      # x8 i7 P- T6 F1 y2 H8 j( K: B( O
      3 H  \6 E9 Z1 ~8 |: [0 z5 }
    • 2 u' A$ f: C& M. U
      ; |6 Y4 G8 C3 a$ ~8 a1 f
      {  ) O) U5 h6 F, ~" y3 O+ C; c
      , V0 w+ R- i6 b1 ?6 N4 z( J
    • ) G0 M2 l* T$ p+ j( t

      . O( c; ?, e7 o4 E9 Z   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      . v/ |7 T' t  f4 C

      8 r+ E' X$ c: `( E" w% e" X

    • 7 [$ e8 B; n2 ~+ z  H
      / N* n" C5 o% E4 [3 a
         {  + ~! ~3 z1 [3 q8 p. N- q; o

      ) I! K. X  K# |0 I
    • ; t( d$ C6 S. V* K! `

      / U' b  a9 r; I      run->cputime=run->cputime+1;  - I1 A7 z( V1 I# M  e  t
      , P4 S1 b8 E3 C* G4 K

    • ( P. }7 F! A  W/ s  e) j5 y

      : R) J% e  T5 `" G' s9 ?' j5 W8 t      run->needtime=run->needtime-1;  1 h. I0 V1 D3 i7 R" G# J, G

      1 O) c% Z: {  [. ?/ e3 U3 Q" n; W

    • - v+ ?& C; }! }4 _8 L
      & ]' f; d3 f3 r- B0 s" h" M
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      6 n: z# z) [' x& H) }

      ' h/ p" e9 _5 N  V
    • - E# @  k* d  X2 v: y1 @; }; O# m

      * W  L7 {" A5 n4 y. e) l) O! |      PCB *p;2 O' R9 B4 ?9 V9 R8 `
      % O% y1 A% w# V! E

    • ( O* a3 U$ m+ @! p

      5 |7 r2 x/ L( D6 O! U" s- G" _      p=ready;
      8 W+ f( Z* V7 Q

      ; I1 ^- h- P5 i3 |% ?2 ~

    • * u$ H  R8 \" J; m, Y( V
      , O$ B% e5 k" ^$ @
            while(p!=NULL)  
      - x$ j7 U: G4 t) W% k) w0 K& C
      - k. V$ h3 H- ?  ^  b( G) X
    • 5 `& e5 o/ p+ {/ l3 U& S8 B# U

      : i! o4 I, P7 h% J8 i      {  
      . L' J0 e8 Y) H" r5 _3 n

      / X( S) n2 C( K; a

    • 0 h$ U0 F$ I9 D+ }
      3 E  t. T. e1 s$ ?; H; u4 ?
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      4 t9 U# [( w  u* X- e7 _
      & N$ K# a* j- @* a9 `  f' l6 @
    • & _9 Y- i5 m: d" z

      , o% X  o* Y8 m* d; |* F          p=p->next;  1 Z3 I( x  U# v. ~2 o

      ! z& U9 K- a! e% y9 J3 D$ F
    • 5 k* S' F% s9 Z5 \6 E

      + r8 J* B5 {- R      }  
        k' w  ~5 L0 G. O; }
      0 }& d8 J2 [1 B9 Y9 P

    • * y0 W1 B% @% u, x* a, Z& P

      7 Z- V1 V% I! {. w' p/ Y2 c      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      4 r  @% R4 H- b
      5 v' q8 X. I1 g3 z* J
    • 5 _- W: _& W% v8 c8 m. h. G

      . g5 `- |# ?% B. m, v      {  
      ! x* q, G$ ?% @
      - p" Y% Q8 \  {) d$ `

    • 1 G! |0 R) K0 l  f
      ) f& S  W1 @: @9 m) W2 N% {( S' D  b. o
               run->next=finish;  
      - K5 q' m7 a; v2 a
      - r! i, ^% T+ c; q2 t! x

    • " Y: N' D( t7 t" e( o
      9 |5 J' p2 j9 e. \& m+ l
               finish=run;  
      6 _; h6 _7 N# b3 v8 t
      3 t& N" v/ i, y

    • 8 }; [: k* z/ k* q/ c$ i
      4 {9 R5 V9 e3 v( ]) e
               run->state='F';  /*置状态为完成态*/  ! @% z# k* K% e+ j" f( B

      ) v, C: `& i- {( H5 S( M( p( A1 e
    • " P" D. D/ F" W9 ^/ A# T6 B7 H

      8 t: r9 u' ^* t9 y9 o& {         run=NULL;  /*运行队列头指针为空*/  
        {1 G1 J% z4 Z6 J- G

      6 T) D8 ~4 ?$ g% o  y( y

    • + ^; X- B7 X3 W
      % d6 }7 y: z# V/ A) Y" R. z3 w
               if(ready!=NULL) /*如就绪队列不空*/
      # ]1 D7 f$ y8 T3 p% e& V

      9 I+ v5 W  |1 k3 C
    • 2 e0 M) \0 Y+ A" G) {
      & M- g1 \* h6 R7 Z! R& h" A( [# b
               {  
        x  ]4 ?. S7 \0 p+ L2 c& Q5 d

      $ ~+ @7 m) Y' p$ ]
    • 0 \8 S3 Y0 E5 n8 g' i) b

      2 [  T" ~$ d2 s" R2 h            firstin(); /*将就绪对列的第一个进程投入运行*/  , {, k7 z" E3 k1 h7 Y9 I8 E
      " s( J4 C$ G: R3 m5 H( c2 k+ e

    • - f7 @# P1 B7 M$ [+ O5 c
      ; @6 k: |) `& I& _) f
               }# E' P3 v9 g" Y+ q. f. i5 c
      8 }& ~8 r1 t7 S/ D5 l& b
    • + O1 t9 J: k5 P4 B  |

      + i3 l0 e: I; K% X% ~4 D      }  / H5 M/ Z. m9 ^' ?3 E8 @
      0 S+ [4 q. d* y/ |: A/ B/ V
    • ' d: l- Z2 r% {: P4 m& ?2 L
      ' a1 C$ T0 [. \* }( F5 P8 i7 j
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  1 b  D5 d! N' ~

      $ {; |) J, k5 ?" E4 f
    • ; W" B. N$ m$ R  c
      0 t$ t; N$ G, V1 ?" M
           if((ready!=NULL)&&(run->prio<ready->prio))  " O& R4 v5 Q) H7 V& Z

      # H9 h# z( N: L7 F* Z
    • 0 h$ p% R( D! v5 C; {

      - s1 N6 c# V+ C# B$ g     {  
      % B) G  \# |8 S% l7 U& h! T
      / z% H3 v$ T& v8 m/ O6 a! z
    • . u/ S9 ^7 W7 H. w- j

      ( v- ~/ ?! j; u7 ~8 {% F. U$ t3 C        run->state='W';  
      % |5 R* p- j$ f5 ~9 t

      & P  Q9 N2 P! ]  L# G3 `8 G2 ?7 L$ v1 i
    • 3 M! v+ E+ R2 F5 d2 q2 U, H9 e
      , s0 I6 b6 i+ }) l! P3 b
              insert1(run);  
      9 g" ^2 Z' t) I5 t' I

      " Y- F4 Y4 p+ O; [

    • / o7 O4 W3 T7 x+ y1 n' g- N

      . }/ c; D$ x: z. E9 s% z0 O        firstin(); /*将就绪队列的第一个进程投入运行*/  + N8 j  x& |# f  R' K  t; M

      + F" ^0 R9 E3 B  }. s7 m7 l

    • $ W! j4 p1 g, V* ?! `" O9 \9 E
      0 F! D5 s7 |; k3 P% c. B
           }  
      " b( L. t5 q# v, @& O# n& N8 U

      " B6 ?. ]0 m' s8 m; L7 n9 Q' ?

    • 1 b; A( B/ o: u# w* [

      5 ]# k; F( G) }8 L! D$ j6 [: U: S      prt(alg); /*输出进程PCB信息*/  0 Y6 o: H% Z  i# x

      ( B/ [% y1 T4 x* N  I' ~: S# v3 O
    • + r" l( ]) F5 `+ i& n0 S* [

      7 d7 r- i' b% x$ w7 F1 D7 ?" V   }  - J* H  v0 w- E( c' Y0 j& _
      % \# `# L6 O+ Y; t! r/ |* B8 ^

    • & H# h) q3 t, W. g6 f2 r

      0 M- V% i, o  {2 z}  
      $ n8 c1 @7 K9 Y) ~3 v$ Q
      - y. G' U) A5 P7 [+ v

    • 7 o; f' q3 {0 @% V# F* F* u7 }$ |

      * R# f, T! @) t5 V4 r$ m: _; R: r/*主函数*/  
      / Y* ]" }+ S% O. M& [

      5 Z# i( j- d5 |5 ?" C- O' ^) e) R

    • & H1 U& L* k, w5 ?$ \, B

      # `, m5 Y. V7 @+ Z/ s; ymain()  # |% R" J% @+ l
      6 c6 r0 t! G2 H4 e

    • 5 c2 Y7 w7 \6 U# H1 S

      , g, c1 B5 T3 D4 q6 W{  
      0 v3 \. U( g* \
      8 a/ R1 \' F8 c$ t

    • 8 ^4 m# A, E; d7 g( [) _* k1 n
      ' {5 ~3 }) A3 b
         char algo;  /*算法标记*/  : W2 ?- E7 P# R+ C; K# I

      * \" |  W6 c5 S1 x

    • 2 R. d8 @# L, `0 k" U0 J
      0 w0 h6 A! v7 _
         printf("输入P确定算法:优先数算法\n");  6 v* H0 `3 G- A7 a9 t) e
      3 T* K8 u, P6 t) y# \. S, x7 D, o
    • 6 g  Z! N& U4 P0 h6 e1 `
      6 r* K& R0 d8 [
         scanf("%c",&algo); /*输入字符确定算法*/  
      - o4 k+ y/ y' h1 n1 b5 X

      % D  \# Y) \) r, ^$ K( U

    • 0 A: W) `* X: A# y; r9 w/ J3 D
      ) D, q5 {6 G8 G+ x
         printf("输入进程数:\n");  - b. K5 `7 a9 P3 s
      . C! h  j  {% o% s( ~/ s
    • 5 U/ n( }4 ~; U8 O% z. M" S

      . h) p$ e. j8 }$ f8 e   scanf("%d",&N); /*输入进程数*/    i% J5 j7 e7 k4 d' y( N6 O

      & G6 g( Z, Z5 P+ }6 h- W' I

    • 6 L/ H. n' }4 H% F9 x, D
      3 X6 \0 i. `7 b/ r5 o
         if(algo=='P'||algo=='p')  4 p* S% B$ @5 U1 n; F( F
      6 }  e/ S; }. j2 A$ z1 X: X8 d2 g

    • / H  L- f" e+ H
      : l! ^5 F! r- Q5 E  k/ C
         {  ( h# ~' b  A0 Y9 J' D
      2 H+ l3 W1 _1 {: c
    • ) l" B+ |/ o& p! R2 j1 W- T1 X
      $ X* e" @8 j+ |; t% h! V
            create(algo); /*优先数法*/  
      2 y* s6 n/ u! _3 Q* Y; n4 k) V
      & r. w' s# N3 ?2 ^9 u% q" G
    • , v6 V' i  k7 e5 U# v. C

      5 C# X( L3 o& w" f  C# |" c      priority(algo);  
      % ]$ _/ r9 j0 _

      9 c; [! D6 y7 X, V: h
    • $ d* ?0 Z8 ^0 R1 b, l* g7 W
      " z0 C; J. U7 A4 B$ y
         } # I+ \4 S; W/ ~
      . F" J. L. d1 a( i
    • # z9 a1 d, s  {' p8 }) [' t( P1 o% f

      - L/ t( E9 q! y: ]5 f0 X4 P$ I}( v5 a. _$ S6 e2 E$ g
      6 y8 n- i5 O, k) k- G7 o
      6 T9 d6 u: ?/ p


    1 b/ t9 O/ l3 {$ a, `输出结果:" u; i# O$ L8 q/ n6 w

    4 w& K, `. \* I5 E1 O2 Q& Q
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    8 Q  ?2 {  I9 O) N% K2 y6 k5 O( F9 ^0 p; c% 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-7-26 12:57 , Processed in 0.443213 second(s), 50 queries .

    回顶部