QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3169|回复: 0
打印 上一主题 下一主题

优先级调度算法

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 15:39 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    7 d! H' ]. |% ?! B
    优先级调度算法
    0 T! b8 \7 h7 `, a: b. z

    算法介绍
    ' o. Z' v0 M: D优先调度算法的类型(用于作业调度)! F- ]3 t: N1 Q% Q% ?" y8 _! j
    1)非抢占式优先权调度算法 0 L) T1 J; S/ E3 b" G, A$ Y/ r
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 4 `. r9 p6 H# X& s; g
    2)抢占式优先权调度算法
    # p2 H( m, E, x- g9 l只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    & U$ L+ [1 X) M$ l" [7 j4 Q1)静态优先权 & v( n, H: b( t
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。5 D6 a0 g3 c4 e6 ~

    2)动态优先权 2 G% ~, o8 J4 m

    算法实现

    抢占式动态优先权:

    ; R& ]& `9 n0 A! F1 a: V. Y& c& P
    PS:本人认为非抢占式静态优先权没有实际价值。


    • 1 n+ m& n  E# }# ~3 E4 q
      , {, e8 ^9 H$ A/ A! `
      #include <stdio.h> * e! V: M1 B( x2 c
      2 B( x9 T2 w5 P0 l$ {( U
    • & c4 ?4 D) z0 o' n3 r' C

      ; L% U1 O  {+ y0 r7 l1 w#include <stdlib.h>  1 g( V  \; U; i# F' J7 ~7 o9 {0 e/ z) _
      4 t9 T$ f& N* b4 J8 J" k
    • ' _4 O' I# ^/ X! u8 i, `8 [% }

      ! N- k3 B' _4 y1 {#include <string.h>  & Y8 s$ u, C; v
      ) Q; y. s4 v- X
    • 5 q# k" o: M9 E8 v7 c
      " ~$ Y( z! w* {, y+ s+ I
      typedef struct node  
      ' s8 P0 l1 |1 g. o) h# C: l. H7 L
      ' o( s- Z* M' ~! t/ u3 o: ]

    • 7 D( ^3 M+ K6 i9 }) E$ b/ z" l
      : o( y/ r. N* N& D$ I
      {  7 W! W4 V* [/ K4 {6 c& V$ K! c

      # h  J& \. N+ E* V2 d) Q
    • , `. f7 C. N3 n0 p6 T

      ) {( [2 h) W2 K* l   char name[10];  /*进程标识符*/  
      4 f8 m, x: |9 {& [

      ! b+ q8 ?5 A% j/ H. e" a

    • 3 a& q8 J+ D3 n5 S

      9 S  o7 t/ E! ~  f. h   int prio;   /*进程优先数*/  
      ( a6 y: ]1 m8 l$ h) s+ J
      ; W6 M6 I- |6 E. t/ H
    • " e, U3 w  i' {, O3 T
      ' }8 f8 x% m& \& E: r8 V5 K8 s
         int round;  /*进程时间轮转时间片*/  3 F. b9 R/ u; D4 E. X, N

      & f: @! P( z' c. d( w  }
    • + t" g& y( ]4 J7 l, }7 U3 G

      ; u- K/ V, [. |9 e( Y- _4 S( x   int cputime; /*进程占用CPU时间*/  " s, V. p- ^% [$ H
      + C) ~8 e& F" g& L8 q5 ^. ~; d

    • % E. i0 p: o. Q. u7 ?3 r% p
        d+ ?6 h# v) u/ Y; j! F" E
         int needtime; /*进程到完成还要的时间*/  / g" s) E0 N/ D0 T3 z8 e! F6 V
        ^' G- f4 `' \1 ]3 v

    • 3 c0 @6 E9 p4 V
      + D* N0 W* X& a% _7 {
         int count;  /*计数器*/  
      ! O& H4 h- A" o3 G: w2 P
      ! A* ~2 J, `- f! O/ N

    • 6 G9 E7 }  Z  q% l6 q- |
      % n' ^+ o" y9 ^
         char state; /*进程的状态*/  8 F  q" b; {) M) x% C! K
      7 ~2 z& z5 ~1 H3 c6 e

    • 8 v% a2 a2 W! M1 z* q+ W2 f1 h

      6 c  [& G, X0 m/ [3 q& a! G   struct node *next; /*链指针*/  8 m( H* N/ ^# `  h: k1 d
      7 @; T5 s) `; s5 ]+ r* }% `) x

    • 2 ~# x$ Q5 n5 \6 D
      % s& f0 V* t4 m! ?9 J3 b, y# M  W! J
      }PCB;  0 K1 g9 X7 ~: i. \; Z0 d6 e* X
      . C* u1 C$ u- m. x
    • 4 h1 z; L0 g( h

      , e4 [* o8 ^& fPCB *finish,*ready,*tail,*run; /*队列指针*/  
      # H7 J4 P8 Y1 t" ]/ ^- o& Y. G2 s
      1 B; l5 ^- |& C+ x& a+ d" D; H
    • 5 L3 d* Y' ]4 O( a* q8 e
      0 S# I+ C! [9 G" Q" X2 \9 m
      int N; /*进程数*/  
      ( B# A# R# x* L* M
      8 |- o, i8 r1 B7 z

    • 6 I% {8 O" f0 r9 ]$ Y
      0 h9 ~2 F7 z# U( I
      /*将就绪队列中的第一个进程投入运行*/  + s! u  Z. J# G" `7 x
      % }* f4 d4 C( `) w" [  X; G3 w1 l; }
    • 4 R' }9 q" p* Q5 k' _8 S" N' E; y
      + l7 K( s6 O( S* c/ L& s
      firstin()  
      : [' g: N: p% D6 V7 m

      ' P# w( J' ^1 U2 H

    • 5 G9 [7 f- c0 A7 u2 x/ d6 @

      . |, c' B4 L1 A) ]) D) E0 I{  
      & O, e- F, g  Z' O" T
      # x  k, R3 L7 n

    • $ P: f8 l  t( z8 e$ C

      ) m$ w$ R7 T/ }+ m/ i# C   run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      0 m1 |: E# N* W& P9 B! ]- f/ o
      : g: O) A9 C) q$ k7 z5 G
    • 3 m% D# N  G/ O4 O  K2 l" F

      * g$ Y7 H* r  z6 ?5 G) f   run->state='R';   /*进程状态变为运行态*/  ) Y7 J) _; n9 n" A6 o/ y' K
      ! c* s/ e# a+ R2 t' r1 N. d
    • 7 q' p3 B/ Y6 s: J1 K. r
      % l* |$ o9 }, a
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      # A8 G& ^9 U5 @: h# M" [) [

      * s7 k7 D1 m# w1 \# d% u7 A' [7 Q
    • 3 O& T& K. O# i+ t) z

      4 J% e9 z5 J, Z8 I) W! F}  
      5 v7 ^" p% g, ]+ {: }; S0 d

      2 |, U, L9 B4 q1 X5 }5 A% P" G. z
    • 5 p' D0 c! W+ e: j! y
      - p1 q3 z$ B0 \
      /*标题输出函数*/  
      0 T+ C- m% O( o5 l- D6 K
      ( J3 \. |' }% y" K
    • 9 a" q7 `- B" x: ~: v5 c$ R

      & I7 [9 \8 K+ z% mvoid prt1(char a)  4 Y+ p( ^% V5 _9 l# I

      9 Q2 j" o( L6 C$ G* }4 Y6 R3 O, n/ ~. V

    • ) ~9 i7 T) ^8 T! _8 s
      ' P8 u+ v/ O; [9 t
      {  
        s7 v8 v+ E; F  F- B' H1 Q

      , l3 t) x4 K. f3 o

    • * n& `8 w+ f4 o1 _

      5 v8 j7 D2 E& w3 u4 o   if(toupper(a)=='P') /*优先数法*/  
      " [' c* T+ j" ?, O, U' Y2 u6 i1 a

      , e) {2 h4 H# f$ Y* j: v

    • ' _5 Z2 b( E; |  R6 ?$ g
      ) q7 _8 |  |& \9 ]& Y
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      * M' h% l7 t4 `% I9 Y  i; l7 j

      + Q# C  g1 Z( g. R, f' X( y! j

    • ! k" d3 U  k! _& B( h0 U7 x* Q

      $ x' J) T* D# Y   else  
      5 q' ~/ E" z- T! H
      8 b& t/ F  ~: [, F

    • + Z- F* O+ t9 s" \6 ~$ Y

      5 c! f- s( j6 J# D9 \3 w$ y! g      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  . L5 l9 S& {+ C6 \" y
      ! ^/ H8 ~" `# E2 ]2 V
    • & K9 p& h6 T- e0 f

      3 m% m  |, a( f0 p" R& a6 C% A}  1 }, n3 P7 ^! Z

      / ^, a3 @* W( t" t4 S0 p* B
    • % m) D9 I) C9 @- j8 c& o
      0 H* t; h, y9 u5 `# M. w+ T
      /*进程PCB输出*/  
      ' _* ]2 H) ?) M$ V, d
      ' Z; `! Z7 Y$ E9 t

    • 9 K1 D9 g; u" H  P2 b8 k  f. r

      - h( ]4 M, m7 f- f1 K- X, `3 xvoid prt2(char a,PCB *q)  
      3 T! _) r& ]7 G

      9 q$ Y7 E/ W! J/ r' S5 Y
    • ! {9 E0 ^9 W; X% y

      5 K& p% I9 z2 o0 K- `- K0 f{  * B+ q" Z" ^. D. _0 f/ \, B

      9 J5 }$ z- f7 K( D' X, X1 j
    • - i( t+ }: M' ^7 X/ ]' K4 S2 g- f

      : w% O7 L5 H6 n2 |/ S# T   if(toupper(a)=='P')  /*优先数法的输出*/  + }4 S  [0 a/ r
      9 p& q9 F8 ]1 C9 q4 g
    • ' q. q/ d% C6 e+ j

      # Q+ U/ ~8 H6 Q      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      6 x2 x7 Y, K# a  Q& r) N5 e! ~7 B! R/ ~

      1 f( |3 ~7 E- C6 ~' f. _% t

    • ! L- d# u3 A0 G8 F/ G6 J+ {( B- i
      + L- f% S7 I+ |/ L
             q->cputime,q->needtime,q->prio,q->state);  & ]  p& j& d' m* J2 Z+ {6 I' u

      ' a0 l7 }6 y3 P9 X  A1 ]8 J
    • ; z' o8 U, F! @$ b) ^# k8 D( Y. k
      ) W/ O$ A8 @; |3 }' y& B
         else/*轮转法的输出*/  ! c2 l+ ~0 J$ Q

      9 H8 T  y8 p2 c$ c6 Q

    • 9 W: ]; |4 M5 D* J- m

      * E+ l4 p7 W$ K1 T* E! I, h& l1 [      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      & n. D! {. z) d1 j0 l6 m6 r

      9 X* ^" W- G$ ~% W& A

    • & w2 L7 C* e: S; P

      2 f( H& L8 |  d1 g' t       q->cputime,q->needtime,q->count,q->round,q->state);  9 j# R7 r. L5 x! T9 o
      1 `; i1 `1 w  i, K
    • 9 D$ e* _, p; Y2 A+ v/ \% s: `) b

      # D" x7 W$ K5 k( E- f5 p}  % ?- g1 T( u" f) a
      $ v+ Q: S" c. Z
    • 9 O# M. E4 M+ e8 t+ j# z  l
      ! D8 M# g: ^, t) _9 X* U0 b* _
      /*输出函数*/  7 r5 [; A9 `' q' W2 ]# E8 Q

      + @" g1 N" `* w* \3 a
    • : ~* [; ^4 A3 u3 R1 }% I
      % F1 K5 |2 M6 a
      void prt(char algo)  : ]7 U3 M" n# Q- Z9 |1 N) O: j

      ' e" P, A" }4 |5 Y

    • . N, F# p% j  P% i" A% j( K) l
      + t' M" L0 B7 z& y* c
      {  7 e( b9 v3 g- J

      + q5 v  w6 `7 q2 {

    • ) `0 n* s; G% I. K* r
      1 ~6 m* ?0 J  Q( k
         PCB *p;  ' A( B$ A: l) P4 T9 N$ k

      8 \2 p/ j* v# C7 P6 x$ X# k, y+ s

    • ; z0 P# ]  n; C3 I8 {. B! f

      ; w' w, q! `- ~   prt1(algo);  /*输出标题*/  % `( [) J7 H0 @# w
      . [1 c. h. c2 P+ T! x

    • 1 D3 C" [* U2 B9 U& f& L

      2 K8 q$ \' D% ]7 J) \6 o   if(run!=NULL) /*如果运行指针不空*/  
      " d$ S7 u) c! t
      - m1 p% Z( I& [4 j

    • ; a3 a+ h7 A( R2 N( z, p
      $ ~; I) `9 l2 L9 K
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      / S) R" d' U/ T, D# H4 c

      * \4 Z# h8 ]1 U
    • # }* R1 K% E% I+ c* B! D
        e, ^0 D) a+ h4 R8 k3 y
         p=ready;  /*输出就绪队列PCB*/  
      2 \) V" _* v  X1 o) H
      8 E, [" g* Q7 C9 C2 N8 w. _

    • : `/ R1 _' B# P/ L! w+ o1 l  O
      9 }0 G1 B$ p  A1 ~) l
         while(p!=NULL)  
      8 w: h8 ~( N, v3 l2 \% L
      1 I" ~5 {8 |, P+ |

    • 0 E8 c1 J8 C/ d+ t- y/ G* n

      3 Z4 _( m) X+ A$ D   {  
      ) h0 b3 o" a; F. w

      2 Q" ^8 J! N0 B$ P
    • 6 H' ?, G$ ^+ s6 f7 `

      4 |$ N5 {1 f4 N# u) q- C0 s      prt2(algo,p);  6 M! b: R+ L: S+ C+ g

      3 T2 C' r/ X- d5 d0 N! _
    • , S" p: \  M7 H# d
      2 A* M. _; Y8 u, y5 h9 W) p# p
            p=p->next;  , Y9 r% X# A, h; R% ^9 x
      . N0 F1 x" A0 ^

    • * O; ~" c# @$ [7 l  x! y
      , M$ P1 h; |  ]0 O: J0 I2 O% G  O( C6 y
         }  
      0 K6 s7 j$ X% |' {+ A) U
      - g7 J8 _3 j6 J% I3 u  S
    • 8 t4 q" H, S3 p; w6 W# z% x

      ' s$ g0 W9 }: N1 ~( r0 r   p=finish;  /*输出完成队列的PCB*/  
      : |3 ?; G0 E3 b  B* M
      ' a/ ?) _2 M6 Y5 B% _& z
    • ( v$ h  v: p8 u9 f

      . B1 v1 z( M) ?   while(p!=NULL)  ! g9 W- a& E) ^/ Y; Q7 F7 ?- ?0 F

      9 ~* N  }  B5 y$ S- a4 {

    • " J* h3 R# A9 l% o7 ]3 H
      ! R% W0 Z4 W! F) I/ b/ `8 t7 F
         {  7 i" p( r- M8 j5 O0 E' s
      % \" j! D& j! n5 o* p
    • . `) t! X* Y) R" N+ p

      ) g! T/ o; I2 O      prt2(algo,p);  ' ^: p3 k7 C! `$ C6 M5 f
      3 U  h' `2 z( _* K
    • : X! P- i1 ~3 n2 M$ I9 k

      * R( M& A0 s  M. v5 Z( w- D" q      p=p->next;  
      9 @! g; \6 g, x- U# ], y' h7 u, M

      3 ^0 f  o; l/ P9 T" R& z$ O# L3 G
    • / b" Q5 r( e+ J% F2 v
      9 d* h9 H' o% M( o9 w
         }  
      % n$ a2 l" W  C* S  ?' F3 u% E3 F
      : j; _' E' I' M7 l8 l1 F, \6 k

    • * V* s; Z5 |* R* [1 w8 ?0 W

      2 t$ f0 C9 g8 }, ~" |0 G$ w/ ?   getchar();  /*压任意键继续*/  
      3 j+ U- Z* o5 F, l+ b6 a* L
        t  q# T) ~; g, N# o  I4 C
    • 0 G) Q, E/ c( S
      2 q# T% L5 t( _. @- G- \6 I
      }  
      4 B, N* P5 D3 d& `& C' C
      8 M2 M" i/ A8 Y- D

    • 9 p% Y9 ?! H7 S* K1 Q
      . e! q& l' O5 E' y0 @
      /*优先数的插入算法*/  9 G; A5 i) R5 p, c

      . `1 l6 S4 g% P* O# |
    • 9 }& V" k8 U( N5 o- m: f8 P, a% H
      : u7 T4 ]& H  y0 P& N* F
      insert1(PCB *q)  & h; Y" c) L2 s% R6 y9 K

      - _7 p( r" \; _/ j: K3 l+ l
    • 8 i/ }7 \% m7 N- D0 o7 b

      # t/ O) I4 K# }; j- ^" ?{  
      . c7 j# L$ x% B7 A) K1 A
      / U" V  o" E( _9 h6 t

    • 2 e2 U. u5 l: I7 q7 @( @

      # q9 X4 P( h0 J7 e% g   PCB *p1,*s,*r;  , X; _( R3 t" x" L

      * t5 O+ E' Y$ |( @* @( _* Z

    • 5 a8 A9 a- h" R2 r8 O! b! m7 V" [0 k
      6 w$ ~, u  X- c4 {4 D9 X* Q
         int b;  : a" s3 l: I7 {# j

      4 ]8 v5 A  I; c) F: J! Q
    • 5 I+ t, o( N( Z6 ]& R- t& i8 @/ `
      4 Y- `) ?7 H* n* k/ @& @1 a" f
         s=q;  /*待插入的PCB指针*/  
      " P! R9 }- C( A  n: [

      4 x0 B# W. H6 i. L
    • " u! L2 B: T! K! H7 q% ?

      5 A0 F2 T; p9 c, X! W   p1=ready; /*就绪队列头指针*/  1 X; S& p0 P* `6 H( Y
      : L$ U% L: h% R. ?

    • , z! s) v( m" E  F0 l+ P7 Q. p+ d! ~' y+ A
      ) O* N$ o8 D4 b2 P" m9 e! f
         r=p1; /*r做p1的前驱指针*/  ( s5 q4 V/ j- z  S# q

        [+ N; G& [+ U: J3 U

    •   P2 q4 o9 W! M6 n* u. Z

      / S! G6 K" I  R. I! P4 N5 s4 L   b=1;  
      1 U3 f% Z& q5 n! A

      9 L7 Q* y$ v8 |4 e

    • . f( }- b) Q; @& o" N6 H. }. Q
      * T1 o" A: r7 e' ]& v( N
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      - q2 W* y% Z5 _. H8 o4 c8 A

      ! ]. V: [! [7 o0 Z. g* I
    • 3 @+ R3 X8 _6 t; H' a* \5 |
      ) _/ B+ A; R: C" D
            if(p1->prio>=s->prio)  
      . Z' f4 Y8 z! j' ^9 R5 |
      - {! a0 ?/ v! @+ Z! y

    • + T2 x. c6 E& u' X5 f( O1 O: {7 S

      ' d+ `3 @% e2 a/ x* I: _5 A      {  
      ' s- Z* i* V' z5 N
      $ o; M& ?$ u, S9 u

    • 1 Q: e4 l& Y+ S5 r- y: o# _$ P
      9 \+ B3 k3 W  v
           r=p1;  
      , D0 Y; v. _1 \5 S6 B* _9 X7 x

        B& [) }. a" U, D  [- ~/ g1 ~

    • % b" T, @( Q: m9 S! o7 q
        G/ `9 p) X2 u; e" _
           p1=p1->next;  6 A% R/ a& y$ X
      ) \( f6 U& p0 C  R1 j

    • ! Q% b% Z) T# J8 f
      . q# w" a' w1 h& s9 Q3 K3 q1 C
            }  
      % s# p; I2 S- t3 x+ C' U- C

      / c- C) V* Y! j0 q+ a
    • : d. x5 U- m# L! i4 y
      * L/ {0 J0 H) o9 h; b2 c
            else  $ @. m" a% @2 Y4 q

      9 {! j1 q1 V9 t, L5 @# f7 V8 S
    • * G+ y! H1 e* O5 N- u) x7 A

      ' \- ?4 m% P, E5 D) L# u  Y     b=0;  
      ( T& C9 [. R% V4 }$ N6 B- f
      $ W4 g# C$ h. y

    • ! T% w. h) g* B! F$ G9 O  L6 q- p
      7 z' w1 b, E# K
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  5 o( i0 Q- Q5 ^% E- w' M
      1 ?/ ^4 S. e4 C

    • 0 g0 r8 W& Q6 n, p* O. R: d. v

      4 a/ B% T* N* i   {  
      ( W8 j* S: E+ q1 c' h- S% A
      . a8 V" S$ Z0 g1 c1 y1 k

    • 6 N% z3 D* I4 l# s$ R8 q4 l
      7 P% ?7 i. b/ Z  `4 S
            r->next=s;  / C, p$ F' |4 g" }
      0 k5 G1 X; W& R( A: }4 X! i

    • ; a0 x. m) z# G% V; h

      9 m6 E1 u" h* i  K, ^+ `( W      s->next=p1;  
      , E. U; X' i: l4 g$ O
      $ o. d: ]* q: q5 s7 U1 {8 s

    • ' ~$ A; ]: t7 E0 _) q

      ! P8 _4 f) i5 A; h- A   }  
      - S0 L3 F3 s! ~& K. z$ C2 k

      + O3 [5 I, ]% V. d

    • ( j2 A$ R' n# o3 {
      1 d3 U% K) @+ r" A
         else  
      5 e- g3 i. s( [% @+ X

        V2 A8 @$ }2 X  j# c
    • % L0 I  O; ]4 Q6 [* W

      & u' i8 x3 p5 b$ ]/ l   {  3 a- Z' V, u6 k  \+ N- w
      ! T* ]5 w6 f  m: `- u
    • * j- |' J0 T9 A6 L2 R, o! A, L# A' D

      . R% G, y/ @# b( ^- K% z; X      s->next=p1;  /*否则插入在就绪队列的头*/  ' R8 L/ ]# I' L3 |( r

      . }+ r: F6 M; h% O, Z4 N
    • ! _  B4 |) h% R

      + }0 d9 E' d8 C- m" q  ~) O      ready=s;  ) Z" j2 v+ i0 x" s2 z/ z

      0 y" _2 F+ [+ ]- P* k
    • . J  l" _7 A+ [2 w' @0 i! W
      3 P7 Q/ @8 |: i0 Z* a
         }  * `  _# a( L3 O; `

      # q3 t& O0 C# R# A( S
    • * w  w: t1 g& e9 J9 x

      ) F. r3 b0 \0 E( q; [0 y}  , \- G' L# N8 E

      / H% M8 O/ m) W% t- w

    • 7 S) ], N5 G/ I; N/ S! B) L
      % q5 u+ T% c$ N* e7 m3 Z  K- ?- i4 U
      /*优先数创建初始PCB信息*/  3 H; a+ h5 \& m7 ~

      6 }; z: r: @, A/ f- q7 o1 v: Y
    • : T+ ]0 d: E/ G7 V$ |
      + @8 [; Q4 m0 y3 X4 ~& i
      void create(char alg)  
      - O0 ]' _) _4 J& K
      8 s; W7 N" I9 e5 X
    • ; \% D0 L: `8 c

      " K5 U; C5 F* i0 a3 [{  - G' p' h) h' o  P

      # @* j, ?8 H# G- [2 q9 \1 N

    • 3 M# A0 c! d+ O. x1 a

      $ B- s: L0 v$ c( i  N9 `   PCB *p;  * l) b; l& ^& S" V& g5 B
      ( x! x& W. B; ^% f3 P

    • : O1 d3 `7 f0 j% v) ~6 m

      3 {- o8 f- D% M7 i8 D0 q8 V   int i,time;  
      & H& o" e, [' c, d# r! T

      ; j. ^* _8 r* s

    • : {( l. q# x+ v/ U3 |/ r
      $ Z7 z3 u1 S% c6 X4 r
         char na[10];  
      : e9 Z% n, @/ `" J+ j, L- ?' M' C

      1 M; h/ q: a, ^8 V5 p( T, u5 m

    • + Y3 G# B  _5 o4 U! Z) P1 C7 a4 R

      : N% `! D- ]+ Z. H9 v  D9 A% S$ I   ready=NULL; /*就绪队列头指针*/  ) Z6 M, d* w' c" Z4 ]
      8 i$ l+ L  P/ x% K1 y' W3 y- u/ T
    • ) ~* H' ?$ x4 f- \- M
      % ~9 O: h0 n2 a! B
         finish=NULL;  /*完成队列头指针*/  , R: g, d1 J* ?0 v
      & `+ c& q9 E' f5 J8 Y4 s

    • 1 m" q, l+ Y( ]+ w7 I; A6 v

      9 J' x' i0 i! ^$ g6 Z: ]5 C   run=NULL; /*运行队列指针*/  
      ; U3 r- s& ~) ^: g8 y) Y+ B
      1 w6 X+ m: _  [& f9 d7 o+ M

    • 8 m, U* L8 Y* h* `* X& `

      7 R3 g: V6 G2 y2 W; q2 z& z( H$ X   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  2 |" w/ A6 n" d( L
      3 Y' O& S& R1 K1 E8 P
    • 9 f% ^. w: y+ I
      * A1 |; m2 Q+ _6 v
         for(i=1;i<=N;i++)  # g, N( d8 X  U7 y5 {4 a4 q9 O8 K

      : ~& @% N+ F* k# t5 N
    • $ J+ X# n# ?# T5 e4 @

      - F9 v0 R  `1 R2 J8 o+ c# v& F   {  
      7 V( f# B4 w7 T& f& P: Z. d+ j# q- b% S

      % O4 r- S8 q+ z8 ]3 S# D; I! {* D

    • : t- Z. P9 [- B/ h7 x

      0 _5 @$ f: @) |  K0 V3 x7 S' ~) \      p=(PCB *)malloc(sizeof(PCB));  
      : b, w3 J' G7 Y5 P  |: ^' w
      5 N' z1 T- q. A
    • * t" n9 u2 u& V8 f7 y' }
      " o" h6 o, S) j1 R, P* Z1 S
            scanf("%s",na);  
      ) s' x+ K3 X, k
      9 W( S1 w5 |( T4 c

    •   q3 R9 U/ N: Y1 ]& J1 ^  S% `
      7 O9 y1 u" R# A( x+ ]
            scanf("%d",&time);  
      7 T. P! ~' u% V7 Q' u$ g, y$ H: _

      - G1 }+ `$ p* i

    • 4 I8 |6 j+ G  N$ `  }* E

      ' H& D" j: o' D- {; i! @      strcpy(p->name,na);  $ \& B4 u* ^; y# {% u
      6 N: q9 c( B+ h2 K
    • ) O( D8 ?) N+ e

      7 T+ r3 E: b6 B  Z      p->cputime=0;  
      % t+ b4 d# B9 Z+ f9 z

      ' k) i2 l% [) s6 M

    • 1 P) j6 W7 x' \" z
      0 D/ ?) u, l: M) z
            p->needtime=time;  
      1 E* z* S8 l% W

      9 k8 J0 ]- J3 N! i& Z8 L- U5 K
    • ! x$ i/ F8 c. o. _) q
      $ W3 L! F! G2 G4 b: e6 y
            p->state='w';  
      6 `3 [9 g5 d5 l' z* D
      * z" }: |5 i8 L. `
    • & D7 r7 Z9 \& x6 H
      ! }( ~' U, L% X1 n( j* N0 s. B, x
            p->prio=50-time;  
      ) {$ `: d' n* D, ~
      ! t3 v* l6 R( d2 k- `* O

    • + m* x4 r5 v( B- E
      6 w+ z) d, ]" y6 s" {/ {: D5 M
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  ; O8 L& f* Q( m4 [6 A  r; c

      ) W4 s# j; D  X( l  P: ?% M

    • " }, B- ~8 D: ~- o
      ) P  L% \5 A: n  ^9 q
           insert1(p);  
      % V' l( e( X9 A8 t& G
      4 T" c- V# F' |# |7 u
    • ; s! N7 J6 ]3 b+ A3 z4 g8 z

      " W' L+ V( B6 X5 W      else  / s1 t8 k& o& a& ^- `5 S

      1 V; H% a, ]( b3 U7 _& n6 @
    • 8 o! o0 o+ E% Z+ a
      $ P, I0 z+ t- m
            {  
      0 F) g* X+ e: E" n% K3 w% X" ?) ?
      $ ~( K" z# |$ f
    • : W8 R9 w9 t: O1 K  ?$ K

      / H* l; P- D  T+ A3 L     p->next=ready; /*创建就绪队列的第一个PCB*/  
      ( f9 V1 {# Y' l
      9 C  J5 S/ x9 G7 e: r9 \

    • 2 P% r& _# U& R7 Q; z
      3 F( Z8 P& C; _
           ready=p;  . }( ^6 S7 e4 z; u, B

      # }! v& M2 Q: }$ E3 l

    • ' p3 e" N# i+ M  {

      2 ?7 Z: J: ~4 }1 e5 o( a      }  4 M8 u' Q- i5 r1 }: \. e& d: _- l, ^

      . v. }3 w4 d" \7 i1 }5 `1 M/ Y
    • 2 o0 j$ E. G, e4 W. a+ q+ {
      1 {. F$ _# c; X8 L3 a4 C) Z9 O8 a; I
         }  
        m# O' |/ O1 V8 z  h: n
      ! W6 U8 @; t) R/ l- W

    • 7 p- V- }" d% v3 z+ x
      1 k: R" D$ ^4 D% o2 D
         printf("          优先数算法输出信息:\n");  
      * J  d. `! e9 b& Q2 t" G; v
      ; v/ G9 h3 S5 }
    • 1 Q7 K9 i+ y1 {/ a
      0 R4 P+ p4 w; A
         printf("************************************************\n");  
      / ?) f1 q: x2 n5 u  B/ \! C, a) R
      5 `- }1 G* f4 y; ^9 ]5 X; u
    • 9 E2 P/ z9 d, A: x  C: u1 G
        @- u) u. n$ g+ s
         prt(alg);  /*输出进程PCB信息*/  
      2 w0 ]- }) j7 v2 T7 F3 H
      ; d+ X) r$ e6 z8 D% H; `" [
    • . X2 {7 n, g: E* i

      8 g- S# W4 O/ q& i$ o) \2 i0 I8 ?   run=ready; /*将就绪队列的第一个进程投入运行*/  
        Q$ v9 \' c5 k/ S& F7 Q1 b+ d1 E
      ) f# N* V8 r" Y
    • & ?, F0 p4 W3 F) n" ~3 E
      " Z- d3 ~! \$ U7 l" g. H: N' S
         ready=ready->next;  $ ~$ k/ C8 e4 H8 R3 Z

      * @: b  J. d& d6 T3 x

    • 8 O" n: c: y+ E) W
      8 H3 V! E& Y; B% n% `
         run->state='R';  
      : K4 m  j1 V  u

      + o1 ?* N/ j  m8 m2 o( {  E8 [
    • 1 p! m9 V: M3 B+ P' }2 [

      % o: D1 r+ U( l* k$ H}  
      2 \" \# ^  k$ ^3 p2 r6 ^+ {
      3 ~# s" w3 e% q0 Z- c

    • 5 K8 h; l- ]% z/ I9 T2 v

      : Q0 P, M4 k# g; h; @# G/*优先数调度算法*/  
      7 h0 Z! j7 o! O( }) E% e; K9 R" \9 s

      7 I. o) j/ V+ ~: o

    • & M3 y! X8 G0 g# {) ~

      1 q- T: E3 B/ W9 ~priority(char alg)  
      . v' Z/ S: P& e- w! _( I$ I+ \3 X( Q

      ! d1 x+ w; L8 s: H2 ]8 I* o" b

    • $ _! I! ^" g( [7 V% U, a$ c
      8 C" t8 ]+ f# G: ^" q3 ]
      {  - F* E& x* F6 V# K! n

      % ^  _+ H$ u, @% A+ O0 |

    • # o4 f) O1 [4 l' _+ P6 n
      $ ^$ V) ?8 q1 t) ~
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  # e$ g% p! j  E& Y1 R9 R
      6 @' M9 w! w9 s# f/ d  u+ e7 v) A

    • 3 K# E# s0 H- X/ i1 A
      ; ~! p$ S- p$ x6 E  L- A
         {  
      & {8 }, B: y2 \# f2 E5 E  W, D

      ' n3 c/ S5 _7 U& u* m! T
    • # X6 T6 O3 V/ |% I

      0 t1 {* [9 c1 V# M$ ~7 m      run->cputime=run->cputime+1;  
      - |- C5 T4 G/ f. w0 q+ t' }
      ) w( ~6 P2 R0 B2 C

    • * I$ g, g- L) X! A
      + z' @% c3 |4 }9 ?8 }3 ?
            run->needtime=run->needtime-1;  
      5 @8 H# E4 T$ _9 y! H9 i. F

      " l8 R+ p" n( o  |
    • " L5 s+ e' s+ }! A& h
      1 x' P% \; Y- V2 r9 v7 h! z; S! Z
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  # z0 Z5 y; U2 G5 m. e' N/ t0 G
      / j* ?6 k- A  `# F
    • 2 e3 c8 A& p8 m9 W9 w! @% |% W

      : q. O# F4 g' }5 r" }      PCB *p;
      . {) w5 S8 P0 s

      5 B5 g+ K3 N6 N/ {
    • 4 M2 A) F1 z5 j# p/ r8 Q

      ; A2 g4 o$ @0 r4 u8 N- e0 i4 N- j      p=ready;
      + P' t& Q; d# _& Y

        P9 U4 `! C4 Y! [1 ]2 M9 w1 {$ X8 y1 i
    •   V# M- y, I2 |0 i$ B

        J2 R7 B& j2 S4 ]      while(p!=NULL)  
      $ c7 }1 m4 T+ L+ w- Q5 _
      1 S: X8 t' e1 m, S* @( t
    • 6 i% k! [  i% u5 ?2 ]
      4 t1 v* N1 V4 E" X/ ~& W6 W( C8 T9 {
            {  
      % ^5 U; m8 ?; c* \7 \) _+ o

      . a" Y8 `0 T6 R% g7 {8 j1 m+ X+ |% X

    • * _9 O1 O% w5 F7 O* W% Z1 [

      8 J& D& J& A% j3 X9 k  v- N          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      ! K* K6 y* @# v: Z$ e
      * F) j8 m2 C! V. z" V8 R
    • $ D$ ^$ i$ u5 _, }
      - J+ ?" b% X+ m; S
                p=p->next;  
      : g: y* G8 S# M% {& |' g3 t
      8 S& Z- F0 X) U2 m1 I

    • + `6 @% s& n& k8 V1 O3 N

      " a* [0 n: f3 f      }  
      , g9 z. F) e3 f: W, ^" \
      " W5 u& o0 m# r  l* ~/ w

    • ; ^! O3 g6 K2 c# u

      # A# e# h) ~5 [! v; W( t4 f      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  . \7 R) q& a/ K
      / T1 B; l$ l( d, _: Z0 e% x
    • & E$ B) V1 G3 R. V5 t( B) {
      1 M  z: B2 |  \4 O3 `, e1 z
            {  , f, C' S* C5 ^9 y3 T8 p. i. q
      ; ?2 c1 ], W& N6 ^4 L+ U6 q
    • , i; [) s9 y7 q$ M2 c, B4 `1 Z6 Y

      ; j( r3 c8 \: }% D         run->next=finish;  
      % x6 A( }6 `* v7 Z/ R( X
      ! _, p; w0 Y# t/ `1 e
    • 2 z8 U8 z7 r1 H& @) \# ~8 Z7 g

      ( F4 l+ L0 u& ?$ U1 Y         finish=run;  1 Q  ^/ ?9 y$ R/ S0 T  H
      8 P) h. q; w0 ^2 P6 t
    • # W4 k0 E1 o7 \$ B1 q- T  O% ]
      4 G. P- R  o! Z
               run->state='F';  /*置状态为完成态*/  ' M# A6 c- p7 v( [$ R0 ^
      : z) H+ Q/ Z8 ?% ^5 s
    • 5 N: Y/ d: }% L. G  {2 [% A" ]0 J7 {

      # F! B0 a7 f' B; g4 O         run=NULL;  /*运行队列头指针为空*/  ; \9 @8 w( m( }1 t
      ! j! a- `0 a7 t4 Q
    • , Y8 g8 K* U5 }2 D: ]

      ( X# D& o0 N) _" q: A8 ^" w         if(ready!=NULL) /*如就绪队列不空*/
      + S! L! p& G& r: k1 C6 D

        t( j8 O: g/ Y, ^0 q) t7 A4 Y; }
    • . h( ^& @4 r9 ~+ H: c
      + s) s6 f2 \  m. L  v
               {  
      # p" @5 `7 L6 Y

      * Q, z8 L, s1 G# t6 |7 s
    • 2 R  e; C/ G, }9 u! r

      8 z0 C! v" z$ k8 g0 a0 ^/ W            firstin(); /*将就绪对列的第一个进程投入运行*/  
      1 R* u! w3 E% ~+ c( m9 _3 l  k; _& ]
      5 p/ o$ x- q1 Z
    • 0 z2 e9 r: R0 f

      ! R' D4 t: D5 D$ x8 N; \" J         }
      5 R5 E  w' e1 V" N' p

      " H* q6 G, \; r$ ]! k" ~% T
    • ' K# S& p6 ~/ `0 \: Y3 i

      2 o6 ]5 w! X5 _0 N      }  
      , B! z# D0 K2 u7 T" K5 d$ K
      , e! Z' \! R5 }( C' n& a3 [1 N9 z

    • 0 N) V& |3 y: _4 o4 ?3 r" Y
      7 L: F( j9 ]6 C! ?7 U  l6 ~8 ~
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  - r; J2 e0 ], t- Q9 P

      - v0 V: i' P# T" f9 W1 y
    • % q" U# b6 Q, Q9 r9 |$ ]
      . q: ?, d0 x2 b; \: \0 N3 \4 J  n) i3 O
           if((ready!=NULL)&&(run->prio<ready->prio))  
      ( \  R& D1 u, k+ z: }7 S7 v& X& @

      # ]5 I: R1 S7 T" l
    • $ C- S% @7 Z5 L* Y* b

      $ s+ {% E7 o/ `' O- a! x& i: o* E     {  , S" ]2 V6 t& ?/ ~6 n. e
      * x% ^- |5 j' F$ w% K* Y7 A  ]* u
    • & ~% N' ?- _7 ^- Z/ l# B/ j
      ) p( M8 o: J* z. F1 a& |3 c
              run->state='W';  
      " R% P$ o# M- {6 i& N& y
      9 L) n6 E# F" A# I  }8 J& I$ F5 k0 k
    • 6 q1 E# f& P; i4 y$ L! b
      6 E* y3 A0 H6 F. u1 Z
              insert1(run);  
      : Y' T- W4 p$ H+ }8 q  T

      8 ^& Y$ j- H+ n2 q
    • ) w8 q/ G/ g" i4 F' |* R
      ( G) h1 y6 Y8 m4 a9 G  S
              firstin(); /*将就绪队列的第一个进程投入运行*/  
      4 E4 F  v! _7 Y

      0 k3 v" u" t. m* V9 c1 U! t4 g6 L

    • + }! `4 B( s% a  i5 v

      # s" c/ ~% R1 f' t" Z- ?, H     }  ! z" Z) j" ^4 W7 i0 B
      $ \3 M* J% P$ f) M3 G
    • ' |/ _% H' B7 [6 x  v! \

      1 M" T1 ~  c: o. v, C      prt(alg); /*输出进程PCB信息*/  7 _( |. F" l5 x8 P7 O6 {# u

      2 j$ f! W6 g; C, V7 g) z

    • - J0 }2 k1 C; F6 `
      ; ^& B0 @; ]+ x3 h- ^
         }  
        Q  U' n* P1 O. O

      5 h0 w% |7 N* p) g% x8 b

    • 8 |. K$ r5 H+ i' |

      ( o/ P8 K  n3 y; G5 Y) j}  # P; E2 D% G6 R& P" ]- Q% {: a! O

      ; L: p1 J/ G0 F: A5 I2 D4 U
    • * N5 ?- x) q2 H0 _2 L

      % p9 G# y+ d' w  h" W5 `! V; @, j/*主函数*/  
        B- a! M3 a, m
      - i! [6 I( y7 u  U* B3 n6 H( x

    • ; Z7 ]. o2 S1 y% W4 c, C6 A

      4 k9 x1 }' F: f9 x/ ~main()  9 |* t5 n4 N1 s2 w" z

      ' `( p8 k$ T" H/ I# m
    • * H2 X5 K) j# ~: U( A
      9 v% H) g/ |8 R8 a
      {  
      9 V; Q9 F' I9 g

        ^/ z  ~$ F- e, @% X

    • / |( C& m, l# ^1 W+ L5 U
      . O8 T9 k& J, Z/ @
         char algo;  /*算法标记*/  
      - [2 E7 R7 O+ u0 c3 A

      3 R  N$ t. E4 [& t

    • " A* @3 y. F- J

      ( p3 u) }) [5 Y0 R  U% X   printf("输入P确定算法:优先数算法\n");  - N6 {) d) t, Z( A3 k0 G- j
      1 H9 N0 e) Z6 ^

    • & C" ~8 a3 S. `
      " l( x& r. I0 g( _* B9 ~, @7 c; n
         scanf("%c",&algo); /*输入字符确定算法*/  
      8 G& V, J5 }1 a

      6 u  N# g8 W6 O. a8 `7 V

    • 6 |: e  S0 `0 C# {! P; l7 G3 _
      " d- r1 e* @4 h3 m
         printf("输入进程数:\n");  3 S1 v1 f( w! \5 N# Z
      + T$ P- ~0 s; n% t7 c7 c, M

    • 7 x) X1 V8 O9 b) i) z0 s' M$ }* Z  `  W

        X% I3 z0 U0 `, m7 m   scanf("%d",&N); /*输入进程数*/  0 i- C) S2 b. b( I3 D
      * E# P# [6 P9 V  ~
    • 8 I$ C9 `# T$ L9 O1 r
      4 b( v6 f; t) p% R* M, d4 f
         if(algo=='P'||algo=='p')  
      / i2 |0 K4 [' M

      - D; e8 Z7 a, X2 y& _% ^$ f

    • ( V7 t) M: B- V
      ) b; g5 O: w8 }1 r
         {  ' f8 D9 u$ A! J3 Q, I
      0 K- J& K* k# Q9 ]
    • 1 a1 V. t% _4 g/ l
      + g( P1 R& n+ e; c
            create(algo); /*优先数法*/  ' ?" ~; u& L2 ^9 Z7 {

      & o' B5 Y  t7 f) `" g& q
    • 6 f; Y  F$ m+ y& A; ?" i$ P
      0 e0 c/ j2 E1 x& b
            priority(algo);  % U4 C2 \- }$ u9 I
      1 g5 k0 R' p9 q  _6 Y5 V. R

    • ; y3 u% N; m0 ~2 w; A% f
      0 d* B( u2 T1 W/ O" {8 [% e$ ~
         }
      4 x4 w8 I2 c0 l2 {! `* A' F

      0 v. e2 V8 ?9 q- l% [0 j
    • 7 C# H! W9 W5 E# _$ ^) K( Y2 v; E

      % v5 ^' C2 \6 r4 R) c" G! }}7 K4 M# S, ~9 b4 S9 \% A* C0 W9 Q

      " _& K8 X* N+ z+ Z/ V' Q
      " ~9 G# _6 G$ J) n  b


    ) u' z( q, B8 G输出结果:, ^0 e& w! F7 q/ q* C8 g

    % G: {% H) }8 o1 I1 K
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    ! M; m/ {5 F, r* s/ Q8 e( ^5 o4 c' o; H# p6 e# Q& Z
    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 14:29 , Processed in 0.653651 second(s), 50 queries .

    回顶部