QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3177|回复: 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

    ; {0 F' t% T5 h- i2 l2 v: T! l优先级调度算法
    4 n, e* s0 M3 M( y7 W

    算法介绍  b( q, @, q& J+ e0 Q' e5 \! X2 J# [2 ~
    优先调度算法的类型(用于作业调度)
    / W5 Z& F$ Q1 u' q( v  \1 g6 O1)非抢占式优先权调度算法
    * n$ P$ p5 Q. E; P5 v7 |  F系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    . I! ?- \/ v5 [2)抢占式优先权调度算法
    & W0 f: g: L( N. ^只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    8 L  m5 T4 T$ W& [) K2 s1)静态优先权 9 B7 c: h( ?$ ~- f# r6 t7 d/ ]) @
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
    / t( E3 _* b; v  f3 D

    2)动态优先权
    7 p$ ~8 n* D+ {

    算法实现

    抢占式动态优先权:


    1 z- g. m: ]8 SPS:本人认为非抢占式静态优先权没有实际价值。

    • . p3 e; {9 ^+ q; C# _

      5 d9 a! T9 j5 M#include <stdio.h> 5 n' u- u9 V& ?+ `

      ! s, x- ~, ?. B6 ^
    • . A- A6 D5 B2 y4 B  D( ~
      3 E2 U- C  `' B# j
      #include <stdlib.h>  8 {( |' f& z4 {. b: c- [, D
      " @' C2 Q- g* V: a+ q
    • + Q7 m$ p$ v3 u* O, l) e& e8 Q
      $ ^+ |* U7 h1 _- @4 X2 X4 E
      #include <string.h>  2 v( X6 Y' |. g- F- q! ]

      : k5 F/ f; H* g; z) d
    • 3 i0 Y4 d- ]: c6 J3 ]& D) N( x: V
      % C7 f7 Y7 S* o) e, z
      typedef struct node  . k0 M1 b) @8 a7 e
      2 K4 }% n2 A( a0 i0 d9 f7 q
    • * H+ a1 r" P* I! t2 h3 i, r9 X, m

      & J$ x4 v4 @, a( t/ S' w$ P9 J: P{  
      % w  E3 M6 }4 e8 a

      : _$ v  a; l. T1 a

    • ( n' ]/ K$ P+ f* K
      ( [5 G. f( H* h0 ]
         char name[10];  /*进程标识符*/  ' F3 b' L) b5 ?

      , p" L0 r6 ]8 p6 A+ ?2 e% F$ d
    • 9 @( T5 y. o& {/ J0 _% A
      . k" u3 \/ [; p( D# l7 T
         int prio;   /*进程优先数*/  
      8 V0 r1 i, ~2 r4 J) K7 ^4 l

      : _7 M& _6 |4 K. e

    • 6 S+ `0 x0 d% @' O8 N6 m) H

      8 G4 q+ V( b: A. F1 s9 {. J   int round;  /*进程时间轮转时间片*/  2 v; V9 X# h  l7 q: _
      9 k! N0 @5 A5 ~' O- x" e2 S

    • $ Y* X9 |; ^, i' v
      + B7 t  b4 S+ _% \
         int cputime; /*进程占用CPU时间*/  
      " w5 o" U  G5 h5 Q
      1 K4 I! R* E6 r8 y2 n

    •   k* m% h3 t5 G; g  G2 ~

      , \6 N0 f0 X: }, I/ `' u7 H$ V   int needtime; /*进程到完成还要的时间*/  ( H; e9 E& w. q
      5 n2 z0 s% ^& V& W& r0 S

    • 7 n- M5 P/ b' J5 _! P& w8 I  y! F

      " {" Q! J+ Z1 E9 y$ L+ v! g" C& r   int count;  /*计数器*/  % x7 t5 @5 E( H, t) q4 j

      / i8 F* ~4 O0 s

    • / [0 s. Q5 N( Z0 ~( C. a. ^
      ; Z/ ~1 v( g5 v3 r6 a- @
         char state; /*进程的状态*/  
      , S9 Z- l7 G* E& S; G+ h
      * \9 _: R+ h) |6 S) h

    • 5 j9 q8 }7 q% ^

      0 v. c' f5 i+ e' H5 K/ m' v6 h) F   struct node *next; /*链指针*/  1 p6 ?, i% c* x% o4 }8 O
      ! a2 F. W/ s  i

    • 3 n  }! Z7 Z9 J  _6 A3 t

      " F# u  F" d, i. v2 s. I7 T- l}PCB;  
      ( E0 v9 Q6 h/ o/ y

      % U6 |0 z3 F9 S9 m' ~
    • ' T/ r! x6 U. j( Z7 ~8 T9 C- \
      " m: |* n3 k3 h, ^1 u5 F
      PCB *finish,*ready,*tail,*run; /*队列指针*/  $ V: n: Q2 T. z1 `8 Y

      2 G! G) A) a; H: A
    • 9 Z6 c+ d: F/ K% c

      1 `- n1 P$ F" _3 \$ @int N; /*进程数*/  
      & o2 F+ ?; C: V" N! B4 k

      6 }2 ^( o; C" B/ ~3 `# c! i
    • " f/ R2 O' T9 w; g& f3 c

      & T7 P5 @, l/ |- n1 R! L: q/*将就绪队列中的第一个进程投入运行*/  - g; c, [. Y/ T6 H  k

      ; F% r% w, s" p! m" q1 n

    • 3 i- q3 x9 s6 c* M8 j* ]) w9 v  N

      ' W4 V( `" s; efirstin()  8 [- w+ N; k4 F- W% ~3 K* N6 V

      / E( b& h  D4 t3 X1 N

    • $ _& [: Z  I7 L' S" O' |! ~
      4 r! t; {. ^% O$ A6 k
      {  
      * M4 u: D1 t6 K( ~& {% O9 U

      4 ^' e: ^8 U% p2 x2 w- C

    • 4 N0 s/ y/ i; y4 \. w8 w
      7 A3 G" G% \/ C# P$ E  e" ^
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  " c5 J+ [$ F$ a, n7 k! C
      1 w  z7 U3 P/ C
    • & f2 A4 ?/ E& a/ U5 |
      % ]0 P* O* P" B& s' i
         run->state='R';   /*进程状态变为运行态*/  
      0 }3 D+ a+ W- O& I
      ) U* t- P% N7 K/ b
    • * \6 ^  ^8 E# [8 {7 }: o

        N! m  i- J* s! ]; Y. C7 @   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      $ c  i  X6 n9 k  o9 {) `

      ' T7 J% U! O, A$ e! ?

    • + V8 ]3 N1 Q2 O% y: H
      5 r* k/ G7 f2 r/ o4 S6 e
      }  5 o1 A  V9 e9 j1 z! S
      9 J# o6 A( y5 N- c; |
    • 3 n* o& ]0 r" {, R' V* ^
      % K: S2 P8 q  |+ v
      /*标题输出函数*/  
      + k3 m2 u% p& w. ]/ ]

      2 O& F. S% ~; _4 c; w
    • ' T+ \/ o* j+ @

      9 s2 {% F# z4 Y% a! D- Zvoid prt1(char a)    B+ y$ I' N# s! T4 x, ?

      ) _' {' x. Z# Z; ^) l

    • ! s( d9 w) p$ O4 S

      4 A" ~- _4 E* p. z1 P8 S5 s) T{  ' u0 A# ?- i3 b! [. U0 F) c  Z% o9 T

      3 F0 b6 `- {1 F

    • & H' v6 }/ [' Z  R+ I* U
      9 C/ b, j$ A6 D0 ~! B% W8 B, ]
         if(toupper(a)=='P') /*优先数法*/  * t: [$ y1 P+ Q$ J2 `
      $ }9 |5 Z6 S* J& i3 T& j7 v
    • + K$ P8 e- f  z9 P7 ]

      5 I, c# n3 v8 R( F; S, f+ e5 r: I      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
      ' i) ]/ w# J* W4 _' t
      0 ~( p  v# ]9 k1 l
    • ! o, \2 ~0 H8 s1 t) ]
      ( O% Q/ s3 K# Y8 i' y
         else  
      # f) I, q; l# \. ?: G% n
      6 z0 J& ~/ Y( H4 i# {. V

    • # k2 T7 Q7 X& E1 q* m4 f

      + @+ p. l* @/ f$ s      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
      % T. f' A1 K- Z! s! [2 f
      8 \# f/ @* m* l5 j2 r% k6 P

    • ( E& j5 G3 m  A/ ~0 {2 n
      & G4 _" |" I$ w7 ]
      }  
      - t9 P" j6 c: F6 a# B) L
      4 v4 C  z4 P: |/ p" V
    • : l. Q( h% L: n9 C

      . `( d3 Y7 K/ u/*进程PCB输出*/  
      6 M( J& t1 ^$ B7 u( f& O

      7 P* q  r2 Q! \' o

    • * c1 `2 |) a: S" N( D

      # h# s/ U7 P. t. Y& W: fvoid prt2(char a,PCB *q)  9 y# T& I& }0 E6 q; ?' `* l7 j

      ! }, _1 c. Y6 n8 m) J

    • 9 L4 Q3 G, f  ~6 x$ d

      # R9 ~% g# k0 s" \' r- w# K! W{  
      ' l9 P. r. e: t

      6 L! H% R0 V2 H3 L
    • # h3 A( Q  F7 f* K+ \1 X. g* _& O* b
      ! c0 ~& g: @1 z6 l5 o% Q. T7 y. q
         if(toupper(a)=='P')  /*优先数法的输出*/  
      ; n5 I- d3 X% L9 h* `4 G" |
      ' Q4 C! ]. Y. i* k+ r0 A
    • ! e) L' D; c! r/ }
      5 k3 V% h8 y- U  o' i
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      " M% U! d6 c+ A  [% Z/ A. D8 Z6 c
      9 b2 W. o  v/ \

    • 8 N0 v0 ]- f- F) N' ?6 ~
      " _( |' g% z# Q  M! K
             q->cputime,q->needtime,q->prio,q->state);  ) w6 D& l( t/ H7 I6 X% T  e
      4 {' o0 @8 s& L# v: \" C

    • 6 b) g; @- _- R  w4 u8 I
      ! O$ x9 [- V* r, Y' ~9 P) X
         else/*轮转法的输出*/  
      # ^& o( ~( R$ ?6 r6 x( c
      & v* p8 q# R) `6 V: t; [1 P
    • . ]/ v( J8 Y9 M4 Q

      & k- u2 A) w5 n1 U      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      1 i$ H1 i0 k, g' G+ n5 k4 V4 Y8 t

      & M- @* M. Z1 N" T

    • 4 O# x8 I. G6 G" }# |
      - t, R, y% z9 l! I' R
             q->cputime,q->needtime,q->count,q->round,q->state);  
      4 S" k: y0 k* I6 p) ~+ K
      / \  B. q6 `6 U+ D% g0 C
    • . {# ^4 m  Q2 `8 v. h8 m5 T- c) Q# [
      ( N9 a, `* X2 Q
      }  - `, C4 P0 \) B+ p1 {6 d% N

      9 e. V2 [5 U/ h9 w

    • " L6 z: r  ~, J# V: V
      : g* c* W! H2 K0 S5 s' M
      /*输出函数*/  9 L1 X! k& f: r
      % T% s. N- F; L
    • / d* [+ }7 Z9 c8 k

      & B, @' G& |! Z' t$ ?2 Cvoid prt(char algo)  ! X) {: ]* d# {$ A, f
      + c/ O! _* |5 w3 I0 }* O0 `( K

    • - g' g+ Y. _7 _+ t# R2 Z" t

      % F8 e' U6 t6 o# S) L7 y{  
      0 V9 p2 o6 F* f4 n) \

      7 q, S( N- E% ]5 w! j* l7 n5 E/ Z

    • 5 I1 z/ S1 A- l1 f$ a$ V

      ) r5 n6 I) P6 b: }0 }$ w) s   PCB *p;  ; O$ j4 c7 K1 k7 q

      1 _+ H9 E5 S; e: S7 Q$ F7 \- a

    • % G0 |+ [+ {7 J, u) o: w$ {0 o

      & h4 v: ^9 Z" O& j( ^* s! o   prt1(algo);  /*输出标题*/  % A; `& Q7 B  [1 S! Z! j$ E

      - W: \8 C" M$ {/ r: y& ~, v4 q! {5 n
    • + ~& u# d% T+ z) R& A
      ! j+ Z' G! q) R
         if(run!=NULL) /*如果运行指针不空*/  + w( \1 l  |: v1 l* o3 r
      : k2 }9 Z9 q" ^7 w  ~

    • ( x* ~4 y9 w+ E2 b$ J1 Y
      , w9 }' @) u7 M8 E2 ?( ?
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      * @: c1 f/ h/ c( N6 E/ b

      : ?! h* B# ?$ J: \& L
    • 9 k* x: x, h; V

      6 Q$ n! n4 r) [& `   p=ready;  /*输出就绪队列PCB*/  2 O' h2 ?1 Q/ Y0 g
      6 V; X0 Y6 ^+ H3 @

    • " `. f/ d( P  B3 j# H# P

      , \; ]7 |2 n" ]7 F1 c   while(p!=NULL)  ( F! J* o$ v7 |% W5 S4 F; Z

      " l  b6 F( H$ W

    • / ?6 g% }- [& h6 t4 q* x; j& Z' V
      9 }& f: y: N2 a  m
         {  : t- w' Q8 n5 o' l
      9 E6 {3 M$ W" v9 e" i
    • * g" {3 R$ K( H: O
      . Y0 B0 U, @( \
            prt2(algo,p);  
      " N" I- x, U7 |$ j0 \" U  [/ s' A

      ! A+ B* J: X& @: z( x6 f3 k
    • / a+ e0 r& g. ]
      8 x4 i6 s% d% T) G
            p=p->next;  
      7 ~% c- q* ~( S2 a# y( _5 ]1 _+ u
      6 ?# ^) T' ^& Q( E8 b  S

    • 6 ]) r+ X0 {, _( v) T" l7 r! B3 G, L
      " }" U, m$ E' ~) R$ V1 \
         }  6 `' s, j5 ]8 e. h/ c& q
      , M5 }5 o# m8 G& D1 M
    • ( D) a2 Y3 F* @9 D5 ^# N

      " \# O$ Y. n/ i. E  ^   p=finish;  /*输出完成队列的PCB*/  2 y( X- e- [  p' T, q5 ?7 J

      # A* p/ Q* }$ v& c1 Y* r3 [$ P

    • 4 y$ B$ n6 {; S! w' P

      . k- |9 r; C4 f$ x. V) s& G' F  O   while(p!=NULL)  3 v  o1 M. I8 J. T( P3 P
      , D, k# d7 T: d

    • 6 y$ V1 q' G1 e# H5 r6 F  r

      2 `4 |* f/ o1 d0 _" o& Z# ~+ P( ?   {  
      * l. O0 Q. o* j5 k+ R" C8 ?
      / R: l, t# G9 N. F4 X* P

    • 5 A0 Z' K4 y( j

      , {% v- q6 Y4 s' t; h" _$ v      prt2(algo,p);  % Q4 g2 F  m& y) \% l

      5 i4 [" G7 N, _4 ]0 o; f4 n

    • ; v+ n& g, V* |/ {

        r, P* ?9 Y  e$ v  f      p=p->next;  
      9 s  R  B: Q, s) F2 o" ?

      2 }3 @4 k2 p5 l: x2 f  y# y

    • 9 k1 Q& A! ^0 ^4 L5 l3 B' k) V6 @
        \8 Y) G; r! G8 S
         }  : x. X! |3 o4 q8 h' w. A8 a

      0 N1 `+ K+ L. L

    • - |3 q' W! l( }+ T" k2 N! F. ?, f
      2 E$ _6 y* R: d, f
         getchar();  /*压任意键继续*/  ' M" ^4 ?# F2 {. v! c6 U

      3 a& y1 Q$ |/ j, e* I7 A; V7 D  E, R7 R

    • * T2 N3 W8 P. z; E: h) P4 O, w1 m6 B3 q

      ) ^. F3 Q1 c# ]. B( E; [8 }}  ( G& A# d. k5 t3 Y+ p( R, M
      + y* }+ B  k) J. {. m- D9 h

    • 4 J9 n& E# ^, S4 \

      6 [# D+ G. P( N" h/*优先数的插入算法*/  & T- `+ ]0 k  T$ p7 r' Q
      * l: R! g$ z0 `, h6 Y- T
    • ! |! h) y  k! d2 ^6 t& T6 A1 M
      ( L! x8 X/ B: N
      insert1(PCB *q)  . M9 X5 I/ Y+ `
      * ]6 w# n0 @9 M6 d
    • " X8 o4 I7 }/ k2 Z! W) F( `

      3 ?9 N3 w: a9 l% U( ^' A{  
      ; b4 v5 s9 G- x  L0 q

      6 _4 W! h4 K% D2 p
    • : J/ U4 [, m1 v' }/ j

        d4 U6 c+ X8 T+ C- W1 O   PCB *p1,*s,*r;  . H" K. r, W1 H6 q# g

      9 v$ N, ?6 k+ V5 [' y9 B; z4 d- `
    • " {% w; U; M* o1 b
      ; J  V- p, P8 R7 {; L. d
         int b;  
      5 l; Q6 _; i7 i( ?6 C

      " x6 W$ k' {" P& G7 D8 f8 j

    • ) W0 M9 K( {' _

      7 p$ W3 S4 V0 L, G   s=q;  /*待插入的PCB指针*/  " T$ L, b  x: A& L% N3 }

      ; M: ]; l8 T; t$ O

    • : S* A' A3 r, b/ i/ _" b
      : _1 Z( q+ _" w9 F- l
         p1=ready; /*就绪队列头指针*/  / q% |, }* N# z- m3 ]1 A/ P6 C

      " z4 V( K! [# W' \- |" F) d
    • 7 v2 w5 Z" g+ \1 V! ]: A5 h- f* t3 V
      " I* K3 Z. k- E; S
         r=p1; /*r做p1的前驱指针*/  * y4 r! [- a0 \& V, ?1 z7 J4 p, }; S  z
      . ~& ?! O, C. U- l3 G- _3 T9 L  Z! y

    • 1 R; G7 A+ d  l7 v! ^! l
      ! D, p6 B9 d2 L! Y# g
         b=1;  9 R6 |9 K. ]# ?5 D4 z+ j
      ! n" T  f9 r/ L5 d* t" \
    • " z% A9 L9 `' _% }7 ?/ ^
      ! ], [# u6 {, H. O: Y
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  : ?" [& j9 a& m' M

      . z7 X2 V/ B( B- ~+ |
    • ( k/ ]+ `" u: m* M) R4 S. l* K" e
      , V% u1 F* K$ U* W# P% c
            if(p1->prio>=s->prio)  
      / z2 o  e# ?  _2 G5 `* k
      ; M% A4 t% F+ u4 `2 c7 O
    • 4 U; d  q4 c0 `' d5 G, Z
      - k- U6 ?1 z; P: X6 y
            {  9 p6 n. `$ i& ~+ Q; ^
      1 v6 R1 ^" |* x2 T7 [
    • & n' @2 S1 \3 G/ }* F' g

      2 w  A4 B5 h" p/ n  d. x0 M/ Q     r=p1;  8 H2 L8 \) m& x' W; b) g& Y

      ) `8 C8 Y3 b( k6 ?
    • 4 G) d. c* K5 o+ l5 c

      0 K, N8 C) Y+ ^2 g5 f+ @9 t     p1=p1->next;  5 |' g2 B& b& o  h# A+ ~

      2 Q" O+ ^! T, U; g' `& t

    • 4 \* C: g5 T7 h

      * o2 ?& @  L! D$ P1 V9 ]2 C/ f      }  4 R$ K7 A; o4 T$ y  B
      4 I! u: c1 X; |. m

    • ( l& {0 [) y' l/ ]+ z- S

      " h$ {% p$ m2 k, u2 }      else  0 M5 F+ T0 X7 J% Z, U
      & k$ o" X' V1 w
    • 7 x! Z1 w( c! a* t9 \' f) L  f
      % _8 J1 J/ O9 @) m; q
           b=0;  4 b2 @* C6 j# x- Q9 O  }% P1 w

      - D  {8 v: a, W

    • * K( {# r& |; [0 {: X& N
      " I9 o1 t  h! P, z# M5 ~" g. ^4 ]
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  / U" X1 b9 p, t; Z

      / ]8 e: P+ X; s- h/ s' Q' G

    • 6 D+ d: G# x# Z4 `. q) k8 g8 ^2 a

      & W  f+ ]0 f, Y   {  - n# h3 {1 k/ k2 K6 e: I" P
      # R/ |* g+ T% N
    • 9 J" D  O2 |% ?' \, q# @3 l

      - _+ I) o2 W. R& f      r->next=s;  $ y" r+ W* j& g( U) }7 ?. F3 o
      - y3 V" z* r$ f, a
    • . {8 q- H* ~4 f2 z, W9 X* [0 G3 B% C* e

      / h' w% }: A2 `2 s/ d! t- T# K8 m      s->next=p1;  , m# ^) J  _/ P$ S3 I
      * ?" ^6 g0 \& i* d3 M! ]
    • % t* w3 m. j$ \5 m9 M+ ^  h
      9 V+ T) l1 K! e2 }; f
         }  6 Q" o; {  q) w; V9 ]9 M/ i7 Q
      * g- ~7 i0 p7 W+ l6 e9 i

    • + s& k( i+ a2 V* P- a2 z  N

        p$ b) `0 n2 z' P# ]2 x7 {4 o   else  
        t+ B9 G: e, f7 B' V
      ! d8 U2 T* ]/ B2 h) X( M" L  J
    • * n. t7 J' y) G% i% Q

      1 l; V: E" C- j3 S( \   {  ; g" g0 W  Z& w$ C  _7 t
      * i7 n3 \7 M. {7 t  c+ E& V

    • ) U% H+ G5 k! |7 A
      ; C: O. F8 R# ]5 d; i' J7 z
            s->next=p1;  /*否则插入在就绪队列的头*/  + ?% c. D9 V) `# n' a$ B
      5 r4 m) i1 g" V4 J7 G
    • ' ]' g1 }  g% Y

      + g# c1 h% F4 |; C      ready=s;  6 {4 X* w' s0 _6 H$ q9 b

      " R! a, d) B- D( w2 }+ g+ o( V1 r. t

    • & Q, h3 i0 }% x% W* X% \
        X1 I2 d; H' }9 y
         }  
      1 q* |8 q0 @! X; d* Y

      8 O# z) _% j# x1 u/ J7 G

    • 2 I* t1 }  s, |5 A4 T% |4 s  z

      7 h& v- \3 X- l  s; s5 U- _8 C" ?}  3 f4 V$ g) n- X6 e+ M/ h7 Y

      * n! n) i' I) n2 l
    • 1 A  ]( d: W- a9 }1 g9 @1 n- ?) \* l$ e
      , a  I/ K. ^$ T9 V% B4 R
      /*优先数创建初始PCB信息*/  
      6 \% P! ^' g0 O+ O+ J2 V, T
      / [" s0 W. C6 j- V  j- H; m0 E. Y
    • * `8 M# m: P6 a

      8 y' _- i' O7 y6 vvoid create(char alg)  2 f& i3 K0 m: n/ V0 K

      ) h, V1 V+ U: B/ J" I% `

    • - x5 t: y+ J% Y- A1 l- S

      ' ^; A/ C' Y1 \{  & T0 Y- D% L" B- i9 L$ ?' O
      4 `3 e& O% w  t! O0 C! f: m

    • * \3 s5 \& y4 ~

      ; X, Z6 T* y" O   PCB *p;  
      & V7 B9 G4 V8 Z% |+ }

      : K* P2 V0 r1 ?7 P2 w

    •   g/ g6 C  E: \
      . Q+ a& U2 a. O% {' {2 ]
         int i,time;  
      / Q5 ?8 T5 r' n+ W; N

      9 z8 s$ m% }* k3 ~
    • 7 X" X, r! x$ k
      / |. [  @9 C- s$ e9 X1 e+ `, k  o( c/ W
         char na[10];  
      2 W+ T" W0 d9 u) l: F

      $ \5 f/ V4 y" Z# Q4 Q8 t
    • # F0 {; g9 Y- a/ ~6 s$ n

      & y- B1 g; n* z* j% t) m6 H- ?1 e   ready=NULL; /*就绪队列头指针*/  
      6 m+ E) C# f7 B! v( ^- t; K4 @  O

      2 B" L5 L/ F+ m& K$ G

    • # k) S2 [* }; `- @3 j
      5 M! n- R/ {' }$ S6 f! F( q3 [9 [
         finish=NULL;  /*完成队列头指针*/  * Y5 F/ v7 l6 f, D
      ; T. ?8 a7 _: b! U" e
    • 1 E: W8 I/ k) x# q+ z0 k- W

      ! r  [% a% _! c# n3 a9 Z   run=NULL; /*运行队列指针*/  7 w& |$ s' g. E# \* F# ~5 n

      * N! ?8 v% C2 |+ B6 u7 W3 O
    • 0 x; l. K4 i; ?

      ) a$ B& C8 q$ p/ [* ^   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  , H# r$ w' G/ c/ G

      9 ]( }' O/ u& F( J) U, }

    • & o. ^3 g5 K9 k0 u

      & m0 m. P0 r% `: a   for(i=1;i<=N;i++)  ! O* u& a0 O0 E, m5 B. L1 w: t/ ~
      & M! G/ v8 L* i
    •   m" I) z3 e* D- h* T% t
      # u6 u- [# e0 ]/ W$ e  S
         {  
      8 ]% r) S& r9 E) x% s) M9 |
      % ]& A  r: j5 f* L# p4 `* I

    • + }5 k# h4 X# b' ~
      5 C" q8 C: L# C7 P
            p=(PCB *)malloc(sizeof(PCB));  - n5 n8 q# o/ X% b2 ^- {
      ; y( i' V0 }* R/ R2 n# Y

    • 7 i% ]+ Q; ?% ~  u7 v6 B8 j- J
      5 U' C  o# n' a2 K, F4 Q" @9 A
            scanf("%s",na);  
      ( w# l/ p/ ~, }' M! R/ y* N/ i

      / b; Y4 G% c+ Z" v9 }9 d! E: \: ^
    • 0 ?  k* a" L. M, S3 Z3 y5 o: p

      & S7 D4 B2 Y, B- J8 B  u0 _      scanf("%d",&time);  & Q, E: M! P; d# B

      ( F9 D. ?" I" u; J' C4 E

    • ! S- y( g- B5 v! r8 y4 e+ N
      $ O( [8 a1 v8 f; z  V
            strcpy(p->name,na);  
      7 [. i! [0 L: ^7 F& u
      9 ^2 ?* E. q( r6 {! n% }% I

    • 6 W) B5 K0 X+ @( C- I

      ) @' a6 h" L5 m- e, Z' v2 ?      p->cputime=0;  
      3 C" [- d8 O' d. |' T* k) c: F6 d% M# [* ^
      1 z! d  m$ |/ w$ X! h8 R) Z
    • " |; }- ]6 b$ w% f& r, o2 B: T

      * F- n0 y0 f+ g% R$ a1 @7 g# Q9 E8 @      p->needtime=time;  
      5 e. ?+ @8 Y( B7 s0 @+ w, L7 w
      ) P( J; j3 z0 N0 |3 _! a

    • + X* v3 I0 d; ?( A6 U
      ; B$ e! y# @+ l9 Y& i9 m) C$ J; O
            p->state='w';  4 G# g) ^7 X! t$ C; w+ H) X

      " A' P8 d' E. o5 Z; l6 v
    • / ~7 S) h. ]% J

      2 \5 i* ~8 S! x2 C$ M: W3 Q      p->prio=50-time;  
      ' \+ Z0 C0 n( T  {5 y
      - f0 |6 {  `$ b1 L2 {

    • % B# P- ?4 @. G2 Z3 D

      & {/ z' ~2 p2 v9 [+ l1 `5 I  I      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  5 i( u% L4 }$ U
      ) ]) x9 }6 s" w
    • $ V* k* Z* j0 u# s% P5 E( p2 }& j

      , @/ e8 w. {7 J     insert1(p);  
      ! k4 _* F" o" i8 _& V1 p
      , z( `8 L0 N, j) p$ j5 f
    • ( f7 ^& `, n( L+ `1 u& X

      1 s8 l) ]$ k3 h6 z' Q      else  6 a+ y3 K1 ?" E  v* [" u  P2 ]
      . A& Y! Q4 h  R7 Y/ g

    • 9 d2 b4 l  f# H6 _. d  g; T
      ! k  z7 _' Q) B& Q; {! N
            {  
      ' V+ N, f, I, b6 G6 M# Q7 m% M
      3 }9 R1 ?0 _, ?/ y  G! [  B
    • 9 k0 l" ~. F/ R: m& O5 h
      1 n" n. m$ H1 K  O  K
           p->next=ready; /*创建就绪队列的第一个PCB*/  
      ! L4 n% s- Y, C& D' L

      + ?4 w! l9 E' J) S9 t
    • & R  X4 w( w9 R* }; C& n8 X
      ! C, [6 U( D+ r7 d" q
           ready=p;  
      9 B. ?& R: u$ S

      , }9 N- G) `! Z7 \, w" L6 G, e
    • ) l* k/ U3 p$ A8 q* a5 A
      . t( q% x/ Y% K+ t1 C* e, m/ j
            }  . F4 V1 b$ ]4 l5 p4 X

      ) S5 ^' c# E5 n

    • , [. G# v) J/ z% p" c

      3 }7 U6 P: U4 O3 R   }  / R5 Q6 O, I/ O
      ( H/ D# e) p4 k5 o
    • ' a; w& Q& L$ I1 ~
      * y$ S$ U, N. ]2 W3 a+ d
         printf("          优先数算法输出信息:\n");  
      " p/ p9 j7 i6 k& H1 ^

      4 H/ F5 C1 Q+ L. V
    • 3 q0 C, T/ D% `' o2 Y

      ! c2 F8 k% y1 j8 C0 q   printf("************************************************\n");  7 r) e. @# q( }3 |' H/ m% c

        ~) y9 f1 I. [3 c, Q5 V
    • 4 }7 E; k+ p* t7 `7 [

      3 l$ v9 j/ j' N. z* E   prt(alg);  /*输出进程PCB信息*/  
      ; J8 X* G' P! Y" |( j

      2 x4 t! H+ Z: x

    • 5 }2 R: `! a$ e9 v+ Q0 k
      7 ^0 W# ?5 {4 _, H' {
         run=ready; /*将就绪队列的第一个进程投入运行*/  1 }. y$ d8 k3 N6 X+ a, [5 ?( A9 x& X, X
      . s' y5 N- k. G* k6 H9 {
    • 9 [0 G( w0 \3 S6 c

      0 h' }6 F* ?; l# e6 s   ready=ready->next;  
      - j$ ^9 I" o* D9 Z4 m0 p9 J& P- r) K

      ' s; x* S! J9 w  G1 E: v
    • 9 u0 T4 ^: m6 b, @$ z

      ( _. J# Y$ H  E, s: L1 I   run->state='R';  
      & i$ ^  }# u% }7 h3 l

      & X: t  I1 K! Q, _! G. M8 L

    • ) X4 B3 ^1 z  L1 T% |
      - X- Y3 j( m$ I! n) T2 @/ A; v
      }  & \- [- R) ^$ [- J2 o

      ' O+ q- Z! W' ]

    • 2 J: X5 w6 v( o- T
      + W6 u7 i* z! P  L+ H; b& ^- j
      /*优先数调度算法*/  
      * a6 `8 G9 ?$ F; K; \! q

      8 V5 L" P9 @5 l# u

    • + [' x" z  Q; m1 x+ J9 X$ J
      5 F/ t( y! z! s9 r) q; [3 f" r
      priority(char alg)  * F& l' `+ z, t' ]
      2 {7 `4 T! L: @% c" |0 \4 R

    • ' Q& b4 m" B3 b$ \  `7 g. W+ N0 _
      + G: D1 B; ^4 z" n( Z
      {  5 v7 v9 e+ W# j

      % Z9 N2 j5 @5 s. [" Z- a: O

    • 6 [. G" @1 |" \: L2 g* p( |
      + F! P3 n( Y  g  ^9 h2 B+ r
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  1 X! k4 ^3 i5 k  ]7 K8 Y

      % C: ]+ Y5 M0 ~

    • * y  K3 x& e5 Q1 }% S" I

      4 w1 r  ]9 r2 L- Z   {  0 ~  O3 t9 w1 Y9 O2 S
      - j  C/ C& o" _
    • 0 D8 R7 s: R2 Q0 J# ]
      " f3 {: z3 N! F3 n" N" l; Y
            run->cputime=run->cputime+1;  : \; r7 B  `: o' d: w0 Z+ g. u

      # q+ ^7 _, G6 z% E

    • , r( S  e* T$ G  o3 l

      % m- m9 S8 o+ \4 d# E) F! Q      run->needtime=run->needtime-1;  
      ! I5 G( z' X* \+ c& K9 ]
      $ B* i$ ~- V8 N! a; U4 B( B
    • 9 v  H) c* ]( Z8 T* S) y+ ^4 S3 H

      % g+ @7 P7 {" h& c      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      + e6 \- O" C4 l; }$ h

      ; B3 R! @: Y4 W; e- i7 G6 o4 S
    • 2 H- M% e$ l, J/ \# K* M

      5 V- {# [5 P6 K) b      PCB *p;+ t# j" Z8 g( _: z6 D3 z# M
      ' z9 f* d/ X, H: \- O# I
    • 4 m- F) W1 ?/ g2 z- D2 C5 e

      ; c* J1 O. ]4 c( r      p=ready;
      ! h) d: I4 ~( h, l4 s/ z
      6 W/ b8 l" ~; }4 Z' t7 H6 P

    • 5 y  f5 {+ e; p' }2 n6 ^1 h

      + L4 v7 B* P( Z1 n/ w! |      while(p!=NULL)  8 ]4 b& l8 _$ h( s, p

      9 U. [/ m: d5 q3 u: g& {& `
    • - L/ W  p3 H5 Y% }

      ! ?0 n2 O" E$ ]  N      {  
      & ?+ c, B: d/ O( ~- u3 E

      9 E6 h2 C4 i+ ?6 J* ~, P; T) p% y$ K
    • ! `5 }4 t" N+ r- y, G
      2 c; R( ]0 |" n6 G1 u2 l5 K
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      & T9 Q. @! [* _& o* {

      9 A8 S3 f# I! T8 p, ~' @: O" @
    • 7 v! g" U# m1 M  O: P" E9 U
      . \$ z  t) X1 ?: k6 G- E* _2 A+ O8 F
                p=p->next;  
      ; v' N6 [; F; |
      . d6 B5 x" T+ e' g6 a8 L; p1 c
    • 6 L: ?6 c3 v( L0 k& i
      # ]7 [2 U/ ?9 z2 m/ L! P6 d# m( {/ f
            }  + ^$ T% ]- y: @- f9 X: K8 w! a
      # w+ C9 K# M$ @" V" p/ ~) ~

    • 6 S' r5 `* f0 m5 g( \* R) r

      # h2 z" Z* _8 T2 k, r: q  a+ g: x/ ^      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      ( ]0 X3 X/ U5 H" l2 b- d
      + q# X0 H% u8 g
    • / ?6 n% b( ?  a1 u( y& m

      5 V' L7 s: T! I0 G, ]      {  ! F1 v- G9 N7 U5 H
      * i& g. E8 _2 ^, X. P

    • 1 l* F; }) |- a6 B# {
      # D6 X! F: Q" Z+ I7 }5 r# t
               run->next=finish;  1 y' O1 z; c$ X* K0 D8 g

      * z1 b6 l: |3 |" A
    • " `. l$ ?5 C) s; e

      * ]* H1 L7 m$ s, f% a         finish=run;  ) D( i( g! l0 A- r9 s  g3 u/ T

      ! x* C$ T# Q3 n9 u
    • & o& j9 x/ B0 H- n
      1 ~. o4 B0 E  @+ f$ H; _
               run->state='F';  /*置状态为完成态*/  
      2 y5 X% ?# ~0 c- _1 h. Q9 g  F8 m9 A
      . k* c7 Z; f+ y+ J: y, n  |# m6 `
    • ; u# T" s# n+ h. I( Z$ x! l

      / b6 J+ t& x8 Q) W0 f. I& d. R         run=NULL;  /*运行队列头指针为空*/  
      4 i% h4 e7 e& A! r2 j( t

      % I1 X4 X3 l+ n2 m! ^. v; S
    • 2 {# o0 S. J$ n' o: Y
      1 E) T& }: x4 {2 H; `2 `
               if(ready!=NULL) /*如就绪队列不空*/ ; x* X# F& @: y+ Q2 Q7 L/ `% i

      . L# r# m! E/ `8 o& L: P) [. \2 X

    • . e. b: `0 u- N0 l
      ) V9 y) ^8 _2 s  _# s4 q
               {  
      0 j1 T( T4 ?) P0 n4 Y) H  L

      4 q+ L$ [& Z6 \* Z9 o4 x
    • 5 d  G, ]# I2 `# \* t8 P& R1 e; e
      * _1 D- A" u* w# Y$ |7 s
                  firstin(); /*将就绪对列的第一个进程投入运行*/  2 O: K; d& A4 s. q. Z

      ! Y1 r% E, @# A: R" I! Q  {5 x, H0 ^

    • ) N0 i0 @0 z& h, z' ?; u
      1 p6 N7 Y. }' q% E( c5 Y; v
               }: q2 T: {; m' f/ q
      . c' O6 F8 y$ w9 I) W! ?1 O* V

    • . S5 j; I0 u% k
      . X2 d* j- R, y# O7 i
            }  : c' E$ v5 t% E

      7 r' n  T) w$ d, b. i0 q2 U
    • , {8 `5 D0 f: o9 d6 J

      & G, F# y, P. N- I- f8 ?      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
      ' n! Y+ V  w# s7 y2 c5 n

      9 y4 W& @# ?4 j

    • / e2 a6 L2 f3 Q/ ?

      ; l2 X3 s' H  {) V2 J     if((ready!=NULL)&&(run->prio<ready->prio))  
      4 B) n1 K  {4 O) v. \) S- d9 h

      4 f' w( p' D4 o/ \$ k9 ]4 ?
    • 4 f) C3 B1 i2 t5 P/ V( s+ Z: J

      ) @! A7 I( d6 L; g6 B8 b; J$ a  j$ \; H     {  
      5 E* z) B2 W2 i$ a2 w  y
      % M; ^  `/ R5 y& _! A
    • 9 _& R* C9 H0 C# F, @: n

      5 [3 `# B5 }# G1 ?; C        run->state='W';  
      * R: F+ n' ~; g- d
      0 {" t3 y  M) F% j% b
    • 6 a8 c; I, F  x! _6 x% O
      2 I$ ]3 W: R, s% m$ |0 J: K( k
              insert1(run);  2 a2 K: @$ C$ n- w
        m' x' d/ g' k, y% I) I
    • : B4 \' \( n0 p' T

      + \4 t0 {: w- Y1 p0 l$ u% i        firstin(); /*将就绪队列的第一个进程投入运行*/  
      " G2 P, f( B5 ]2 z; R& P

      & R0 _6 m; d5 }1 k9 h4 q: g7 L& m
    • 2 Q3 H  ]& h6 T% ]
      7 }/ G0 |: v- M* o% T! g7 e4 L
           }  7 ]3 T0 v. T( g" ~; H# b

      6 l  c( p; z3 ^$ _' a. a2 M

    • $ o1 D7 K: B( V$ E, R
      ; m  r! d6 h8 Q+ B) M
            prt(alg); /*输出进程PCB信息*/  
      4 ^  Z( y$ z, D+ J5 h
      8 f' s. K8 ^) R. q; S( {

    • % e0 `" w0 n& A1 S  x* o! u
      % Z2 T. _: j( R3 W0 D/ S
         }  
      : v2 `+ }. t  `

      3 u; C9 j7 {5 k7 X9 c" ?; d

    • 8 q" W3 S/ h" ?' N
      , D3 t! N) n5 @! ~: R* t/ F' ~
      }  
      / e! P4 e6 p+ j4 l: g/ v
      2 ^  ^$ [1 K" L0 ~  v

    • 2 a; j4 D5 g9 b: S$ W

      $ V$ ^; J! c; D* {, c/*主函数*/  
      ) k+ H" e) }4 L# d- u; Y; L
      4 P: w+ G( [" Y( I% y1 Z3 [

    • & z5 B# i9 {& T7 |

      + J" j" C2 N; w5 ^7 u8 zmain()  
      - z  v0 i( h8 M' |, g* M7 R4 @

      9 t' I3 N. ?3 ]3 z! {! v

    • 0 `* {4 j) h+ \& p" X% Q6 J

      - [3 l9 I+ ~) h& u0 v/ f{  8 `2 @3 e5 z( S+ }% c. I& P; ]
      , h8 q' y; }4 u

    • 8 u- P4 p$ v2 x$ }1 z3 x

      2 C3 H% v' k& u. m, B   char algo;  /*算法标记*/  
      4 x. |* ?: n: _2 j$ U& @7 N
      ' ?' L4 x  }7 X
    • - t+ u: C# m. D/ Q( U
      1 e8 Q1 ~; v; o" z) @9 z
         printf("输入P确定算法:优先数算法\n");  . P* f- e9 z& a0 C0 t! I+ g& }2 g8 d

      , Z8 \: [0 D2 a1 J# \
    • " H9 S# g; S% ^7 s) r5 O7 A

      * H. o* ]8 a: u. d% H2 r   scanf("%c",&algo); /*输入字符确定算法*/  
      ' u! H  n8 U* \
      ! S; v! E  W) }* h" W6 [. C/ z) F! a' d
    • 9 }+ I1 F6 `! f. }! C4 i0 g

      ) L3 c; U  e! ?. w2 _; F3 I   printf("输入进程数:\n");  
      & b1 Q8 [" N* U7 ]# H; f! r& R

      # j5 W' ?& Y, B3 U9 j# K" Y) C0 }

    • % b9 W, o; h) _. f
      6 O5 H) @: z0 F& ]/ I+ g
         scanf("%d",&N); /*输入进程数*/  % s8 {* Y9 E& Z: P5 w) j
      & `% B' {; A) S' N7 z
    • . p2 }- b$ X% c

      / j  W  v. _- O: Z   if(algo=='P'||algo=='p')  ( r, T2 Y/ A% X$ I
      % n; |: N( e% J$ Q2 M: [8 V

    • & L0 l( c0 H" n" A  F

      - Z. T+ R0 N7 y- B   {  2 Q& F8 ^) q. D
      4 F, m: I, F4 O" B% {
    • / l7 J; g* z  _5 j) K+ l; t
      5 y# f. U% V) N% l, \& x* q
            create(algo); /*优先数法*/  3 h5 R. e5 B. |% F$ t8 P
      & r0 n/ G  _5 m! ]4 a
    • 3 i  o: u; J  e5 `, N7 @

      ' v5 _& b3 D- k9 B- A! k      priority(algo);  
      4 S& d/ K0 G* H# T" v+ d, `6 V! |

      1 i  b9 R2 k$ H2 h. T" |

    • 2 F8 o3 {( f; x5 ?- ^9 ?! a2 y
        B( g0 N- B4 ?% ]1 K
         }
      $ ^0 P$ V( s. @2 w. R

      , K5 W; u% k" P2 ?
    • 6 c9 h$ f7 J6 Z2 n( J

      * k7 W# O, z# L  o$ P! l: \' E' \6 z}" |/ @" K* z9 `8 w1 R. D6 X

      ! I/ J$ L. m2 C/ E: y$ l- B2 g) v# Q- H7 l4 B/ Q1 B


    9 U! o: @# ~: b& F  L" _3 ?输出结果:: [3 y9 e5 A- t$ S


    / m1 S3 P6 l& P8 B2 _  m原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    4 R" _/ O" K4 k1 v( ]0 E$ e- w

    ! ?3 ]0 h0 @9 T/ a
    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-10 05:02 , Processed in 0.478652 second(s), 51 queries .

    回顶部