QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3206|回复: 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
    4 w# W9 A* j& a9 E
    优先级调度算法
    - c8 `! ]7 G& v: q- X8 u

    算法介绍2 ^5 p/ Y7 V' ?. T7 G0 M9 b) c
    优先调度算法的类型(用于作业调度)3 ~; q& R/ ]7 }
    1)非抢占式优先权调度算法
    * }. F2 ?% K1 @+ _9 H- G* R系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    ; U4 \) O0 ^* S2)抢占式优先权调度算法 0 y: h$ U% ]: B  n
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    + F4 S$ u$ a  x1 w1)静态优先权
    . {2 h  E" \0 M1 Y( X0 g/ ]! J静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    4 {+ L; Q8 ?+ x8 g( ?) R

    2)动态优先权 0 H/ K$ K: u" @& }: h4 _4 p" a' _

    算法实现

    抢占式动态优先权:

    " P  g3 t# H( N" d$ V
    PS:本人认为非抢占式静态优先权没有实际价值。

    • * w: B# c3 G, B3 u  x4 \% u
      $ j# D# E) b1 |$ A7 w1 ^3 Q- V9 ~
      #include <stdio.h> ( B2 n1 I( e4 B/ i

      ; E; d" h. |9 d& Z5 x3 @( r2 ?

    • ( b! S* f- K- u2 f" p: g$ D

      & }' h4 j3 d% r5 k# e#include <stdlib.h>    y* X- N% O' N: [

      5 p* W" z2 S4 E

    • & q+ [  b6 N1 T) ?' }! w' j: a4 c

      , T9 k- o) r$ y4 X6 G8 l9 M#include <string.h>  
      / a0 p" N+ a8 Q; `* ~
      : e" g' Y; Q6 Z+ m/ e; W. [
    • 9 x  z& J# W, t" \. N) ~

      % r# {8 z/ \' g/ P& T- atypedef struct node  
      # p+ a1 m0 U' T1 {

      ! K# a) Z& s6 X5 C, H
    • & Z; h+ g# W1 R; d6 f* h

      % |+ B: ^9 q+ L% b{  $ M* o1 d" `. g1 g
      ) L. N. O1 e$ i' G
    • 2 t5 @( W" t% A# [9 R
      1 X8 R  I" [" Z
         char name[10];  /*进程标识符*/    U+ |: A0 y; r- T7 b/ Z6 u5 Q8 m( y
      4 F' i7 q' L' a- _3 W

    •   W  ?; a" m9 T( T/ R4 a

      1 I* g' g6 W2 I5 U4 s   int prio;   /*进程优先数*/  % y7 {% _/ ~" ^- M8 N# W2 B) B
        _' V0 E. a. E& ?! e% \
    • / ]  Y  D# D& {4 ^' ?$ w) z
      6 O! a" E3 G: o8 T8 [( S3 q
         int round;  /*进程时间轮转时间片*/  + z# Y: f& g( }, ^  g* [! c
      ; ]" _/ U( o1 A

    • 5 ?: Y) J0 Y  Z; i; }, n

      % b9 {* |1 u  e# v' i# H: ^, `   int cputime; /*进程占用CPU时间*/  
      ' W! l- ^7 M- D) e5 X" i: v
      ! e: I& Q" _" n8 q9 L2 w7 N, h
    • / E) x2 |, _3 @0 J3 g$ v5 c: x
      5 f/ }: a$ f7 B% l& g
         int needtime; /*进程到完成还要的时间*/  0 X9 {) j8 R4 r& P6 j. z+ H

        V7 G, ^. B8 `4 v& ~

    • $ o# ]' ?) v2 M' N
      / z) k  }& n6 ]( w4 ^" W
         int count;  /*计数器*/  
      2 p; y% D/ N8 s4 T3 W) e' l
      ! B6 l& z4 I7 B% q) h3 I9 w0 A
    • ) S9 B& {0 u: d8 P
      + Q: x# S6 o4 T6 p& g9 }$ I# N( S4 w; l
         char state; /*进程的状态*/  
      4 [( V1 q6 [2 p! U

      . }& G9 `% s$ K# _2 c' D( O: N
    • 7 E& I- A. q- O0 {8 _) r) R

      8 g- Y- \  f& V' I1 E+ U   struct node *next; /*链指针*/  3 f7 j- e4 N! C" ?: e" Q  a( f
      : h3 \! z' W! Y: P8 q! j4 W# ?
    • 8 K; R% D) T$ n" e2 r% k, Y
      9 K2 Z) A7 o; g
      }PCB;  
      8 q/ ^  k1 Z4 S* X) I. |
      ) s. U9 H0 D1 h

    • . F. Q6 q9 e/ P3 j# U

      9 w/ _/ x- E% z4 G! uPCB *finish,*ready,*tail,*run; /*队列指针*/  " f$ L, E/ o& @- h3 p3 k
      . {  |- V+ Y9 ^, u$ Q' y
    • ( N1 b! P- q  l1 V& `

      , y' E8 n2 ?* u2 g$ v% v7 Jint N; /*进程数*/  
      ( B0 C5 q  \- [

      4 Y7 @, N# _' }9 M& j; Z5 L! l

    • " K8 _' ~% Z& s8 q8 q

      / o0 d+ D9 [9 S0 A  ]% C% N" h/*将就绪队列中的第一个进程投入运行*/  
      - Y* t' @) B0 z( L' w1 {- ^

      / Y0 R  m" C. X7 l, O5 ~/ z

    • , F% Q( h- }1 s( |$ ?2 U
      . w3 C! a0 K( m5 f3 [$ d' p
      firstin()  : `% m/ }4 [0 Y
      $ C. w" I1 e$ {& g
    • 9 w1 x2 f& T* f. }6 L  ]+ C
      , X) `  S/ u2 c1 G8 ?
      {  
        G/ n- a) |" a# R& H

      " k+ k2 s- g  v2 E- d* \
    • 1 _9 z6 ]' E$ ^/ `5 ?. Y) m
      1 V3 E: E% d: J5 a
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      : M0 P$ T) v# J, E+ x( N
      ) c1 I& p2 `# o1 m; {
    • : Y' y# c# @* @5 F8 _

      * k% f+ Z  E# Y% O, D5 J$ H   run->state='R';   /*进程状态变为运行态*/  
      * r/ J+ f) j0 |% O: t% c" _
      2 t# U1 g& |6 U5 j- Q9 v

    •   g( a5 j# z$ h& u) [

      + I0 @1 n  a" ?. K5 s" f   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  * p; R) k. _. H, a: |
      ! w0 S) ^, q0 ]" @

    •   Q( q. _, I8 t& z+ g1 _5 g
      7 x$ ~5 s4 a+ ^
      }  9 `. a7 E" s% Z9 b6 W& }
      ! ?" T4 O( x( p5 [

    • - h7 \' p5 w- g1 c2 y" e

      2 @. ^$ M# S: I: U9 F4 r/*标题输出函数*/  
      , d7 b- [7 Z# Q  r
      * N& N' ~  }' F! A2 f8 w- Q4 G

    • & Y8 k; B4 m3 t4 f2 |* K

      1 m- t* }. p4 h# j$ p( Nvoid prt1(char a)  1 C4 W" X. a2 [5 H
      ( W) y; w0 r1 ?- n

    • * @: q6 v6 y" w8 b4 Q0 w( o

      0 o& p! d- w9 L5 Q1 S% k$ t0 T{  9 Y# S/ l1 H" t5 _
      # h4 L! V* }& u# F9 J& _
    • . V/ U# x6 S9 q7 L
      ; \& E$ s+ ~( Y9 ^
         if(toupper(a)=='P') /*优先数法*/  
      4 O0 M2 Z; X: n( c0 [) p4 h; c. J
      3 y7 z( _' @& t
    • $ C: v2 u" T0 ?7 Q7 z+ }7 E

      ) m, n! K  W9 ]9 N2 f0 P1 d      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  2 i7 I; H8 e# r
      0 {1 C) K3 }0 o- {& u, y" w$ D
    • , p  J( t; R$ h, h* ^2 @
        b" q- F! ^% T( G: K4 P
         else  
      7 l3 b( U: e6 F% K7 S, N1 s* P) `

      . @2 `0 a' C4 e  F

    • 6 [( t% Z! e/ G) L9 s

      ! _% Q! D9 X* O# w; n* H0 i$ A      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  8 W) r3 o! V4 x6 z% [3 o6 W7 F* B
      # G8 _* C, w! _' _8 y) B* V$ Y9 U
    •   [- R" u7 [' h( K6 C

      5 n8 X; }. m+ S}  
      . N3 z* z$ @6 ~$ s2 \( S+ g

      - Q* @3 b8 G& O5 x4 K* b9 j

    • ; g  B) r- r% A
      % S4 s6 ^: z  @  I
      /*进程PCB输出*/  2 f5 [) L) f6 P

      % j. R9 q5 ]: P4 s! |2 W; z: f4 p
    • * f! v5 _+ ~; i* H6 v; w

      ( I. c& _" J) G! z+ c  @3 i. Svoid prt2(char a,PCB *q)  ! I8 r8 c8 ~' a. Y

      / B0 h6 I( _* W. e' P
    • 9 T6 |$ W; l2 l7 Z4 R' `9 S

      - `: i: U- H' P. J2 b. ^{  # f3 Z2 o7 W& n% G

      4 q* R+ g: b" ?* ^4 D

    • 2 ~/ t& e0 T* m7 p

      6 j8 l7 T7 F( |2 {; O4 e& e! d   if(toupper(a)=='P')  /*优先数法的输出*/  
      * M9 b. u5 O; e; S
      ) e$ O2 a+ _) [
    • " S$ ?' A" z' G- a, q8 ]9 a
      5 M6 B8 q( ?) i1 `
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      ! D, r" _6 i, T8 R

      2 z7 l# Z7 O" t/ O# l8 f

    • 7 x# j9 d- N# Y: i3 e% X1 A1 c* R

        x7 c$ o" y" k. S) L& |       q->cputime,q->needtime,q->prio,q->state);  
      1 g( T& _4 G" }  E, G& g
      6 N6 R0 ~# @: F+ N$ V- U

    • 3 ]- ^) ]: |0 a
      0 F, L- Q# o! A* M2 O* ~
         else/*轮转法的输出*/  
      ( t. T6 x! V& H9 }  h
      , {* Q/ ?+ b8 r& ?* p
    • . R& N" k( e6 Z0 J  R+ B

      8 H" h3 w8 R7 C- z1 d- h5 g0 Q! j      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      1 N( A- `0 p' x% X
      ) K$ f8 Q. W9 X( I8 T

    • - t+ i( T! ]0 g  c& [

      * n. N, m+ R/ Q0 g* _       q->cputime,q->needtime,q->count,q->round,q->state);  
      # o0 t3 H) L* u0 a6 R3 ?( H0 E

      " I; e! `( K. ?( W

    • " z4 @  U5 c' P. S9 |
      9 B; N4 u" i4 U; @4 H( d, j
      }  
      + l: {% E) ^4 r) ~; U% q

      ; C" K" v8 Z1 `' ~5 D
    • 6 J' d  l2 g# f6 V: L

      # S0 l" D9 R# m# x- a. h9 d0 D/ J/*输出函数*/  
      $ |# p2 z! p8 J; [

      ( V" j6 k8 Q! j

    • 2 M+ ]6 n+ F+ i) v6 C* t% q

      : C# u- z% v) F/ p% a( K. A% Jvoid prt(char algo)  
      * B' c4 a* y6 ~5 s, |

        w; O5 f. o# L5 |( Q
    • # F6 X* _8 o4 e6 b' H0 k
      0 `7 w; n: {7 c  \0 A) ?, V* J
      {  0 y/ h1 D! j9 C" P

      * ^1 X% Y3 d( O% z: j& K2 K

    • 0 }1 g* V) Q! T& M. K
      - B( R. h; }, B4 F2 S/ v6 A
         PCB *p;  
      % L% L9 y) V% m6 V( N
      3 h& H3 ^, B- G6 B
    • 9 ~6 ^: y! B4 X/ ]8 b

      9 ]: E  G$ b: W  c9 L   prt1(algo);  /*输出标题*/  
      ; v. N/ m: [/ R1 f6 I
      ; o1 D0 C# }& i8 |2 b
    • 7 w8 g4 `; t9 k4 ^
      3 C$ ]- z& e; c, ^
         if(run!=NULL) /*如果运行指针不空*/  / Y1 V: h+ m* b. a
      ; X: f+ B: |+ R5 U- u

    • ) Y) J) g1 e2 i! ?) ~* k

      9 h  R1 j% X+ t6 Y$ q9 I. h! ?      prt2(algo,run); /*输出当前正在运行的PCB*/  , ?! m, i* a, q  M( t
      : H- t+ {- G6 F. z$ K+ T
    • - `- _8 k1 m$ W+ `
      ( x+ K# h% G7 J0 D1 X
         p=ready;  /*输出就绪队列PCB*/  5 B/ p1 s, |* I) F9 M$ e1 e

      8 j  `1 b2 k4 x8 A

    • 5 W% e. S5 X9 L" `, E7 j

      0 M3 M7 M8 a1 p. b  i) @   while(p!=NULL)  
        n9 e; g: t1 i( f7 Z3 F) G

      , i# ^5 T2 b2 J# I
    • . x1 k0 m* q" R( L# f! Q5 @) W

      9 \. R, c- w8 N0 f  h6 r   {  ) V( ^) S+ K" a9 L

      % t9 l4 R: [* A, E
    • + ]" t) ~6 y: g2 W
      8 S) ^& Q0 H; ^. z
            prt2(algo,p);  
      0 H9 M1 f- w4 L. n! Q

      2 F1 C+ T# O% A* W  s4 O- B! a- e

    • 6 v, L2 v! e6 g& F

      6 l7 d& K1 D6 X8 N      p=p->next;  
      " y, V1 s: U2 r7 O! X  ~5 B/ |
        p6 Z! I7 w1 y+ j

    • - G$ k# X7 Z9 X& c2 \* u- V

      ; j" N9 Y( G+ @/ t! F- b   }  
      / ^8 x7 t2 b% x+ W1 k7 N: r
      & B1 Y2 j2 Z9 r3 U0 ~8 n  Y

    • " Q2 {8 \0 `; N( D" j, ]2 T0 X

      * q8 O& e$ V4 K# G7 x& m* g   p=finish;  /*输出完成队列的PCB*/  ! Y  \/ p+ s! X  P$ W
      9 {4 X7 i. J5 `, z' r& h3 G
    • # J) C" h5 O2 i; w8 M7 |

      & L" B) A3 ]3 e  y+ o% e- B# [; r. z   while(p!=NULL)  
      7 m+ f! Y% G' X& w4 a( q
      . F4 j3 z! X0 y: w6 G

    • # o; D% c; ?) N2 Q

      + w5 N6 y& |1 D% k& O; m1 S& Z   {  
      ( _: V4 R: O: v1 q0 C6 C
      / o8 @& i9 P/ [7 s" o

    • , T1 r0 |7 p' b

      2 T" ^: X/ Q. Y( a6 Z0 P, K$ l      prt2(algo,p);  / O" T9 M; n# Z. `

      ; w2 F3 f# O5 S8 m! x' V
    • 4 J6 M1 y& @% l+ f8 L( d
        ~% T* m% Y5 }8 o' ?" m
            p=p->next;  
      3 b, Y1 P' \: d9 {0 K; k

      * D) l% S0 o5 [7 N0 X

    •   Z4 Z  _4 i. q% l

      & F! i( i3 |7 g) u$ r( q7 B" V7 ^" h$ S   }  - r' s+ j, ]7 O' S

      3 l; n$ |2 m  H, e$ n
    • . q! E1 O4 e8 k/ ^* C( ~

      # t' p+ ^+ m; {  ~- I   getchar();  /*压任意键继续*/  3 `2 i/ K. C4 Y+ X' d
      % v0 [$ h8 J8 k. d& u+ r& \% _" }

    • ! K3 m3 R" |$ Y+ g8 G" E! F/ Q
      " t2 @' i+ ^# e/ M0 n  `. Z6 W
      }  
      ' v  Y& _$ t6 j/ f8 v7 E# W
      0 L: p& L8 W- i: U
    • 5 a, v* i2 t  l4 W+ |
      3 i* D/ P- k+ C8 S! T# {
      /*优先数的插入算法*/  4 d3 g: ?5 U& p% D5 b
      : r9 L* x( g  s; M/ H+ y, n

    • ; i/ N% n4 u0 d& H1 l! w8 H, K

      0 M2 w* j( m% U: Binsert1(PCB *q)  
      6 C/ [) {: h% E) |; d- ?

      ) e/ j/ y2 o0 A$ j9 F( Q) d) {& j' k
    • 3 S( F' m$ z% C9 r$ I
      , C% A) l2 ~* l9 z  j, t' E' O6 c
      {  
      % J- V) p+ }7 R9 x
      0 F- [- @7 V: d! D8 _; L

    • 2 Z1 f/ I& h+ \
      9 a" d$ p( S: E0 r; K$ S( q
         PCB *p1,*s,*r;  5 J, A" W, S# C

      0 A/ E( M7 p4 Z; U# x7 B+ |

    • ( t' l( K7 R: [* r
      6 I: p4 l" b1 ^9 H1 N
         int b;  
      # o* _5 ~; Q- J' D* r% ~+ r

      8 i; F+ Y9 K9 A6 z4 N

    • : S6 F) _5 o! I* y$ B, q

      $ R8 h9 n6 |$ b6 ^   s=q;  /*待插入的PCB指针*/  
      / Q' b7 Y: q$ e% n% ~

      4 o+ ~% D1 J" j0 h5 n
    • 3 {# X% P4 ]0 q8 J4 T8 z0 C( h

      : h5 u4 p0 Y% }* |! ]& m   p1=ready; /*就绪队列头指针*/  
      . L& Y$ m/ I$ X% H; K/ Q9 _

      : K6 P6 `  \- i7 r3 {9 {) k

    • % Y6 a+ K) |  ~9 q4 F

      ' Z7 [' b9 I1 ~. V   r=p1; /*r做p1的前驱指针*/  
      4 m7 F; B9 [3 i& h
      ( t9 o1 v. Y  S" R7 W
    • : ]- P2 H  o# ^# w( o
      3 _- _" a' V' Z1 w" Z! Z0 y
         b=1;  . M0 K* H0 ^: T0 D6 l& z

      4 d' Y! v8 E% }, o: L. L
    • # |( r, O- |6 Y% O- T- P* |9 o
      / {# p2 e  t/ X4 m
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  4 L# {- `( t* V9 w

      , k2 E# @. |8 `# V2 N+ m

    • ) |* u  P5 s5 _% b, R* D7 V
      ) _, q& L2 U0 `% i: }
            if(p1->prio>=s->prio)  / O6 k4 P5 w6 U5 [5 a# b0 [! m
      # p; U4 L! I# f  e- {" F9 e
    • + e' v2 Z( A( k1 H5 d, U. l

      " K: L, Y: O2 h$ W      {  0 z5 _& d9 d: T! d

      " F5 A! t- s5 I* J
    • ' n# M* D6 g) G0 K1 ?: I5 ~
      ; y7 R. v' W* E5 {4 L- g/ a
           r=p1;  ( P7 m: I/ k- s, t
      - M% Z2 T, @" _' ~, v
    • 0 U4 H, q9 u# F& C, ~1 C
      7 A5 P, G& S4 G- W( c& J# i
           p1=p1->next;  
      ( Y/ D# B: o6 _! X; B9 Y  W

      ; |7 O; i  a# I7 A' R
    • 2 T( W. p1 W; X+ U4 w

      1 H- e/ j& g6 K! E" D' ]) P      }  / Z% u- ^* [1 l& i& n& `; v' }
        J8 ^) D$ `* p
    • 4 B! Q: F( U  @8 E9 d/ A

      ( n4 `/ J% b: }3 Y      else  , O2 c3 v( N5 f$ L& T6 P: W

      % G& A! s* G# \& {, q2 l

    • 6 X/ l6 D8 L! _; ?
      + F1 s. f% o8 q- F4 I' u. j" Z/ ^
           b=0;  
      + q9 s3 u% ?: f7 s( W) \: E
      6 f3 }# L. N0 P

    • 8 H" X2 ^' [- e* r$ F1 M: u- O

        e$ L6 j& J, ]" V( @: ?1 i6 s! e, B" \   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  ( f/ O2 r3 k* O1 ?& l9 L( }( S& b

      . c& s: d$ r+ R' G" l6 p/ M
    • 5 @! A$ {6 Q) F$ o4 Q/ z, {6 q

      7 c' Z) }; T+ l5 u2 N   {  ( h5 x% l- B& h0 l0 E
      0 q/ j. Z- g/ @2 J9 P% E7 k
    • / r$ ]9 _, V2 m2 Z% ?% Y
      9 Q5 H2 C- {7 I6 {  |  W$ K
            r->next=s;  
      7 f" P+ V* s; @- h

      / [- b4 _) g, m3 ^# G. p" D

    • - N& ]5 }- ?1 ~

      4 d$ v: q2 A5 ^! N      s->next=p1;  
      ! d9 T) U# }2 F0 Y1 E! p

      * l! G# K& R8 P/ a$ I

    • 9 L  X- V9 B( t# ~  _

      : L3 H6 U0 g1 q0 ^0 |7 U   }  
      / T2 U+ e7 W5 M' d

      - @8 q! F7 Y9 c9 A* y- w0 b
    • - ?. ^0 E' v0 ?. A
      2 k" V( k. u" U) w
         else  
      ! }2 |  Z; q% |/ Y4 l
      & ?- V: a8 Z0 f9 ^5 b$ {( C+ O
    • ' N1 q+ D9 m! j% l/ J
      5 O0 Z( _/ U# z$ H
         {  
      - k6 r" ~! K3 f* C! Q- h$ u

      4 ]0 r% D+ N3 w  j/ w' Z
    • & R5 g5 o' A5 g, x% T

      ! G, n5 O, R' F) q      s->next=p1;  /*否则插入在就绪队列的头*/  6 F' H$ C! G, g  ]$ A4 c" ]% l
      1 D) Y4 x: q$ z- j7 x3 p% ?. F( ?4 R
    • 8 `" n$ [2 {0 Q, ~
      ; ~0 h: R5 b2 k. H5 X4 n
            ready=s;  ! c! k1 q' k" q$ [; x3 ^& ^6 Q
      8 O" P, t% B( q3 U5 [3 _1 A
    • 2 N8 ?9 \( y% H- \# I2 S0 w7 y6 P
      . ^) A. U9 h8 J( O- G" j
         }  0 I! K+ V) I$ H2 `! j
      / s+ p& I8 ~4 C0 k

    • ) U( o1 f8 O; k/ F7 x
      + B; f3 w# G- ]/ r& ^5 ]
      }  
        g$ I# V' C$ ?8 l5 C0 N3 m& J

      3 G2 e2 b5 j; ~) V' D7 g# V4 K, m* m

    • : N" |* Q/ H$ i% V! z# y
      + }  E1 l* Z7 O
      /*优先数创建初始PCB信息*/  
      " p1 `$ ?) K3 D% {

      2 C1 [( U# C. S: E* T' O& m# Q% D/ A
    • , c" b# w" W6 E/ V5 h4 H6 b

      * J; n3 H4 m6 e) b8 G6 _( Fvoid create(char alg)  ' X0 b/ M) f9 N, D5 a, g+ r
      ! H6 w) h9 |$ L; R" ^8 R9 r
    • ; ^  W( u# M  V
      & w$ ^, a$ f% n2 T  L0 V
      {  
      1 w8 ]% W# f& g5 @+ a
      $ y( Y$ L8 }1 y* `, P
    • 3 a) J- U  B6 {
      2 O( l* C- _9 S0 t4 W/ K
         PCB *p;  
      & S  ]7 z3 m) M9 d

      2 D+ f" C# s' a8 e9 g% G

    • 8 z+ U) R8 V* U5 u1 S4 X. L9 g

        H+ X" d3 x! e- R! d' v9 c" ^+ l0 o   int i,time;  
      : ?, O7 R! k3 K
      / e% q& g7 R& i' p  _: z) ]- j
    • # n% B9 ^! @: S! k% j, G( b
      * L3 R- h, Y' h3 l# J1 y  i
         char na[10];  
      ' B7 i- s$ k. n6 G2 g, f# E, I: H

        r. Q5 p" D8 g# D# ?, M
    • # k, a; L( M1 K! T: \

      : H' J' ?$ S) V- M2 U   ready=NULL; /*就绪队列头指针*/  5 L2 I/ ?+ [5 M/ X# R8 n
      2 P3 R  d5 K8 v$ P8 V! e

    • 5 A6 E. P) |' N# P" a( `- m4 J

      3 f) @4 W+ _0 u2 y9 j   finish=NULL;  /*完成队列头指针*/  3 \- f2 r4 R' r3 e
      4 u' @2 x) @! s7 B8 [: x& Y% \

    • : E/ I1 t0 v) w& l& I. s$ Y

      + [' P& c- Q9 p* a6 r4 @   run=NULL; /*运行队列指针*/  
      . x2 S7 I3 h6 ]3 Z
      6 L; w  Y9 W" @+ K9 y* _8 c6 r5 w- `

    • 6 w9 [0 h  C% T" M  K- P

      4 S4 n: R1 B" C( c7 }1 F' _   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/    G( b4 v6 E6 M- ^& B6 Q# R
      8 O. m! G) x: o9 h

    • 4 k% t- k9 q* V5 W7 U) y

      8 ^1 P2 ~# D9 P' K( t1 E0 X& Y   for(i=1;i<=N;i++)  
      ( c! H. a' {0 h  P1 x7 w" W) j

      7 d0 d( W/ a  d1 o
    • 1 H$ n& t8 |3 p$ D6 q, c

      5 `* n( A& _4 O+ E: q1 i2 P* c   {    Y6 z3 F$ k  a# w
      * O$ [8 I8 d& U8 ~2 B
    • - z2 _" v0 {; _" i3 M* h8 A

      0 d9 R/ ?' x: r2 T6 {) i  z      p=(PCB *)malloc(sizeof(PCB));  5 z6 }) q. L, T! @. b, E1 c+ O
      & i3 e) F; s; c5 b
    • , j* c: z2 n. C: v  ?

      / P4 B& q) |3 X$ p      scanf("%s",na);  " G$ X9 A, b' Y2 V& o; T- D
      2 X  O, q* ]: ~" D6 N" f* p

    • 7 r% g4 }3 `- D: K" W6 @
      6 R' J8 ~# u  z
            scanf("%d",&time);  
      7 }4 b/ V) p# h9 V% f& W
      ! Z# j6 a, g) N9 g( m2 O  r

    • 3 t. `1 l' l  c" J
      7 ?* }- r$ y3 j* D6 k+ ~& W
            strcpy(p->name,na);  6 _& A; c5 z% q9 D0 ~
      + s2 F- o& h; }$ K0 _  ?3 A

    • 1 Q" G4 Z/ X6 ], `% c

      . l* u! x4 Q: C8 e7 s7 V2 [      p->cputime=0;  . d7 `' Q! Y. k6 O3 x% D' r$ O% Q

      % y& w& U: O4 \! R

    • 9 E3 H" }1 _* t2 C! l1 z6 A# {. {) A
      # V) @3 k+ f' j  G/ o- @& E
            p->needtime=time;    [2 f! u( w; K, K: y+ j+ i
      ( n$ ^* t1 R- W0 A

    • . m  C0 ?% B4 ^  Z( M' Y$ k8 U0 ~
      8 v: G% R" H4 j
            p->state='w';  
      ) B+ K/ [4 j' S! ]9 S! h; x  k# g

      6 X8 B. Z: q1 x/ L' ^2 v- D. _: e
    • 7 z" Y- \( s. i6 n: s5 N

      ! S: g5 J0 S% e1 f1 ^- E1 B6 S1 D      p->prio=50-time;  
      # {3 t# C3 w6 X. Y

      ( f; X- E! E( ]. f3 z& m
    • # \% |) U6 g/ ~* Q

      . y6 G4 `9 P  s) Z      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  : q1 G) Q- E4 G* _; ?% b
      8 T- z' e0 ~$ V' M# y' `

    • - f  W  b" c: f  A6 [" a
      & \0 |/ J/ [9 r
           insert1(p);  3 J  B, `+ p) Q. r0 x
      ) x. a3 {' p5 W9 N

    • + `4 f- n; ]: v6 G5 l8 Z( N

      6 q) q2 n" F0 s9 e      else  4 q. v/ o/ m" x0 }
      3 H; T$ I' Z$ b; f0 J
    •   _) h1 ?+ U1 L7 ]- ]4 d4 P

      3 z5 f8 X( l* Y# X# L      {  
      # q% }4 f* ~2 ^4 n' f# v

      7 j" }. N' E4 I: m+ y( X
    • ; x- J) b2 Q  A* m# t1 v1 Q

      % y* J4 t8 L4 F     p->next=ready; /*创建就绪队列的第一个PCB*/  & g" Q$ A2 c% H+ H0 `
      " X5 P* ~6 e/ Q0 T9 m" e
    • 0 n% F% j( @$ r4 X* g0 ?
      5 h  i7 I3 Y( B0 v' J. k
           ready=p;  
      ) T4 Y3 _. Q4 N8 C0 j: @. r
      * z3 O8 D& b7 S  h9 R& i1 H
    • 0 ^6 J2 |% U: e8 B

      + A+ e4 P" }' o5 u      }  ) I$ G; O( D; @2 p; F. \

      ) n: S# r. ~+ s9 R# i1 Q

    • $ R; W' t6 T. ?. V  o# N

      . T  }4 ^- E3 h; r; p  y- i   }  ) b* z4 y" e0 y% [5 L1 u

      * ]7 `1 l1 {( q2 l

    • 8 m  T' L% }$ T# l" }; ]% T1 z

      ) H! X2 V( }3 U+ p$ y   printf("          优先数算法输出信息:\n");  
      . \3 V5 I8 o( V' J5 ]: M8 t# @
      9 I7 v/ u! @' Q! _% ], _( B! M% Q
    • + U# m* G$ J% S! [) {- {

      / z  B! ^4 \4 z. O8 K1 u   printf("************************************************\n");  
      / m8 c+ U9 D7 I
      ! N0 |7 m- ~" l: k/ t* d
    • : n) ?1 a1 Q' x/ z6 [0 b! [5 r

      ; V  @" I, u6 h( s/ s- E! Z   prt(alg);  /*输出进程PCB信息*/  & L6 q: N0 P" x+ x
      * Z8 C+ j1 u2 @# L6 g
    • 7 C; ~( S2 u% C& P' y; `

        j3 A. s9 y5 c8 U. ^: G$ j; ?( V; q   run=ready; /*将就绪队列的第一个进程投入运行*/  
      * k0 L9 D! |  x" t  H4 g) E, O( p

      : B; N0 {, t* h0 r6 ^% x" k3 p3 G( V
    • ) @3 o2 j" \: t+ Y/ ?7 I
      3 g3 ~  s1 L" v8 n( J7 I: b8 D
         ready=ready->next;  - r1 p2 f8 M* X) j

      ! z& K0 V2 h" Y. G, W+ g

    • 6 ]6 B8 U0 e' e" ~4 c6 J
      * i" p3 D% i! X# O3 ^
         run->state='R';  : V% \/ V* B1 a& C* }- k1 f9 O! W1 w

      ; L' @# }# Q7 _; A
    • 6 l7 O9 d1 {: C$ X# X
      & N# \5 U9 J2 M% n5 F3 F. m
      }  
      $ H# V! e9 u- X; F; C
      - I3 Z2 L0 ~# ?  Y9 Q7 ^/ b& t, k
    • ' u# V1 J+ Y  S6 x* |
      / k9 p! a4 v6 B" D. l: ]+ z
      /*优先数调度算法*/  4 y) a/ R$ \" d9 M2 |3 c
      / I2 b0 |2 N% d: i1 ~) O( Q4 M
    • & s; h( K) m3 R3 f" u& j* W% C

      ! e* @) _4 k5 ^) J9 k1 y4 n6 rpriority(char alg)  0 X7 l+ a7 B& H7 t! p' t7 c; D

      " Y0 _( \! O2 Q7 }5 `

    • 0 _( T/ [! S3 C
      2 T; B  m7 U0 r$ k, l# ~8 g' i
      {  
        t9 R0 h1 x2 _. T) y9 |
      " |8 Y* P8 \2 B  ^7 ?9 F
    • ; w. B1 C, K+ ]7 t" U

      ) Z# M1 @& z$ |5 F. u$ Q/ F   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/    @$ M$ t, N5 y7 g0 Z. v5 V

      - _' x" ~8 ?1 ^& z/ O
    • . c' f4 Q5 O6 q  W! W: {$ e

      8 M* e, u4 i, O4 l  Q5 z$ U0 r% I7 u  d   {  
      9 U2 I& v1 H# i; S4 H

      . C' l7 c1 }! U
    • 2 |. Z! E( L3 M: U/ r: `- B# u/ m. j

      ' l; r3 T+ v/ ?( {9 H1 t" R      run->cputime=run->cputime+1;  - Z: e" y7 z( s' B

      & y+ F+ P2 ]+ `

    • 8 d6 E/ _4 q+ Z, Q9 v/ O

      ! }( f" r9 L+ O( N% S2 O5 l      run->needtime=run->needtime-1;  
      # ?% y6 n2 O, l5 q" ~& w# P

      0 O+ _( a/ V0 E6 }9 q( a! P
    • + B; L* t5 a& V( ^2 S& ?

      / R2 w0 l% }) q' ]: L6 @) m& D      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  ) C* o) m( Z3 m  f

      7 w( U1 x0 g! L8 f' r* C8 ~4 a
    • 3 Y, R5 E  s1 i# @0 u; N! S; z
      6 w7 ^6 O; y- S1 K+ J8 {! C
            PCB *p;( j! q0 J$ C# w4 g6 L5 G6 N. t' Q! D

      8 M' s& O- o* X/ t
    • ! B* x/ m5 a/ t
      ) |  j% ^* r7 `  n
            p=ready;
      0 ~& \9 |6 M/ z
      ) S4 l+ ?' X/ C9 v& T

    • % j2 e- C1 N/ a( x0 G; J" r* F

      . s6 h) ^. a% Q; E+ t1 [" E6 V# r      while(p!=NULL)  
      " T$ P9 z" M1 ]# E$ M
      4 \4 r* D9 S3 T) \& X
    • : e, \3 L0 {3 ]+ A1 Y

      1 V+ Y. \4 `7 }8 `& F      {  
        r1 i& C" S& {5 \* M
      6 O/ o7 ~5 M- ^2 f$ Z9 N

    • 8 D0 e& V) [" _3 [& O7 Y' {3 S9 z
      ! H$ g  e/ `% u3 L# Q6 W; j! i8 g
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      0 |6 J/ A. p1 w' m: r  [& P7 f% i
      6 J' v. Y' }% O2 L& [6 ~  S1 z3 Y
    • 9 c- h4 E8 F6 A3 d
      , y2 U  `  l' D; E3 T: d0 k
                p=p->next;  * G4 C# Z2 F" }+ N4 e
      / J0 D5 v: |9 [2 p, L7 ^. y5 J
    • # W3 Y2 [- \5 Z9 j% J# {* O2 z

      2 d# N0 t7 F* q3 a! ?' K      }  
      $ ~' n( Z  b- `  r: y

      ! E7 {0 [( u. @
    • 4 N* G: w: ~/ y& r9 H

      . t" n/ i) U. L1 z8 w# I. l      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      . O( u8 a3 H1 C" J2 e  E
      0 w0 Q) m! w* r. ^% {: a/ J. q

    • 7 V9 Z8 Q1 c+ ?7 P0 @

        x' z3 M5 v( }" N5 B  H      {  ) b' q( e3 q$ {* H. W
      1 _3 V6 p; ~( m, ]  Q

    • 9 j1 D" ]. F% L) x% l2 k9 h
      1 s$ [& n4 N" G( n3 ?# g" K
               run->next=finish;  , F. m* W% Z/ R6 k6 e
      ! q6 r; [6 M8 {5 r) |( f& P+ S
    • ( T+ e% K1 {; y6 X, k& O6 J

        {1 V- c0 F2 n5 H+ M9 q% A         finish=run;  
      " r0 `9 ]0 {: e1 g8 O$ ?
      1 y6 `4 p& Q. [9 D4 N
    • ) F, p& Y) }2 _) Q
      " f5 L" R7 f, u: O
               run->state='F';  /*置状态为完成态*/  , s' S9 l$ O3 x! \: H

      4 _) K  j2 m0 I+ W9 I
    • ) C; x+ H1 M3 S! ~
      - M) B' t2 M- y
               run=NULL;  /*运行队列头指针为空*/  . Q3 a  o( }0 q  ?5 O
      $ a# Y5 T8 e" w

    • 6 [3 I5 u* d3 h2 `7 j

      , \- L) c7 v& g         if(ready!=NULL) /*如就绪队列不空*/
        G$ a$ d2 ^0 s/ H" g0 A5 V
      ! n7 o# p$ C! ]( Y

    • % Z1 `3 y% v2 y2 R' A: S

      $ |9 Q/ X+ q7 @* ^  c! g# {         {  ! u4 w' Z1 x5 \0 h
      ; d* M4 K" {! ]# U. q% k6 Q* w
    • ; C0 K5 B/ e6 u8 _
      9 Z/ S5 S/ i2 s: E+ f9 o$ U+ f
                  firstin(); /*将就绪对列的第一个进程投入运行*/  5 D6 |( u% Y* C* n' M
      ) p2 q& V9 Y8 c: g

    • * u% m% ^: S% q7 J8 w
      $ W6 c. C; D8 t) Y/ B7 ~
               }
      : w3 ^/ g' C+ l
      " i2 a! O: [# C5 k( P- o' F

    • ' x$ P9 I, [9 j7 g/ n

      ; R1 `+ w3 g$ I# E8 v$ D0 ]      }  
      + e) h  {; p! y& z
      8 f+ r. C6 O0 t( g; D

    • % S4 X  _3 l/ t- O

      2 N2 p: K4 i+ P- {/ w7 x( {8 N      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      ) {8 |, P  M' g# J; L  S/ n& ?' {# r7 d
      8 t7 r) W. x: i0 k% G

    • % ?2 @7 v" Q- s7 g, x3 E) a, _
      % U  T, }& K3 V0 W: g4 ?( E: K
           if((ready!=NULL)&&(run->prio<ready->prio))  
        U9 z/ _/ W0 P. w

      : j9 e  Q' v& p1 w" i5 o

    • 6 R! s8 o3 C; J5 Z2 ]
      , l* e! X9 r8 e, x
           {  3 q6 X! d) c7 G

      ( |5 R4 e9 ^2 [6 R/ E4 B
    •   j6 n3 q5 B/ y" j$ A; O- m

      ) e. D, i/ \% N, M$ L# r        run->state='W';  
      / U3 D7 u# M% b
      5 v" F8 f1 L! s  ~* Q) b$ J& c
    • # a  G; P+ n' T, K0 U% K

      + y) v, U3 d5 k/ ]0 a( Q$ {$ R6 W        insert1(run);  8 {- |+ [# J0 m! W7 Q7 Z
      5 k' x- e7 I8 v/ `, p3 s2 ^

    • / {4 S9 O- c0 a, \0 [+ o
      2 T7 |# c) S% ^" {/ y2 a
              firstin(); /*将就绪队列的第一个进程投入运行*/  
      5 b7 i8 L3 q/ G8 O  M# [5 h8 t. q
      5 z* ], z0 t, M+ z1 V

    • 5 [/ q; O, _7 X$ f

      - U% }' @% V2 d( c; |" d7 Q. Q     }  
      " [. z3 Z  V' w) \
      & o* d" s; \+ A& x! c" d/ S# d

    • 2 }, C, |) T/ s7 a( `

      8 V3 \% n) l$ a7 A5 X      prt(alg); /*输出进程PCB信息*/  
      + G6 T$ n: R2 @* U. [  V) \& E& D

      , R6 f0 w: w9 K- t8 m3 l6 j0 b0 j

    • ) P: R' o" ~" x( ~6 a5 h

      8 F% e7 N! C" [' z1 [0 Y   }  
      7 G1 q4 O( G* ~( \2 O& j' Y: v
      & P3 ~1 M/ f( z/ r/ k6 E
    • " {* _+ @* L4 p  T! n
      : V: {$ g% u; D* [; e% C# Z% X
      }  3 g, n  }' f- |6 S& z8 z+ e6 F7 S+ K
      ( V/ }9 H. m7 I+ M

    • ) \& g" {* E% M9 O
      ' C6 @  b: s. }, D1 x+ R, K
      /*主函数*/  ( [4 L; t. f4 v% P1 z$ y- ?
      2 x# S3 O8 g6 h" b8 W9 }

    • : J2 q# a1 ?( m4 Q' e0 K7 I2 |
        S8 H0 D7 W$ i. k
      main()  
      : @  W: n; }( ]) G2 L

      ) V" X! ^/ v7 A* H+ P  U& `4 f
    • 8 R. P4 |' t7 M0 h5 _9 V4 t

      $ S7 t+ ?9 Z* b; u: G* ~1 E{  
      7 x# L; d' W6 ^! J! X

      2 J  b5 x6 j! V# c
    • 2 n/ v' Q* F# X6 u+ P

      8 p3 v3 G6 Y/ H! P/ \( \   char algo;  /*算法标记*/  
      8 Y6 Z0 I: R; c' k6 W7 t
      7 r; `* K* Z0 g: ~3 S  m+ [4 V1 Y

    • ' ]/ f& m" q# _: m7 A: c3 V4 {

      9 Q* r( S7 \9 \% S5 t   printf("输入P确定算法:优先数算法\n");  7 Q6 L+ a* Q8 T( o$ J6 `3 k* v
      ) Q6 V( f- {# P9 b! I6 y
    • " L) a) u8 y& X7 i$ V: W6 p

      6 _+ c2 D5 m: B% N   scanf("%c",&algo); /*输入字符确定算法*/  
      * c: C5 v0 S# R- H. m' @
      ; r* B% o; i3 F# q3 y0 N: D( [

    •   P8 [5 |- f& V8 b, a

      : ]+ [9 _  ]3 Z" c8 O& l5 A; c   printf("输入进程数:\n");  
      # u. k% f- M( @

      $ z; F# B7 W& z) a
    • ; m2 c' g4 n5 V) _- M% v. I. @

      & S+ b: r% y6 s1 h) q' \/ J( o   scanf("%d",&N); /*输入进程数*/  
      % E; P4 _( I5 k; F1 k! D
      1 N; \# v3 L  l" N; D
    • ! L: V6 n7 M" E7 _

      8 q& ?& |- O& s& n  q) R0 Z   if(algo=='P'||algo=='p')  # V& l6 x1 m" a: \2 q( m

      ( |' O& l+ x8 o. a$ j
    • ! C" U# m' @9 l

      5 Z! U$ I: y4 ^3 i8 p1 {1 ~% f7 b   {  ! U1 s2 W& k: g/ ]

      4 F/ o9 X% L; j9 Z4 e
    • 3 Q( f6 d  Z. ?: F7 m- d0 v

      9 n% V$ o; K. j, g! @      create(algo); /*优先数法*/  
      $ M0 f/ ^8 y! s# ?# ?

      1 @/ A. L" `; G" t( A- ~* X
    • ( u$ f' L2 ]# o. r

      * k' a( L5 U# i6 j3 F      priority(algo);  
      " Z5 B3 g, B9 j( z- J

      % N8 a: h* {) w  K% }
    • 2 c0 F/ K8 u! y" g, w

      5 a3 ?& {% K9 c( c   }
      6 @/ W% e. W1 J1 R3 @
      4 T/ S) L6 u/ _$ E" g& y% \" W
    • / s3 q: z& ^& B) @  z) A4 {

      2 v+ E% h- T: A4 Y# t6 w}
      * ~" ?4 c% W3 {: a
      7 h5 ?: g$ b& t# y

      1 b7 B# [& k" o

    3 L7 t$ Q! \& r$ k+ S- u6 e* \
    输出结果:
    * |9 ?3 b9 X2 c( f0 P8 h

    3 t* y* W# V& W# W! ?# R6 |0 g# w
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    0 J4 k* n; t& l% ]1 x) g8 p
    / c* N& a6 ?+ z9 X* b* H$ p
    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-9 01:40 , Processed in 0.454439 second(s), 52 queries .

    回顶部