QQ登录

只需要一步,快速开始

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

优先级调度算法

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

5273

主题

81

听众

17万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 15:39 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
      S% q! a, }0 {$ w% Y. A
    优先级调度算法7 |' c% r, @4 @; b4 z, N& Q

    算法介绍' c  q2 L/ z8 C* r
    优先调度算法的类型(用于作业调度)4 r, _" t" e- \2 _& [7 {1 S) B' T
    1)非抢占式优先权调度算法
    - A( G7 r( T# W" P1 `. a7 l& i系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    , Z& I$ q& P  u& M7 ]1 z2)抢占式优先权调度算法
    , w- s7 r4 p1 w* Z8 v只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型! X! x- v4 M" F& t, \2 N0 g
    1)静态优先权
    - |, O) Z7 g+ V& G静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    ( R  J9 B% @, }  @. q6 D$ N

    2)动态优先权 1 N( n+ c2 e+ q% `

    算法实现

    抢占式动态优先权:

    - G. X" G* ^. A3 E$ S4 }9 s; y
    PS:本人认为非抢占式静态优先权没有实际价值。

    • ; {; k  n9 U0 G8 J. `+ h$ {
      * Y) s0 q) p$ e$ D
      #include <stdio.h> ; e" v+ _3 J0 p; D0 d

      4 Q% O# h1 i4 e3 x! l
    • , V- {& s2 Q) p! [- e- ?( V

      ' z. X. R# o% C8 E# m' Q#include <stdlib.h>  2 ?. w6 O/ ]& S8 P, `# k4 a

      2 Y1 s) Z. {  ?+ J' |2 u1 z/ U6 y

    • ; }% |4 @8 d/ U9 D, m

      & q  s. c4 ?% O$ @: }, y% Q#include <string.h>  & w  w; G/ U1 A

      6 R: c( v2 }3 [  @. E

    • * e+ ]  q% Q6 L/ u. V
      $ X& W* S3 ]* d: `$ a, B' r
      typedef struct node  5 h; p' @, h/ q* p5 t* O+ O

      ; b. Z; J, i* j

    •   H8 U0 @8 t. O8 F8 v8 f

      ; S! o* y/ Q' y8 g{  ( P8 T( Q$ R! W& v9 f

      $ P) K$ K4 \% v
    • 6 y# H0 J; Z8 |* X

      2 E. k) F, m* h* a$ f# S  X   char name[10];  /*进程标识符*/  
      ( t4 Z2 b: W6 a+ M+ ~
      * x& V1 Y7 ~) t, d) G5 ?8 k  Z& E

    • 6 W# }# F  Y- Y' Q( k1 C

      ' d7 X/ O, X; Y" {. }5 b   int prio;   /*进程优先数*/  / h, o2 K5 a7 r' b
      ) G; G& g# _4 o! O: a% D
    • ; Z; [" f2 G; r% X4 b$ D

      + V0 o' i& j; n! `$ c' {4 S+ z$ c   int round;  /*进程时间轮转时间片*/  
      " w, c9 I3 x4 Y3 d$ Q$ n
      3 Y' m7 u; M6 S# J, ~& |

    • * k4 _9 t6 U! Z" x& x
      % Y6 q+ Q+ x/ [( C$ b7 F- F
         int cputime; /*进程占用CPU时间*/  3 ]7 p, L# c) W5 K5 o
      : K3 J3 g4 i5 ]6 O4 X- m1 Q
    • 1 ]; o! Q1 o5 e0 i
      $ r  s+ s6 k3 `/ Q5 }4 f$ n
         int needtime; /*进程到完成还要的时间*/  
      & x/ ?% h/ O. Z3 _& N
      & M4 ]+ ~  v% h1 n9 @& r

    • ( J. F, n% T( f7 X* K$ H
      4 G% l7 T, ^# Z5 Z
         int count;  /*计数器*/  
      5 f* k7 h) S0 u. D7 R/ H
      ' v: D( u# P# x: R

    • ( {# \/ q* q! J% `
      ' b- }) T% b! ^1 V: r
         char state; /*进程的状态*/  
      8 P2 h# ^5 A0 M2 a' M9 Z

      , ?1 i' e0 |  m$ m& ?
    • - C, S2 Z' ?4 g$ |- |: N

      + c- \" x" y( x, K) j   struct node *next; /*链指针*/  
      + I- f/ ~" W. j+ \1 g' X

      $ h* F+ c! d0 n1 [( N2 T3 w( }

    • 7 T3 e2 T# g0 D& }
      0 m4 y- m* x9 T8 F" `, V- _. ^
      }PCB;  ' P3 g/ H% A  |& z2 e5 W0 Z& x

      : j  L! z7 c2 F* N3 l5 {

    • 7 C9 P/ h  i2 ^8 o4 W3 N
      5 I" ~- [& }' I6 I( H: _
      PCB *finish,*ready,*tail,*run; /*队列指针*/  
      / p# H, _6 S/ w' k5 ]
      . B4 z! I$ D: k5 O1 I
    • * d9 S0 Y4 u4 D" {  s& ~
      ; d" z2 `2 R7 Y+ j
      int N; /*进程数*/  
      $ N2 J" V. Z  t0 Z9 `

      ! o1 t3 n$ W2 u: p0 O. m- ]
    • ( J! e, A7 }& J; p( j

      : w2 o& \- _" A0 [+ V$ L/*将就绪队列中的第一个进程投入运行*/  ; ~& T) q6 I3 d; Y$ a3 C( i" x& r
      ! P8 l; k& \3 B% }% ^5 B
    • 8 ~6 D; r8 P4 y* J9 m

      9 J2 m, t& ~* A, O/ E! wfirstin()  
      % H, C% Y1 F/ ~
      3 {, e( K- }  H' d) B+ N, h
    • ( c& A3 j9 G2 Q" m1 ?6 k# r2 U

      2 ^0 g( a$ T1 u- K) ^) q) w5 M{  
      " v2 ^( U% Q( Q+ E& Q* p$ i

      1 t* \! g1 \1 a/ C+ x
    • ' I6 F! f; t( R5 Y+ X

      ) D, E  e) m9 X   run=ready;   /*就绪队列头指针赋值给运行头指针*/  5 t% c! T: v" A
      3 o, z) |- b1 }* @, G

    • ( s5 `  _# f* i, L, [: I

      ! h7 D' s$ c4 ?1 ]# Q5 q   run->state='R';   /*进程状态变为运行态*/  7 J. B  K7 @6 G0 w
      4 J  E. {' x9 e
    • . U- P+ v, _& a5 t7 r" `
      3 `9 ^$ u2 J3 o: d# c/ D/ ]
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      ! S% \  Y  N4 C) g& B. l
      7 \' e6 w) i3 Z  e
    • ( Q8 Z3 R0 D. d9 i" s9 [: h
      8 U1 u9 E: a8 B
      }  5 u3 d# d% {/ c9 h
      . ]/ e5 C/ Y6 H! C

    • ' E; \. a, s7 t9 H

      : D& b4 x6 d# y' C# T/*标题输出函数*/  
      1 t7 @! x9 H$ M8 z3 r1 Y

      " P3 n' E$ @) T

    • ( j! A8 z  e* q0 q' ?8 E
      / R& s) n/ J6 S: Q
      void prt1(char a)  
      6 J7 _) n* Y4 k) `

      6 D# J% T" }) w. P, H% Y
    • * ^* c* O; |; Y: K

      9 A& }# @- Z! v" p. L0 d; P. l7 z{  
      4 g' m+ n; H, h% I# _

      7 d. }) B6 ~' c) v& X4 }1 |/ t
    • * F9 Z6 X2 b9 D& c; @1 t: M
      ; N2 z$ n6 \5 e( R. |- e
         if(toupper(a)=='P') /*优先数法*/  0 j# @  [0 ?4 [2 H% V
      & V) A- w6 N! w( a% c
    • / Z2 {* @9 H& U5 r
      + C  O) j2 _( c; `6 j9 y
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  2 n; C% w3 I3 e! ^; }

      1 H1 A* Q6 U9 y# e2 C* j( F0 Y
    • ' D: a% k& K8 e
      - k) o. q% Z( z2 p4 m
         else  $ K3 b4 w* w" a6 @

      / }% G0 l: |  i1 Z- {
    • - e2 U5 x7 c& O5 y' }% E
      & Z# \, |3 @# k: y6 J8 d8 G
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      ' `: Y6 Q9 {: N

      1 h$ W' N  P) j) z1 D8 b

    • . F9 i' v& \6 ^3 a6 A0 n# C$ a

      . R2 r: t- ^: L& w0 d}  * _5 Q) Z7 N  H( j: C# I

      & W; H" I2 k3 f# K% h3 p  T9 i

    • 8 H) X9 w6 T# `

      8 Y' ?2 P% K, R8 h' c0 P/*进程PCB输出*/  
      7 ^& d) I( k' C
      . P: g4 p- U6 n2 L" f1 |- P

    • 1 u5 b" [- L" [" D* K" k1 a. u  e

      * h; A9 n; ]0 a9 X! Ovoid prt2(char a,PCB *q)  . x; F( g6 s% C6 z6 n

      0 Z: ?6 J7 X4 q2 p. E* l$ D& t
    • 9 }. I" S! j7 A

      # ~+ T2 {0 n% l! v3 |{  
      8 u9 T$ O4 _2 [

      3 `' x+ Q. _( ~

    • 7 r. @: c# i: r5 T' k# H: F

      # f# b2 X6 q$ g  J1 a  @0 C   if(toupper(a)=='P')  /*优先数法的输出*/  
      * u! Q+ i2 I9 o0 I9 f' n
      : {- o' P2 T5 T7 E$ a

    • " G6 w, n! u! O+ N0 m6 W

      . t9 r& y4 Q% n! H9 ^; Q      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      & u& `3 ?# L% W
      ; h# p. n# J2 i  c) @& V4 _2 r$ R

    • - n8 V/ U& q9 O; u0 o
      ) V9 S& k$ J* G! D
             q->cputime,q->needtime,q->prio,q->state);  
      $ G9 d3 {1 Z- j+ A0 X$ E
      4 e1 `( O7 f) c1 o7 R7 G% ?
    • 0 u- a8 t* q0 M# d' q* A, y4 G; c
      ' `! ?- e0 u4 I1 i) k+ o
         else/*轮转法的输出*/  / [; b2 v  m" l! W+ @* A
      ; M1 _( T! e2 r! u
    • 1 D; i! D3 @5 j+ F/ P

      / k7 h  n$ M! S; h# K$ b9 ^      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  " _, K8 G" U: T9 M7 M. c) F. o
      ) w# L/ k$ {6 Q: F7 {% C+ W( O* |
    • 7 }/ y/ Q0 {& t, }. Y  Q. O
      ; S$ \. o9 R5 @  V
             q->cputime,q->needtime,q->count,q->round,q->state);  
      ! D- b) O- t# i+ @

      % M" V! @# P3 d7 r7 d

    • % e4 T* n$ v' t6 A4 J1 r

      ) E* y) D2 d1 g$ n}  
      5 m' l: P5 D+ \' e

      7 b( a8 C! i7 M& X9 L
    • 5 j1 h! j: b. D1 P5 r3 U

      # ?8 B" M4 O8 R2 G% O( w/*输出函数*/  
      & y- u5 M1 Y' z9 t, s: Z7 m
      0 k8 N1 c' h$ j$ Z2 J, |
    • 6 V7 B$ E8 m1 n3 u

      ; M9 W  Z  s) Gvoid prt(char algo)  4 {* ]4 @/ ]- U6 y' x2 F

      ! k3 [# ~9 c2 g
    • % ^* _' Y1 L' U0 L% X
      % S; Q0 g  Y; C5 @: w
      {  $ b4 c$ s. d+ w3 C
      / E' n5 d. i  S1 S

    • 6 z% f8 v: S; h* p$ M( d3 p
      7 q: T& ]7 V* @
         PCB *p;  
      ) ]& a8 x% n; O9 U6 T. Y6 W

      $ B5 T/ F4 Z- Z9 {" B$ A0 C6 d
    • , b  \/ W7 p5 b0 M' }3 K

      5 \/ I) }8 p+ Q- x3 d   prt1(algo);  /*输出标题*/  / N( i8 t) o  Q% x0 d5 T/ i1 w( l
      / g  D( L, g6 K& _  s3 m
    • 3 o1 p3 b& A7 ~$ a7 T, q1 g1 t

      + c# Y7 R6 ]4 b, e   if(run!=NULL) /*如果运行指针不空*/  ! i( G# s6 z  H, T1 U- I* `

      0 {7 ]! R5 k; P( W7 N9 _3 H0 W3 O: d

    • 0 \3 \% U, M* D% w+ N/ I3 ]" Y1 U
      1 ~: G$ i- p( S
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      4 w" ~% @$ _$ }6 x) F1 z

      " Y3 C4 w( s5 e0 o& P9 ]+ K

    • - v( c0 x4 @# m* o

      " D- l5 i  W8 x7 H" h3 {6 [5 o   p=ready;  /*输出就绪队列PCB*/  
      2 a: X( L' m. D3 z5 r
      / K* j  S! r0 o7 d: B

    • : q7 \; s6 g$ Y# O- M2 u4 q( D

      , K& |( I* h' Z; K$ y   while(p!=NULL)  / j% U7 \% R4 @1 L4 x
      - l5 e  d% H( n2 r  k4 f

    • + {4 [7 H- E# k8 _8 P8 _
      3 m9 ]7 o7 ]* f; m/ _  o, x
         {  5 U, j" _6 C5 Q

      4 k3 o- b% ^+ N# [
    • 4 s  ?2 C9 i/ w4 z

      - X$ X$ _5 T4 h* A' a      prt2(algo,p);  # A3 ~( d* f5 \, a- {$ Z2 M( e5 y# J
      4 l/ X0 o5 z* E

    • 9 s8 r7 d* N! K0 }/ b! k1 F$ |. c

      0 d8 m- W* V" Y4 v& q      p=p->next;  
      3 J4 a. I% n  E. Q' A8 b; n. n
      & `( E1 \' M3 M

    • 7 o) T* w+ v0 I, {  i' m- {* o

      % j- I6 K: s: @9 I   }  ) Q# T) m. Y# m; ^1 Q. a

      # A/ o4 t" N0 ]/ I. G1 Z6 D! g7 v

    • % M( f/ A4 D' z2 W% u. @* M

      8 I! e# Y% {( j& @   p=finish;  /*输出完成队列的PCB*/  - Y1 e+ f4 U3 b) y3 Y
      ) q9 _+ ?* k: z0 h/ O7 X+ m
    • # T) B# R% q. ^& L' \0 E: s: ]
      % V# t( r6 p1 j( ~' U
         while(p!=NULL)  8 A. B  K$ ?* I6 j# ^8 k
      # m* g7 V1 y7 J4 j
    •   j+ S3 t4 n/ K% s0 F* x; U
      8 U) j* K' `6 @: O1 R$ z: ~
         {  ! j( {' i# F6 C- }/ ]/ ~

      4 E8 G5 j, `& Y& k. g" x/ h# {& O8 j
    • & _$ U9 M5 w9 P/ f9 z; |- B
      - y/ i+ H9 _" k6 A! z  ~* ]
            prt2(algo,p);  ( N' h% H" f& K& B$ s$ a5 ?

      5 R4 p6 S. h0 i. i0 E$ @& |$ m5 V' Y

    • ' o0 b: ~4 u% V0 s$ ?* O
      8 s4 X3 i3 _! x, y/ c3 U' A
            p=p->next;  
      3 B2 {/ u9 f) h, `, t
      0 r4 L% L) A* z1 p! i
    • 0 m! z, N# w; c; z% T
      " R7 c" d; S( @3 H; @1 p
         }  * a6 y+ Q0 G0 g/ }8 w  _* ?- g! f
      0 k4 {- q& h3 r0 @0 P# |+ G
    • / x/ D$ A* R* r6 x" C% y
        F/ D  {7 B, u# z7 h, V( l
         getchar();  /*压任意键继续*/  
      5 E- D/ {$ P) {
      + F* `* S/ {$ Q/ W0 p

    • 5 q  ^6 ~& H  [1 V& R5 ^0 }6 R& z
      1 f6 J1 c5 N; r! I2 N9 V
      }  . P2 m& K6 q1 s& V5 I" l' F4 p

      + F- g5 _) H) X0 P
    • $ ]6 }7 a% }4 b8 p* T' q5 t+ c/ {- b
      ; P1 n8 Y3 F) H0 c1 W; [7 j7 y) U
      /*优先数的插入算法*/  ! [# @* A; ~0 G! y
      7 u7 t1 }$ ?9 s) g
    • 2 u/ N% d5 F7 s" `* K0 L6 I' I! C, V! R

      6 c) W3 N3 ^# b4 Z7 f: Zinsert1(PCB *q)  
      # S) S/ ]6 a& d; n
      - S6 U* C2 j- i( b$ }1 g. }2 z

    • 1 _2 a" j3 r+ Q& x8 {

      4 \$ M! I) M6 H  Z{  
      & Z7 q" Y, V) u- G$ v/ Z

      $ J! ^2 v$ B( c

    • % }4 p! g" D$ ?- A
      # h5 ~! x2 N' m( z
         PCB *p1,*s,*r;  ; O$ ]/ R' Q: u3 e

      0 u( h4 f6 ?" G# `: M! _

    • ) N5 B" L  t0 m7 c; a2 G& {
      - j; Y1 n* f( @1 n2 ]) y
         int b;  # P7 Q1 u4 Z# n* t' \9 T
      + ]" S9 U0 n2 g# k. W- v

    • , X; U5 m, [7 F! ], P: P

      : g, _. F+ w5 P' E" U   s=q;  /*待插入的PCB指针*/  
      , P. L1 A& x; b

      * q. W0 G4 K9 L+ N4 [. X4 y3 `
    • * Q8 L" m' V/ o6 v/ G

      : t) r, S' F3 C' X" N4 Z  v   p1=ready; /*就绪队列头指针*/  , w& M" V7 V( i& z& B8 q
      * F2 E( h2 f" X% W2 `

    • 7 i- T2 p2 D: z7 Y: g

      ; ~  I& R- {& z   r=p1; /*r做p1的前驱指针*/  ; c* V( ^/ A& h" U
      0 b+ z; v+ H' }

    • ' `3 D' E8 J7 x4 \' Q

      ! s) u4 {$ ^: q9 p- F   b=1;  
      , j9 \- T  q4 A9 _* p

      2 P4 q" p2 \7 F8 B

    • 1 A! n: Z0 `9 [8 ^8 c# K- E' N
      7 H) N6 R7 J2 Q( q! W7 }
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
        v: o; s, f  S( a

      2 ~  i# X/ m9 E* w+ j/ l
    • ; M# i# a2 {& z
      ) |3 W8 r+ P' j8 a7 v
            if(p1->prio>=s->prio)  : k# Q2 A1 T) l) {# Y* ?( @1 F# _

      - E9 }% N9 J+ a7 S& v1 h; @
    • 6 `0 \# [1 i7 ^4 c; N/ P6 C  T; i) A
      6 J: \+ f6 v4 X, k. f4 |5 _, _
            {    m  L% P7 e  g# S; a

      6 j; B0 S' t4 O: M  g4 N) Y

    • $ ]7 i: \7 R0 D; w- b. J

      ! F- d- C$ l0 Z) v( ]     r=p1;  + p4 v0 n: ]+ Q2 L! f

      ) [! n" Q" u  d( Z: p0 U, u
    • 1 X- c* V5 ^2 C4 O. g, v) r7 g

      % h6 S- E1 x4 F" ], Q  L1 X     p1=p1->next;  
      3 T$ O( {% B6 ~/ ~4 N

      6 g6 i* L( R4 B4 K4 Z! ^) b5 n* {: m# T
    • , b# y1 u) A2 P

      ; i3 h& E8 e( l2 e% `5 W+ E      }  ! _, m8 {) d" T. u4 K( ?" Y% ?

      & h7 S- C9 @8 j+ Z2 v3 f

    • 9 N' @$ G% R) z" K  o$ `* ?

      / V; {  E3 X, T, u# @# \      else  & M, x- a9 ?' Q( L# S% {2 `- p9 {
      8 Q4 H$ [% i2 Y' C8 v5 Z

    • + J6 ~4 q& E% D
      ; f4 @+ l6 J, o
           b=0;  $ |' L. _+ K  i) D/ j9 Z8 O
      . k- t8 A  L7 v! ?! E/ ]

    • & |; S) _$ V: L2 f! y$ T/ E
      $ o; t' ~; p( Q0 ~) U
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      : O7 v! B5 {4 y. ]
      ( ]5 v3 p5 x1 ~& i. }: A
    • 4 Q0 ~" v2 A& |: A) U, a) R' b
        w2 T8 l0 Q1 v7 q/ s! W
         {  
      6 S- o4 ^0 z! z" c5 [1 w5 P

      7 `  ?& ]% p9 y4 P( ?/ A" M
    • 9 x! E1 _7 F4 S/ c* m
      $ N0 }8 c8 ?* r$ \
            r->next=s;  & h, \! \  ^/ M5 z1 z4 B6 ?
      : B3 z' Y* a1 @7 k

    • " P( i) N% ~+ E# X
      + {, Q! K) g- e9 f# R% ~) L
            s->next=p1;  
      ) V; Z. }; k5 R, D
      2 E* j$ p; v) D8 V; G+ G
    • 6 i5 s! }& v$ g

      " f" C- t0 c( ^# Y: ]   }  
      % @8 e4 a: y- o; A& [
      ' u1 Q1 S; ~' C8 K

    • 2 U0 p, _! L8 u' f% s/ ?# I

      : j4 D% [% b) Y1 d7 |8 P% m   else  ) a, z3 A, l. Y* H0 C% r" f

      2 `/ V$ c  x4 c  U
    • $ `6 ]2 {% h7 e5 H9 p7 |
      3 i* s( O7 `" n$ i/ A1 S- P  d
         {  
        Y2 Z( O- F  f5 u$ l
      $ z) U: a& h8 m7 Z& K/ g; }9 y5 A! A

    • $ f& ^( O4 S* }3 A! n4 r! j
      4 l( X% ]& J/ o2 x& w* e; ^
            s->next=p1;  /*否则插入在就绪队列的头*/  
      4 H8 X  B1 Z0 v+ A7 c
      $ v! t; h1 S( C6 ^( u, E

    • + f  [: }3 A# g4 w$ ?# e
      * \" r3 `# \5 E2 C- y) P, e
            ready=s;  
      ' r7 F) Y' n% N8 S) X! a' g
        y; P9 m9 X2 f& c& I( P/ e% ?
    • 3 `' x/ `: k6 L) ]" M: ^! Z

      8 J: H( z& U$ ~4 k* @( o   }  5 b* k7 N# G$ G! j

      & s5 W4 g% w1 `

    • * F- Q7 o/ b- g  K2 r- T$ @
      ! G  j; L0 m8 V$ d
      }  ! a; F+ ?# ?7 ]# `
      % e/ ?! u4 x: q  R
    • # b4 V9 w7 a1 b) i+ o9 x9 X8 X
      ' f. p- v% ~! h0 k& d
      /*优先数创建初始PCB信息*/  - l5 ^0 E. o& c- _) h* q5 C0 q  f- y

      + O2 K" k' }) V0 E

    • - M! N$ C) W0 M# q: ~: h

      4 r( r/ e. d5 avoid create(char alg)  1 m# k& U# F% z6 I3 f3 f! c
      9 n/ Z. _) |* U) C6 b/ S

    • 4 g0 j* E8 @# x1 n

      1 u, H/ L: |# m% e7 T{  " I: }+ h0 K4 X4 M1 ~- @. n) z

      . a* f0 A3 i+ `  S
    • : s7 _+ t% p3 k$ R

      9 R- q" b& f+ ^, a0 b   PCB *p;  
      - E& V7 k9 g% k
      . g8 m8 j& g1 c/ {( c
    • : e, Q& ]( Q! O& B% \

      ' p! \! ~1 w5 H# K   int i,time;  ) x+ F7 L$ a$ L' C" I6 Y
      4 t3 g4 K" t& S/ N4 \$ Z+ ?9 q

    • 2 Y# E1 p2 M" V& q2 t. |" d
      ( r) x% A$ U; w; s. t
         char na[10];  2 r; X) v' n5 a% I. K
      0 D! K3 s& s; a. t8 a, |# k

    • ; [# z; o$ c5 d& J7 `

      8 f, k8 Q, w. v+ L! h* P  O   ready=NULL; /*就绪队列头指针*/  * i2 [0 l  d1 _/ @$ d
      2 V$ X* p$ e- g& K. D; Z( k

    •   f  }  O9 E3 Y5 C4 E

      " N' O8 L% ^+ t  Z' Z   finish=NULL;  /*完成队列头指针*/  
      % n6 \# E8 X- M% K& `+ R. a# M9 O. |

      ! {; S  B; @: z

    • " m# L& p7 R4 J8 m5 g9 {
        F# h- b4 S8 q. g( R5 f+ [
         run=NULL; /*运行队列指针*/  : t( J; b# P$ ]" x. H7 ~1 G
      6 Y$ w$ A  c3 J9 J$ ]- k5 G0 c
    • / _9 i& k4 z! e1 G, `; R* r3 W
      / b7 [% u" G4 x9 N" B. t: W
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  4 U, L0 i9 D( q' H) [/ t; y' E2 X

      4 k! t- J( F% T
    • 2 f; L, L0 ~+ H& G8 b

      : m  C9 A' h: {  B: ]: C# J7 X. [   for(i=1;i<=N;i++)  0 I6 |. f3 S% |2 S2 V( T

      ' Z& i8 y7 |& m# f2 w" t" P
    • ( T  I( @' w* w
      0 W& e8 m1 }3 h* ?
         {  , b  E2 k0 r' D: x1 X

      4 L$ s- g; I- u7 x. @+ e. W
    • 2 ~4 b0 y' M, a3 a
      . ~0 O& P' D- ^0 u; p2 D: q+ ^
            p=(PCB *)malloc(sizeof(PCB));  
      # M$ L0 m, W' k7 }$ ?+ a( s

      0 g* m7 Y3 Q( K1 k' ~
    • * b8 t4 q7 l/ _0 E% |& @& E) V

      0 H* s  ?. v# }+ K! D5 ~/ a' S      scanf("%s",na);  + t  H; w5 o( h/ d$ M3 T: @# g8 D

      ! ^6 z. k8 t1 C! f$ g

    • ( i6 J9 Q; [6 Q

      1 J) m1 u, N7 c) K- d+ |; h% I" z      scanf("%d",&time);  $ a* a4 a) @5 v( ^6 k

      3 `# {0 X+ q* n# w$ ]

    • 6 |5 i) o5 O; ^* _
      9 @8 |+ m" _) L7 |9 n# {, R6 G6 {
            strcpy(p->name,na);  
      : ^" F* b- I# L: B; o

      & P) f  K* P! o4 Z/ `2 ?
    • ; U; Q4 k% l- l, @

      9 d: m* n- }& Y4 i      p->cputime=0;  0 `9 C+ q8 M: S8 j
      ; q0 q9 L- K( Z+ \

    • 5 S& R. M/ s8 `1 l/ A, }1 N
      8 W, w4 d  e7 ~
            p->needtime=time;  9 v) P0 Y& I9 O7 [( p
      3 C# r# e+ i, u6 {* G- s' N

    • ( v" F9 w; _% b

      5 J$ a+ \. r! s+ h! W: f& c5 p      p->state='w';  5 k8 c- P  ?6 I. |6 _
      ! M5 d- `, O. Z5 r, w

    • ' |  g+ Z3 s4 T' b% T9 j2 ]! c$ X

      ( V9 J% q& r8 _$ Q      p->prio=50-time;  - X! F/ \. G( b% W' s5 S

      3 ^5 f: `8 H* X8 _3 K

    • ( W: e$ n* S$ ~; X1 ]; V
      : J$ _$ x4 ]! p) a4 R- A/ P9 x, i4 h
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
      9 s6 s( u$ X- ^# C, ?( L( g; W  j

      ! H' F  N0 g7 `/ _; B
    • 6 Q, l) Q8 h' O/ V3 B: A( l  p7 b

        ^* x+ K8 {  Z; y     insert1(p);  9 B" \! Y( s% U  m  t/ L+ v
      * \( ^, G2 @% r+ P* q8 R

    • + C- S3 S: p# X/ Z( h8 k

      * N$ b9 n7 b5 f! f      else  ' Z; D" C2 l5 [: J/ _9 _

      " N2 F) f) k1 J/ p; P0 ?" _

    • - R% D) @0 f/ q- @' u6 V

      ( h5 _$ g' c: m" k* o8 _4 ^1 }      {  % {3 L* E" \5 Y$ j: H1 n
        y$ r* a* d( c6 M4 o! S2 y/ {
    • - y! Y- S/ F6 M! u
      ' R: K* \) W5 _& i
           p->next=ready; /*创建就绪队列的第一个PCB*/  ; }! f1 n: ?0 b9 r
      - W$ M) M( x# F9 U( V8 L
    • . @# V$ F- C( Y* _5 p6 G& K' I+ f

      : `" H. I' {" ~8 G# n& f     ready=p;  4 \" H  H4 x. u  F
      & Z4 F/ a" X3 Q  @$ |, F

    • " A8 |* T, [" e  ?6 Q0 @+ K
        N1 f' e/ m, a9 _6 d5 z1 A2 K
            }  
      + f  W" U# j4 Q; S, f
      / l& [% E9 g2 V( O

    • # U' {3 v* A- b- |3 K
      % n' E* m7 @, w0 V
         }  
      1 i6 ^0 J+ [' Y+ Y
      , Z* i) q7 g% e* V3 k- U# a4 g$ G, z/ A
    • * X7 L$ W6 O, P4 f5 q# x4 h% }
      + q% \5 ~& Q; H& K8 G2 f7 h
         printf("          优先数算法输出信息:\n");  ' V3 [; q+ J" G# j
        ~+ Q  W  v+ Q* O

    • * ]( D6 i: k" ]: u$ E
      7 C& i0 H" M9 Z  n
         printf("************************************************\n");  7 v2 Y6 ?& j1 c/ K$ a3 H  k/ u

      % C$ y( F8 k7 F" V4 @7 U8 D# J! q& |+ ?

    • ; F* r, H1 O0 r) f3 ]7 a9 x' p

      - P+ J& l; S, r5 ^1 ~   prt(alg);  /*输出进程PCB信息*/  0 C% d* K8 n5 h; y; C

      7 j- ]0 \8 d) y, f" D0 ~7 C
    • 1 |  V! d: x2 q3 D9 W. o5 Y

      9 W5 }: g5 Y/ K, d+ A7 B' J   run=ready; /*将就绪队列的第一个进程投入运行*/  . }+ [1 K' M' R6 j+ I

      % p" _3 L0 Z& l
    • / j% ]  N. {7 C6 Z  R$ f1 o0 s

      / ^! q, a" k" s6 k/ u   ready=ready->next;  
      ) y0 h0 D) q# V# j* T2 p5 }
      ! |& R! p4 b6 S
    • % Q* Q- v0 {, [

      . t; y- S9 D4 P& d+ B& t4 w+ S   run->state='R';    C" W' [3 `  B! H$ t- \

      / |5 O* l# |6 P9 t
    • 9 B& L% t3 D# e3 }

      ; m! l( E# i, W+ B' K. L2 s( F}  & [# m! n" @5 Z: |

      $ Z. Y$ I  O9 U  @

    • ! ^. E" \6 _) a# {4 D9 C4 z

      7 K3 y1 v3 k/ R  L/*优先数调度算法*/  
      4 s( f' g* J/ K  _' a( |
      & O3 z  _) W/ B5 B1 i2 h. W

    • , l0 {) I  }5 r( x0 H- W. H% A3 d
      5 {2 G: r+ ~/ E6 U, l: m% N, ~
      priority(char alg)  
      , H6 c) s9 o9 h

      2 Z7 o6 G7 f, L* {0 d
    • * V, X0 y6 `; }0 \; k4 C

      ) p0 A% Z! o" b{  
      5 X. b4 F4 w3 j
      . M3 i" P6 n6 U* }  D; `7 K( @* w

    • # ~& P* G  K9 h! u, y# ~

      , i8 }5 y8 f! M7 c- {5 h# Y   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      5 _6 V, t* {: B) A4 g' `6 X

      6 F. g6 H! r( L8 @# b, u5 ~
    • 5 P, t& q4 B+ D

      0 d* M: n1 N1 o2 X9 Q% j' B7 F   {  
      2 _) y" W$ s  Y9 u
      . r5 k0 @) \6 _. P3 E$ v

    • ' Y7 ]( n4 _' ~6 }' M

      4 L. k  \8 D6 O& `      run->cputime=run->cputime+1;  / x  r* T3 b% }+ d- [& ^" ~
      4 {" i& v! b& B8 ^: s$ h4 L
    • , `! }4 k. m7 K: M

      . q: }; M7 c* B2 x" G      run->needtime=run->needtime-1;  7 W( q9 s2 v% z& B. V4 D

      ! `5 i* t! \+ L
    • ! C8 Z6 y; [& t+ v( {

        p$ E; q- \8 v7 r2 x! M9 e      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  " \- `% h1 z( J1 d

      : o3 E5 {0 R6 W+ x% R! t

    • . k4 W, H5 I! k6 v* \/ p/ w+ D

      * b" C  G* I* \8 y! W7 b      PCB *p;7 _: i& Z8 b6 {3 v8 }) a( ~( u, e8 P

      0 x. U# j) h' w/ Q, k) C3 G& Y- n

    • 6 N  p; l9 k: O3 X, X/ \
      & B  [* \! L& E8 W1 [
            p=ready;
      5 I7 x9 D3 @$ Q

      " m2 k/ M+ `  Z: u' x" w

    • 6 G( H0 h6 d" ~+ K

      / F1 y, ~' x8 I# J! ~      while(p!=NULL)  2 K" F8 V; M! ]* o: X

      : n6 |4 r2 X* a* `( R
    • / v5 ?) u. L: \4 N! R& v
      2 Z! f" o/ S$ Z) @
            {  
      & \$ n% V" ~3 [
      8 e5 v; M" |* ^

    • ' u( H3 S  \& E9 {- n/ U; v) ^9 L6 N

      + q6 z) l8 g" J5 w& D) Q( C          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    2 r* ^- I: C) Y5 E' p! ^
      ( {& \1 l5 K. i
    • / v6 I/ X( Y( Y! @* E  O8 z

      / D/ _( W0 u& u6 x7 _          p=p->next;  
      * d- q2 @& |4 E+ w& A5 D

      1 z% ]$ e; S% d7 @4 q
    • - F$ q7 ?" M/ O5 P4 M2 }$ N& r

      ( w) f4 v0 o" n; T6 e& v      }  
      % U; e5 ?6 s9 B+ r' s5 F6 t

      7 A. e0 t1 p- F0 N9 U0 n
    • ) r& ?7 m- U% F7 h6 l4 E0 t4 J, h

      6 q7 ]) @' |/ Q) X      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  : {5 O% m$ I, S' h6 O
      ) r. |7 ?( T: z1 q9 ]1 W

    • ) x3 a- B7 V& B' K

      ' q: G8 u  I! h2 H" Q+ Y      {  0 a6 P5 u, C  ?& ?5 R5 W8 X3 Z

      9 E* Q9 h) W0 E+ ?, z5 u1 K- H

    • ! K  k# Q3 Q+ V! N0 Y' O
      - l6 L' c! \5 c5 B. i
               run->next=finish;  6 Y8 v3 B' _9 r. H# o
      : W2 H# [2 o& C! C& Y
    • 0 y% ~* H% H, ~. c3 m
      $ n/ z+ a5 U1 W+ {+ q2 R& f4 z0 Y
               finish=run;  - _# `: n; j% E# l% L

      0 C5 O; P( s5 }$ s) e

    • 0 u  h2 R, y: G; |  K  f& s

      & f9 D9 t2 [. B  C6 G9 M8 x0 s         run->state='F';  /*置状态为完成态*/  
      ' _( o% u! q' \# X2 }( V$ f. D
      / i) Y0 c$ I& u/ ~! R

    • , i' r) t8 J# I/ W! A6 U

      ) D, R4 S# k& ~5 }9 t         run=NULL;  /*运行队列头指针为空*/  5 V; \+ \8 ~, V1 m
      " R1 }0 E  r. x: p7 q

    • 7 N. q! N/ Q* Q

      2 C9 u. X8 R4 ?: K: i  F9 M         if(ready!=NULL) /*如就绪队列不空*/
      0 e1 s, [# R8 G
      1 K* z9 H' ~- K6 X5 k

    • % r9 n2 U; n, _( A

      & O4 o: S( l) s6 D         {  ) q; h) c0 q* s' h: I

      0 ?8 v7 _. L5 T1 E& z4 ]9 n( V
    • ; m6 l( Q0 y8 \0 }

      ! l( k1 t( l8 c            firstin(); /*将就绪对列的第一个进程投入运行*/  
      5 I2 @" W5 E8 W% Q# e$ Z% W3 f

      " k% `1 f! \3 N9 a

    • - `" n' s, d4 P7 D0 O; T( d
      " d: G" F. B3 ^4 e3 e+ Q) E% r' o0 ^
               }% S- R9 ]& h/ l3 w9 g; }
      6 w' g' t5 V) s* D9 R8 q
    • 8 J* o$ Q3 h# b1 D- |
      1 N6 S! ^( h2 F
            }  
      0 M( k3 g) ?$ y! J: o, a

      ) m! b' T( `2 }( q% Y6 Y- Z
    • 6 v5 w0 C  {2 _, y$ G2 z( C

      # |, U5 e. J, U! V2 v: o7 F      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  0 _% o3 V9 Y! v' Q  N
      - D4 y+ k: _0 O$ s0 H

    • " G4 I# Z- |1 P

      ; ~* h) ~+ E$ P4 u6 E2 ]0 h     if((ready!=NULL)&&(run->prio<ready->prio))  % ^( D+ C0 G9 x: Z3 f- t+ d9 b$ N
      . C  @: E7 e, x9 ~
    • $ p9 f9 S* u6 p) M

      2 x1 n4 @7 P' t4 i0 ?- D! N     {    z7 y( O6 Y% P' `5 n8 E' ?8 J

      2 Z- q- ?# t6 r5 A8 p5 H
    • 7 ^5 J1 y; K& a- P) M6 V; i' A: Y6 h

      8 S. a  C- C$ q4 e        run->state='W';  - t! h4 P" ?( r" d+ c
      $ i& S! H) j- e1 ]1 p! ^# W

    • 1 J8 s' C/ s' p. F3 s. p
      " y5 @1 z6 h; m( `# O* h& Z
              insert1(run);  
      5 W5 @: H) L* Z  S! |2 d- h

      / }" ^9 f' l- K; ~

    • - @( u( c/ h' E7 T" W

      9 g/ N# E+ A8 o# k5 K. s& n        firstin(); /*将就绪队列的第一个进程投入运行*/  
      7 ]1 ]+ x( e2 ~7 j" n8 Q2 t4 Q

      3 P7 k, j/ }8 u
    •   T3 k9 Z5 A6 _6 X# S
      * M4 r3 h7 }' V+ U
           }  * i! C% N% C- }( H3 I: _1 {
      # s  A$ ]( f& e& \$ h" T. [
    • ' D% l3 K& C+ O* ?- M5 U( ?% c5 Z
      7 m$ N. W! o: H) P
            prt(alg); /*输出进程PCB信息*/  
      - M& n. A" r. |& O' ]6 A3 @
      ; }! J# L! v) y+ T7 L
    • $ _) r7 z, `/ H( E+ u  }# g# ?

      ; R; f0 Y- l2 L- o# u' R, v! ]   }  ( x9 R+ @! \; _0 R( r+ a
      # R9 k1 c( B/ z

    • 9 R* S7 P$ I5 d4 P2 Z3 r$ |

      ! }3 P# }; Y* X2 U}  
      8 U' p6 z* W" C3 Z; H. }! o

      , B. F1 r1 S: v6 i' o; l
    • 7 g* J$ \& V) ?# d, w$ _$ c

      * F* F$ j2 W, N' ]" I0 V/*主函数*/  
      2 w0 ?  n2 _' @# Q

      % R# n; Z. X5 a( r* G2 h

    • . q. D! X: B* o6 H- E
      " ]  v1 T5 A" m, v% r* A: B
      main()  
      # {" A# A7 T9 B& u' p! a

      ) W) o  r* _5 F$ o; C

    • % ^' d3 G# w& _( k4 z

      * B/ Y: }: w5 M( T0 z* R, S{  
      0 Z2 w# H# k3 P0 |
      $ I7 x; o  k+ M7 B

    • ' P' L7 d, |0 I2 T& O$ a: v

      8 j3 q7 X2 F7 L   char algo;  /*算法标记*/  ; F7 k/ }  r) l) p) K% ?5 M
      3 N6 ?* B; J- J/ z

    • . `) C  D- H. V6 W; E+ y' z
      - ^: {' v: l, X3 c# h3 L  o6 w, }
         printf("输入P确定算法:优先数算法\n");  : Y: k9 o! W( x

      % Q5 k) U7 C8 m; o- n

    • , I: U- f% H$ [
      : ?* g8 H& _+ f  }5 t" z+ P- C
         scanf("%c",&algo); /*输入字符确定算法*/  
      9 u* {( Y  O7 [
      * }: x; `, f, ?# C( Y- B

    • ( w; E! x, f0 |5 n! U  o6 {. _
      & K: F1 P0 a5 S; J
         printf("输入进程数:\n");  - t) E8 o6 K* \3 H2 p$ w

      2 a8 v$ j% K- P. ~3 {8 O

    • 9 o- F: _+ L( q5 h" h1 G: V  }
      * H0 F# q" ~4 M- b- ?
         scanf("%d",&N); /*输入进程数*/  ( S5 B! l5 s% ^9 ^- m' _

      3 n. O$ n2 ?, S6 R% r5 O

    •   n. l: A/ R3 W& U! Y% q
      " B  g" W6 f" N3 W
         if(algo=='P'||algo=='p')  ( r# j6 J- n+ o; O

      ' K" S! K% H9 A! n  n6 A
    • $ }) b3 ~3 H+ n

      4 V; |2 ]; t9 H& l1 x   {  
      ! T% b: t8 `7 w* d4 v5 p

      % S) [. x9 M) U6 |" D/ X9 J# [

    • 7 V4 ^- v# H' ?

      ) P7 p. [: Q6 a2 h      create(algo); /*优先数法*/  
      , n1 n8 H( d2 c6 G" @
      : p9 p5 q8 `( \7 S$ X

    • & B2 D# I9 V7 c" U, N1 g( k! ~! O

      . M% c( f; z% E5 r8 G      priority(algo);  4 ~$ f$ t, s, z

      $ d" U5 r! j! Z# B: \+ M

    • 5 d3 v( N  _) A5 [
      * Z& h* E: q+ \8 ?: m, R
         } - O- j" v) ]0 t0 ^2 k( @
      . }+ {0 l3 ^5 b: D; d

    • ; O% A0 o2 p$ C" p7 C; O& q- [, d% G
      - e7 Q! E+ K3 k4 k
      }4 v' j/ H5 I1 {5 A3 d
      , a3 A4 t; Y# O/ C. ]$ h

      5 A: ^" l) ~# J4 A


    * p1 [& R( d/ U输出结果:
    ! Z4 g/ S# u0 N

    , D$ [2 S1 |5 Q
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    ( ~& O0 i9 [# f0 K
    ( i- x2 [% o7 G" @2 D# W' n% 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, 2025-5-15 15:01 , Processed in 0.515927 second(s), 50 queries .

    回顶部