QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3157|回复: 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
    # w" V9 F+ a9 B2 i' O
    优先级调度算法% B$ g; e# s5 s- {- d* P

    算法介绍
    # R( i3 s% E* R0 G优先调度算法的类型(用于作业调度)
    ( U  Y+ ^% ]7 M, f1)非抢占式优先权调度算法
    ( L- R  F) Y$ J- i1 y7 x系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    0 h. R8 k' H2 Y( F/ r. j2 A" H% s2)抢占式优先权调度算法 $ q$ G9 a6 j0 L( I; f  Z0 c
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    1 }& g. x+ G. K3 U3 L) a1)静态优先权
    $ R  y' g. z, B& u" g静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    # f$ M  E3 p9 H+ Z8 G3 Q

    2)动态优先权 , e8 y/ ~- E" h: y5 i+ ~% r4 x

    算法实现

    抢占式动态优先权:

    9 N# X5 e: [# v8 q
    PS:本人认为非抢占式静态优先权没有实际价值。

    • ' ]" Q9 u7 W) f3 x, N! P: f

      # M1 n9 ^: ]7 z7 U- k& q#include <stdio.h>
      : O- T. A/ \7 }
      , M* o( ^6 P3 c7 F2 g0 W. U  w

    • & R4 q6 T$ \! w
      4 P7 Y2 l- V4 \7 s7 j4 e! w% N- D
      #include <stdlib.h>  , M" j: F+ g5 f9 h
      # v$ J% z9 r' I5 ^( x
    • % `. `% G2 s1 a& x1 S/ J
      ' ?: o* D! w+ }5 ~. Y( f0 E( I
      #include <string.h>  5 p3 {2 M0 v+ v& T/ U

      1 D' y1 g. ]+ N/ e
    • 3 [5 w# K0 N5 p3 A; I

      & i7 Y# V, E9 ytypedef struct node  
        v  S+ w7 f: h% e  j+ y9 d* K
      1 g, [' b, H1 k1 Z; _
    • # W, T8 J1 M: U

      , ?7 p, ~2 o4 b9 ], O/ e$ {5 ^0 v{  
      1 k/ p$ s4 |1 o7 y& D. C/ Q- Y
        K: Z# x) J  h$ S! H' T

    • 7 R+ U+ G, C, L( j5 h9 n
      % V. B7 v9 m/ P) U- P: i
         char name[10];  /*进程标识符*/  
      2 G7 i& H8 r+ m- r9 Z

      2 M# Y1 @7 i, W8 X% Q) V9 v4 }3 P0 J
    • * ?* g- F" W% S" r! N
      . \% @+ W" s0 ~( W* _+ s* q
         int prio;   /*进程优先数*/  
      2 \0 y9 O, F: |: W1 N( N5 X
      2 ~* a! K! n- ?

    • % @1 [' O! _9 p! M

      ; [' d0 r* u# W: e9 R   int round;  /*进程时间轮转时间片*/  
      % t) i' v: }8 L: x# E4 p

        D- P5 H$ @1 r  y9 i3 e

    • " h5 |. j/ b9 V* g

      . G9 ^! q- F( i% ~* A/ w- ]: g   int cputime; /*进程占用CPU时间*/  , @+ u: {8 \( {% D+ z2 Y/ l: P

      6 ^( l7 ?0 Q3 Q7 I: k0 ^1 D- e
    • : m9 g8 b7 H' E* F- J- |

      1 X' ]  |( n" l  `   int needtime; /*进程到完成还要的时间*/  , n5 G$ H- e' ?# @* a

      0 d' C& b9 ?5 `) Z0 N

    • : ~4 j- W- B$ M& i7 N% G
      $ B& r% w, D* t! n7 C
         int count;  /*计数器*/  
      6 s! S% h. y1 l2 H
      / r( g' r) Q/ i. r
    • . y* Y" ?1 E+ Z% U" z  t
      6 I/ \/ T' q$ O
         char state; /*进程的状态*/  ( A/ Z% F# m7 x" k2 I6 k. i

      ' k/ n& W, M2 V. g2 o
    • 0 C" K* |! {- s! N

      / T3 x$ ]( k: u" g) f( h+ B) E   struct node *next; /*链指针*/  + ?2 {1 j  R$ \3 U. ^
      ( }/ }2 Y# j& Y; ~. g

    • * I( {% f1 r  S; o7 g4 J

      $ ?$ h  v% Z5 t: I2 u  M0 p}PCB;  
      $ O3 ^& p' H5 {; l1 H; i! w

      % p+ n4 u# p/ K8 G
    • & Y% g4 d6 V) b

      / |$ x4 @/ p! s; uPCB *finish,*ready,*tail,*run; /*队列指针*/  6 I/ M# ^; A+ @+ ?( G5 ~
      . c. C+ i4 H  x9 C
    • ; O2 `) Q: V8 Z- p

      # d; M  a: o+ K- _) x$ O8 ^) j* \int N; /*进程数*/  0 y2 L' ~! l2 V% p+ _
      6 H7 p# F" b1 `% s# Y

    • - f4 y& s1 d' V
        B% z' {9 I6 }, a( x
      /*将就绪队列中的第一个进程投入运行*/  
      % a0 n8 q" ~" S- K) H2 @- y; s

      4 o; R; u9 A' P' h# T+ W

    • - f5 ]/ a0 W7 X9 z  R/ q

      8 N- {' ]  }5 N' k6 R! o4 ]2 }7 R8 c1 b4 Hfirstin()  * f& Q* G5 p. f7 C

      / l, d8 l. `, E. p0 i
    • / x5 D1 M6 s4 j2 A! D

      & P+ P! X1 s3 A5 h- b5 [% p{  0 g8 S9 `3 k8 N

      8 y6 n0 |( k0 A
    • ; l" J& f# q9 ?7 [
      0 r0 D, j4 n: K5 I3 e
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  : v; G. B1 c3 d3 ~& T8 |6 ~

      # C( s8 Y& g: r( ~; `' ~- h' v
    • 9 K4 C) Q: O6 Y

      $ x" u2 Z- f7 t1 j5 a; @   run->state='R';   /*进程状态变为运行态*/  ( @& o7 U, H9 f6 {. M! b5 H3 J
      / H/ f7 V; C: k5 e- g

    • % I- m- I5 ]9 I/ I1 z; w" r

      . M6 D) u# p5 d5 @   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  4 i- S3 U& `6 U, |. P2 I4 |  D
      & U- J' b; L( j  \
    • ( F# ^1 d3 K: U) c8 m9 i5 A4 u
      $ M9 b1 Z* r- y
      }  
      & u# I% }3 A, [# E1 ]- k& e

      : D/ K! I7 T8 o5 o2 U& n) `! M5 ?* ]
    • " R; b9 @$ _0 @9 R
      . U/ B# h7 f- g, C1 o
      /*标题输出函数*/  
      ! t2 t2 c& {$ B5 |* F' ~$ b$ m. h% G; e

      1 L( ]$ G8 V& v

    • 6 r5 L3 x7 j4 _- K- f/ V) s5 T! N/ `

      7 b( z2 L3 p, l4 O8 N; Z% {" dvoid prt1(char a)  9 h  r+ ?7 Y' K) @2 K6 F2 D

      ; x0 v9 J8 t1 @2 E5 n

    • : y' B% A2 D& J3 q
      6 A5 B; N. l; T, Z! B
      {  
      & \# X+ `! e: ]5 i$ u
      " {: J& W' ]" T' x

    • / U+ U' b+ F( n

      9 v- j( N6 q1 @   if(toupper(a)=='P') /*优先数法*/  
      6 C! p) u/ A$ Y! |: @

      ( ?) a, p! X5 a$ Q- L' M1 B5 Q

    • ; Q7 E4 F3 }$ v7 E( l' Q

      . m; _# v0 X7 ~: N      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  3 u) G2 m! a3 T+ X3 C# X. \# h. z
      ( ?7 b9 p$ G3 ?

    • 8 x# C4 e7 i, g& Y# t3 b' {1 [

      # }) e. F0 [* f8 N( b/ n  J   else  + D, S# Z. x  M5 L3 K
      - ?4 _+ l: `( u
    • $ g' T" d$ j  x0 B" ?

      , ~3 b4 \3 t, c      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      6 d3 Y+ x4 M" o) y4 i- Q
      - L* s8 E7 ^/ X0 y' O
    • 3 {% L8 v5 e! d9 U
      # ^5 W( M/ Z% t( w. T9 m
      }  
      , @; C" p, @% ~- x- j) z! W
      & n; s  h" A  \( `7 u4 p2 x& Y

    • * R* l- ]9 r: |2 t% a0 ^
      4 K# W3 w8 }- {2 A
      /*进程PCB输出*/  , H. l# M5 ~% w3 ~& ]! c
      ( X3 h) c; v+ [' z% I( r! K, P( T
    • & d# v/ o5 p9 p& |7 w8 l9 m' ]4 \5 O
      5 O6 B% y! ]0 A/ c/ U
      void prt2(char a,PCB *q)  
      ' c1 \( Q$ x" d/ T& c7 W1 F
      ( `* i& M* D5 l

    • # p7 P! H, U' ]2 s% _9 V& J
      $ v  Q2 y0 f2 [9 [; J8 [& D8 O
      {  " `! d2 h5 ]& q0 ]9 ?# A. B

      0 u% u; w; R" x; _8 {
    • 8 V# ]* G9 y" X$ U' E8 F$ S8 M
      ! z0 k0 ]8 `2 U6 G
         if(toupper(a)=='P')  /*优先数法的输出*/  
        t2 l" v) i. t# N$ w  @  |
      + j* k( ~8 o- m0 b2 j5 Q
    • - L( X( B$ i* S2 F& o* p
      0 R$ \: _: ?. G( l+ l. c- l
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      , W; A1 G, r* }: l! Q

      2 O# m  D6 J! `% N3 C

    • 8 J; |4 ~. N0 t3 n- z1 d5 N: u
      ; P' V9 {2 U8 z4 l' u4 f( ~
             q->cputime,q->needtime,q->prio,q->state);  
      * K; G6 F. l; `; \# O
      . I) d" L+ S! G& ~2 ]

    • 6 {7 l; I5 v( e( }

      & P% X; x; `7 l: b8 E* U   else/*轮转法的输出*/  
      ( |: f# @3 D5 N

      " t+ J+ @% r  ^- c2 w

    • 1 q1 h# M0 g# y- i

      # t0 s3 j$ ~. `; u- A4 n      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      ) O' @. [: J: F3 b! `6 d

      , T5 R1 l! N' Q4 v5 [+ }6 f/ s2 d

    • / i$ l' m: d$ Z
        [5 k# z0 D# o! ]
             q->cputime,q->needtime,q->count,q->round,q->state);  
        T& i" P/ C' K1 H) O2 C

      8 [0 X$ I3 l* R. [9 E& w$ D5 S$ q

    • ) ?% [7 F  L& A3 G2 n+ O$ Q9 T( j+ o
      * E9 [. m& j% n& J9 E9 w6 E
      }  7 C; K$ U2 M8 Z4 h3 k3 t

      ! X. Z1 f% @9 q
    • 2 a6 K. g5 `  t1 ^
      & o/ v0 R7 o" U& M- V- [, N
      /*输出函数*/  # g. q2 C9 H( |$ i. J" u0 F

      " F" h9 q# ]  j+ o* s
    • 1 ]/ U) _. o  v9 ]& V; X

      % E6 _. G7 Z4 c6 A% g# Qvoid prt(char algo)  . `% n7 B$ t& u( {5 X5 z8 S5 c5 ^, N: p

        g. t, w5 s4 e  }: n4 c

    • 9 P- F& f" L; A% Y  ^3 O5 f1 Z

      6 M2 r& b" c* l  w$ K; }{  ! j$ i1 O6 H0 s  a3 {; o

      % Z% q$ b$ ]  e+ x) \" v4 R! e: u

    • / ]* M) J9 }8 Z  i4 Y3 }9 r

      7 t' Q% g. m2 l9 \   PCB *p;  
      ( g% H' V: z3 V& \, p' ?# W- z
      2 \+ d3 ]3 u' ]8 N, v

    • * T: a$ E3 f( m0 m

      3 G( p! D. h# O: N& d1 t   prt1(algo);  /*输出标题*/  . {2 s/ U7 w4 {+ }6 u! s( q
      , z( g" L. V& }
    • 2 r$ a4 C" K' D* H
        k& l5 k  {9 z/ @7 L% _& Q
         if(run!=NULL) /*如果运行指针不空*/  
      - q( G4 ?4 ]- |- |' x& b

      1 B4 C9 w& e. O" m/ h1 a2 D

    • . f) Y) t) `1 k, g- N, H+ s: P
      ' p$ k' j  o8 R3 ~$ T
            prt2(algo,run); /*输出当前正在运行的PCB*/  5 X6 I' G( n# E6 k+ e4 o1 [

      6 W' S$ g9 z1 G, B

    • * c4 D6 k2 E4 r1 c0 Z6 ~! x, o

      2 p$ O  a9 L$ {   p=ready;  /*输出就绪队列PCB*/  
      ! P5 }$ ^# W- a' _& l1 Z

      2 d3 X! S% o' z/ U. i  f5 Q8 D
    • , `8 e4 e$ G( b2 A) i' F

      * ?! ^) P/ c! ^* x   while(p!=NULL)  
      5 f$ R/ G: E5 v$ k: B/ F
      ' h( ?2 a4 V( s5 k! T9 a5 ?

    • $ Z2 V6 U0 ]! I$ j* {+ _4 C$ M  Y
      5 ^  G3 a7 V- ]" _! o
         {  5 `' ?+ b9 _+ v& d! C( p& ^9 `. J  H

      9 w8 ~' o* E  A& ~4 U& Q
    • ( Y, [+ J4 R  ~* Y; T
      9 C" W% |" X0 y1 R
            prt2(algo,p);  & ~: u0 P6 k+ g! b9 Q# G0 j) @
      ; A# r6 h$ h" D: o
    • % w& f  ?8 I$ G0 x

      , O' `4 r/ y7 l* f7 |) [      p=p->next;  
      0 K: {' y# }) _/ S
      2 V% y! P$ J. a) G- L

    • . K! a( M0 Q: s7 Y* k* L& i
      - x4 [$ v; r9 m5 o2 f
         }  7 T1 g/ O! z% @0 Z
      / O" A0 I. x8 U- O5 I0 y0 O

    • % i0 x1 i/ e4 v' ~- V
      , p: ~8 N+ B, j7 `9 y) @
         p=finish;  /*输出完成队列的PCB*/  
      * ^/ s( N( E# Y+ S

      " y1 n% X4 k7 k

    • ( u) \( e! R+ y7 c

      2 ~5 d3 r/ V" m1 ^% \  V# T# p   while(p!=NULL)  . N5 i' g; k3 R# a. \% L# h

      ! t3 p# {2 G# \1 V( H5 x' K
    • # i. A% z4 u. I

      : q: _8 \  S) H9 ~   {  & l6 _. p% ~( L8 ~4 ^1 C
      9 |6 G" b4 D7 ^/ ^2 D: W& I
    • 3 [7 N; D4 Z! v; S- \' [' |
      ( D% Z, T$ g) s& n# r
            prt2(algo,p);  
      + A% {4 U% l) g. K" q5 X# K7 x

      4 g1 q% k. u. C, O4 x$ T5 Z: Z
    • # P$ q$ V; u, |9 I  X- q+ b

      $ g/ u0 P* P# Q- \) V' x2 I" M      p=p->next;  
      . b) a% z: e( t& s1 {$ z/ e
      - k2 x$ a* S2 u5 J) B

    • $ @. u7 f8 e' g7 Z. r7 p, M* L. G
        |! r6 }8 p& U8 j& E
         }  
      . f5 b" {' Z. o

      + C4 ?' g& T; F
    • 7 H3 ^$ \6 j1 Q, I
      9 ~7 m. v4 z8 X3 [! F; Z
         getchar();  /*压任意键继续*/  2 q' P5 {. L" c, ]$ R0 ^
      7 {8 N3 |% n& c! p# E9 x8 z

    • ; z, m9 M2 z- f8 b/ @# K8 A  {2 D

      ) S5 _2 T9 b- H  k}  4 |7 ]8 `+ I2 J# n

      5 r. N& \' u& u4 q3 ^, c4 T
    • 4 I  Q1 t: |4 b7 S5 r0 V6 d

      6 n1 \2 {! p6 H- H- [/*优先数的插入算法*/  
      $ F4 ]. @; E* Y% z3 j& Y5 A9 k
      % Y0 w7 E1 ]# U

    • 4 C  R4 h" o0 u; c' _
      8 F3 j! f/ @# F7 H
      insert1(PCB *q)  * |5 F6 H- N& f% m% T

      9 R/ U8 M( n( z  s8 S
    • 8 _9 q& l' P7 o; ~; U* A  g5 r9 V
      3 w2 _7 b4 t: W5 K) i! J! ~- X
      {  8 ~9 f5 y5 {# h8 A) E2 G5 f' i
      ! R5 |" B4 v7 n. i; h6 Z5 s. ^% B
    • * I# F7 ]6 m* U2 U" x' |

      # o' m) t7 J3 |) [1 E# @: c2 s/ t1 L   PCB *p1,*s,*r;  # t" M$ o, K8 X  h

      ; S0 B9 E( M* S: S

    • 5 p  T+ z4 l' I& G7 Y' O' \1 {- U

      4 ?0 m, D5 _( y2 K5 S   int b;  
      : L$ D1 Y! Q: u8 A/ D" R9 p  [

      * r% H: Q/ h2 |! G3 _
    • 0 M3 c: O; Y% l$ G

      4 M) K4 a! V6 j) u5 p# y   s=q;  /*待插入的PCB指针*/  
      / K  G6 }: ^* Q  B7 `% `

      ( _9 E  ]1 O! v* V2 B9 t2 G4 M& h; I

    •   |1 a8 t- Q5 O/ f) e! O1 j" q

      9 r0 N4 O  [4 s5 m   p1=ready; /*就绪队列头指针*/  
      : q2 i/ f7 c- h7 m5 S
      . u* N9 I& I% u; W+ C2 C

    • * D7 N1 M$ Z' h& Y# L$ T( j" X

      ; f( o  L6 h% L3 r; q5 s7 [   r=p1; /*r做p1的前驱指针*/  
      6 n/ D/ h& Z+ v) Z# U# \5 I/ @- z
      " m0 a# S3 c: g: |& B, N
    • 0 ]( [# _: `+ C, M( G

      . V3 z# |$ T. k3 o4 f   b=1;  % k5 N- c8 D$ Q  e$ H/ b1 p0 u* R" }
      - }' l' n; `4 r
    • ( C: |; h9 m9 r+ @$ i/ c
      9 e- e( z8 p" {* q
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  ; R/ A* S; C. Z  m

      % U. ]5 O1 o+ }5 _

    • 3 ?8 \* R  v2 W5 \' \
      + B) e4 K1 U2 ~9 z' `
            if(p1->prio>=s->prio)  
      - O  V: }" ]  b/ U5 q8 Y1 k

      - k& q- t- y( h( `
    • ) H% H/ ]$ G, s: V0 R- O

      3 u0 R) x" R* s) T+ y; j/ T! y      {  
      + t. W8 y- @% @- {; s
      * K& E/ O- ]  E+ Y+ t9 N8 M7 m5 F
    • * D5 j9 R8 B! O# [  Z; ]7 W

      2 W; S; l3 S6 ^& R' f     r=p1;  
      , \' E; h- F; l& ]% G

      0 v$ T0 b) @4 Z; v
    • , L( f4 [# k1 D( f! u, R1 u! T
      % s3 Y3 t, c5 z: }" e
           p1=p1->next;  
      # \; F4 Y. y( C

        E" V$ P' Q& x8 G7 J5 f
    • 5 N9 A; b, F9 F3 u& _8 X8 \
      ( U" ]6 y- P3 l) O
            }  ! U: j3 `* n# e" c+ W  p
      ) N( @7 j# A5 M1 x" ]5 v3 T# C5 M

    • - j/ c8 T  H; y/ {$ ~4 ?9 U
        f, v5 @, l& v0 G# c. M% N* T
            else  ( g4 N" O' ?: Y/ I  D- F
      & c1 h9 ^) u( v1 c2 P6 S( I

    • 0 |* M& a# H" ~& ]. P3 M
      0 u$ I& |' O5 `. x; m* j2 V) P/ C
           b=0;  
      ! t, p! C/ s3 l. @7 S
      3 T) u, Q0 K# o$ O- M
    • 1 Z5 v0 d& K3 u
      5 R* b; f( |# E  F) W' H: |
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  # U/ f7 H& U3 a2 L

        q% ~. \5 z# r

    • 4 G9 S& g3 @  G4 ?$ N

        W# e( g: g4 U: @* t% a7 ?   {  
      " E. T& \$ N9 ?9 j
      / ~- |  {( ?$ y& V! m4 {& R

    • / ~& U$ D4 V+ {; C

      - K: N% |4 a2 R      r->next=s;  
        @$ k; h1 p2 G, P" M2 P1 r

      # H3 ~7 b! u$ {) ]
    • + o0 ]; T* S! U% f3 o& G. f; Z3 p

      7 C& j( p3 u# ^( B      s->next=p1;  + }  F  o( d, m- w6 H3 z

      / n$ i1 R; Q% Y% o) W9 Q3 ]
    • 9 x; T- v+ Q1 u( K% Z& q- c5 N

      2 K' \9 \( C$ c% }; Z; g* q   }  
      : \; p" n8 P2 j
      ; q3 N- ]9 w6 ^
    • 2 c2 y" c. ]' s2 L/ J; U- s

      ) z$ Q& C6 N2 R( N' b5 P9 M   else  
      ; a5 E+ ]+ `- n* M6 Y; M

      % @$ M4 f8 k4 o
    • 9 G: s7 o5 |2 r# L+ Q% q( G  z

      " h3 s  X4 A1 g2 A   {  
      3 h. U* x* ?1 V  y7 [6 W% t( K$ Q

      ( I5 F5 j: _. I0 ~

    • # f" _& ?3 o9 }! \7 ?" N- y

      6 z, a1 h& `( u" N3 |0 s      s->next=p1;  /*否则插入在就绪队列的头*/  5 S4 W' P2 q& @% [8 ?, K, ]; K9 @
      2 q. l$ a+ X& g5 f: o

    • " R( H! X3 C5 e  f* V
      9 ~  {1 q5 r1 C4 `" E
            ready=s;  
      * t4 o& G* J7 Z- F% U

      : a" v6 f2 @/ \- ^: L5 ^0 C

    • : o% e" k& C$ \- m
      9 w1 ?; z0 x! k2 D" `% ?6 `8 V
         }  
      2 t. d( b1 \% K' s: R$ b4 h
      # {. D% [  n) t* G2 ]
    • ! J' q% w9 V0 S3 T8 F" H5 ^

      ' ^. g  C! B5 v6 [1 l$ p) k8 D  A  b}  
      ' n  a2 p1 V$ ^; f7 p
      / k) O( U/ I5 I+ V. F

    • ( s* a4 z. @6 i5 y1 ~3 u6 _

      ! q' d/ J. l* G; n; v/*优先数创建初始PCB信息*/  ; {# I. I# G: f1 [7 F! X4 x! D( h

      # W8 o$ _3 b; [! h! _' ~& z& @

    • & }& v: ~; P: B7 i# c9 W8 W5 q

      ( ^  A6 B% j, z8 z8 [, gvoid create(char alg)  
      ( `0 k; w; P3 H/ [  L  X' G8 V

      4 q$ e) ?6 I. O; N

    • * M5 _9 B! m. |
      3 q5 W2 U4 h6 b5 l
      {  5 V; J! v4 C% u6 u

      6 {0 F  e9 X5 H# _

    • $ N, d; M- D+ N1 L. O% y$ _
      2 @' Z0 p, r$ ~7 p2 T- ]
         PCB *p;  
      " Q# T% B2 m: Z. K+ e

      - S: M/ {" v# F& Z# a' {, k
    •   S6 H6 h, ]+ r4 C% }9 N

      ' M6 E9 V7 d" r   int i,time;  , @9 P: V$ A3 j9 z( M

      6 R" e/ z9 s+ E( p
    • & }% \/ {6 h) c# z

      / C/ S1 ]6 S% @4 k   char na[10];  
      " ~* H( M$ T( F
      # h7 k9 x6 d- E8 K7 S

    • - w5 L8 x) \2 q1 t: \) c
      & _, b5 P* y: E/ X) W
         ready=NULL; /*就绪队列头指针*/  " }: |4 D  N7 N1 Z5 v
      9 {% o% p7 x- z% Z- Q: D
    • ; d% b, K+ F; f$ [1 p' z7 [' z5 t
        D' a+ {- a4 |# }* K3 Q0 |( t9 |
         finish=NULL;  /*完成队列头指针*/  0 S6 @( l7 d: I

      " @( g/ G  ]/ u4 w2 A, t  E

    • / |% v' `3 j# v& B: I- m

      / ~  z* V1 v4 \6 g8 M/ }8 M   run=NULL; /*运行队列指针*/  
      8 X9 F5 \( f' A9 i! b9 y
      3 u$ s4 ^5 f' y# K% {/ E
    • 0 d3 ~. H3 u* @& ^) I) [
      . g4 |' K  u- N* E& v7 @
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  ( @# A0 Y$ Q5 o# L
      ' O) D) j9 i7 ?0 T* P7 Y
    • , a5 k8 W' K& w7 W. t
      : Q2 k  N) J5 X. q0 f
         for(i=1;i<=N;i++)  : m2 |1 L9 B* i  m1 b$ O

      + [1 G4 ?; l0 ?# B% F* t- z. s
    • ! j2 ]5 z# s/ t

      6 j0 @3 R5 p$ h. P   {  ) Z7 [' y- b1 q4 S8 {

      7 x& f' ~  L. I  k, M" m

    • ' z" E. O0 n& q1 ^+ r" d

      4 D: g3 q# a' y  @( D+ v      p=(PCB *)malloc(sizeof(PCB));  
      ) B9 k" l. I5 d( g

      $ z% Q, Y4 s  d0 t8 q/ {
    • / a: ?4 t1 [2 w
      7 u8 A% q  @6 c+ Y0 Y1 P! {  i% Q
            scanf("%s",na);  ( m. Z4 [  e, A# h5 ]

      : L9 r. f( E- }$ Y  B( P: a6 @
    • * x5 T0 _# i  y  V& \/ z: ]

      / u. j+ S) C+ x" X      scanf("%d",&time);  
      ; v: V; d; Q  L, Z1 y7 B0 q

      * J' L: X; `5 }- J: R! A) W$ x  D" {
    • ( b' X; M4 N& l0 ?" V5 R
      " T# S7 N# t6 d2 i- X; V5 o6 u, X
            strcpy(p->name,na);  9 u5 T7 x5 n1 k% u0 v: n" ?# T$ |

      $ y& P* `6 C: E
    • : b5 H2 M. z; T9 `
      + L$ \! b/ Z% ?8 B* B
            p->cputime=0;  
      ; N7 Y2 Z& ^6 P. K

      ' ?& @; r7 ]7 u  \) `5 j9 R- P
    • / n$ M3 p2 f8 C2 h% b) Y

      & G3 ~' ?1 n/ h# r; V+ i      p->needtime=time;  
      6 O9 p+ W7 I3 B2 d2 L
      7 b9 E3 x4 w: k$ |1 M

    • , E# H! x: r1 G7 B9 o3 ~, q

      , {! ^! E. A9 j1 U0 K' Q      p->state='w';  + v6 }4 _, V# E3 I, r5 t
      ' @9 o2 v7 Q5 n' |8 e; _

    • ; U  F* t7 S- v; N  `
        V' F! W' Z2 I# T& ]6 N2 M0 U5 }. p
            p->prio=50-time;  
      1 y( L9 E, c. f! b3 x

      9 Q) Y* I; |: E) t7 j0 s, |( V+ r

    • & W/ n% z$ A+ O3 Y
      9 y* l. A' C8 r0 \9 r; O8 s$ Q
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      " Z8 E' E# Y0 a4 R$ W; o/ ]
      3 j  s" x  \7 }+ O* k
    • $ h: V' Q3 T% j, c8 U

      . b1 a5 D% b* [8 u/ |& O4 E$ _2 p     insert1(p);  
      ( y2 C3 s) G. f7 G( g6 F5 @4 X

      ) ]# `* e# _1 [. r
    • ( g# ^. S2 ]; Z2 J% ?) b

      ! Z5 o1 |- @/ u0 e) C- C4 Y2 M9 @      else  9 m* f1 a+ G5 b
      : J/ j) B* ^5 R; T# \2 F4 {
    • 8 s( O8 ]. G- f2 q6 \
      1 X+ i5 E1 w2 s
            {  ' _9 p, m4 v/ T, q9 D

      7 ]' K3 g! T  l$ n0 p6 A
    • ' b2 s1 J; ?, @. E7 K6 {

      ! j( r+ I  O( B' R     p->next=ready; /*创建就绪队列的第一个PCB*/  6 j& `1 H, u$ H

      " _& M) h/ Y8 U* Y: L2 B0 I  ~
    • # v. n" S; `2 y7 V
      - e9 F3 a$ K9 ]9 C+ w5 w
           ready=p;  9 o$ Y4 ]7 f& `4 x, I  ^# Q

      / J$ F5 L0 T* [8 y* k1 \

    • , R7 b, T, n0 p- s0 h8 j) t+ O
      $ j  C2 \- U8 F6 b9 E" ]/ |
            }  
      $ H+ k& R  \/ z8 _' |4 {. v6 U; u

      ( O6 V( J; g+ C( J4 H

    • 9 Q3 {& @& l# ~/ L  ~  {
      % @8 J& {2 f6 Z" s. o) u+ N
         }  % p! a/ h0 p! j! a5 ]

      " V+ l; b) {6 L2 D* ]/ J7 A6 i
    • ! a2 Q8 m" {/ x- s
      ; j' i; b' E/ c9 }: X
         printf("          优先数算法输出信息:\n");  
      : X* }7 O, L/ V5 C6 V
      5 O- Y8 t" ]: x" R; Z, Z0 b
    • ; u% p3 T, o% R- U4 R0 P4 H
      ! d9 M# k, _0 e5 `; \- x! s
         printf("************************************************\n");  
      . G/ H6 ?( G& [( I8 R

      / e4 P: B( D) `1 t) k2 d# ]
    • . U* F& ?9 ~$ h+ n: R
      ; l+ E6 T: \3 ^, C& t& y1 \4 V
         prt(alg);  /*输出进程PCB信息*/  
      # o$ x8 l8 _: z$ g- i
      1 Y% B3 v" s3 P/ S2 L' F3 ~) B. v
    • 6 J1 T1 I) C) s1 C9 p  F
      ( [8 _7 N! i' o7 l
         run=ready; /*将就绪队列的第一个进程投入运行*/  , y- i: H% W* `$ r! n' o
      4 b4 D% r& _8 L
    • 0 ?# p0 n/ l; m% Z. }) J" r

      ( G$ Y5 q8 r6 c   ready=ready->next;  
      ! d, Y1 B+ q6 [9 `  r' _& n. R: p- m
      , H" \; C0 L/ K( w4 D7 k7 ~
    • 8 i: [0 F" j5 B7 r% O  L, l

      1 n6 u" @: O( `   run->state='R';  7 f  P3 L% g3 D; B4 t

      % Q+ {6 f! l8 C: w, b
    •   o* J2 L5 V6 H6 R" E/ c" s" S& T
      3 s& |" q4 W- H" P) H: A& C, U
      }  " F9 }5 s2 j4 T& G2 m# v
      * g% f" y4 Y( `  p# d0 s# L
    • 2 P3 I1 j: z, y

      2 d0 ?2 y6 m- t; d/*优先数调度算法*/  
      ; R- D7 h$ U3 j" g

      3 k* D! V' s/ v: k. [* i3 `5 p6 X
    • 9 F% s6 w1 `% `* t
      ! F7 ^  C% [6 W0 |
      priority(char alg)  ' z3 T5 Z+ o' v& t1 `  w0 \

      4 ~7 ^; \& K) L, b3 j8 J' G

    • . p/ Z/ s! |7 p, G$ p5 k
      6 u8 R" m$ i+ F' e% r; u; R
      {  3 n3 K( s8 x& |+ t( g
      2 I$ @! D# }0 o$ @# |4 M: L+ S

    • 9 @+ k9 i/ `& k; k" {5 @

      ) n' n' c& p6 O2 ~! o) ^& i) v5 ^   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      ; j& C9 t8 z, s' ~

      * N- Z, S. b# s( }3 W5 O
    • 0 Z1 g7 T$ Y  ^1 f+ ]2 D

      + Y9 t4 N! B$ o* R& ]$ D6 h1 M   {  
      ' k7 n; Y) U8 @* g% o& J4 K: B

      ' h8 j/ i( R  ]1 j- Z

    • , b; n+ V( V* N( j1 V) m( E; {9 @. p
      1 x# R- ~- d. g9 P' e4 [- |% Q4 K7 h
            run->cputime=run->cputime+1;  
      & e: i, S! {" l
      * Z0 y  B6 E" H8 T

    • 7 N7 V7 O* T* j' [% v: d
      ' Y/ e" F, `7 J9 ~1 r1 ?
            run->needtime=run->needtime-1;  
      2 d; U) x) B( l- v  s4 O' N
      & e, H0 }+ g% g# u, v1 ]% L

    • 5 j  Q5 w4 [& Y% U7 i: R
      : F7 Z/ B/ P! d0 f4 i' }" o3 ~7 [! S
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      # D2 U7 M/ {. q, R: O% Y, ^# L

      : x# A! L2 {& {* V, B
    • " u5 l/ |+ j# b2 v

      & V- C; g/ Z" g6 `. N1 S      PCB *p;* n$ ?& Z; q, h1 i8 `8 l: o) p/ `

      0 o) b/ x2 b, U
    • & S" v8 A8 Q5 Z
      ( m$ x& y- y6 g- I! j& N
            p=ready;+ w+ V7 [1 E+ K' e

      ; l. K) h/ v0 @

    • 2 X4 g0 q* f6 y: F. N
      . |& X: G0 P- P
            while(p!=NULL)  % m5 g/ R+ D+ I4 \0 @
      * k4 h( E3 z2 `8 |) c9 Z2 W

    • / S( L* v' k+ }% V3 \9 |" q" b
      # @1 H4 c! t0 O' p
            {  
      8 f4 }, Y: O6 B2 O4 |: l! h0 _. n

      ; B2 U# S. Q$ `. y8 ?& ]1 N

    • 1 }6 V. _7 S& M
      8 L. j  R, k& h; Y4 \9 q4 Y% J
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    # z( a. D6 L1 k3 T% y

      - f3 y1 c! r$ I* s4 k$ \  x

    • " _$ A& m$ C' v' b/ i
      . G2 ?) ]3 H& O7 V0 \- m9 p
                p=p->next;  
      " W: a3 `$ H( l( g* ^
      # ^7 j# E  z' K5 ^  L. J$ O
    • 4 f; _5 m! y$ b8 i0 e- }( I% |* ?
      ) W1 C/ E- G6 P: C: V. F
            }  3 g' G4 C1 z! b( @. G: S0 q) K* ?
      ) j( a4 P1 \  I) }+ m
    •   t  U( W- ]4 r2 Q

      , f9 h8 Z& u: ~8 E& E  a) @      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      / x9 z$ `( l6 e! T9 e2 o+ N9 P2 r
      ! I& }: ?- u, r7 w) r# H2 b
    • : ?1 J( b/ b8 z; y
      9 H& d! a" v2 V' o
            {  $ I8 D3 G7 J" {# e9 V
      0 W4 c/ c# h2 X, F% N( ~2 M' X7 b( }

    • 0 e, w% J. j) K0 f9 z* C3 V. A
      ! G: ?/ A2 ], m7 [; J) c
               run->next=finish;  
      9 a  }) _! A* |' ?  J8 l  u% g  k
      9 k4 R! m# O* d' @/ [

    • # A# f/ D& u. m- M' G

      " O4 Z6 W4 f8 T( ?3 x& t2 R         finish=run;  
      6 s' e3 d) v( d: F+ @* ^2 R% ?
      0 ~+ I0 R. t9 N* F& a: c

    • 8 C5 Q  |. R- S1 Z( g# T

        i" [' G1 j4 x( _$ D5 n2 m+ w         run->state='F';  /*置状态为完成态*/  
      / ~( J: T' T% L1 h+ Z

      ' z* ^+ ?+ x$ v

    • & g) d: Q) T8 g8 M) z2 \

      " h. z6 `( E( M5 L. ^! B3 e         run=NULL;  /*运行队列头指针为空*/  " ?/ N4 `2 t' Z/ L$ a* t6 r; R

      * J* v9 ~% M3 R# p* L
    • ; `& F3 s" A! `: a
      . K: {+ i, U$ m/ S( m
               if(ready!=NULL) /*如就绪队列不空*/ ! h' T! y5 L3 Q& S  e
      0 I/ R9 S: r9 X5 _
    • 7 c6 b+ _; I9 b9 H7 ?9 j/ T+ \7 Q
      " F$ w- M* ]7 O* N" G
               {  
      9 i+ A3 N! k1 K7 u$ O9 ^
      1 h5 k+ x' }' v# ~* m3 ~6 X' t# j

    • 0 \" R2 l$ g$ ^( w/ Z2 `4 n
      ( j$ f' o- n( {, x
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      " Q& v0 L+ B% E# I" W( X

      8 N0 x: B" p  ^# e, M
    • " z+ N! B% B! r1 r  x* X6 X- H( ^  L
      " d  ?# ^! g" S# |3 S4 y6 B% E8 a
               }# J' s$ U3 p$ X

      5 y& m* a0 `( d- B! R6 J

    • . r: Z; I- v' h, B0 S& D

      ! t, `) f) M' o2 T' n7 A      }  : Q4 n2 O- K# }2 ?" o! J

      ! U0 x  ]6 Y7 ~9 k  I+ G3 Q7 I$ Q
    • 4 S' c* Y, S2 z$ P3 b2 e$ ^
      , d$ e( N/ a, d1 @$ ~3 f! Z# F$ u
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  1 _! n; X( N: z, q8 d

      ' @9 ^+ u4 P0 ^& M  g* {
    • 9 _7 I) q7 M2 z- q5 u6 M

      5 u5 a: J/ ~$ w/ m' y0 l     if((ready!=NULL)&&(run->prio<ready->prio))  
      * P1 z1 M% |( z- O4 i$ A
      ; M  j4 |! g1 b* ?6 K
    • 1 L1 F  O9 W! f# {9 `% @9 N
      ; ], X6 }6 ]3 o' k  l
           {  ; x( g6 p1 s0 ]' y0 ]

      , Z4 j7 [0 \" }2 M6 d

    • ' N- q, ^; ~* }$ y
      5 ?$ i4 |/ V8 X
              run->state='W';  / L+ S" l6 q! R- C7 {$ ~
      , f- U4 z( h" y; ~% H3 k% t( f) x
    • ; Y  Q) Q# Y+ ?
      5 w1 q: L8 H( j# Y
              insert1(run);  - }" W! H9 l; e$ @

      & z" t  _& e1 B0 z

    • , o" q2 ~+ F5 I8 u

      : u, z# o! [4 H4 C7 x9 z; c: _! ]        firstin(); /*将就绪队列的第一个进程投入运行*/  
      ; m9 e! u/ V9 t) g7 z; u

      5 B! ~0 t) C) A3 b! {- C
    • & \& A0 l" g4 {; N+ c9 w

      $ p; b4 N. X; y' ?     }  
      9 i* q; V5 A; _2 {7 b% ]- M% O
      " q% C/ D; E6 A! E. h. \

    • ' B( z, C. y# Q: h( q, _. t: _& a

      3 a/ K' R5 F, Z3 M* ^* z6 s" k      prt(alg); /*输出进程PCB信息*/  
      7 g; o  `/ B( b9 f4 o/ o6 A6 |

      * @! `  G. w/ \. ]
    • * _4 Y+ N( t' o' ?
      3 B$ L) @1 j$ _# L
         }  
      # `& r( n- V$ D1 i. _0 g! P; J
      1 E+ W& v; w) V

    •   ^1 X- m6 a. n3 _9 x- ~9 |

      ! }9 ]4 e0 m7 V+ C}  3 e8 n+ a, s1 h' s0 u5 B* [) O2 J
      & U8 B1 H; |0 e7 |+ b1 M- M9 y

    • 4 @, _( K, |+ i1 W3 `0 K% P; H

      1 z/ F$ v/ V/ N9 X: `/*主函数*/  * \* z+ S: i7 J5 d! \4 R
      , j) V5 }1 r8 G* c. ~) I
    • 9 ?8 G, n, Z8 _' f/ ?
      4 L' ?4 g9 e. ~0 f
      main()  7 g5 k, p) f. J$ e# q* U; V7 B

      " R; L( |: L% Y2 }
    • 2 ?0 ?/ o6 E7 h+ L: k6 I& `

      7 D: l$ U6 M4 J& g( p: H5 w{  
      & p7 w! n1 r7 b5 D9 @$ b

      ' M+ w3 Z3 {1 i# H3 I, K8 ?

    •   k& ?, q3 H6 q" V! I' F' `

      . p- f( w# D* F) U% F   char algo;  /*算法标记*/  % Z2 k! ]: U3 I5 i2 C, C% U/ J
      4 d( @+ I* B0 {: V/ F* |# @

    • ; s, D* A: k/ c1 M1 _9 ?" V/ Q

      & R: k9 M/ h$ ~) z" |   printf("输入P确定算法:优先数算法\n");  " R4 v* S6 D) n4 _
      ( S* R  L' }/ u
    • , r3 l/ N9 ^- A6 y* b  v* P

      0 m- B. D4 n* ^5 e% |! P   scanf("%c",&algo); /*输入字符确定算法*/  6 o4 Y/ a$ Z& O( p- C& @! t' \
      , e( c  l* e" e  @3 u! N8 N

    • # `. K- [. k4 y# M! s: b  A
      5 M# ]( L& @( L: M: r* j
         printf("输入进程数:\n");  
      ' G: r, L1 u  I& R1 f5 E$ g
      / r/ E0 ^5 q+ L! ]- Q

    • : I( Z# N- G- _; A
      + X) f6 P& Z: n8 F' c* P
         scanf("%d",&N); /*输入进程数*/  
      ) S! j# ~0 B( R3 U. W
      ( i& q2 r, w8 m

    • 9 V3 `) w0 g# `, F/ I' C% |
      1 ~9 D+ j+ d6 K) G* X( P" S
         if(algo=='P'||algo=='p')  ' V; _' Z5 c% b# [8 d+ r
      7 `+ K: v% z7 b/ t- R; I
    • 0 G+ a; i( Z+ L0 H" X
      0 G( c- z5 u$ C* ?' h  X
         {  
      . o/ t2 x5 \; e# T0 |% k' Z
      6 s* a; G6 B8 t* X
    • " a8 @/ w0 ^% e) g+ Z
      ) y% b) N' t* r& E( t
            create(algo); /*优先数法*/  $ V" D5 i1 t/ s3 ^

      # G% A; r6 |! N: f. Q

    • ! f3 X, ~5 o; c/ K  K: Y
      # i0 [+ Y) c$ K3 T  B
            priority(algo);  " w0 h! b- G- I7 q: g3 g/ \
      ) W& |$ V0 T1 y, S$ ]

    • ( n) g+ l! V! Q8 z& X+ {

      : N+ v; l% j5 W9 b0 A   } 8 A+ _5 B6 e. B0 A# C. u+ f

      " i/ M+ ?6 u0 D( D

    • $ p- _) N% N  e  M& i

      0 I5 o- o4 u: e/ U5 ], C4 f7 g}
      & P" B2 ], |/ S) f. N0 {7 I1 R: a

      - G1 G' Z: a; c" r! E! s9 ?
      ; e6 y" ^7 B; B- V" b

    * ^7 S- E" D# @9 o: {0 j9 D
    输出结果:# }' ~9 ?7 e. h  ^

    " h- O1 c# Q! p; @$ B& ^$ Q( Z
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    1 _( Z5 `0 \. D9 O0 O; w9 p
    4 u' {  N3 C' X7 K
    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 23:06 , Processed in 0.493047 second(s), 51 queries .

    回顶部