QQ登录

只需要一步,快速开始

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

    & E/ m) k. S4 b. x8 y+ e% [% p& H优先级调度算法4 K8 j. C+ Q6 x' E: m

    算法介绍# Z% m& S8 P' }3 s
    优先调度算法的类型(用于作业调度)3 w6 \+ D& o5 P+ ?0 M
    1)非抢占式优先权调度算法
    - m2 D/ ?$ N1 r, g系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。   U, P2 o) `# W: ]2 e4 O
    2)抢占式优先权调度算法 % q" p2 T& M* O7 {" D8 T7 \
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型" ~  U5 T4 V0 E  A7 C
    1)静态优先权
    9 v" j# `3 v1 Z! D% G静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。3 K: G' j2 }% T, Y& {3 w$ l

    2)动态优先权
    9 R, |6 \: ]" b! u

    算法实现

    抢占式动态优先权:

    7 I# K7 ?# z/ J. G$ p/ p. B0 W3 B
    PS:本人认为非抢占式静态优先权没有实际价值。

    • 8 i7 ?( \3 d. j- a8 ^0 e
      7 L( M. M% c: w/ I* a: M" C
      #include <stdio.h>
      * G( w  ^( B0 c3 s$ g. W+ \1 m
      + @% Q& G0 {5 O% v3 T
    • # x5 j: H9 h7 a! \" d( C

      5 J) R% W- {3 N9 d% p9 |#include <stdlib.h>  
      ( U/ g1 k5 E7 G7 O7 z1 w1 }9 y

      " ?+ e: ~9 L' A" b

    • % M6 M2 F9 b4 k
      5 J8 ?% u: {! x; B; g9 W+ T% c# X2 `7 w
      #include <string.h>  
      ; _5 R. i% M9 P( {0 S# U8 N& ]

      ( @$ Q$ z5 q' z/ H

    • - m8 G: d' v# ?" @# v. B& p
      2 _5 I- N/ q8 o0 T8 w
      typedef struct node  8 [7 j" j# ^% ^4 F: E6 h2 `
      ) D4 _' C) _& N% t5 i$ @
    • 5 M2 {' y4 `, k, t; a5 p
      - D4 D1 m/ d$ T% n# C, Y5 \
      {  
      9 s# E& d) _. O1 W3 v
      ( L: z, A1 J4 O
    • % [& }2 B& U& P; a! F3 O
      , n6 i# f6 {, N* U. m) W, N$ n
         char name[10];  /*进程标识符*/  
      1 f5 w, K7 ?" p$ F% z
      4 {9 r/ }5 q. H- l+ R  q4 n
    • . L2 A  \7 E) w, L
      " V* Z" z- e1 `2 f* W: g# [
         int prio;   /*进程优先数*/  3 }6 I- r$ |; w' N! {
      ( m& n8 \9 r* b

    • " X1 p  r1 T8 u1 l5 c5 v

      ) Y1 q- v$ l3 E# {$ R8 @: v   int round;  /*进程时间轮转时间片*/  
      $ x4 h* G, U6 D* P5 A) P
      + y0 H) n$ `1 e4 a, ]3 _+ X' c% |

    •   k6 @, A( E+ S# d$ h. i
      1 {! h" B  J* ]: d6 c$ f
         int cputime; /*进程占用CPU时间*/  0 O* m$ Q; I& _4 @5 d) A' T$ S/ R
      $ Y, i  \" |. M2 \& K. E2 [

    • 4 l* f# s: I$ W2 x3 R7 l$ A" n
      ! {5 }* X: X: _2 x" `7 f
         int needtime; /*进程到完成还要的时间*/  
      1 r& R4 P0 a5 {6 G( U* U! X! O

      3 E) h' w* D- O/ U5 ?/ k
    • ; I" m0 P! m9 N* I, Q

      ! g: x9 _6 E8 T; V- n2 y' o( h, E   int count;  /*计数器*/  4 A* h( l- f# B: ?2 r6 s0 @

      ( A* k9 v+ A) a1 J. S1 v, `0 L
    • $ Q4 U# c& M* \4 P- u0 \
      8 ]6 d3 t1 ~' k6 d1 _% \
         char state; /*进程的状态*/  
        D0 ~( W3 a4 p5 o* t. C+ V: n; f/ k

      7 b4 r& {5 B5 r7 ?

    • 2 M0 W) j1 |& d2 c7 p- Y
      1 c1 h" p9 o' k
         struct node *next; /*链指针*/  
      . N* E5 Y- U# s" F- ]3 T

      - G: h8 s( t$ I+ b. T

    • ; s/ y' ], B9 ~6 N) I8 F+ c1 s

      5 A6 d* R5 X) }7 ?+ u5 S}PCB;  * a# X8 r7 l+ g

      " i1 }  w! x0 P1 o' H! X6 z
    • " j, g& L2 _- |. ]9 b6 m) U% p7 D' Q

      $ y# \1 z4 U( l3 W! M4 qPCB *finish,*ready,*tail,*run; /*队列指针*/  
      0 j& ?4 ]3 z" N% h- }2 ?" ?

      8 B/ D) d5 y5 d4 s$ y3 ~. N$ F

    • $ Z& i, k8 s- O" K8 r

      + k' s! ?* z! M5 wint N; /*进程数*/  4 f& q, |: q9 G6 T
      3 ?+ L& V) r+ Q  F

    • 0 m0 h2 l: Q3 y8 h# X
      8 n* z7 `0 m' [
      /*将就绪队列中的第一个进程投入运行*/  # N" g5 E4 l% I. B% p; b
        k, M) e3 F# J! A, d
    • + b! K2 W6 Y0 @; G0 g- N, N

      3 E5 n1 [1 a, G8 P7 l. ^7 lfirstin()  
      / ]& j! s, |( ^

      7 I- R& z0 q) t/ ~( L5 z" f
    • ) V6 ~) |* B" b# o
      . c% J! j5 a  ~% H
      {  
      & X$ L& M. I' f) C9 V3 V
      , A4 Z2 c& x0 U6 ]) c, }5 U! X0 m
    • 8 q9 c. h) c8 v. \( `/ e. U
      / }0 ?8 q  a- `4 r+ ]" u
         run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      ' C# e( ?0 a" z- ^' i9 C* _2 g7 `8 h1 I

      ; C2 E0 v! G: b2 ~* s

    • * ?4 f! q/ ^8 `2 i

      : A  b( J/ m9 \5 d   run->state='R';   /*进程状态变为运行态*/  
      / \$ r- P! y: f& u& }; d
        E- \" Y! N: V- T* }" X- d' G
    • 6 d* j; e! K7 _6 [" A4 b
      % B5 D0 M  ]1 b* @: T0 {% f! A- g9 O
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      * O. F; s% q5 |0 d; }; _
      + P' @7 s# ?* h3 H) L4 D: \% J  x

    • & ~5 K- c# Y, ]# G. \* o
      ) o& w5 n7 s' ?+ B4 M' ^' k
      }  
      + p2 L$ s( j$ `, E, k! I8 _
      ! Z- i) s& y4 ?7 Q+ N
    • 8 l! M0 b- b, c( o8 a! a. p

      , m/ i0 Q8 Y8 x2 m# ^& [* t* d3 _/*标题输出函数*/  ) j& b; n5 Q* {
      6 @) |* X8 h) t7 t- T- Y) `5 ]+ P
    •   e. a4 W/ u/ D! j

      4 ?* o# x7 W( O7 H" w' J1 ?) l7 W: Bvoid prt1(char a)  9 y# l" n! p' ]  Q3 _( b) y
      3 R" T- [* q/ X1 }$ J: M

    • 7 d7 _+ J* p; y  G; x

      . \2 `+ X* {1 F1 ?{  
        u0 {# F: K$ |0 L" x) W
      ) O$ P: B) m8 W
    • 5 w+ Y% U0 T& V, W7 `4 Z5 R' I

      - r6 U: P& _- z- I2 b2 p( N! Y1 ]+ s# ?   if(toupper(a)=='P') /*优先数法*/  
      & R5 [% `7 b8 Q# g) l# }
      ; y- @# @7 D/ I" m2 }* U

    • - e$ O/ B2 l) |  V
      7 r& B: O* H7 P2 W4 F1 M
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  - s, g0 c' U- G% y

      , |5 ?; G0 `9 |+ P3 P8 |
    • " g* D  m2 p5 a/ ^3 }

      5 k/ l; E$ f7 x   else  
      / H4 a: Y0 N- T6 F! H7 R9 q

      ' Z1 n/ m$ @+ Q+ p3 u2 A

    • ! ~7 V, F! f  t: y& c

      0 R% g3 G) j/ R8 L5 j* N: }      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  ( `6 G6 x% Q' l& W$ q

      / ]$ {" i+ D8 A; R

    • , k$ F" B/ ?8 l/ d

      : ]! m" }# ]2 y5 N/ m) O}  
      ( l( I' j! h7 P- {! M
      4 V/ R7 c( \* v) D
    • 3 M8 C* x$ m0 H
      / ]- L# h; }  t
      /*进程PCB输出*/  
      ( [0 b( k# T, z9 c

      " D4 w. |) z  }
    • 1 z2 K0 w8 D; @& e
      ) B! w. M8 d5 Z3 L, Y
      void prt2(char a,PCB *q)  
      2 R7 j0 y/ ]* a! `
        D6 U! [7 Z6 z( H" k8 \/ X1 V, i
    • * H  i7 m0 s3 S
      ' ^6 j' s6 }$ y- D
      {  
        R4 U+ O, C7 ^: a

      . t. P' Z# g$ D% X( g0 `
    • & B; T  x7 O2 j1 ?1 \/ t. U

      $ a# G& O3 E7 y  G   if(toupper(a)=='P')  /*优先数法的输出*/  
      3 E7 Q( e+ w7 Z; s
      ) ^9 B+ f! M" t8 Y, v9 @" K6 U  Z) v

    • : W& G/ F( P% z4 _
      # L, c  D! A8 N2 D1 ~, V$ H
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      % A/ R. \3 B; _" h7 u

      8 P- x% a/ N4 N/ b$ T# C

    • 6 x5 c# o( F; B; \; O5 G. ~/ S
      / n8 p. Q/ E) E9 a$ ]) z2 x
             q->cputime,q->needtime,q->prio,q->state);  
      6 U3 Q' N* k1 k5 H5 T
        e% ~! D$ p2 f' ~; V/ L
    • ( t# M# H' j. A5 b
      ( h( p- X( o1 K* S
         else/*轮转法的输出*/  7 B7 M$ {! T+ u7 J, L3 p( ^

      ! x% w+ t2 i* p

    • , A6 h  F7 Q2 L
      : d* m! ]7 n; ?+ b2 N
            printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  9 P9 s# E# C$ z
      7 x! j% ^3 l: u

    • 9 {& {3 [1 g+ n) X8 x1 O! A

      1 q" R8 C8 M9 f+ m% v6 |       q->cputime,q->needtime,q->count,q->round,q->state);    r% {7 E" _1 F" D9 x

      : T, t+ l7 O% S' R; @$ w

    • 0 B# G: c+ J2 O& a2 l& \' K
      ' o" n% v" s  p. z7 e; E1 O
      }  % g1 E0 Q' B' W* R4 j6 @; H) W; c
      . R& w3 f6 G$ Q
    • % C' C& `, j$ |* e/ W
      & R7 ~7 F5 Q. V" I
      /*输出函数*/  0 e! u$ N; O. K3 F

        V* [  ~5 ~. k9 D
    • # d9 k- X. }/ @/ k  O- `
      9 z; j8 x7 e+ ^4 k  R
      void prt(char algo)  ' n; q% M; D& i- O- U5 ?) M
      2 ~/ t+ J$ V4 ~6 u+ {, O. j" z7 X
    • , M! }6 Z9 X) O: B% A0 K9 F# A9 r
      " ^+ C. I* Q" D- u; s+ C$ v3 A! B0 A/ b
      {  - p+ l' j( u6 w0 J7 j1 V7 v4 g8 i+ I
      ( b5 H' w* l8 W; Z( S5 r
    • " j) f2 m' G9 |7 |: H1 R2 L
      - e# A5 X* V) i! n
         PCB *p;  
      0 c( S; r3 f3 l6 r7 p& [. f- Y  r
      # ?' o+ {/ Y9 Z* S- t& g0 U
    • " ]2 x8 f  H4 h7 s) W: S7 v' n
      ' L& }9 Z/ ~9 o+ `8 e
         prt1(algo);  /*输出标题*/  
      3 c$ q# `. R4 T' ?; b0 G: L
      2 C: |$ p8 a/ z- i$ c3 i

    • 0 @* \7 X, g$ X2 K2 y1 L4 l8 C1 y
      5 z% W: n/ n6 N
         if(run!=NULL) /*如果运行指针不空*/  ) N* d4 p6 Z" y3 |( q) v
      $ ^0 F$ y# P" G) [
    • * S1 V+ A- I' }- d

      # W% S8 [8 ?- r4 b% u      prt2(algo,run); /*输出当前正在运行的PCB*/  
      & e* C, x- s4 [' F" c7 G
      ; k1 K$ ~' u4 u/ _

    • % V& B+ T- Q5 K" {" q

      1 e. I/ C7 m! U   p=ready;  /*输出就绪队列PCB*/  ! q9 E6 g+ ?/ K# D; }* ^% x

      ( U0 Z. I- k. `9 G
    • 9 r: G$ l. C! m4 ~) P/ G  @* [! C" I
      : N% V1 j* k0 j& A% ^$ A; C
         while(p!=NULL)  
      & A% z; @1 e+ V1 E  B7 S

        I! E! n7 n' ?0 E% L

    • 9 x: J( }) w4 A( V3 ~) t

      8 G/ C: C, S) B7 ^   {  
      ( X! ^! ~" E0 Y' W' ?9 D

      5 T  {8 b! m. k
    • % A. e) p% g$ j

      ' Z8 @% t+ a1 c      prt2(algo,p);  " M" D) s0 E3 W& c( M4 U, J

      : T% P- p: o& n5 n6 g

    • " W8 e& v, y6 P: r# U
      ' \4 l7 b) ?7 ~/ G" V
            p=p->next;  9 N+ x% R3 @1 g% R! O' W& n( q- a% L! g
      / J. t0 F; c5 j* c$ c& F0 m! Q. T
    • 8 x8 {# J$ _; q( E" l: `
      9 T7 `+ ?" h0 M+ r; T$ v* y3 ^
         }  3 _( `' T' D3 Q. S  \: f, C

      + F2 J5 q1 v& D6 e  F; y: |
    • % T" P& b' |  A3 m. W/ m9 c
      " \3 @  w8 ^9 U) p
         p=finish;  /*输出完成队列的PCB*/  ( X$ e8 {# E4 [3 \$ ]
      1 |3 f8 i5 a- ^4 \- R
    • 3 j$ N4 B$ a  |8 g% b
      - N$ B- o! S5 z7 Y2 a0 _
         while(p!=NULL)  
      % L& K2 z; [0 i7 V# y0 _% B

      6 }3 Z/ G) n6 ?/ L5 x) M" ]5 ^9 o

    • 8 L) J$ {* `* e, S9 G5 x! |
      ' r: b; @5 F: \8 ]" y0 F
         {  
      & T  n* Z7 _( C( p6 ]" u! u

      3 `2 s# U# e. m0 f, ^& c$ k( \
    • 9 F4 j6 ]) H& T

      - ^# M& W( |6 k0 M# p      prt2(algo,p);  
      ( g& c3 ~5 ~" h  n" G
      : w! {/ l; ^0 w$ O" R+ A8 {; b9 e
    • 3 i% Y3 S( r. J: `+ |  L0 U+ C8 E
      * H3 J5 G" A1 \* b
            p=p->next;  
      + x! e% [0 H; g# i+ g7 H
      ( P$ a$ J: j( l. i8 D! f. V8 e' w
    • 3 H' W3 t  r' d0 ^0 b* X* M! w& T

      . ^/ Q+ F! O& K   }  
      ) u4 J, H5 R% p% s
      : M4 _) f* T/ L# P: S" k3 J
    • 5 C) l( V/ w9 G5 R: x+ m) r, C
      + N6 Z+ S# B1 {* V
         getchar();  /*压任意键继续*/  
      ( p* t/ |6 s, W! i- a
      ; @/ q) d% R) j) j( [3 I# U) r
    •   ?" K/ R0 [8 s1 [! Q. ~$ l
        s, @5 Y( g/ [8 f! X7 y
      }  ) @, H1 X6 {) U1 X( z% O1 @0 C
      ' M* I/ H% A+ g: V) d

    • ( Q% H8 F7 g0 f4 a: q8 R- l% o

      ) k8 E% C  u7 [( V/ X) L/ H/*优先数的插入算法*/  
      % B8 {* e% m, X5 \

        x. u" d1 \# l
    • $ s* a, c  W6 a- f1 ~& M
      . f5 b. x8 U2 n; x
      insert1(PCB *q)  8 i3 v+ w1 x& v% J( y) }$ E- \

      ' t- s4 w9 J8 V7 ^: g
    • ) H5 L* @( F8 t
      2 y& w3 H$ [. w9 H8 X
      {  8 b, u) [4 ?" A2 c- X

      8 O) \* z/ k+ d" p, o' [

    • 7 A, L5 q0 o7 K4 Z

      " ]/ z- n8 q! u' r$ h   PCB *p1,*s,*r;  * X, k- z! P- D* c6 o3 o

      ; v2 m9 }& O6 \
    • / L2 V7 h( J( ^% h# h" Z: `* N
      / B, e; d# ?% B) l6 x7 T* q
         int b;  6 N" O# ?; ^4 ~7 e
      - u0 f: h5 `2 g; }+ j& U6 S
    • 0 i+ v/ ?" S- ^5 v) {* n
      , o# @5 \9 R# t4 a: e
         s=q;  /*待插入的PCB指针*/  , K, W3 N* ^/ n' V$ g" H
      * M2 g- |& v$ `( n& r, G* E7 b% M

    • ! O7 Y) ~1 M) w' X
      5 ~: c$ d$ n# h4 o4 I) O) p. k
         p1=ready; /*就绪队列头指针*/  7 t6 c' Q9 i. a9 C7 c  X
      1 e5 a3 I) A# _+ _1 g

    • + S! g# g! [2 N& L$ ?1 ?) A: |1 G

      * S: I4 A* _% v4 m$ G4 V$ {# E9 l   r=p1; /*r做p1的前驱指针*/  
      ( X6 E' N% P7 l& v8 {, ]7 O' \

      1 Z  s" X: `* V
    • 5 Y- e3 e+ F3 ]- D- E6 I

      9 H, _9 N) N6 D5 `; m/ m: v% j! E9 K7 ]   b=1;  # w9 ^4 @% S; w' f- n/ }" }( Q

      : ^/ @! s& W( E2 S( r/ v
    • * }6 I: W1 G' Z0 }
      # }, U2 V& _# s; r" V5 c- f
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      0 k' m6 L3 F* s5 y' u+ z1 q

      9 W3 C( a% o9 r) J. W

    • " a5 Z2 R$ @- I; R  p
      , g' f! J1 k" N/ H4 J# D* \
            if(p1->prio>=s->prio)  5 L$ g) z5 [7 l+ ^9 S- D

        l+ n' B. ^9 p5 p& G! S

    • & i' |; S- |& w* F

      , E4 F8 D$ Y1 h/ N      {  5 q! B7 s/ [) q" y5 {/ s
      7 [& P% Y$ [; w3 W  Z6 ?( l5 ?
    • ; N: j. r2 L0 W" O1 P6 y
      # q% j( l+ u' A  w& s  _) k
           r=p1;  , D4 B& ~% f) K1 j; G

      - ~' R6 ^0 m8 l3 J- M2 L) \$ R

    • / C! h3 a  |8 y/ C

      - n8 R0 z, e6 J' I     p1=p1->next;  
      - D# {3 ?0 i* @# r9 p9 _1 R( D
      / l3 [; U9 l' C: @( o- t+ v( ^

    • " W7 m. d; T8 R# p' ?3 h1 o9 S6 x
      ( j; c/ [$ z% M( t9 Q
            }  
      + M* A8 T+ f1 T6 E# R7 Z7 T0 D

      2 n: j) O* y2 x, X; h: j3 H% I
    • ! X5 ?5 i) o, R1 l0 e' z. \$ l' f7 ?
      " i8 k( E  A1 r2 q  g
            else  
      * G- y# d+ U4 F  `7 s

      * l# x0 d6 K  ]0 [

    • 9 t1 J7 z2 Z( W& b- |7 E+ \

      " W5 D, Y9 z$ f" `     b=0;  0 u: ~8 h% Z& c
      " J7 q3 A3 g- M) n' P% {" f* d9 v

    • * U7 g* t. A6 O5 w8 _2 ^" C/ V
      & T+ ^6 O4 m4 n* z4 B% b
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  + ^' h9 c0 m: t; H( s
      ; X' D3 `9 D, e
    • # l! M- ]* n1 e& V

        Y- d9 F3 c7 G- E3 \5 U   {  1 D9 G; s- M' I5 V

      . g: w8 G# m$ K/ ~
    • ! [4 }5 t/ m. f- ~  z+ b# p

      & M; Y& R( Z4 M7 E3 y  [% f      r->next=s;  
      9 A) e) R0 l) `- l6 u! h

      . H, r! f" c4 c7 N, v

    • ; @7 t+ s, T# }4 Z6 b+ k1 K4 D  S5 j
      . o# l! m7 `1 I9 K8 i9 L; _
            s->next=p1;  
      6 C' S2 @7 ]. O5 _5 r
      ' n" t0 G5 m* z1 E
    • 1 I2 `* R$ g) \) J5 ^: F8 S

      5 g8 s! f4 ~5 f' G( J   }  ) `  Z8 T6 v$ [' j- _9 e6 b) c
      8 {9 B" z2 r( x: p$ V

    • 5 \$ c9 O2 @% t& u/ L7 [4 o
      & e9 g2 y+ x) O# d# H$ A) z  f
         else  " P0 i* v* x' H8 g

      & c# C* @' \/ v+ R, M; i# a4 a# E; T

    • 3 f3 ]# B& c7 o5 W
      ) ~: Z" d9 D9 J4 i* A; q
         {  
        Z* O7 K2 O) E# A* s; A4 {( K

      # w) ]. z( d, n0 ~- b3 V/ ?. ^
    • : D# B5 Y2 G$ I# m: n& K' N' Z1 o
      5 q$ N/ T9 n  G/ H& N/ O
            s->next=p1;  /*否则插入在就绪队列的头*/  
      * W6 U/ d. |( e/ y& }4 r

      2 D7 }: i. D8 E6 T% l0 g
    • 4 `& @2 P5 \6 o% n; O
      # |2 F5 f6 d6 i) ~
            ready=s;  
      1 b8 |+ S4 b% J# W/ m' t0 U0 V
      9 O4 N' B  X! Q, r7 X

    • , Q6 x, B7 w, u/ D. I" o2 i9 e' |- p3 z

      4 N+ C* d6 S4 E   }  
      % O8 [( a) Q7 V: w$ C
      3 d$ @, g1 |. U7 Z& I. E. Z0 |

    • 6 C/ w' |: r, \! f# M0 x- h
      $ Q: j" w/ b& i( D$ `- ?
      }  - Q" K/ c/ d" c4 u1 C' f! @

      ! ~1 m  y- {! ?* k6 c, [, E( s" e
    • 4 \! Q( ~4 R4 }& Y% w

      ' C  C% x' ]  E% |# r/*优先数创建初始PCB信息*/  " P! Q! I: H" _2 E* D

      5 L& g' \+ Y$ B! t. l  V" Y; h6 `

    • 9 q5 ?: A0 A: Q5 |; L
      1 f( C1 P; w% U4 P/ g
      void create(char alg)  
      " O$ k8 F* g- ]6 e% a

      - r: a& E8 J  I2 s% |

    • ' L  u2 E$ q) ]4 P# M

        t3 ]0 y$ N5 l* V* j{  $ N  A* p7 |8 X
      9 w9 g& `) C7 ^+ o. l' Z; I# H0 p
    • 4 R! H$ L& u4 P3 O2 E
      $ N+ L  N' B& p8 n- C/ {
         PCB *p;  
      : d/ u' w: |5 e) v2 O2 w

      1 V, w0 j( k& {% C; w/ ^. C

    • # q6 \; L. c. d+ ?4 t4 C6 Z

      9 E" U$ J9 l6 p2 D5 }+ ~   int i,time;  
      9 o' n! g' Y" s! D, T: P
      # F/ l; i7 G# |

    • ' c7 ]$ u! {6 {* ]+ o

      & E! k; B5 M2 s2 p1 }* ^* E# g   char na[10];  + u* N5 n0 w8 K2 P, J3 y% v

      $ k  w* b/ s! a9 L

    • 6 C0 w1 ]: f5 u8 T
      , B8 |5 ~# k) V- u: Y6 \4 R9 I  q
         ready=NULL; /*就绪队列头指针*/  
      ; L" u) L7 E( [& I1 g

      . u" {4 x% o9 A7 b1 @
    • 0 n, Z% w- {, Q8 U8 B8 n4 Q; i0 N  l1 }

      , x, s& r- d4 A$ l! a% Y! F/ X   finish=NULL;  /*完成队列头指针*/  
      7 [. N5 K) h- v( j

      ! F# ]: W8 O5 e1 w

    • " x3 O  k% i; X& o! Z' x

      ( K) x. W0 Y- d0 f  E% W   run=NULL; /*运行队列指针*/  
      # B: |/ I1 |/ \% I% j

      . y) V  \; m2 Q# |
    • 7 s3 G) h! `3 C

      / W9 ~/ e" a- S) S! n) N- @   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      / t: H5 s( p9 V  o( z

      . H" v. l- v. I2 _6 D0 N+ N

    • + y7 t* Q" x, V' L) S. v9 M* a8 X0 V
      * T3 Q7 u% j6 g; Y. ]/ W+ v( [
         for(i=1;i<=N;i++)  * t2 o  W; i) H9 z: c) Y0 {& Q
      0 J. U6 b2 D9 b; O

    • * q: m+ m: E5 J

      $ I+ W! z) x4 I0 I# q   {  / v9 D# n, S1 b- [- j' v2 y! R
      % `. {6 r2 y- R6 W
    • . m/ H' u# R- a1 {* t- v

      " c( v" s# H+ L* R6 `      p=(PCB *)malloc(sizeof(PCB));  
      ' X+ H" q. R# J* s; Y
      8 Y; x% P! D6 i% A& M( C
    • + W; A$ J1 i" ?9 `
      $ {. t% r7 ]' @
            scanf("%s",na);  
      , I; j! R. @& u; Y+ |+ W  z8 K1 K
      & |7 R" l* C3 W
    • * c6 X+ b0 [+ L. l9 m: j( B0 m

      ; \- M1 v6 H8 P% W% Z; h      scanf("%d",&time);  3 k5 Z( S; }% x% [" R5 v9 }

      9 F6 f" z# f$ }

    • 3 Q6 ~3 o' d2 Z% O4 R

      . c/ e' u) F6 D. ?$ s* @0 ?      strcpy(p->name,na);  
      3 h1 B; ?; d4 m2 G2 E# Q# c& `) ?
      ! E& ]! ~  M& l3 Y0 X5 R
    • / q+ n- G- c- L1 f* b0 J$ X

      3 r! H, ~: S( D; y5 a4 l( F0 L' @      p->cputime=0;  . e# x8 }5 e% I8 X

      1 o5 D, a5 Q. T" ]7 }

    • - ~( C% ~! {( p6 x( {
      1 F) \- u+ F, T* ~% T+ W* E/ g
            p->needtime=time;  
      $ |5 H# ?, J) c3 \& r( g, \6 m
      6 V5 j- P% I; z* E' |

    •   E8 G/ y& o1 l. s( B

      6 n: Y0 |8 `6 s0 B' [4 d9 a% u      p->state='w';  
      + n; n2 h& X- B6 |2 H
      9 f, ?- h1 R# K

    • + ^  j5 d3 ?6 R6 O) {

      7 E( d+ P6 \& X! x8 h  h0 Q: g. k      p->prio=50-time;  + R1 Z" e. @1 a0 D; G
      ( H  ^- m- i# D0 H  W' G% f
    • 6 `& y) K1 X0 W4 \5 |5 x) a
      . J+ x0 ?$ [7 ~* E% u; ?8 p
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  . e& v1 l8 o% g( A6 A0 Y- ?' @! F

      1 R1 V3 C5 ]4 |% F( O
    • 3 p$ ]8 Z4 ?6 S( R# t
      4 u/ Y! q$ F7 ~! a% D1 `4 q
           insert1(p);  5 Y; |0 z( H. p% N; N' i

      8 Q2 G7 e4 _, f2 R- R3 x- Y) |

    • 1 O. o" W9 @- x- g4 Q3 R0 q, f5 {
      5 p- j4 Y& l- B6 _9 S, J
            else  
      ( O9 ~& h& x4 \# k% @. H
      , H4 l3 X! I! w! ]

    • # D+ H! y/ y) C- m$ d1 C

      4 H) z% I+ S1 D+ G0 J* Y8 A      {  
      + G  g: U* F4 l# @* g

      + }; K" |( t& X, b
    • 4 p, B4 u9 w9 _

        `4 v; ^. p2 z4 m8 O4 C     p->next=ready; /*创建就绪队列的第一个PCB*/  % {7 n* w- U8 x, j* S8 L5 x
      # N) J' v8 y# n. h
    • + k0 j& |$ d1 S, j! f# T
      . H: g! e! |$ X' t
           ready=p;  1 x9 f( h( @$ A# j' U
      ! C2 `, r0 u# O# j- K1 g; A9 d
    • & O5 t& |( _  ^+ z% P8 M+ `
      9 M  l; d/ E9 Q+ K0 Z% s
            }  
      0 @! K( ~$ P, Y  \; z& c

      1 K5 L% M2 `, D1 E7 Z: B

    • 7 B$ I! ?3 E2 T" s9 k

      $ D( T3 |3 u7 k   }  ) d( m, N' [  B: I4 N8 x

      4 |/ r$ m# E( j8 V

    • ! w1 n7 R/ L2 v1 ], W, |
      $ F- l$ k7 P; O1 h7 D
         printf("          优先数算法输出信息:\n");  & e, H: L8 k- J, A: z7 X  ?% J8 B

      , T1 R* X* T& Z& }' U

    • - M) U& S- d/ E/ x
      ) f" m, L' a+ K! y; A- [9 ]3 L) B. `* e
         printf("************************************************\n");  $ w# O: Y4 X2 P$ R
      9 s' Q/ ?! ^1 C9 G: f
    • / G- y7 I* H: R7 w; C$ ^( g

      % C) Z: Q( S3 M' A' M' [2 t   prt(alg);  /*输出进程PCB信息*/  5 V: y% H8 ^# n% n
      ) I! \% ~  W( |0 f3 R" q

    • 1 b( [; \% c2 x0 {  O8 _1 \6 _# Y

      6 s+ x! f  L' K; ^   run=ready; /*将就绪队列的第一个进程投入运行*/  
      6 `( `' K( O2 r! ?, k9 L( q1 E. {

      ) }. D1 V6 |$ v( U8 L' _2 M; r

    • 9 g' e( z% V9 [  p/ _

      - l! i- V* ^9 F9 C. \   ready=ready->next;  
      8 x3 S6 ^9 d; E! m
        f4 y' F' {0 p9 K; y. a+ E) [
    • 1 r, N7 |/ m, c- l" A) h$ C

      & j6 m- S6 z$ y+ @   run->state='R';  3 p& e9 l0 R$ E+ g5 Z& J  q
      ( y) g- j6 A3 H; a, W% r
    • : [, v) L% X0 U& z* V3 A) d+ A" r- j1 `
      ( o0 y; w/ a4 ?! z* ^3 C
      }  - O% o8 D4 Z  D) j# \

      / X: j) c1 X5 x; C+ I
    • 9 }- E- v* H) v, ?3 s8 B3 A
      0 y8 I( @- w5 m! t# p6 n! b
      /*优先数调度算法*/  
      $ @' }( n% r/ N: }3 z
      & {3 ^( h# C) y! V  A8 K
    • ' L! v9 L+ W* {( a5 N4 o" P9 A

      & F) C" q6 B2 @priority(char alg)  7 m5 Z0 ^  T+ A: }6 f6 w3 b* X

      5 M- @4 B; Y' F) e# Y- k7 s: D
    • 7 K# k4 h( j" G! K
      & N& j! L) x" M1 q
      {  1 Z; x4 F- o! M8 Y' O- q2 o, t

      * F1 E2 S+ t: k  Y$ h/ e  R& ]

    • # X8 }3 M/ v# f  a
      - u9 @5 X" K) d/ I2 T
         while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  ! @/ M  r6 u. T" c+ n+ U
      8 r0 ~3 g% ?0 x5 b; s+ `, `, F
    • 0 ~* o; c  M5 W
      ( ~6 V' m9 n: f% {3 Y; V
         {  9 w" Z3 T% ?2 n" L* w

      : P3 w$ S2 ?9 u' F$ E

    • 0 _$ a3 O7 R6 |2 g/ I* o

      ! ?* O) @( _6 t: n      run->cputime=run->cputime+1;  
      $ I( x6 t8 y. w7 i" q& I
      7 v0 p, Y* y- Y' u. {3 ^

    • 8 c" D3 s8 O: k7 ?! _: t
      $ B( g( u9 j, u% g; j) }+ |1 n0 N
            run->needtime=run->needtime-1;  + N6 I; c/ C' \

        E0 W! b0 e: w* q" R, b
    • 4 R$ T  M7 s+ Z
      8 w" g, o7 U( Y
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  8 Q' q% _" Y% `) \. A
      4 i; |$ z: _* s; z  P* V5 N) w( M
    • 1 _( x/ E+ b$ ~4 F3 A0 {
      : L, d' s# q% S) R9 [+ |
            PCB *p;0 B1 N- g1 d  c3 N/ {
      ( ^5 a0 f- V1 n1 T8 i- P! c3 D

    • $ P" j/ Q) X: A6 \! ?! H
      % s4 W& Y2 @$ L) _* N* |7 {
            p=ready;; i3 [+ g8 M% k! E, k) V6 B/ `
      9 h$ k- l% g+ b3 P+ _* ~) j
    • 5 }. Q9 B  h  p8 w+ C9 ?# ]

      # i0 w& e3 O; t7 h      while(p!=NULL)  
      & z; K$ Z- w$ p/ X

      ) u) J. Z3 f, [' w, h' F
    • " D; X  o" J2 K0 @; B. g5 H" B3 C' z. f* W
      + c! B" Z9 g6 }  c! f  o
            {  
      % e& J) ?# u( A* Y! d1 A3 B
      : b! a4 u6 O9 V$ _. e8 y! [; H
    • . J6 D6 v( A* P& \8 X% P2 _+ v
      : v4 `6 K" X' F/ u; r5 Z1 j+ Y
                p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    , m: v- i9 H4 J- G# s8 I% y  _
      ; ?' U9 x" a. U
    • . n/ y1 q! J  b4 M* {
      ' [4 E( O) L" o1 N
                p=p->next;  4 f3 f7 f4 w2 F+ U  V% T$ g* u2 O

      3 p4 v$ E3 a% k& `% b* R

    • : i* c1 ?% n! X
      & x! n5 G$ z3 T! C( |
            }  
      ) m( y7 S9 ~5 g) p5 I

      / X1 s4 j  x  Q" ~; ?) c
    • * S: L- D! m1 ^0 l) K+ t
      & O8 Q8 b; X! W) a
            if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  1 B+ B4 D6 ~7 l4 A8 t1 M
      ( s2 Z. n; A& P1 R

    • 8 Y0 Q+ m! P5 h$ n

      , I" s* B9 o( E! p      {  ' R8 ]2 U' J( D, B  W
      5 G9 v0 ^% A+ \. [8 p
    • 8 e$ T' u1 W- z1 C% w' u
      3 v7 E! {9 s/ g5 e) m/ c) r/ T
               run->next=finish;  ) C/ D5 M0 V8 ~2 p$ ^: v- c
      2 W! I5 I, L. t7 }  [! |
    • 6 j3 z  k; R3 U* B3 X

      " C3 q- ~" d4 V4 L/ ?         finish=run;  ! {9 C4 t& l. H1 G

      1 D5 ?& U/ _1 u/ }- B6 n

    • 6 `* g1 {6 _* ~# g* Y8 C6 Q' S3 t

      ! l: K% U& v3 O- A* {, C. {         run->state='F';  /*置状态为完成态*/  9 D, F4 b8 w" b& ?- n4 b9 {

      + j! c0 }+ C' D
    • 1 d+ X8 l) u$ @9 [+ q2 c) z

      ) n5 P) h) i8 x+ g, F$ N$ b' m# w         run=NULL;  /*运行队列头指针为空*/  ) B7 F/ c: v# B+ \8 p
      ' j  o" X* @0 Q- j

    • $ q- c/ O9 B% t6 T* u; n% r* u; I

      ( g5 j! N: F9 G4 I         if(ready!=NULL) /*如就绪队列不空*/   I) X: L9 j) ]$ E# Y6 Y1 F

      6 K8 d+ E8 h# m1 F2 A, N1 {, t

    • 5 d* f3 i. ]2 V$ J# ^

      * j- u( }* u9 P( f2 @" N7 I" \+ f         {  
      $ R- m- r) P( l/ @

      0 m0 Z: O& Z5 {$ |, _
    • 5 m0 @9 k& q. R- s" p
      % @: y: h3 h6 P* k5 [
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      , _) O/ j3 d1 y8 x

      ' [$ U* z: i: _0 t7 v; K  I6 Q
    • . I6 x9 {4 n- D$ u4 t3 o

      ; ]) W3 M3 S- B. H( J4 e' [1 k         }) ~$ P1 g! P2 B! r
      : t! H* R+ z8 X: ~
    • / S7 P$ l8 k. j% G- ~3 }% _+ O: t

        @/ Q- F6 i+ t% j      }  
      : d2 o3 W) Y7 z8 {  a- K, Y" J% ]4 K
      ) K+ o7 e) v1 Q8 f& ~" T
    • ) r: ]8 k/ `2 u: B

      5 {& Z$ t# m, z4 }  m! P9 g' ~+ Q; W      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  8 J% v$ M$ g- Y2 H
      6 m8 N' T+ q5 Y% c& p  ^
    • ! o. z# r# R; }1 t

      ( S: F+ z6 y/ |  @: l     if((ready!=NULL)&&(run->prio<ready->prio))  
      + O- I3 ]# L5 |% j
      ' g: {7 M% J  N$ \5 \. B  w( I

    • / ]3 \3 J* j" s) N1 r4 A, `3 ]

      ! [5 T: B2 E8 S# m; [) H     {  
      4 p% V/ Z/ x- b. h( P7 I
      % h: A7 Z- H9 o
    • . I) m- Y# ?* i- X5 W/ }  ~
      - `& o8 y  [7 g7 `0 b
              run->state='W';  % l7 p9 H$ }. d

      7 T( a* q" b4 d6 z/ w! ^# a) J

    • - h# Q+ B' ~8 p. \) Q% L9 e+ y1 k
      : ^0 a& Z/ S7 B3 o' d3 J
              insert1(run);  % y7 l( D3 f$ J
      ) J+ u6 e# [; z& X- ]5 M$ g% [
    • 9 Y" t( I0 c  k: Z  j: Q

      / _/ {& K& Q9 V5 Q% M        firstin(); /*将就绪队列的第一个进程投入运行*/  & M) r* k) P# B0 Z8 Y5 a+ C

      ; a: ~# E% x. T! o( C, M+ i
    • 4 @% ], {3 Y! k5 M+ S

      9 L- m* {1 S/ f6 `& T* k     }  ( D% [! {( L  o- W/ U/ y. a: v

      # {7 N* P' @- V- K5 h7 E+ h  Z

    • ' W0 S& I# d2 M8 J( R
      * F( n; b8 Q! R! |$ z; {3 Z5 c; R
            prt(alg); /*输出进程PCB信息*/  ( F+ ~% Z$ @5 y

      " I! r6 I9 C6 i* d  O7 E5 J' W
    • $ ?7 @+ r( _( s1 A# S

      1 `' R4 ?* M6 G1 k2 d, B; ~1 q+ n   }  
      ' J% \6 A, [+ P

      ( }, }; u4 R0 t8 B# X! c4 j9 |. L  a4 v2 h
    • + J( a) u2 M, i) F& k

      & F! B: K, K0 [& Q5 Y! K3 w+ m}  ; I% p7 P: Q6 Z9 V) \# X

      ( P* q7 ]* A) l" V

    • 2 \  P3 |/ M# N

      * V0 W  B& u5 D& h3 M  v/*主函数*/  9 R* i: d' g& y9 K3 }7 w8 G
      4 i1 Z/ I  d; M) x# E$ L6 i

    • . ]  w0 E4 w. z0 U2 M2 y" K

      9 y) J; }- o; I" i' `main()  # \( M1 {; I; g# _
      / F; E& K: P  i; M; S# i
    • 2 q! R, u9 O9 d  N; d, q' F

      + _5 d* u- m- b) I( B{  , U4 X8 E3 [) G2 A. a( j+ l0 O

      2 P/ U8 n& k' O$ v

    • & o) `5 j, p: m4 j7 X% {
      # k( q  A# ~) w( Z- ?
         char algo;  /*算法标记*/  9 U/ b4 I4 E/ F2 o6 @% q  V0 B

      ( A. U% q0 K5 Y: @
    • , @) i. t1 {5 Z& y( K
      " P5 B. G. u$ B4 N8 o3 D! R
         printf("输入P确定算法:优先数算法\n");  9 J! h; B, \( Z5 t7 t2 A
      5 u, {6 E+ ?- Z/ n

    • $ V/ I( v) i& E% L# h2 V) a, N

      $ d/ s7 v4 J3 h& C   scanf("%c",&algo); /*输入字符确定算法*/  6 A. P8 a4 o' y
      / L) H3 T% x/ X9 D

    • 9 }3 U: r# e% Q
      # c, S" _7 [9 r
         printf("输入进程数:\n");  1 c9 H% o7 P/ [+ u

      9 ~- u2 A, ~* X  E9 k% M  P7 \

    • : p; S, u  p( b  |; T2 w/ F

      6 {  }6 B1 W' k* f1 B  ?( Z   scanf("%d",&N); /*输入进程数*/  7 a6 U4 i8 d0 x; o* g

      % `1 V: d9 ]" W3 i1 v5 [

    • / ^; D5 F' ~& i+ A+ Q% u4 _  n
      & E" X5 A; t5 `
         if(algo=='P'||algo=='p')  
      ) Q  L' z0 B' S$ e3 V

      : r) K+ Z- D8 P& P

    • ) C8 T8 u7 G/ i# |0 v6 z
      8 B7 H$ K/ O' X. i8 `
         {    G& i6 N4 `7 j6 d
      . l. O5 e" I" z8 R; _8 c/ k

    • 3 O9 b8 ]& `6 j9 k

      " X% V, W/ N- x7 `      create(algo); /*优先数法*/  ! o$ t# n2 B1 H$ @( T, _
      / U# U1 E# p# I

    • ' V7 m5 A7 V; C

      8 \6 \, e  m8 `+ X& h7 c5 Y0 e7 ]& }      priority(algo);  . Q7 n: S& j8 Q

      / Y/ ~+ b! h( c" B- L# r
    • 7 F, N  V+ K. W& F4 \! y
      $ }' S$ ^1 q' Y, M  |
         } $ |/ h  h% s3 O& b& Z
      * q, `3 v6 ^; B- N8 \: {4 X, a
    • ( k0 l$ Q' \& e' i8 \/ J% t* n; H" p
      : r5 @, E/ }. e
      }! f5 {$ B- I$ Z4 \4 S* b

      3 P% \! F$ @7 w+ S* s
      8 X9 \4 _- u+ M& u' G' s$ F


    $ q* D. n" Y7 Z( ^7 d输出结果:
    3 l' g& F8 @, |8 E: J

    . P# P: m3 F! V% O; N7 P
    原文:https://blog.csdn.net/weixin_40962955/article/details/80072769


    * N5 ]! b5 [( J) H: e# Y" @
    * \+ ?  F; u2 O! ~3 _5 g" |
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-20 21:18 , Processed in 0.499571 second(s), 51 queries .

    回顶部