QQ登录

只需要一步,快速开始

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

    , U5 h6 [' c  {$ _) |% M优先级调度算法
      x1 J5 ?" z' s; z) I- {- G

    算法介绍
    # Q% g" Y4 J% }9 _& d1 C! h& P优先调度算法的类型(用于作业调度)
    9 d9 m8 e. Q6 A4 V  h0 y/ D1)非抢占式优先权调度算法 . m" n5 H- C$ M, y
    系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。 & ?! j3 S+ y* b( A" b
    2)抢占式优先权调度算法 2 f% C: R8 i: k! v
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型
    , \, b& E& E* }1)静态优先权
    % F4 P3 U" d6 ^$ W' z静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。6 I0 `% v* H% _; i* h

    2)动态优先权
    # Z( V' N) z, u; n' |! ~# ]

    算法实现

    抢占式动态优先权:

    ( ^( e2 |9 C* Q. n7 [9 X2 h* d
    PS:本人认为非抢占式静态优先权没有实际价值。

    • / i; b- Q- p2 F

      ' Z# L* Q  ?3 [; j! I5 A#include <stdio.h> / n( @4 i0 O& ^# k1 F
      $ x1 f# R; y, C
    • % d1 A1 D8 @% \" B3 j! u
      ; v& ?  F* c+ h
      #include <stdlib.h>  
      + }# B7 G& a% A- t5 P; e% n

      5 [% E6 Z' d# f* u9 h* P2 \

    • 1 G+ a7 L; C; T/ x$ J- B

      % H  y+ s9 q7 @5 ]#include <string.h>  
      8 v/ ]; R: ~7 w$ [( L  W/ {+ U
        K2 w) D7 w% y$ ^
    • ' ]1 N% [. E% z/ t$ z) R/ u

      ' P+ y: `1 N: K) k% [8 }/ \typedef struct node  
      - q9 K8 v: ^  ^. T

      5 B6 o% W! a7 V. u' w8 q% r) U* o$ X
    • # _7 V- F9 @, c$ N; ]! [4 [7 F
      : v, U7 g5 F( N4 ~( g8 N
      {  
      1 N) d$ v  i& ?* W, B
      / K% u% U5 w5 w$ f# a0 s; I
    • 3 r* {/ Q3 [8 i- y

      . k/ q8 F* C9 J) Z   char name[10];  /*进程标识符*/  
      0 h$ _, H& x) F1 F7 k1 R
      6 b- U2 Z' i, h3 U3 ?% R8 I* o
    • 8 B( E, k# ]3 l! a6 z; a7 z

      : l2 h' n" A  O- i& J, F6 E   int prio;   /*进程优先数*/  
      ( Q& @& H7 b& r, Z' Z( Q0 n# e# J/ G

      6 o7 l! Q0 y3 }; R. Q
    • $ l: R0 _% U% X2 t8 L: X4 t3 x+ [) ^
      $ N" ^+ |2 d7 G# f0 _
         int round;  /*进程时间轮转时间片*/  4 r; D5 J) Q! h9 O* X
      ) s) {/ A9 V  c; }3 G, i1 `( D
    • 9 T$ a8 p( J6 q" B+ L2 w
      * t3 M. Y' r- T/ R# [% I- h1 F, W+ z. m
         int cputime; /*进程占用CPU时间*/  & [" O/ L5 Z& e+ X* [
      . Y& T7 F$ V6 c, U4 |6 Z& X

    • , s- d- J, C: v+ j$ R
      + R1 d- e7 b/ A$ H) k1 n7 w% @. [& o
         int needtime; /*进程到完成还要的时间*/  
      0 n5 c* \0 g+ O5 T: U
      . F2 l/ h9 l3 n) D: m
    • . s0 w! y0 S1 ?" |" f8 A& k4 N

      $ v1 J, X( k- f  C& W5 ]   int count;  /*计数器*/  * Q0 Z& D6 \) I1 s; q! v

      & @% {& ~7 J: s$ Y8 t

    • 0 }' R# l/ ?( o5 L5 `7 k/ _; d

      0 [7 ^) k( K3 g   char state; /*进程的状态*/  
      ; J5 C* W" u9 [" p. _7 `$ ?
      9 I4 {3 \' N8 G0 Q4 d
    • & S6 O7 S1 h0 N
        X, r* x/ v) y+ m9 k
         struct node *next; /*链指针*/  ) D6 X" F/ i" _! o  @: l
      1 r$ ?( o7 M, g. E

    • 3 n$ S8 V. V8 x8 }5 i2 o+ P

      . A, I, P! m' n}PCB;  . E0 {' Y7 c: q
      " Q- e1 u0 |8 r0 b, ~& F

    • / G0 A9 \" B0 R
      1 b. t; L- x0 f' Q+ d8 }
      PCB *finish,*ready,*tail,*run; /*队列指针*/  , V/ z6 R! [$ U( z) d+ i8 t

      3 D% J0 k+ p, _( v1 E+ j

    • 9 `0 {6 Q" ^& d+ H9 B* b7 E# r
      2 x* A& N7 o- F6 ]5 O
      int N; /*进程数*/  
      ' x5 Y& O3 {  r7 A1 \1 E! e

      / X2 V: w" x0 z3 _" Z

    • # W& f3 v) A' {

      % X3 G- g1 m. I- @' D/*将就绪队列中的第一个进程投入运行*/  + M; [0 h. J& a4 A2 z: J, d

      : q4 F+ P+ ?! o) D
    • 3 \7 L1 l+ W% r, X: N4 |

      / G3 @1 B& Q- O3 ]. E( X, afirstin()  , @/ t& d" m3 [9 ?6 w* t

      7 V; w4 `2 P: ~! J' e2 b

    • . Q, L( J; |, v) r& f
      ; x! n! J5 c+ W/ i7 F! g: H
      {  
      * g1 Q! \+ `$ b
        J6 F2 E( k/ G) J
    • ( S6 O% |  v& D# d

      4 d% ^2 O2 G1 C# W% ?: D- s9 ?   run=ready;   /*就绪队列头指针赋值给运行头指针*/  8 E$ Y! V% }, n9 V2 J8 Z: N

      + S& j5 ]+ u9 C' _; b0 g
    • 5 }9 w, }4 J9 J* l# l3 P' w) p
      - N1 J, q1 g1 B0 }# N' v7 w
         run->state='R';   /*进程状态变为运行态*/  ' w% w7 `; f" E) E

      1 p4 d& X. l0 B. m* b9 Q5 S
    • , V: Q' U7 j$ h" l- M+ i

      ; }% f( y9 q4 `3 e  h( @   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      ' [" e+ A( s3 S
      ' Y) M( O- i$ Q) i

    • " C2 p/ D! F' |7 w

      5 o7 G, g0 q* p9 Z4 s4 J4 Y}  ' G/ O( m! m8 w. G- q2 M8 x/ `/ r

      2 E  z% n! p8 N- X+ v. C

    • 4 V% l- D9 m: {  F
      ; K* \2 b. n& ~
      /*标题输出函数*/  
      0 A, M$ w9 U# u* V- }0 T1 v
      % q) J! I/ ]& ]. Q% S9 Q) y
    • , ~6 k9 {" u4 s9 z

      2 T/ F; ?" \4 y; Pvoid prt1(char a)  
      2 e% ^6 z8 I$ l- q
      7 A# f0 O8 S) l2 [

    • , ]$ g$ P/ G5 `/ i. g
      3 J5 |7 O* y: j4 q$ P& m
      {  
      " g/ @# R, \- A0 E5 H8 e
      1 V- ~! t. w- B1 E, d

    • 5 Y# j: h- c/ |# p8 N
        h& n3 W1 t  @0 E. ^$ u
         if(toupper(a)=='P') /*优先数法*/  2 I" q3 E4 F0 z$ S

      # O# r! k" s# N$ p( Z

    • , F% P1 m/ f2 ~) B  a& m' ]# i

      * E3 ~7 R. |" k' S6 W: }6 Z3 N/ a      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  2 `5 a, x2 Z$ \

      3 _9 M& t" U% F

    • : v# ^8 @$ i3 d4 {5 d

      / B8 P/ N# K) s: ?/ Z   else  0 F8 @9 l( g( b4 H' s  X' i. Y

      * {6 j% p/ h! @. ?
    • - C* y: c6 Z' t
      9 P; h0 ?& i- J% |2 }* ^- ~, ]+ S
            printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  ' m: `& |% `0 y+ e& n% J5 q- j, R

      - _9 {+ G% w+ s/ D! r1 Y

    • $ |9 l6 R& D0 B) l. f5 F* T8 u

      $ I; \: I; ^, c' Q8 S  S}  1 K0 r9 c' _9 o% U% K0 L- a

      , ]. A; N8 F" D" H

    • 7 U% x# f4 I5 W+ |/ H

      . b: A* f  R- B" x/*进程PCB输出*/  # I9 \. A- N, o8 x+ w
      # N9 w$ L, h/ S  \& v# {6 T
    • 3 N* u; o3 f6 O7 b  _# U
      $ b3 H0 K' X' E
      void prt2(char a,PCB *q)  
      ( s. ?1 H' @% _( @
      $ J7 `' [9 h4 Q3 {0 y' I; {( J
    • , J& u1 r0 x- a2 y) J) |8 y
        G/ ^$ N) R1 ?! |+ s0 S
      {  2 e! g) y/ O$ R! ~  E2 M

      7 _0 n# g- L: X3 u! x6 `1 ^
    • , _, S' l' G- b

      4 u6 G% c& a: _& J9 K; g1 l   if(toupper(a)=='P')  /*优先数法的输出*/  
      ' N) ^; o# ]5 T& _' P! B

      ; o, b0 w6 z1 U

    • % p2 Z  l% U; F2 W* G( I3 s  B0 r

      7 P5 f! _: {, U+ [( e; E  k$ I      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  9 e9 }, b, K) S$ X0 D8 W$ {& V7 z
      4 n8 n# o; s2 S4 C& J+ q7 ^
    • / F" Q. s5 [& x) y  w( J9 [
      : e* J$ {  `: u/ n# P# P' U
             q->cputime,q->needtime,q->prio,q->state);  8 V8 }1 @  g0 }, w
      " {1 ~  I8 }+ w8 Z$ Z: b5 p

    •   D. r9 z; ~/ ?9 D

      ) G; @  w$ D+ O$ }/ v6 h4 Y4 i8 M2 @   else/*轮转法的输出*/  ) [6 H1 x4 W# p* \% b( g+ o
      ) E) z) u/ @8 h3 u6 j  C0 W8 X* M8 W
    • - o# C: o2 r0 a
      " T5 g3 H5 L: d4 S' {2 v
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
      1 c- }# M3 j+ M, N0 F+ l: b

      + y1 w' W( D+ d" a4 [

    •   l. ?; G( \+ Z" a& k
      ( i4 k' ~* c+ ^3 r( S: v
             q->cputime,q->needtime,q->count,q->round,q->state);  
      - I( C. F1 T- }, U  z

      ( o5 o. s0 |/ o% p4 j# [

    • 5 p& F+ T; X7 H( h+ W

      ! `! r" t4 P! v# Y2 r: \}  " D  {3 T# Q$ Y0 J

      % z" r- N( {5 |# y3 o8 T
    • $ {- K0 Q  f" B  ]+ i' t3 {+ p
      $ r+ e, f8 u$ Q/ i+ J
      /*输出函数*/  ) n" k' P4 @4 P! F& a" r3 [
      ! f! A3 O' A& H7 r& S9 m. j/ d
    • * w: T" z4 C- L

        @2 A9 z: k2 r, v  j7 O& h% hvoid prt(char algo)  - r( y! [0 ], n- U; f5 u

      8 p1 V0 \2 j8 m% J

    • / i1 a2 |) Z3 R& x7 _

      8 i9 u4 F+ {+ ?2 [& q  g{  $ l: W- F7 a9 ?6 S% u# g
      $ F+ l* j4 H, j3 a1 i
    • # h. X6 B# w. N- E, X
      / C* A2 R! W/ {6 P9 |+ r
         PCB *p;  
      3 y& J3 G' k  m# S
      + q( u- a+ T  {2 y

    • " B9 H9 X$ t3 G% n/ o

      9 [& b& M% [( y# _8 n" q) b) P   prt1(algo);  /*输出标题*/  ) k( @- i! E( `; d5 M- L# O- k! y
      1 H8 ]/ i; v  G& P, R  ]

    • 5 E$ k  g! i8 i
      1 d) K& S0 `" O5 J3 L. B
         if(run!=NULL) /*如果运行指针不空*/  
      . i% i' r+ k  f! ~
      9 i% H2 J6 t2 t8 f6 b
    • : N$ O' U# `; N2 m1 U9 I& j. c, ]0 z

      2 `5 |/ W+ ~2 y3 j' ~: M* [      prt2(algo,run); /*输出当前正在运行的PCB*/  ( y  b' R1 }9 Z: b6 W! ^
      3 n: w+ ^/ i- h- e! R
    • # K' R7 G5 b8 o1 \5 B0 k

      * u" j3 m" {1 p5 v  ^2 M   p=ready;  /*输出就绪队列PCB*/  6 H( K/ Y! ?3 P, F( T5 t, T+ E1 |
      % a; v' Q0 f, I% d
    • * L5 B1 p2 [3 u1 L2 y7 t8 x  F

      ' I# ~( j2 P# b5 o/ H: `   while(p!=NULL)  * @2 _. ~! k* y( X4 }% n# g
      $ Y/ ~( E7 @0 G
    • 2 i, k& b# r1 p

      7 `0 S2 v! ]# |9 m3 ~5 ^   {  
      9 ~. [/ T" V/ n  x5 U

      6 K& Z! [4 J/ O8 x3 H
    • ' T+ w2 ]7 }9 _$ m2 ~4 ?' X
      9 _4 v7 r1 p2 n: s4 [
            prt2(algo,p);  
        F* m3 O: V& [: S# E  ^; S# w
      . K, r) `/ D- e% }6 m9 q

    • 9 V4 Y7 @& D# Q$ w
      4 s) p. d( V3 \% r4 q
            p=p->next;  
      0 E# G/ \/ g6 F- J- h) u6 n

      7 D0 a0 x( S# i. T& I
    • $ @! J% U% O, x7 m0 c5 R) I1 f

      4 l5 ]* B& `+ h# W- ~   }  
      ' |! M* _; p8 Q: d+ V: H
      3 K* l; w! t2 \

    • 0 g7 O; K4 \0 v4 E
      5 |; _; f0 y- y9 Z# \8 C! D" m+ X# D
         p=finish;  /*输出完成队列的PCB*/  6 t- a! a2 F0 e& S0 E3 n
      * w# d. R/ J" l- ~" m
    • " e( F. U2 u' e; g

      + w; r: v  k. b8 A0 m+ f7 G   while(p!=NULL)  - p* _  ^' ~5 r. Q- z& w: Q) Z

      & e' P" A7 s6 O* `8 Z" y/ _
    • % D, v4 Y/ R7 x

      , m  a; n" `) |0 q5 E   {  - Y1 Y1 O/ T& S: n6 H9 g

      & d8 Z" W9 z( p9 v
    • ( _: o  r% A. q0 y

      5 H5 w9 n! q9 N4 a: p1 W      prt2(algo,p);  
      ) D+ t: K6 l' C" H
      ) b& q9 E3 W8 r7 v. {% Y- `3 r
    • 9 t* u* L+ L* |; R' \9 c

      ' N" z5 A# @+ S; [3 P& T0 r& }3 k      p=p->next;  ; `" C4 U5 |! ]
      ( r9 A7 E& g; }5 w3 o7 k

    •   @8 U6 Y2 W8 p5 Z5 {- w9 C  f
      + `+ u2 ^' y1 ]% h3 x
         }  
      0 z/ X# }* f$ t4 ~, p

      & k. Y+ v0 ^7 E2 f$ R  q5 O+ E
    • 0 {; W3 ?0 Z" b' S

      ) `1 F" _/ o& i3 j, d* c   getchar();  /*压任意键继续*/  
      * i& S1 [2 [" }2 L

      2 l5 z0 q6 k; c0 [- `1 B
    • + b, i& y/ I% M; s3 H

      & O" {+ _3 A$ i+ j( F}  - X. G! c# J+ Z5 }/ f

      , U! w! _  F) y# V0 u: }

    • . b* q7 s4 w( `# R4 |5 ^! N' w
      / k$ ^* ^# K+ M' `; f" H! q
      /*优先数的插入算法*/  2 f- z# Z. a( }4 D$ G8 ?! l
      3 T8 P* w* v0 @0 ^0 F$ K/ N
    • 6 p0 n# c8 [5 B+ C

      1 n+ H# ?$ m% ]2 _insert1(PCB *q)    F: j, t( Z9 D) J- O# n, v
      5 Y) Y6 F4 k% }, K8 u: j) Z
    •   X3 Q# }! p' G7 H+ N! W

      ' ]% m, h) S7 l/ }{  
      ( K3 J6 f2 Z" a4 e0 n

      , r( _2 V% H" K6 U, j

    • % R9 p5 q* R% T0 C4 S
      5 ?* I# n0 A0 H& `9 j! ?
         PCB *p1,*s,*r;  
      % S8 Y8 h. `: O& I; z  D
        X4 M) [4 i/ l8 i7 B3 T
    • % g- t# H4 L0 j, V+ b0 q  G

      9 y! m6 `' v& {: L* b$ L1 x   int b;  
      6 n4 x4 M7 ?5 N/ ~/ T0 \/ j, z7 N( J/ b
      * e+ P/ x- A3 M4 y8 V  E& @0 H

    • % m( d* m$ \# Z# C- c' v% ~
      " X& C- d9 I; x4 t
         s=q;  /*待插入的PCB指针*/  6 a" {; k: k) G" _" B
      ; ^2 k( k6 G1 A  r5 p* c
    • ( m' ]8 G6 b* O- s

      2 D8 `5 }: Y; Z+ T/ b0 b; H   p1=ready; /*就绪队列头指针*/  
      ' }! Z' s1 \! X) ?/ P
      - H& d3 x  F9 H* _3 m* w, o8 ^  E4 ?

    • , I" k* r* x/ i- j8 W  g3 e! u

      : i( o; f" I" {) A1 \   r=p1; /*r做p1的前驱指针*/  ; u, G: M8 Q3 f+ k/ c* G

      . f0 `0 |4 `) f) @
    • 7 Q5 T2 D9 R2 {  F) p9 z9 K! z
      7 U: {8 N. f0 ?+ |: D4 c" o
         b=1;  
      ) I8 ?$ M$ h7 w6 _9 i

      6 g% E$ o) P) T* h

    • , c6 ?; ~3 Y/ I" p% d  e# C
      9 {9 l- o7 `& o8 K4 k+ q
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      2 Y/ Z6 k4 a) l$ Y9 G
      - z, [1 \0 l# M# P2 \
    • 6 U3 [3 b0 s" |" v

      : ?, Z! R! \  F7 @* H5 {3 h% p# ?      if(p1->prio>=s->prio)  
      - i: ^/ v! x6 }: L  ?

      ! }" a# s" S: h
    • - z/ V9 }; a' g* ~. w

      3 n" H: Z1 b1 v9 O) D/ V      {  ) T5 ]9 `1 i% ^2 I) ~5 t
      ( O4 H9 J$ y) l$ c1 l
    • 8 _" A' r  C! @  f

      8 m, J" Z0 L9 n7 E7 v$ y     r=p1;  8 y- r1 S+ d1 r
      " o& R! b; S) D( T$ n5 q  U, p7 M
    • % ?! o+ y, A, n; {- [3 o

      7 c8 _" e9 W+ a8 D, }! {- w" m8 G     p1=p1->next;  4 l) P- b  G) `7 v2 a
      - C- b1 [6 z* E; ^

    •   j# O- y( p. ^4 H, \: R0 S& B( h
      * {& c. ]! X2 o" `/ ?& Y
            }  
      ' m2 J/ |; d' Q- X

      9 ]& C' c2 a5 D
    • 3 h* R/ T( u6 {7 l, G
        B" M* e) F! e+ g; Z' x# ?
            else  # F7 J, ^* d; Z  A! F
      6 I2 \7 _0 R1 k% b4 `
    • 6 D" S# N5 q0 Z& ~8 p- ^1 t8 v

      0 ]' c/ r' \+ m' n3 d     b=0;  
      5 f; Z. Z$ r8 U8 F, X3 _
      4 s3 p8 y* L6 k
    • " z0 S5 B! Y/ s: G3 n5 ?$ e
      4 V: y# {  n9 R4 l* d
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  & \8 o; h/ t$ [! O5 @

      ; h$ g8 L4 }4 V  P  W
    • 7 b+ j6 E4 c4 P

      0 h5 a% e- C, t1 n2 m   {  
      6 U! w- r& Q* Q4 ~! X
      6 O& S' t# |7 G* {8 ~: W" ^# f
    • " o; d: k5 K" `6 Q" H
      $ G' p" `9 [6 N! ?! H: \
            r->next=s;  
      9 a0 V" A  g4 W' q- w) ~

      : ~+ R- [% g3 n. |/ W# G& W
    • 3 Q' K' y- x8 F* s0 p

      - T  a# u  x2 G# g. Z. d      s->next=p1;  
      2 z4 R6 Q4 f. h7 V$ M
      ; U. A! }$ w' @( @7 R1 b- X/ x
    • ; h  q* B& z5 c! y" A' L- ~

      3 z/ V& @& [% k5 |; A; A   }  $ l6 q+ N6 [- y( j4 h) L

      ( G- s  N$ K0 S. p5 [0 S6 f
    • * ^! H& M8 J; Z( H

      ( y1 h7 e1 g. Z" ]$ z* a$ D- i   else    y# O2 ]; P: R2 M
      - p0 P7 N  O. [
    • # [! I) l% H6 ^0 _  e6 B) x

        e' Z2 u8 K/ I   {  
      % F3 @& o$ v8 M# x2 i" S' x3 C

      * \3 Q% S( \5 b8 y9 h$ P# z

    • * i: T7 v$ T2 E4 [0 C6 i  l
      ! U9 ]& r& j/ u6 k  a, q' F
            s->next=p1;  /*否则插入在就绪队列的头*/  
      ( [- F$ M/ X$ X
      6 ^) P( C! d! ^( m. Z  w
    • ) E- _5 w$ D' z4 H

      0 _7 b) }# e. p6 i      ready=s;  " |. P* \+ S9 y2 _/ Z

      , n3 _( e0 Z# X0 l8 O  ~+ g

    • 4 q9 p* a3 H( G- I3 z5 D  A
      $ Z( \+ E6 h- }: e- I. s
         }  
      - Q& y) Q6 W- {
      ( _# j; B6 `+ f: t

    • 4 X0 N) I) |) P
      ; R: ]' c% Y0 a8 r  C( f7 [8 _
      }  - u1 @8 P/ v2 l) L5 }5 M6 ?

      - d5 z$ J% Y; e6 @

    • : h6 S* S! u: p' |0 R8 Y. ?1 r) M

      $ n6 u+ L4 `# ]* }6 D9 m! W3 o$ o/*优先数创建初始PCB信息*/  
      / x! C0 s* P- B
      3 L8 `- ?3 L# `! }3 G0 ~

    •   ]! a1 Y  b" I  s0 ~) o

      5 i% e& u& k/ Nvoid create(char alg)  6 K2 _) i6 {2 r. M% A0 v) n' l

      & t& ^( P- a: H

    • ; U7 ~. l1 p: U1 o! T) ]+ R' J+ V

      ' y3 T- ~3 Z" E+ o) D# P( \{  # H8 I; x& ~6 T
      1 `7 U2 m7 u3 I5 {$ i2 A

    • % K7 k5 l) R0 a% d

      $ |5 o, [7 |$ Y2 G' W) S( \% w# c2 O4 [   PCB *p;  8 b8 Z5 x! h+ K( i% b, T  M" s

      3 X- A+ ~5 x( u

    • 4 U5 G. R. r6 Y1 D5 w" q7 K  b( j

      5 Z! f- n! L5 V3 p/ a' }. ~) U   int i,time;  ) {. O; `, K" \' j+ ~8 J

      - w" M( g4 |7 T# |% r& m# x3 o

    • 5 @, S' `% j" N# U5 w3 f/ Y

      % ~5 \5 I; H) {- S- {% T) r   char na[10];    |+ I: C2 E, d. i: X
      & e9 n1 ~- x, L4 X3 g
    • 0 c( }$ J0 X" [! m3 V/ D' X
        R" M. G) [  L! P( K  M3 V( G6 [
         ready=NULL; /*就绪队列头指针*/  
      6 M1 B9 d+ s& b; o

      ' z8 T, @9 }' f8 S
    • - O/ H- q+ ~3 q* G" N! R

      0 {! ?' k7 W/ _8 C   finish=NULL;  /*完成队列头指针*/  
      & C$ b$ f0 z0 r) \1 }; k

      4 |2 \& J5 S1 b2 K0 m, r$ K: Z

    • * q- H6 I, z$ P. r9 x# [1 o7 F. r# w5 N

      % F( U% P# r4 ~. w! Z! u; M   run=NULL; /*运行队列指针*/  
      $ _0 @# m+ F5 @6 \3 M& H
      ' Z% m8 N5 {1 ~! E1 M* L0 r

    • - X' ^# S8 g8 w/ i. u+ o' o# s

      % l# V  P- k3 H: Q% c5 |8 [, }   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  5 W8 v; c# s3 ~' A* E9 A
      # q& s$ P5 [2 l2 {# m5 r4 Q& _

    • 9 `& G7 T4 j* ^+ P
      6 B6 f$ g- F4 f/ L
         for(i=1;i<=N;i++)  / _" @  {8 m: b) c: ]/ z# T& ^; o

      # N% Y4 s4 a4 O) j- f. I. T
    • 8 ]: \+ e1 N$ @
      7 c# ]; Y. n8 S
         {  1 X' j$ ~. U$ H2 b% k/ p! v* L7 l0 _

      , q, g. ^  |5 n' Q9 L
    • % |% E1 P3 @5 T; b5 A- Q  T5 @  O

      ) D0 m7 n# a% J( J# R      p=(PCB *)malloc(sizeof(PCB));  
      ) ?1 ^, |! H' B/ i; t% M
      + x! h9 U$ @- J! U) R$ ]

    • & A" B+ O. h+ O5 K& {" c8 n) a
      , \: q0 A' u- X( a8 D) ]8 h& B
            scanf("%s",na);  ) q- E+ q" c: k5 T& w1 D* `

      8 s3 [5 ~- O# j% T! a

    • * Z$ ]& \3 z! I: O, M
      9 K: D! J, ]- O4 Q5 x& M/ D7 P
            scanf("%d",&time);  ! c! o/ R, J4 B0 m, E4 x
      % R# l3 Q' V7 Z/ O: [: U

    • 2 p* W8 D2 f7 S" J7 h" q/ }( t3 |
      ! \- \1 t; R6 h9 g! I2 w
            strcpy(p->name,na);  
      7 X' g+ u6 G( s/ n

      2 Y. I5 }' D, @

    • 7 y$ r2 V6 v  {7 B0 S
      : w9 i( p# S: M' U, c- f8 q: e3 S
            p->cputime=0;  0 t/ |' T( C( A* t# @0 E% r

      0 I3 ~# c% ^- ?2 J) y

    • 9 [5 ^2 V7 E2 c9 Y5 q3 A
      $ j; s2 t) y- N( _6 P" t. P
            p->needtime=time;    Y% _- i* M9 T& X

      $ R8 b. p. W; t& j
    • / c+ I! \% |( u

      + M6 U/ B" E& @2 D" E- C- B      p->state='w';  9 r$ [# j/ v( W' T- O+ _4 F1 j! N# C9 b
      2 {4 U0 u8 q- J! e

    • # `& }) S" u' _# r( H* _3 i

      + x# ]  m! u) Z, V7 I, T+ \      p->prio=50-time;  
        H. p$ r1 I& f3 a4 P
      $ F6 f( F' e+ c' r$ }; q* o

    • & Z9 ~  h2 l+ b  i# r- ^4 a
      : T/ `& W( m, N5 L& W$ K# I
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
        ?0 b' A; t. G. P" Q' z; ]. i
      + g! x2 c6 K3 O, q
    • # @/ Z2 q& T6 F5 K4 W4 t
      : [9 w. j; q+ }5 f: I3 L) N0 |, z% D
           insert1(p);  9 M, I+ X* ]" j3 ]) c1 i& }; y

      , m2 s( m7 w' k# H  j# K3 T
    • 7 H8 j1 {5 u& p, s1 I  F) \3 H
      * \# X& ^- Q6 S9 g
            else  8 h& G( ~6 b. [8 t
      : ]0 g3 Y' M' k3 W
    • - D+ T) h0 X6 `

      1 b3 m8 w0 V0 I( G3 T      {  4 c1 b' P+ j* g* _

      1 p; E7 p" s0 |$ C, U2 L: D7 _
    • 2 t6 t8 y- l. f3 m% [6 z
      ) {) T& }& i- j3 Q& f& C
           p->next=ready; /*创建就绪队列的第一个PCB*/  
      + M5 F" z3 _: F! x2 Q* L% Y1 Y  f! M

      * {( q& I, C3 \, O, b
    • 1 N2 i' [3 Y- Y# A3 y; y9 x
        D; B" k+ l4 j- I+ a+ |
           ready=p;  0 }/ [! ^  e9 m! G% l. {1 b: B
      . X6 _; N9 L! t' [7 n) t

    • 6 G4 ]. b, \) u1 U; Q9 V7 w' E

      ' Y! W% R1 |; J* x" Z) j      }  
      . j- e" g2 A% B, r: X

      6 D+ r6 T& j. z6 u0 f% f
    • 4 M1 ?8 u' f# B# I
      & }4 n. w' \0 A  V) d6 A! X
         }  
      + ]4 K9 }& c! W, U0 J( f
      8 F% X4 ~2 C& j. l; y& Z5 v
    • ' [9 E, r+ @* g  P  L( x" h

      ' W3 a/ k# [) K# }4 R, g   printf("          优先数算法输出信息:\n");  
      " K4 P* L1 y4 E2 a, h+ c

      , a& A- P+ k: }/ f; l4 `

    • ! v" W+ f5 s. H9 |$ ~

      - V1 T: Z& N2 b$ ]1 r, C3 s. c   printf("************************************************\n");  . N# q1 e& v3 o- G" \2 m

      ) T% N6 o1 [( r* r8 ?: X
    • ) s) d  |2 [1 }8 T

      3 R* y4 ]& y5 U  l, G( y# {   prt(alg);  /*输出进程PCB信息*/  ' n% F" r, U. B- Y# y! N
      " K- _0 h$ l/ ]% b1 H
    • " ]: m" V: A! ~5 j! A6 u4 }

      & r$ W$ r$ Y4 V   run=ready; /*将就绪队列的第一个进程投入运行*/  
      1 j$ {" @% r( r; t2 X% V5 l& [4 V

      3 {1 Z$ w; f4 ~( s' ?3 j3 w
    • 9 \7 _/ q8 X" H
      " }  T  l3 }& H+ O9 `+ I. z5 _
         ready=ready->next;  : D# Q: f9 v& l
      0 p( }2 T* U. C& @# P0 s; Z7 x

    •   l7 q% {4 |) ]  b7 n
      & g2 A" H. n) X" d1 q
         run->state='R';  
      " c, C8 N7 e2 J  i% @  v1 \* w

      8 e3 f7 D& x5 [2 }! V+ s( C
    • $ j( R( N; v; f5 j7 R2 [

      5 ]' U: o$ [2 I2 y+ q7 s}  
      6 N' a8 b( g; H* W& |# @
      " Z5 p* W. \$ G, D

    • 7 ]0 e0 Y: i) m% O# D! f8 o9 X& w

      8 c9 y. @% n- J/ k- b2 v/*优先数调度算法*/  
      & a  S% X7 ^: R. i. k
      . ^/ \/ T! z1 X

    • # W3 l- p6 }5 R3 V/ S# E

      : {5 Y( ?( a* d- N" Upriority(char alg)  ( |' v& }9 ]/ r4 t. e' H; g

      3 S# a" A; H7 O  y' P9 X

    • % o9 Y- n* {% H% ]
      " t& ^: k$ [! N$ R% a$ L2 s' G
      {  , `& {* K8 ]- j3 [, D( J' q
      $ C: V9 z/ g- A" m( z+ P$ F
    • 9 b" [# ]1 H" N5 {0 |
      2 _  F- i9 p0 Y
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
      0 _) h3 B1 l" G9 [
      ! H/ y! A8 y7 t# f( {+ |( x  n
    • $ G% e, `. ~; _) V' }7 w
      3 D5 x" ^+ |# _) [7 {, t# a& C
         {  3 h$ m2 c2 B. E- J" y8 P1 I
      9 u0 @2 w( `& n3 Z1 ]+ w7 {+ m
    • 5 l+ k+ l, [1 a$ z! f8 }: L. D" p
      9 F, T9 S5 N+ K+ L
            run->cputime=run->cputime+1;  
      5 y% }. P! I: v" `

      0 g5 l  h3 K6 g9 O6 u

    • ) h4 h- c5 U+ w# z" W

      7 w1 q+ ?4 M; |  V8 X7 a      run->needtime=run->needtime-1;  # |0 f5 N9 w7 x0 Z
      7 X, M7 Q# J$ R! e$ j% l" m

    • + c3 a% }8 B9 j7 F. ?" f

      ( Z' g' M' e7 V0 w5 ~      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  6 F+ L  O7 k, u: Q& a

      7 l. e$ b; U- O* x) A# g

    • ; w4 o& h* E) t, w" Y

      7 ^, f5 i; u, Z  R      PCB *p;7 @: b# M+ U) _% w
      + a$ ^# ?5 U: d+ _
    • 1 h) G0 ?5 {3 h  ^+ W. J4 g9 b6 |
      , _9 b1 Y. T& s
            p=ready;5 Y% y  r0 N- ~8 E0 {

      - X3 |1 l1 D4 H

    • 6 l; v6 n5 J; k# x, d8 d8 {
      * }$ _# O' Q/ b* S$ t
            while(p!=NULL)  
      3 ~) K3 v# ^# n& W. `3 F; H; u

      , R$ k% `% l4 P- \. Y6 r8 l; D9 P: c
    • 5 F% p8 l1 W- H; Q' O
      5 V8 ]1 d8 e+ q
            {  
      : X: J+ r+ A+ @6 O1 T
      1 p( ?% {; G0 Z0 a/ E( R' C
    • ! ]5 @7 q3 e$ l
      / c  c& D2 T, D1 I% k6 p
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    5 B3 W  f* Z  M$ X2 ^4 I
      % J% [+ |8 Y; b/ H
    • 3 \+ G3 c# y1 q3 k$ r

      & I# o# k; e7 H          p=p->next;  / K; X$ p1 g4 M) @

      0 s. y1 t* f! a/ P

    • : L1 j( T, V9 e1 O( D! u; P! ]$ c8 ~* A

      / ~! c* C1 L0 _2 z      }  ' U8 G6 Q( l' M: N+ h' X9 }2 M
      . ]2 W0 Z1 U" ?

    • 0 G6 u, k. c( K" F( |9 p% }
      ( X1 q9 g) g( L1 W
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      / X/ A! M7 Z) O. o/ Y2 G

      ( W" [5 q2 X# e! X( K! r
    • , Q5 B. ?8 s2 u
      & y4 c) q- E+ V, ~5 P
            {  
      ; T, ^' p5 M4 o/ B" T
      ! t' s: x" A5 I7 X

    • 8 o3 q1 R( R; L6 z1 D2 [. d
      : X1 ~) l  J# y+ W" P
               run->next=finish;  
      , r6 Z' s; `) e2 ?1 u- F, K9 i9 e7 e
      " B3 {. A/ _* G: k; @5 C9 g
    • 4 ]8 `( V+ }& e- G4 b, w& ?

      : v& G( z8 U+ j2 f1 J( z         finish=run;  ; ^; b3 W/ d& }, l" C6 d6 A& `) V

      $ r" t3 t4 a2 `6 t/ i: D

    • & _1 R. V4 k  V
      7 o* h* w8 S" L
               run->state='F';  /*置状态为完成态*/  7 g0 F3 |1 y; i  K3 i% a9 k& P/ a
      ' `3 a2 I8 q8 X# p! G6 C" Q

    • ! _) f2 ~8 R% e5 @* n. A/ _

      * C- E& a+ q% n         run=NULL;  /*运行队列头指针为空*/  ; H! R) {$ k$ ]( R* p

      * ?# Z5 d& |% Z) e
    • : v7 u& _; _5 e! `& @3 ?3 D9 r

      # g5 ]* |! n9 |( x         if(ready!=NULL) /*如就绪队列不空*/ 4 a$ h$ Y5 @! Q6 K" d8 Q
      % ~: Y+ l4 t9 ?2 K# ~( g* r1 n
    • ( K) k5 Z1 j) g/ m; y9 |2 k

      ) |$ h5 r' }3 Q1 ?- |         {  
      / [$ R( ?9 ~# B2 T3 Y2 g
      ! N& n: a! F& V! v
    • 9 \2 s$ O5 R0 d. w& m+ y
      , S' c# _1 R9 D0 d0 N
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      , T# s; ]4 I: Q( n) N
      # i6 E+ ?. z( v" b; R: @7 H

    • ! i4 B% S) R) K' p- E1 |0 H" \; i

      . g! o# H% ^4 w" V/ h         }! D' a( P$ ?/ ?
      , u5 ]5 h9 E5 O9 N0 M
    • . I1 K, l) H8 a5 i

      . P/ L* E, R% k      }  
      & g2 ?- s0 W. H6 F' m  c
      # O. X- O6 y9 V* r' z! Z
    • ! t  G9 l: `" j9 M3 o  l
      ; P$ [) t1 R  \7 T
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  / Z* y- f7 Z# x/ L. b
      2 U" m4 f7 }1 i, I

    • & r2 U- i2 }* \- y$ i2 Y& A

      6 l* u% y  U" T2 P$ W     if((ready!=NULL)&&(run->prio<ready->prio))  2 G( _$ ~8 _8 Z
      4 s  O+ `: ?) D  j
    • 0 G: l. {  P2 Q

      & p7 D3 V. R! e: u1 Y: b     {  
      5 _! b. U) V( t) G% f

      * D8 r7 s. @2 e9 f! A

    • 2 q' t5 o0 s2 V. g) n: ^
      3 @* \) o. r4 A3 D8 x8 s1 P
              run->state='W';  
      " G% q' i6 v. X9 `6 ?$ d8 p
      9 P( p& H5 ^6 L1 q# P  @1 l. t+ Q4 W
    • $ q, s5 H1 j1 t. ?& T. q
      : m9 u  _" r7 o* z
              insert1(run);  + X0 o. u/ u4 D
      8 ]8 e# s! b; c, E7 I% x7 w) \

    • 5 y& C! j# g7 I7 L" |

      9 y8 a% p; v" B- d0 F% v        firstin(); /*将就绪队列的第一个进程投入运行*/  % e" ]; `% e  r4 M
      - R7 H3 Q: t4 W9 g1 o* Q
    • - r& v! z( J1 v: ]" @/ S) V
      ( I7 }# u( O8 n1 h
           }  : J6 L0 j6 X" J  Z; X4 l
      ' a# d" m0 q& x& s; H. U" b: s

    • 2 Z; R, Z8 I' K
      ( r  r7 \& J" A! P- d
            prt(alg); /*输出进程PCB信息*/  0 y; h5 z- s" b. C. q: _' s
      # O% g+ y$ T" s# [. M+ {

    • % k! O( R# ?/ A( m% d9 X
      1 q5 ]9 H0 e- ^, f
         }  
      " e' t* v* `1 m5 J1 ^& D% g

      $ r# f# i' `+ o' }: a* t2 W

    • 9 Y% d! _) c  d$ e. O9 i6 H; s
      0 [+ [6 n$ g" ]* @& H
      }  , E8 ?4 d. m& G% K7 C6 Y
      ) b! H2 T) e$ i% r9 ?

    • . f! F. D7 @5 u
      9 N0 E% p- o. ^" X2 S
      /*主函数*/  ! K' e. S6 ?3 w# Z
      9 R& r% ~. O% d: f1 c; [# W
    • 7 X0 F9 G1 z3 I# G- |+ c
      ' s$ ?. v, q8 u( @
      main()  
      ; a  [8 [( ~" t5 g( b' g+ Q
      4 Z. c' Q: [: n8 e$ H7 _
    • ( t: r* Y4 q" f: [; |) O

      5 |+ w8 _9 \& c- m. P" z{  
      9 [0 m7 E4 D2 C& t, z* S$ F3 {. q

      " V. ?; [+ T8 O- I) M
    • + e3 r% T8 Y0 e

      7 E1 L0 c* g" L; x: ~+ Y! s   char algo;  /*算法标记*/  . B" C; T, @3 l# n6 d$ n' H
      # n; ]& h) I9 M! p' D

    • " c) x3 G7 P: j, }, ^. i

      8 y' J) j) B5 B5 C+ t1 P9 j. U+ ~   printf("输入P确定算法:优先数算法\n");  # k' @) V- y5 E. T% @

      6 x" z+ t  i) y' D

    • 6 }! {) U" {' V

      " t+ j+ W) }$ K& ^; m9 }   scanf("%c",&algo); /*输入字符确定算法*/  - c$ E0 S$ J* x2 x# h
      ; I/ C; H; @6 ~! p

    • & u0 k+ H- X6 t4 [' z# N" E' O4 I

      ; h' N+ s: l  K   printf("输入进程数:\n");  
      : `) \( C+ p: @' H: a( R

      & C: E- P9 \8 }1 n
    • $ i! A& F$ S+ Z% R: h

      : i% T5 q  f6 C" b   scanf("%d",&N); /*输入进程数*/  
      ; _# E- C4 c0 ?& D7 z0 Q
      & g* C1 d" o: y% R

    • . F. N# I6 r& q. K* g
      , m: Q% s0 M& q9 P. ^2 Z
         if(algo=='P'||algo=='p')  8 o& E0 e. {- {5 k1 {

      , G3 O0 ^# B+ ^, t0 \* A

    • ! `$ }+ l  o6 V9 b' r8 {  K
      ' E8 D3 F3 w8 x
         {  5 ^" A, |: Q' o6 t- x, ~" M
      9 T( A5 g) c" N3 |- g3 e+ U
    • ; B; O0 c* }0 `
      $ M3 s! ?- U$ Y) J5 G( ]9 q5 E4 t
            create(algo); /*优先数法*/  
      9 l" \8 U! z* R% ~
      , o% r$ S8 G, Z

    • % Y& l% `% }" ~3 f- t# B/ B7 |& @
      / a& c; f4 d* K9 v
            priority(algo);  % d8 p6 s$ S$ }3 ~6 J. R6 C3 k

      # |) e+ X5 N1 d+ e  ?

    • ; O4 w9 W, p; Z

      & r; ?, B- g. k, b/ k' V' G; p: `: i   }
      / v( p. R6 O* a# l
      9 a% ?1 q9 }1 x3 I
    • * _. j3 X/ h/ Q- @: T0 r* {0 U# X

      3 E2 X7 v( r) w# W# K* U}/ X6 Z6 [! k+ U

      + K$ ~" S! ~9 ^& y5 w( H/ G! j' o% c7 s; {6 y8 I


    ) g4 j% N5 G% F5 a输出结果:
    , g- w& V$ F# I

    . Q  y) M" U0 ?
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    - s& Q+ G% d6 [8 I7 A1 Q3 J. r  M, @9 o+ L
    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-14 12:16 , Processed in 0.462578 second(s), 51 queries .

    回顶部