QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3229|回复: 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
    ; P/ }! i5 x# ~! }5 T+ \) j. ?) Y
    优先级调度算法3 m& G& x  Y- V

    算法介绍6 D( F2 ~! d8 F7 Y
    优先调度算法的类型(用于作业调度), ^  l: I' Z8 f. l
    1)非抢占式优先权调度算法
    3 n0 R3 K, L) y& R* t) }- n系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 9 L# \+ n& G9 H
    2)抢占式优先权调度算法
    6 x' l- C' Z  \4 o只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    5 b4 `  s0 z9 N) ?6 p/ ^* u1)静态优先权 1 _4 {2 v6 F/ B9 d- K0 b
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。1 Q" W9 g3 w; Y

    2)动态优先权
    * o! w( y: B' S. [

    算法实现

    抢占式动态优先权:

    7 G( G8 v5 Q% E9 n
    PS:本人认为非抢占式静态优先权没有实际价值。

    • : |7 L: ^6 o) |6 h( H+ X6 F
      0 e6 _( K+ w. m5 O1 q$ y. J' O
      #include <stdio.h> 8 A4 K$ a  S$ p" ~6 n" R. [8 V- i
      * p5 T3 w+ N* c8 Q

    • : R3 E' U8 b4 z, r! n' p
      5 ^2 ]3 H5 s+ {6 A7 `
      #include <stdlib.h>  - B, h/ ?2 s5 W3 K7 V4 |) l
      7 Q6 F6 G" q, H8 J6 o; H
    • 0 ~+ B$ D0 @/ |9 T- ~0 _

      5 |4 W- [8 n0 J- \) N  u' X#include <string.h>  1 K+ X5 f, Z: X' I: d

      / r# q7 q6 P) F' B% z9 g
    • 8 H6 v6 k$ D; F  ]9 I4 {

      4 F2 K/ ]8 [% T$ x7 B: \typedef struct node  
      5 C* p* X$ _) o6 w. K

      ( [" h7 Q: n1 L
    • ! \. V( n5 L) F: q; s! B
      % m( d6 Y0 J( H0 k
      {  
      % I% a5 C$ o, o" T( V; V
      5 ^, v) m8 C3 d

    • 1 x7 L9 f1 }7 K& Z( }

        i' F" N- ~) p   char name[10];  /*进程标识符*/  4 j2 w; b7 c* B5 k8 j4 r: l8 u
      1 l4 m5 r, d, U. u# S4 d7 i

    • * r% ]2 ~0 A+ m$ f/ G/ P* x" w

      7 h0 `+ e/ _6 u$ E( w8 Y- K" p   int prio;   /*进程优先数*/  - }- H8 e% k$ S( b; r8 u0 P
      % D/ `! V, Y, ?

    • " q; t6 n3 J; _

      ! S0 f4 E* \. q9 \   int round;  /*进程时间轮转时间片*/  
      ; a/ _( p3 _1 D9 F' q
      0 i1 z8 {( ]& m0 q* j
    • 5 G- k5 |! K) V) F8 P2 o, y$ ~
      ( t8 N" t4 y% t  U7 z. u$ `. V7 f
         int cputime; /*进程占用CPU时间*/  
      6 N2 O# k8 Y+ S
      8 ^0 S% N# o# i  ]

    •   C" R2 F! f9 I  d
      - L+ q, E+ s: w
         int needtime; /*进程到完成还要的时间*/  
      : B$ Z1 h, q  b- g* {& C
      / I5 R5 y6 P( W6 Y9 k& {6 ?/ g

    • ) C5 a- p" J1 o; _+ R- n

      6 ]8 j2 i- H1 P  w2 [   int count;  /*计数器*/  . O( K2 u, }* O- ]
      2 M+ r& T: R$ C3 @

    • ! s6 g. M5 Y0 |" ^. {; g$ ^

      ! q$ S) \/ n2 u* R# P   char state; /*进程的状态*/  - {7 o# y7 y5 {3 t$ w  P' A

      9 p- l" L. U7 a/ p
    • , n3 s) y6 J6 F+ z4 z+ O5 i- O
      ; K; K# _% X, J/ p4 y% D
         struct node *next; /*链指针*/  
      ; T/ _1 s' m$ e% T

      # _( Z  z7 t2 F
    • 4 m- _1 l, ?$ e( x
        Z  b! v0 M- N# @
      }PCB;  
      ; Y/ a/ C, H/ K, t# V
      : J: }: O, U* d& e
    • . M6 K$ B, q3 u$ w% }) E7 T
      : j: T# Y) m- N0 Z$ |
      PCB *finish,*ready,*tail,*run; /*队列指针*/  6 l! o! T8 s( n9 S# h! j  J5 O, _
      * I  q1 S+ I8 `7 w
    • : X, O. l0 U3 T% y: q
      ! y/ L4 ?3 f0 ]$ u
      int N; /*进程数*/  " O  ?& X6 i$ g5 m7 o
      4 O) @& o. _" q) f2 ^/ x# o3 C7 d

    • ; ]$ M5 R  {2 `$ B. {: _0 L

      9 a: b) d4 q* T" M/*将就绪队列中的第一个进程投入运行*/  
      % @! U2 t. `; I' g

      + X  A% P/ }" ~4 F, d, u

    • - {2 d' l7 X6 g. E2 c! Q# `! s

      5 n, e" X  E: j+ K$ q; [0 i( Bfirstin()  
      ! k+ ]" q6 s2 x" d& w
      & ?" L" e+ |: C. d

    • & z$ V2 o/ G' S# \$ O' Q
      - V. ]  N0 `2 Z* Y
      {  
      # E8 I& U* c' P, w% I5 ?# V) x, M# E, V

      / J* V) p4 A4 y9 C0 e2 f; H

    • 3 J$ I( k6 E+ O! W2 q3 y
      4 s! V2 V/ m$ X+ q! \) a6 s
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  ' r$ w! M2 G- H: J$ l  r
      4 U4 C4 Q1 B, I" r
    • # V9 C: u- y1 e% k; @% I. M

      ) `9 i& G. ?& S) M8 a* n4 C   run->state='R';   /*进程状态变为运行态*/  7 a8 \3 `9 H2 j- `& @7 z3 T

      - Z  u( w8 K# @0 ~
    • ; [% Q2 ?8 v- B" M
      1 Q& ^3 [5 f$ h$ W
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  4 Q" u5 X% E# r% @

      ) ^" B+ t1 d9 n, @3 ]

    • 8 q  q0 i( E# L! q
      ' O% j7 S, [- u! o
      }  
      & @3 j" e& ~. O

      * G  }( G( z: |! R! `
    • 9 S8 c: \! l+ _4 L( R  ]

      8 y/ g8 m% U5 v" b/*标题输出函数*/  2 E: c- ]. _; W6 h7 Q9 D: k
      * z' H6 \6 r1 V/ g% B: W4 R
    • 5 b- r/ N: r5 C1 p

      ' y( h) e9 {. g9 _" Ivoid prt1(char a)  
      : N" a' _  M- U  ^. K2 [1 {5 q

      - }# Z8 S( h* b* o1 A: F1 u& D9 N

    • 0 c( k7 p  G6 `0 G" r; J0 d

      & a; X/ V: }" M& f, s+ }- U{  : _/ _6 q: d" i8 ^5 ?5 ^
      3 U& o* u9 D7 k" v; P! s) x" W

    • / R( y5 w: O$ |* H* x  q
        N- ]8 b, y4 i
         if(toupper(a)=='P') /*优先数法*/  
      7 G  d3 }( Q/ F4 D3 t7 ^. T0 N
      ( \1 g2 v" g% J# ^' }
    • 3 ^6 n: E( t$ a
      : B( n' m- G  u6 C# C& L1 d
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      * u( w8 T4 k$ I- j+ i, y1 l

      7 r9 ^) k  j+ F5 X; m9 N

    • & p, W, U% e" \& A- x

      * A3 L; B# U4 o0 F) x   else  ; ?1 i/ I% b( I  f' s6 G

      . w# r! n8 L' f: F( x

    • & M6 J; z+ y$ R
      / |# v/ `7 w9 @4 N2 Q' l
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  3 s8 q: B) n2 M9 Z
      ; P; R, A5 O& l6 p3 y
    • : A' \* E: R4 ^' C  c- l. e
      ; g% N8 r3 K% m
      }  
      ; v% H4 g" @" k" q0 @' S6 T2 `
      0 X* [0 b( J& `; C1 X+ s, P

    • - j9 d. A7 `2 z1 O2 @% {1 L

      4 n; L) e- D$ a2 X! M# k6 q/ H/*进程PCB输出*/  ( N* _+ ~3 [2 `4 R4 x

      ' W  n& K. b" f3 s

    • ) u) N& K& R) k! Z% z/ I
      ; P, B' v8 ^/ b% o
      void prt2(char a,PCB *q)  8 {) e+ f' ^+ A7 b  j

      1 {/ r* g9 O2 t. r" B

    • ) `9 ~0 a' T' p/ T! i2 K4 o; m
      + L8 a/ o! X/ T( X- U4 g
      {  
      1 b/ c, Y9 C& _4 z( \3 O: w2 e

      - U2 U2 U; q! `7 h

    • ! W, I. h- p* f( S0 [
      & u/ Q5 Z4 _& {- d2 q
         if(toupper(a)=='P')  /*优先数法的输出*/  8 I4 B" F# Y/ x- ~& n+ e8 o2 k
      % ]3 W0 o& W& A: m

    • & F( D7 |' N1 S# @, D; K

      : x! {+ g1 \& k% e3 s6 R& J      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  4 Y  N- U0 t3 K  O. ?
      ; z5 u1 T5 T, M5 |# N) L
    • % y7 S/ N  c# R$ Z* O

      0 }1 `- j% w8 p8 H, `, u% [" g' Y       q->cputime,q->needtime,q->prio,q->state);  # M; ~" n5 B6 L: D! f) ~
      1 Y2 p, t7 b" L. V+ N3 b  F6 d

    •   u; S6 i5 ^" _5 [8 P; _( X
      - J& l  h% Q" w5 Z7 O* f4 Q
         else/*轮转法的输出*/  
      0 ?' e4 G; ~. ?0 [* ~9 R. l$ d

      " |2 b: f" a- B. G

    • + q1 Y, O' R/ i5 S! o

      # l6 G) m* ]2 o      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  2 ^# ]5 u9 J) w6 v% }

      ' ~# \1 x: u# h
    • 3 e1 k" ~- ^) c( f
      8 n7 w: _2 h3 z3 `
             q->cputime,q->needtime,q->count,q->round,q->state);  
      . N& \4 r: b& U7 }7 S

      ' P. E  \# q( A$ E/ Q% H

    • % Z; Z" p' _! V

      5 G2 X+ C, F0 g8 t0 s: `0 H}  
      & Y0 I2 n7 I/ n( x) h5 a

      ( C, N& ^* e+ b

    • " v6 Q! F5 Q) _: H4 ?

      , Z! P, m# B( `- Q3 w( M/*输出函数*/  9 r1 ]: i! F/ L) R% x: C
        j1 q: F" t+ a+ r. f

    • , j/ c8 W; k* k* B

      7 b8 _7 m" K. y- G5 |0 kvoid prt(char algo)  4 u2 k* k/ i! H$ r) w

      / `( J+ Y% _+ S, B/ A& P
    •   h+ q: s3 q: o: U" N, _. [

      % M# o+ d2 f3 n( I3 o{  
      * d! D& Y. v: r' g1 ?& d4 G0 U
        C6 `2 H7 }( e
    • 3 K3 J& T, p* v* t- L# I

      2 @3 Y0 U* \  @7 M9 V   PCB *p;  " Y% s! t, M7 L! J& f7 r
      5 I4 ~4 a5 h& J5 b5 K( M2 V) d

    • $ x& a) F6 L3 l

      $ T$ V5 m8 W' U1 T1 j   prt1(algo);  /*输出标题*/  : ?1 g- i8 F* b% Y

      : a& X% l% o, ~' R# a
    • $ Q, y& L0 j: x  d( R8 J, Z+ |8 l0 I
      ) m/ @0 c4 X3 }8 u$ Z/ Y
         if(run!=NULL) /*如果运行指针不空*/  
      0 y0 Y. u' I% Y7 _7 [
      , T4 F+ t, [, t  X/ Q
    • & v6 S- l! o: y3 S7 t9 z
      ) ?! K# }3 a) U1 \5 z
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      ' m4 E4 L# h" n7 j- a$ J3 u
      + E- q& u, U( @. b4 B+ ~& l; D
    • 9 d7 ]4 F- @& H4 D  Q7 ~- J+ Y" G
      3 C6 o$ K# N9 D( M
         p=ready;  /*输出就绪队列PCB*/  ) k2 J/ J4 \. h( ]& I3 ^) ~
      7 B7 G; e" K9 o$ o, u+ e

    • & K7 w9 |: ~; Z$ m: u3 a

      9 G$ o; A" W# Q& Q   while(p!=NULL)  6 t+ ^) _3 E( A$ w9 T

      9 b' x- {) i% L1 P* n! }/ Y
    • , R; k1 j5 g8 z% i/ N

      ) f' ^. |, @7 T0 ^   {  - `5 @; _- I, V/ a/ X. e: a( J, H6 ]
      1 f, ~- `' T: w) Z7 l0 }, T6 s
    • / n0 T1 X% v" e+ j
      3 {, {( U. u3 }" W' U& w
            prt2(algo,p);  
      # d% s) h( l* n9 P! e  D$ D

      $ L4 C. r5 ]2 W7 l; D6 L) s5 ~4 A

    • ' O$ |4 u0 T- ^' I3 U8 s. m

        ?6 n0 j' |5 x2 r/ H/ W7 o1 L: X      p=p->next;  4 m: ?' A2 d$ R, R" v

      + M( j0 m2 l" W( A6 [5 G, e& t5 d

    • 5 H: N0 q( {+ S5 M+ i; ^
      2 [1 w3 m0 [( c: H/ d( [
         }  ! y: T1 K3 h* v2 A2 i

      . W( ?% D3 P( c; A  s1 {1 {% m
    • 2 E; F( Z% w& o( u2 M

      / Y% A) T5 y( }4 @$ ~   p=finish;  /*输出完成队列的PCB*/  
      , X  C( I% k/ n% c# |

      , L8 h+ F" h9 M

    • 2 e2 D" U8 b0 v

      ! }4 d7 a, T& R  x, Z   while(p!=NULL)  6 O- L$ ~3 K% _( M, Y/ a

      9 l/ F% _, T  _. t

    • 2 y- O( {& e: P4 i# ^  k
      & c/ c0 S2 ?$ L* x+ s, Z
         {  
      % o& z! r% u. A  h

      7 B& ~, q" Z! t. m& h
    • $ E3 k" G) k8 K
        F6 S% v6 x/ \& `3 x8 ?
            prt2(algo,p);  
      & x1 `% E, A3 l2 I# i  e+ x
      4 G+ A" e; n% F4 w
    • 0 x% ]) J5 r" F( L

      - K" h6 R% J0 y; E      p=p->next;  
      : l. G) \% U6 l+ R, `
      0 [5 {6 Y2 V1 {/ R2 G9 ~

    • # X7 t* r) k. O3 G
      , C, j% N2 U: D  N3 [" ^
         }  # ]: p, ~) v+ L  H
      , c/ g  _" T1 O9 o  l
    • . V9 m+ f) Y2 ?& Q$ ?& Z& F/ e
      % Z2 h9 L3 L+ w; n2 h9 l( j" I
         getchar();  /*压任意键继续*/  5 I1 m+ `) i$ [! M+ ^/ `" c" B2 `0 X
      $ _) J; S4 @% H  z% s/ O
    • . [1 P- Y2 n9 N4 E
      8 ~% C3 k8 p. ?: n) B# [; b
      }  
      * e4 N) `' p$ _# o9 k: p

      0 K% F8 B: R( z

    • 8 A3 K8 l) A0 P  _
      5 t* h9 J: V* F0 B4 ^" N: D- l) g* h
      /*优先数的插入算法*/    ?$ L1 a: x! O" ^
      8 w! i1 w# G4 a, m1 \9 x1 \
    • # F+ \2 P# v# N

      & J  R( ]& L. _insert1(PCB *q)  / L0 V: c- s5 q$ R! Q* ~4 o  k
      2 t, B  W2 [% U8 ^- Y: V& ]

    • & q$ I' U( y6 c5 t$ u3 k1 ~
      5 D: Y2 \. D( S( h* H5 t3 y% s
      {  4 d9 b) g; A9 M- L( E$ D, s

      - q- |$ Q4 v6 a, z  h4 b5 u

    • # i4 H* o/ ?6 i* ]

      " m2 o1 D) P% n% z  k' T" ~   PCB *p1,*s,*r;  ! \4 w9 W: y4 e3 B, t" Q8 e; Z
      # z3 T( |! y2 G4 X. L
    • 2 r+ K/ |4 `" ]1 ^, \
      * a" `" O) Z2 w! V
         int b;  
      ! M$ i! p4 l% y: ]% C# v) V4 w# z

      6 ]! n. j1 t* ^8 @2 o0 l/ \
    • 1 J) w/ Y5 U$ G; D' _

      ( h( m- L$ C  v9 G   s=q;  /*待插入的PCB指针*/  ) V, \1 d' E4 H8 P4 P2 d

      & g4 U) A! V7 {+ j  C2 N; f
    • 0 C. p, g3 Y* p. d' `3 @
      + L6 Z7 R# l" W
         p1=ready; /*就绪队列头指针*/  0 r9 K' w2 L9 e8 {7 P
      9 z- o8 b1 @0 r% X
    • 8 e1 p6 ^$ B% l7 D6 b
      * _# f# G' Z  X
         r=p1; /*r做p1的前驱指针*/  7 [, l' z, R+ Q2 }5 |5 z' N

      # s1 K/ d+ V4 H! |. {
    • $ p. T) O/ z- m6 }! `  S/ q/ X

      2 U2 ~: r) O% l; R9 n0 {   b=1;  
      , H4 k9 h. j3 ~# @
      : O. o" `, t9 i) |0 u/ E( a
    • 0 Q" W5 A1 _0 y$ Q

      4 n( J+ W4 J2 K3 Q" S; c% E   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  + j) V/ \' c! D1 l' Z, X

      7 o0 D  c/ @9 v7 \# {
    • 4 K* `; j3 d- ]# p

      9 ]2 r* U3 v* W3 i      if(p1->prio>=s->prio)  
      , U; g$ i4 g% u% ?

      6 `+ }2 l* P4 D( \
    • + ]' n& S& Q% r# c/ Y6 f
      # Y( N. v  Q$ A! c3 P1 T' G6 }
            {  1 R- [; k0 r5 F5 k

      & t% A2 ]6 o; J1 I4 \4 R

    • ' p5 |& A$ M7 D9 |1 _1 G

      0 Y! g! I" e7 y. h: [" {     r=p1;  
      6 W- ]' L. d! K3 i( i

      . ~% ~3 l) ]- i( p0 C

    • 5 v* [4 H1 I& D- e+ H7 e  x
      9 ?, K3 U6 Y4 R; y% l; u5 E" U1 N
           p1=p1->next;  
      . |2 ~6 @0 m: \; D& Z

      & p" j+ W1 o4 |$ S( t. Y
    • 7 c! U! e! s5 i( y. z
      8 \$ ^( I; A$ \, V+ z; p9 Y( V
            }  + C1 w. R; e( n' d3 N! {2 e

      % w& f; X6 u; W
    • & A7 V5 }/ m0 ?0 w

      . M% T# a3 t/ b- L3 ~; c      else  + O1 b* B& e" ?' c" L' m

      * L  v  k7 t6 P
    • 1 Y8 A3 X6 V6 B& y5 A

      ' @: n% g! o+ D9 C3 _( g     b=0;  6 O& D; P, g% _9 r1 P

      ' ]; _' P  k" [: C7 q: r" M
    • # \5 L1 f. T, n  t; R  D

      1 a" f$ u8 p7 T3 e6 z+ z' }# `, i   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  ' a8 a! m0 \+ h1 S
      3 o$ Y* L3 j7 o3 Q& i

    • ( W9 U7 V. ]0 d4 g5 E
      0 P+ F: R# f+ |) F
         {  6 A- z4 ]# s* d3 x" }

      # ?+ @) H8 {, |, ]- C( c+ ?  q, a
    • % o) u- A- c" P- }6 r0 g
        J! _3 e$ v- m9 c+ g' j
            r->next=s;  0 r7 O/ U- X; O

      . x) V# ]8 C2 @' C# x

    • / H' @9 ^4 \" `  S, f1 D! m
      ' O" `4 x; Z( w
            s->next=p1;  0 o; M" L0 c7 y0 _7 K

      2 ]1 ~4 B1 P! K  f. B) z
    • ; |% ^8 |6 d/ I  x( _4 t' |- E; e

      $ z- S& |# p; N* a& x* u6 a9 s   }  % H- l. U+ w: |1 s- c3 Q+ Q

      2 m, \& j5 [" H5 n! j/ B3 k
    • + Y$ X$ o! N/ }/ T

      ( M7 C( E# D& O1 c- Y" O   else  ( `8 q( m9 w4 |. C- J1 s

      4 q2 w6 \; t* w. S

    • $ }1 D8 a- C0 y% I$ N2 [1 a! L
      + w: h1 Y$ w5 o5 D
         {  
      / w; s& e: s( h# e# `7 ?' p

      . E9 h$ H+ a- i

    • ; ?" h( w" H( r5 ^5 j) ]2 D
      5 a4 ~7 e. P+ ~* ]3 J
            s->next=p1;  /*否则插入在就绪队列的头*/  
      : X; b4 Q) p7 m3 w0 q2 l; z
      9 k  d1 J2 [' R$ F& m2 a  G' p

    • 9 \/ t5 X$ R; ?4 @7 q
      7 Y* R  [6 l3 v
            ready=s;  2 I* W. P/ j  p8 d4 c7 Y1 f

      5 c% B. i) T; f8 H; B

    • + m* g" m! ~6 Y/ B' o. y

      " p$ P& {3 f! M" J. \) A; X, [6 |   }  
      . Z8 R; Q5 t9 Q4 A" d, [% ~& h
      " P8 H0 `, c% X, k

    • 6 E+ [1 w* y) y# f. U: X. D+ ~' j
      9 w+ V8 r- f. ^% c$ @+ m2 V
      }  * y8 t6 d/ g# R

      7 b9 ^4 h0 q' ~0 ~6 A
    • ; x5 U0 a/ ]) ]

      2 r: Y1 b! l1 D* i; s/ B  h& y/*优先数创建初始PCB信息*/  
      9 G( T8 e$ s3 C% f8 [
      5 O# n+ r' d* }9 d; V' q+ K

    • # e7 {( P8 Y0 ~" _" k

      ) E' G7 Z% ^. D7 s8 evoid create(char alg)  8 }. E+ S# x; S
      ' X/ q! }# x& w# ?3 T* t

    • . x6 J( a9 F* K( p0 v+ t" E
      ' D9 w8 G, ?$ e; ^* o) H
      {  : W' m4 F. g* [! C7 H
      % R9 Y# A. p" z8 k4 k! o
    • . T; D, o& t8 i6 j7 t
      9 e4 D7 l) G/ ?0 b
         PCB *p;    v( L2 i5 l4 a5 H+ l& v
      6 }+ w8 v7 x( g1 O9 q7 V% W- Z5 u
    • : b( v$ S% p) k( W; t" R+ R

      ) j7 e; n2 P& [. w   int i,time;  , J6 D0 _- x) T8 I) V0 N
      9 d8 ?" K5 M" p! l. K5 E

    • 8 t  R: K- U1 y* V

      3 w' `% p& r7 s; r& p0 |   char na[10];  
      7 P, t4 P" T1 ?5 s

      ' e9 w; G( r% b, M9 u

    • ) O3 w8 D4 q. b- w# G) H" V/ K

      / Z# Y# n  Z$ _& X) A   ready=NULL; /*就绪队列头指针*/  # ?0 y1 _/ A) e' I+ n! ?  \

      " M, d, j9 C0 A
    • # }% n4 N. D3 C/ E+ ^( \
      & O9 ?) w( N& V0 y; }# V
         finish=NULL;  /*完成队列头指针*/  9 D( J$ L/ t( G  ]! v
      " D+ w% Y; H0 I" x; J# c* D! ~

    • 8 i- }9 z2 J' _, I# [9 L
      " f6 Q% x1 H: v) H9 q
         run=NULL; /*运行队列指针*/  % c4 D) A% k% {! f+ o" P' r' F
      8 g- V! ?; V) _( {6 r8 W  n7 z
    • 8 X6 H5 L% D- Q
      - @4 Y& x* B0 z% d( V, l% _
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  2 y% i+ v) R3 a+ G) b7 {2 ~- o
      4 r, D0 l4 t2 B, q

    • 6 l0 J% d. s( J/ I0 H5 p- x$ O

      9 h  V# R: {- A+ w7 B* j3 r( }' j   for(i=1;i<=N;i++)  
      * u2 b. Y  c3 }; K4 I
      5 x, M' v" x. }* S! W8 U, ?" q
    • ! ?; K% ^) i, c! g1 F1 f
      ! m% b( C7 e% n) q: N, p5 _+ s5 O
         {  
      4 P  z% _) g1 W9 R6 t

      1 \% T3 H2 a7 A. `% j6 L" ~: [
    • * X2 B8 n: t$ _+ W+ r$ }$ \
      ' g2 ]2 v& l8 x" _. X  a
            p=(PCB *)malloc(sizeof(PCB));  
      1 p8 N* D% [, ?; B8 g
      $ A4 a- t6 j3 y; z! K7 L" K6 O
    • , N6 z" E# a# D8 \" q

      # o" ]( I5 n  M5 G8 d8 Z* H$ I      scanf("%s",na);  
      4 o. V+ J; D+ F, T- K$ M- Q- l
      / a' O. j' ?# |$ z3 a5 a5 ~1 s8 }

    • % A3 M$ p5 X1 t/ @0 z2 |
      ( J- V2 n/ a6 b& ]
            scanf("%d",&time);  
      * S* z- T$ y5 I! v! H0 q( N

      $ u( H' p# f* E: R% k
    • & p/ f  R( {- H

      ( H  \, E0 t: i      strcpy(p->name,na);  
      0 f; J! w) N* [" j
      7 E2 i) y; t# W4 y3 N8 O5 W: C

    • & |- Y% e1 m/ l* d8 B* a- t

      , V; ^3 E2 [; j/ X      p->cputime=0;  
      + z4 H& ]* G  g7 o( T- p" z7 J  z' V

      4 a5 I/ ~5 ]. S4 S% a$ A" @5 B

    • 2 S% r5 N, K% a1 \: R0 r8 h
        o7 r7 e$ D) S0 \
            p->needtime=time;  
      4 k. Q2 N  I2 W  Q. B3 B

      0 O) C  h3 ~5 T
    • ; Z% C# d4 P9 `$ G
      * U0 q3 S# l$ q8 c( O
            p->state='w';  
      + K- J3 B+ A% Y3 J+ ?1 |

      ' v! o( j) Q5 n6 t  O( w2 O
    • 2 O8 J, s/ x9 `- H* V
      3 Y2 Z: R$ v! W. U0 v+ o
            p->prio=50-time;  
      ! L/ L1 r) _" V0 R
      ! ]5 K( P8 [) w; \5 H: O
    • , h) V- X! x! o
        O+ {9 I4 |; t3 T: A+ Q$ T8 m
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      1 J! ]3 ^3 X0 r1 ^; x1 z& ?

      8 |- x8 z4 Z) E- ^
    • 8 X* h- x% E( n* ^) Y
      , b) x7 Z4 q1 w
           insert1(p);  3 A; I$ M/ L0 j
      " n( k# @  E7 E/ Y( _
    • % u' \, r" F% B" o* Y, z6 }$ d
      / I  ^4 c1 z/ c' {# Q- c% Q
            else  
      " O5 t* c6 t+ b6 f# u# g& B
      ! g8 F* Q. c1 X. ?. W' v. s$ i

    • 9 I  u3 r2 B/ p; J, o6 o6 S& B
      1 v, e, |0 M6 M% x: ~
            {  
      : ?" J/ t& A' h( T
      ) w( c/ C! j, t5 V( R5 c. S
    • * p1 u+ _% x1 h( I( @6 i

      4 Q7 A1 i7 l) D3 R, \' _- z! M     p->next=ready; /*创建就绪队列的第一个PCB*/  
      1 @+ V1 y- o! r4 b8 ]0 R

      1 t! b  E) t. I# F
    • * N. i5 H- R# e+ T  d

      1 D6 a( v6 V$ r* `     ready=p;  
      ; @- h! \( n- @7 [; [
      , D. r. u& j, ]/ Z

    • . k- l, {5 y* d3 v

        ~* V, z6 P% Q* Y      }  
      # U& g0 ~5 Z! l7 ^/ m  ]" L3 Q

      1 E' H! k  G6 I* O

    • . ?$ F6 }8 g' |' i7 k1 p

      " C, z# n/ ^! m, ]# `" Q) q2 E1 r" [   }  ( k7 f1 z2 D/ E) n1 j
      , P" H5 H6 q0 a$ h
    • : o' M8 Q+ ?9 [, @  p( ~

      9 Z3 S. f7 O; H   printf("          优先数算法输出信息:\n");  ) ?. h. T5 D( r
      : n" e6 i; u5 z9 h+ o! Q4 a
    • % s7 \9 q. e6 P6 a5 Z9 p. i  M

      $ p$ ]  P: W  R$ B4 z   printf("************************************************\n");  4 Z' U8 I; y8 M) C) T; C

      0 D4 Y! T  H2 n2 f
    •   o" u, h, h- i1 r' n
      , @  N  \! F% [8 g5 d) u* @  B8 w" p
         prt(alg);  /*输出进程PCB信息*/  5 \" t0 H; R3 f
      ( `: A' [# D* S2 o3 C* X. Q! K! n1 x

    • ! s3 G; j+ @) i; k  U

      * s0 M( s# i" }$ N" |. f, R1 T   run=ready; /*将就绪队列的第一个进程投入运行*/  
      ; T* e$ z( H3 G! U2 [

      ( m( c6 d: F& D6 \2 C! G: j/ d6 g* ^8 J
    • 1 j7 Z) K7 U3 u6 C9 {' }
      " w1 s5 {$ J# g6 s9 y8 s8 O( |" y
         ready=ready->next;  ' @% |7 S, I* T) A
      " b" ~! c, m5 o. x' }
    • 5 _( s8 |2 J" a  H  M

      " R, U( |3 D- J' B   run->state='R';  
      7 Q' e5 Z. |: S. \# {- h* |
      5 C  _. s  w7 U7 i, c$ m

    •   g3 Q/ H" G5 i7 v2 K& {/ w2 e
      : K/ s6 P7 I9 Q$ \8 W5 n
      }  " A6 K) \+ m0 Z6 g
      ( W3 }3 J# M& G% k3 v

    • 8 E1 [, h" N: P9 U0 ]% H
      . l% A" O* \5 p& ?; F
      /*优先数调度算法*/  
      0 H/ k" |2 v" o

      0 n& V) L* `9 M8 z5 o# j. b

    • 7 ]' A* ~9 ~* z: q" e  `5 A

      # @" D7 v8 H/ V. ^9 |& l' f" j( Vpriority(char alg)  % F! V7 J! K4 n; c4 ~

      0 g9 O. A* m5 o! n% n

    • * S9 Y9 ~/ A5 |
      2 \# ^5 Z( E6 {1 X. q9 w0 ?
      {  
      ' c1 R- X7 M9 Z  e# a
      9 _1 U% j% \6 R

    • 6 L) [& O7 u. o4 `3 z4 g
        K0 x  p0 U1 w3 I
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      . B0 l% d. g' X3 j1 R
      6 L  B. e- |' x( V- V( M
    • 3 {( P% f, m, P

        k& Y& j. Z' S6 d. [- h% p3 @   {  + W1 i2 M. W0 X

      + v6 l* C" k; l  E$ w

    • 3 R9 t* a; ^* ]* c, J

      9 i4 }; |8 ^# _8 m      run->cputime=run->cputime+1;  ! D. `2 f. J, [+ r" `

      # Z6 W$ J7 N$ F5 X# M
    • / I9 T- I* {  W; A, L
      1 c4 _6 S% {) M, t: B7 _
            run->needtime=run->needtime-1;  % q# K, ~# p, Q8 ]% O, {- ~9 H* g

      / n. w# T5 {0 v

    • 8 E4 e7 M* v( l. o0 |# [
      6 L& |( b  V) l# `6 R0 P- t) f
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      ! F" N- B5 _) [0 W) `) C+ \: U
      : c- `- k( g; I* P7 Y
    • 9 a+ ?' M' _' @' @

      + N6 F7 a# A7 h' V5 @      PCB *p;5 O, ^! L; ?) ~9 A/ P
      2 z2 d$ W2 |/ {

    • : h5 Z! j; s$ C- K- B

      - J: u, }4 U# f# Z. N+ w6 J      p=ready;! t% a% q1 |% g

      ( E- }6 _5 o/ w7 U
    • 9 f4 c  M% L1 ?, K; E3 E( w

      5 _9 d- W' e0 b! v      while(p!=NULL)  
      # Y1 U1 y! i- `, p3 P

      4 w( ]0 @' w/ F. O

    • / b  [" |3 Y5 g- `+ i) c( l

      " F- a, M" W) Y: P# B      {  
      . C: c% K+ B+ S

      + P/ j0 y2 {; u. M" c

    • ! f2 t1 _+ w1 j; S/ U1 N- N( D

      + X5 B2 n2 H( p! N$ O0 K7 ~' S3 n          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      4 B3 d: P0 F# r# H0 R; `
      * \- o2 m, \" N" B

    • 8 w7 u! z0 E; U: b

      1 x- R- b9 W, K% n0 Q. {          p=p->next;  5 Q! q8 K: l; W4 ^8 V* k

      4 c# Z- Q& u* y0 l. y" I

    • 9 B/ t# Q3 S( v4 j5 w  m  q. y

      - M" D+ Q9 |" `9 O( V; E      }  
      % P9 P- K: S+ T' {

      7 T1 F; D! o7 K& E% A. l

    • % u4 h. L1 P! P8 B

      3 A1 `. z5 g: e9 S* }  v' R' ~      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      0 u* }3 d% u2 P: U# t! L

      - l4 }5 T9 D, R; k

    •   I' K1 ]4 S1 N3 `3 K9 N( ~- j9 R/ Q. Q: c

      5 W5 f3 A& H" l" d      {  ; q, V, ^9 r% t* [1 k
      . ]& F; X$ h. j8 I/ A
    • + o5 M0 l# `6 o. }7 [& Z
      $ Z  {! f- l2 ]1 v/ J7 l
               run->next=finish;  + T2 w) M- a& M+ L

      5 [9 M. m" ]1 q, z; W% t1 S/ M
    • & k% y' S; g  d! a, A9 b; n, E: f

      3 R% @- E! K3 _0 C/ d) N- I  y( n8 B         finish=run;  
      0 d! H4 k6 ^4 L% [4 m* d
      6 r4 O; ^$ Z3 d5 N& u. F
    • 4 P3 |# `1 q6 n9 l
      " b: V! q2 @4 z0 z' d0 o
               run->state='F';  /*置状态为完成态*/  
      - m& _' U: o- w+ P
      & }8 B/ t, J8 Q) D: x
    • 8 J. b2 c, i  M, O- t6 K2 R* x
      ; v- I6 D& Y& ~# e; }
               run=NULL;  /*运行队列头指针为空*/  
      + W" V; I; C4 t) n; D( L- r
      3 a9 e3 I8 n( ?* V( E* X

    • 8 v' ~$ L; Z  \- i4 O0 `

      " n2 k8 n; |$ x9 [& Z; F/ b         if(ready!=NULL) /*如就绪队列不空*/
      4 D, [6 z3 S  t& L& S4 t

      & N- p8 f! _7 k! a9 U6 z
    • , C0 a  @2 l6 u; U! _4 H4 ?2 O

      / c4 C8 g5 G3 @& W* ^* ]/ g         {  - k4 m/ X2 r1 e7 k

      8 E5 s) j& v( K# A1 y) V
    • ( i& e. I# g; u! Z0 |

      , Y6 {9 J, [( T3 c! _            firstin(); /*将就绪对列的第一个进程投入运行*/  ' v+ |2 y2 e% Z& |& i

      5 b9 \) p& K( d2 H, A3 w' w# @: n( A

    • / Y8 g. R! Z) U# u" N+ W5 A
      4 H+ v8 m9 n. L* O$ b( J+ D
               }
      * G9 K+ f5 k! l) z' T) D& e4 N
        @; Q3 u- S. M" w  i

    • + z# M9 s% D- U& C/ y
      2 o- j$ i/ k* W5 h% X5 T" j/ \& H7 ]4 q
            }  + A3 l& s0 P" p& _
      : X9 x4 V" N4 i

    • " C8 Y+ M: d3 j+ m1 A3 }  J

      8 l# {, P% T4 G1 Y  c# @7 `      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  ) i% F- |* r9 D- @4 J$ ~: H& G
      7 j; K. w2 b& `% b( H$ B& G
    • & p2 F8 N; R( m" G7 Y
      8 N! r4 \. z/ e: y/ R
           if((ready!=NULL)&&(run->prio<ready->prio))  
      4 }! t/ X' D2 a+ C: v' s5 i
      4 I2 q( S3 G5 Q9 g8 z( f' O
    • & q# S0 H; \8 N+ \. |3 q! ~1 x
      ! c$ ?1 C5 y2 \2 T4 r4 |; [
           {  3 c9 K" C( j+ f1 c
      0 |2 {* I  R# x/ ~2 [0 b2 K7 m
    •   j* r7 ?! X3 n8 i+ X! j
      7 P5 |2 q& B: j0 h
              run->state='W';  ! F. N6 U/ a1 J8 f# I5 i9 Y

      ! I) T% E6 L& w1 E- |1 f7 `% F

    • ; h* t$ {) I" n  O
      8 B+ Q/ K: L0 R9 A3 B
              insert1(run);  
      ( z) u5 `. S* {; R
      7 O  \- W3 L0 ?. g* ^% u2 x
    • 5 i0 {8 `  U. h* M% Q
      % G( U3 V( C- }3 W
              firstin(); /*将就绪队列的第一个进程投入运行*/  : u6 o- E/ s# U" {, y( I

      ; D3 K3 ?* |  c' v

    • ; ~4 s+ o' P# u! A$ H" e

      7 v* n1 m6 ~6 j7 D& @- U     }  2 V5 k8 R' P2 p7 O2 b! J  f4 t

      / L: Y7 z- e2 J1 c5 S/ H

    • . }, z6 u6 h1 b& a

      $ W/ `$ H1 k8 c4 V8 Z) I& V      prt(alg); /*输出进程PCB信息*/  
      2 B* _: K( y! F, w' \+ Z1 x5 D

      % o" ~! N( x. E+ W

    • # ~9 S$ e- J" u3 f

      3 i: l1 b, z* P- k8 V8 ]' {   }  
      3 `. F& e9 V$ Y& ]8 ?, b
      3 m/ G4 W5 r+ O) N8 z0 G7 s! c( A: h

    • $ Y' m  g' h+ d) h: o% ]
        [" B7 ?7 Y9 }" q  {% V, K
      }  9 _0 a+ B7 {( x
      ! ~0 C% d8 x5 K$ {. ?2 |
    • # q0 ~4 i$ w& ^' E, u2 i: Z

      # @  I3 p  A' ?+ G6 A" q4 n/*主函数*/    |! U3 h) {( Y: X. t
      ) R7 c4 n2 N8 T& ?3 ]% g4 S- j% ]" V, G
    • & @5 S; E: a. q. N; k
      1 a' p  b+ X. n: ~/ Z; g& Y
      main()  
      3 d2 H. Z4 \' T$ y; k

      5 [  y  c' r" f, m2 @5 p' A9 b+ S

    • % y( p+ V; a( o
      - i+ K; B9 G6 \0 M1 U' P3 S
      {  
      " _- }5 u' M7 c6 K3 M
      0 K( y& I9 y* {( X& D! g; t3 J$ _9 R
    • ; d5 B4 G$ @; d- X; C' G8 i6 n

      4 G$ u( J, ]9 f" T   char algo;  /*算法标记*/  
      1 B" E3 O6 J5 h6 z. k) A
      ( l6 X  E. `  B: v% y3 H
    • 0 Q1 S9 G) Y' f$ C, H& ?9 |

      ) a3 S: g" F3 @$ |* p' }, |) L$ o3 z   printf("输入P确定算法:优先数算法\n");  8 j$ A9 o8 a! w) X
      ' U+ v* s5 s" {

    • & s! o! D" f" K9 A9 d; r
      0 @6 s% a1 u9 F; a5 f) {: \
         scanf("%c",&algo); /*输入字符确定算法*/  
      8 b8 y7 U7 |% z# l3 t$ f2 v

      ' E( m) F6 U1 ?) I; |

    • 4 c! x- a& u: t8 g: k

      * ?+ c9 |) I2 |/ K- |  R. D3 _( _   printf("输入进程数:\n");  ) e" b5 J& U( o" Q/ n& s+ t. K3 s
      5 N, n. U! D: y3 J6 l% [$ ?

    • - J# e, w% @$ y& D

      ' X4 @) U2 L3 l* e: `   scanf("%d",&N); /*输入进程数*/  
      " W8 [/ E9 m) R! v
      * R" q6 `' x+ u' s

    • ' w' w4 Z; J& y! |

      , k' X- S; p" K0 b( i8 t   if(algo=='P'||algo=='p')  
      . e) ]5 k* u9 Z3 T! `0 h

      4 n6 H+ W$ x: ^) N1 l

    • % C* t+ k" U) x
      - O" T" Q5 G9 B2 x6 K. ?- k" i
         {  
      0 _" G+ n4 ~5 s# S6 U& E
      0 C! ^- q: k' [) @6 {
    • 0 t' N2 B8 c3 u8 G3 [0 A" d* R
      ; ]) w; f: p0 g
            create(algo); /*优先数法*/  
      3 U; X5 u1 \( u8 f8 L: b

      2 p/ X; v8 r7 }" r8 x1 T+ ]
    • 5 @9 V$ u; H8 i6 v: m. c+ Q& ^

      3 B/ D! W. n2 o8 m6 X5 E& C      priority(algo);  
      7 D' [/ g) m" b$ w7 {( @1 K

      6 ~/ U3 z- R  I

    • 3 U9 _8 f9 o5 n* z1 A' ?7 F; K
      % g4 n; j  _: [& f
         }
      7 Z' t& O5 g# X$ ]$ |3 L0 l& G
      ' P8 C4 {, F8 o" e
    • ; u" ?# ~* M! y+ U
      * @' O0 @9 A( ]
      }
      * v. Z, I9 ]- U9 `: I5 w
      - Z; U0 f/ \. {% W
      5 C. C2 |- u: K. n) J; H+ k# s


    0 s/ B& j& C' j9 s" h! y输出结果:
    5 d* Q/ R* C4 W0 U2 l


    / o7 Y2 P- `  p& B4 e& M; q) f! Q原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    + J: t& I. X1 ~. z
    4 o' e, y" B( x* G6 l
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-11-1 01:16 , Processed in 1.066639 second(s), 51 queries .

    回顶部