QQ登录

只需要一步,快速开始

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

    6 j  j5 e. ^  ^. k* U4 i优先级调度算法
    8 e0 F4 w. W1 q5 O: k* v

    算法介绍
    " f/ J8 p& N% C1 {) m优先调度算法的类型(用于作业调度)
    * t# G/ n- p) P* c- H7 t1)非抢占式优先权调度算法
    . q' E; T' r0 _8 p# J" Z: l系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
    ! b) P& S% x2 A! ^9 N2)抢占式优先权调度算法 ' @0 [/ o: R2 S- i# A
    只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

    优先权类型' Z) S, ]$ @4 e1 c
    1)静态优先权 $ {* X: I. i7 U6 C, W+ J
    静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。$ t2 ]8 T% Y, x1 g& T

    2)动态优先权
    2 K, a, \, X9 a3 i( i

    算法实现

    抢占式动态优先权:


    ( Z9 Q: L) |& u* g! d2 w1 ?PS:本人认为非抢占式静态优先权没有实际价值。

    • : |7 D- g( f# {- ~  H
      4 V! ~; ~- j9 ]! t
      #include <stdio.h>
      9 B6 `7 P# U2 q. ^, i4 \3 B
      . |( g5 B- Y6 ]* N9 ~

    • 5 h$ J- f2 M' b' U$ q1 w, U1 [
      6 d  g7 g9 t. _% C5 [  D# ]
      #include <stdlib.h>  7 U9 x1 C: w6 c3 K7 z" S* \& f$ l0 R

      & h+ Y9 K& `1 z2 R1 u6 |% U4 @, _
    • % g# u" R6 y5 ~: _$ e  g

      7 u; G% j/ [$ {' t7 b#include <string.h>  
      6 T# ~( O& b# s4 Q: n: d

      % q2 h  H- e/ Y( I& s, k; }

    • + Z- R, s* \% ]- h9 L2 |

      5 n3 s3 o* g: A& Qtypedef struct node  $ R' D2 J& m1 F( @3 z: T  Z
      ( J2 K8 W+ q7 ^8 Q# f3 ~+ [# `
    • 1 w( \8 V  N8 |: f
      5 V  m% o2 F! ?$ T* Y9 K6 L9 w, X
      {  
      ( s, L& N- c$ F) I
      : L; |9 h, k4 ]

    • 9 l; B: a7 I0 H

      : \, }) c' S# T; I# R$ \   char name[10];  /*进程标识符*/  6 V' {" T3 M# s2 ?
      . j+ R. K: j( u% P
    • ( _- W) @* o  y5 |& p
      ' x! o5 P4 Z' z' E
         int prio;   /*进程优先数*/  # Y* g0 z& d4 M2 |; U3 n2 C( h' J
      / H5 O6 t* p/ B+ g9 H
    • ' s2 k) l, a) y" n* R- Z& R& M3 ~

      8 f  h, {3 H# L: e6 \   int round;  /*进程时间轮转时间片*/  
      ( ^1 p9 M. j# w4 S0 l
      . A1 n' o1 }: o
    • % k! v- W. {+ [
      " h' m! J  d  ]. U
         int cputime; /*进程占用CPU时间*/  0 m# l7 H) g  _* u" O' z! q' r
      6 e% q  m( ~, V: W
    • ' W! b+ q( l+ @! I& F6 z9 ]- B
      2 l2 t& {3 _/ k0 d$ R" w( H% Z
         int needtime; /*进程到完成还要的时间*/  
        F1 @0 K( R7 w; M5 P& T; j
      , E* ~: w( \5 y: f. y2 u, E

    • : y3 ]% V% ~2 B' E

      3 C# F, W3 i: l   int count;  /*计数器*/    k' [' h2 @. {0 C. p

      $ r# B& r7 {+ p: q
    • * W$ w3 |2 t5 {- e/ ]

      , ]  P0 |9 j  d  x, b% I   char state; /*进程的状态*/  
      8 R9 p0 @3 |) n

      $ p, K. j0 H# ]" W3 ]/ X

    • 6 O5 ^* a. }# S1 Z

      7 V# P- G6 c; ]1 I# C   struct node *next; /*链指针*/  
      5 h, t% V0 G! s- k# B
      0 k7 }2 C, y7 F
    • 6 e1 ?. Z; f. _% a/ q" y0 K- o

      : m; }4 w8 [: Q: Y; ~}PCB;  
      1 D! h& P' t1 H4 ^2 y6 F/ m3 V! X" ^

      7 G/ A5 ^7 k' X5 L, N

    • ) y, K( k. U, K( [

      5 d( ~1 n: Z$ {% B+ U$ V. vPCB *finish,*ready,*tail,*run; /*队列指针*/  , b: r8 r4 l7 U* H, `9 ^
      / U* G+ t8 m7 B. q8 l
    • ! D" _, s, {1 O2 P1 c

      ! C* z% ~0 |, k# F. ^# B# b- ?int N; /*进程数*/  7 a% n! o+ z5 T. k2 c

      6 `0 f- Z( N9 n! F# a: M( y
    • 7 O  o# U4 Y% `3 J' G
      % P& {  n0 _+ z2 e, B& M3 \3 d
      /*将就绪队列中的第一个进程投入运行*/  . P: i) ]7 [" x2 h0 ?

      ) Z, V* \* Z# l9 z7 W

    • 9 o: x9 o% a: f$ x# U
      ! i# q7 g6 |( F5 [& N
      firstin()  $ L# v) H8 M6 }( p: o2 E1 B" F
      + Y: c/ Q* A+ e0 [# g5 x8 P

    • 5 _; H* X( `9 v+ C. Z

      8 u' E' q( g! r6 e/ g: b" X{  ' q% ~! Q0 T' j5 _. d- L( J# {

      # U1 S( Z, a/ F5 F4 o, _# [

    • / A1 g9 a& V& j( {- L

      ! F' D! K' k7 b1 I2 l  _+ K! }: z   run=ready;   /*就绪队列头指针赋值给运行头指针*/  
      ! T. n2 O0 j' L
      ; o. S, J" u' h, M5 `/ P- J1 i: K

    • 0 t* F9 ~9 L! D' S5 M0 G

      - h& g9 U( o- V# _8 ?+ G$ V, S3 O1 H   run->state='R';   /*进程状态变为运行态*/  
      9 u5 N* \* V! L! T3 `- b8 V& A8 u
      7 A8 l# N- ^0 ?" f$ F
    • 6 P5 n5 A* ?  R1 w7 ?+ [
      2 B; u' l& p3 C/ z, f8 @: l
         ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
      - K7 M1 c1 m; ^
      " v& z$ m( V6 C! c& t# ~. B2 A
    • 0 L& E2 N# s/ H4 y' w! s9 o9 p& C

      0 x) W5 z* s/ O, u+ B9 x5 n}  
      & G2 f, h. g1 [1 {) D7 t: H

      6 ?2 v4 `6 j' a

    • + F2 E% B$ q9 p. M* [

      1 j6 |2 K  b( h/*标题输出函数*/  3 W; g* b' L/ l* C4 w6 Q4 ]8 T

      ! H' @3 v+ h- y+ B

    • ! F5 t7 K9 e1 k. G2 n

      6 ^! v/ U' Y8 V; Xvoid prt1(char a)  
      & s, p( l+ Q6 A
      ) a6 T8 H/ J, E) @: w/ q
    • + m4 J+ M& |/ |  N. S
      . O( C" T: \5 x( @
      {  
      ( C0 {  R) X3 ?

      6 X& W& x( c8 W+ ]' P
    • % F, }. z  Q( F2 R! O' d
      & G+ B9 z, X" f5 b' Y, }( M
         if(toupper(a)=='P') /*优先数法*/  - U8 M4 w$ _3 J$ H

      1 s- O% s9 d- S6 I1 t% w: s2 M

    • & _2 g5 }+ e0 B, r% L4 v$ D- |
      ( |* Z: A- _& L* W2 O! ?
            printf("  进程号   cpu时间  所需时间  优先数    状态\n");  8 N+ S2 L8 C8 _2 s
      # Q) M8 p/ J8 T' Y& _

    • ' i' L( h/ B( m2 L. ~) T$ n
      3 N$ }8 b, ^9 [; n, p8 y
         else  
      : Y- w: u3 B- J. @

      . V* r& ^1 O% J# c2 |3 o! u* e

    • % W2 h/ Z3 D2 E! U9 i  z% o

      $ M; v' D, w# @( Y      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  7 G0 E. o% U+ }& P6 \9 w

      ; z- O9 k( D! J6 Z! N

    • 8 c- Z) t( A/ z
      5 K- R& P" _) Q! u+ m) [  y2 p
      }  - [1 N- ?2 q% u6 P8 T6 ^. w
      5 v  m" |( g9 w& `4 [# D9 F- F" j' ]

    • 0 q) ~7 S7 e( `

      $ g# b2 L. {; {) U, B/*进程PCB输出*/  
      / E2 K: U% o$ o% s! T4 P. @+ ~
      ( A, r) o$ a5 B# l

    • 2 o6 P/ T4 ~0 {; D4 g

        `" G$ q7 M. X% xvoid prt2(char a,PCB *q)  
      . {8 V- u! ^% Z. i& j) d
      0 S0 w5 a& U4 a4 ~

    • , g: l; o# g: V* J/ r  J9 Y
      # [$ N1 B8 v2 V7 z) E) M
      {  
      1 p7 ]- K5 R$ i6 F( L1 V
      ( j7 G* y! F$ G. x- P
    •   K# I) K1 {% Z  X, x
      * M" o+ {' c0 \+ `5 b& E2 u6 b
         if(toupper(a)=='P')  /*优先数法的输出*/  . }6 `1 P0 A( g
      # a* X- H8 F/ }" M3 z3 U2 l/ d

    • 9 M  q  [; y. L
      $ `! B8 B" [: o0 K
            printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
      1 I, h5 ^: g- w; c# F* u

      ) i7 ~6 t* ^, m: ?* R; D

    • 0 m/ R5 C+ B0 g1 V+ d7 T9 f: u2 R

        }9 K3 n! Z9 p, e5 u- A       q->cputime,q->needtime,q->prio,q->state);  ( h$ P. D- C/ |3 z
      - ]) T" u' h; s3 Z
    • * j0 x& q# s- ~4 e& |# B: z
      + X, K% U4 O  \( [
         else/*轮转法的输出*/  
      0 p  M4 f0 y, b4 D0 F
      % H& {' `! g" \" E
    • 2 w  L& e0 K( f1 j/ d

      8 A1 c6 k7 j, X; G" j8 \+ Y      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  ' }- V/ R7 X3 E7 V' {
      : |2 c* H# s+ D, c+ y! j% Z, t
    • 8 P9 v9 ?* \2 M; ~1 U) t
      . @  \3 v( w& x3 r1 I1 n7 k
             q->cputime,q->needtime,q->count,q->round,q->state);  $ \7 ~' `8 {* L: U

      " i* W. i$ }; p3 K
    • ; t5 l8 p2 T7 x. l8 E
      6 ^, L9 D$ w' |- D
      }  
      * Q" Z  |( P( a2 R" Z$ v% h: M
      " U, @. A3 ~& F5 F" t- D$ U

    •   m, |+ X1 B) _

        L" h: D" s9 p3 b+ P5 T- X/*输出函数*/  6 D5 z! B  z* \( c# ^
      ' p# V( m& _5 a- [) U1 N

    • 6 M; }! p: x9 X" Z

      " P/ H; l: F  @8 m  d! G5 C" w7 avoid prt(char algo)  
      4 r% V" x$ I+ q5 u9 U

      - c( y: ]. F( p

    • / U8 f1 W* x3 o5 K* v
      9 K+ `  n8 _! q. M/ R: C6 G
      {  5 `+ ]4 _+ ^+ b9 I+ O) p* `" o2 Q

      9 j( J. z2 M$ X$ z

    • , E( a+ b2 _: ~0 \( p1 L

      : |9 f( c; K4 q# Y0 h! Y1 {% o  Q   PCB *p;  1 U' e$ B9 c! L) z

      . i! [* C. s5 ]) y4 X* o* M9 S

    • - `& e- s( U6 B, L6 L/ W& U
      7 s& v4 c5 |: D- e
         prt1(algo);  /*输出标题*/  % \( O5 a  X  Y7 ~
      $ M$ e' g- x4 Z* _: Z3 |. L+ g& V7 M

    • & E; m% z/ {) s# t4 y7 u
      ! E( M) |# I: Q' ]* I9 e: E
         if(run!=NULL) /*如果运行指针不空*/  . d$ _2 U' U+ O9 `

      1 c3 C, u; J7 o) ^& k2 q

    • ; t- R5 }' ~( k6 e2 p/ S& h
      ( D% ^* F4 R; o6 c1 E+ i8 e
            prt2(algo,run); /*输出当前正在运行的PCB*/  
      ' ?1 p$ N& @+ C5 w5 T- X: z: j" L: H
      , M/ u$ F; K1 V* {/ f' [3 t5 Y8 a

    • * l, |, M; x; J8 h. P+ {
      ' u3 X! _: \- A6 A& i7 Z: I/ k
         p=ready;  /*输出就绪队列PCB*/  ' i5 `( e  N8 e* m! c$ N0 P9 t

      $ e6 z  F; K( c& J1 N) x; W) r) A6 U

    • # F+ T; V# F+ ^$ [
      8 g+ F* Q/ L- |6 V! [7 N0 X/ Z, I
         while(p!=NULL)  
      ; a5 D& r) t. @2 h% O

      % g8 Z5 l1 V: r
    • 0 h9 ?9 k2 A( C, _0 {
      ' ]$ L( ]2 r1 X/ \
         {  
      ! `3 q" S) e; l  P
      3 N( z1 K- B4 P/ A! C+ A7 K

    • ; |! m/ Y$ n' ?% c

      9 y7 Y/ T9 G4 B+ ?  q0 t      prt2(algo,p);  0 m: _0 z7 l7 V% l: s4 y; ]
      9 a8 ?4 ~6 G/ E2 O
    • / U4 T; N' w' M4 R7 J0 z

      3 t. ^/ W) X! H1 Y6 U      p=p->next;  ; k" D* ~9 F. X. G& r

      1 f3 P  {$ y0 m7 s

    • ( G2 a5 e# @% s: i/ M( z" g

      7 S( D- ]; O% C' i1 `0 d+ n* Z. h% y' V   }  ! I8 a* J3 Z) y0 q' }
      # ]! J" S4 b1 f

    • # ^6 n7 R, o6 K. Q1 q' @
      * C! W: R. f. e5 D2 g
         p=finish;  /*输出完成队列的PCB*/  
        b/ L8 G2 [; B9 h  w- z

      % a7 |& q4 c7 E" j( ]- K0 K, }

    • / N( O. C3 }0 W- R+ \1 A
        n# F( [9 y! K6 `1 V9 Y
         while(p!=NULL)  ' M- [' t- h7 c9 b# X9 D$ J' Z

      6 }( T7 [4 K" `; f7 X2 _
    • ( L& T/ d% @6 G/ j+ t8 l" `
        I4 q7 T" }3 I& O3 e  Q
         {  
      ! p- W8 Z, q" a
      3 a! ]6 Y+ a4 G# o8 m% r

    • ' a$ ^' ?! H) p2 F' N  h
      + d% }: [" ]9 k* i& T9 k
            prt2(algo,p);  
      " R8 f5 J/ W! u) c# X0 l: {" c) F
      3 C- q1 w) {' U) U

    • , x, ~+ o8 ^, Z
      * Q& O/ r' b$ Z6 I
            p=p->next;  
      8 L* f3 K9 r" K( X) t3 j  V

      ( A7 _6 k8 H9 t) z3 y7 p  |
    • + g( p4 y1 y, X, J6 l

      " @5 u9 ]* R5 \/ g/ I! A   }  
      8 a! R6 u8 E" `  N
      " i0 M2 f5 f4 N9 S6 d5 H
    • . _/ x$ d, S8 K2 ?/ l
      & Y7 p: ~4 q+ r6 A. f% Y9 m1 k% R
         getchar();  /*压任意键继续*/  
      7 g2 O/ S( B4 z/ Z6 E
      ) J# b8 M3 I" g) Z% g/ y- u8 F; b  V
    • 6 h" H9 n5 U% J- b* Q

      , o$ K7 o; h! F( N8 x4 A. t, S/ P}  
      % |# J, P% i. Y  B, T" @
      4 \8 E1 H4 E# \1 Z$ I3 b

    • 6 r1 d8 p$ e, O) A: X) ^' g$ a

      / s) z: X4 _9 y: |- S& ]- j8 ?/*优先数的插入算法*/  & h7 j7 l0 C+ ^' `$ e% V

      # |) J+ p$ D% v3 n2 f# L" j% R
    • 0 i. ~! r7 I, U. n- }0 I
      ( h3 r1 J, }2 F8 H5 r
      insert1(PCB *q)  ) _( K" r8 R% b( m
      5 V5 r7 [! k' z+ S1 s. ?

    • 6 G! g! j' H( _3 C# B* ?
      / b8 _! v; i! z  q7 U) ?
      {  
      0 c( k# ~" y$ x; w

      & j7 r( v' }& y2 F, ]) A

    • 6 p' h: ^$ _! x$ P, O
      ' E  ^+ X% ~& o) F! |3 s
         PCB *p1,*s,*r;  7 J+ u0 e! O* I% R: d; h, Z3 F$ B
      - s! _" D, D' R# ]
    • $ V* v- v9 c, G2 Y' O
      0 {2 o  ]# n# i' h' V
         int b;  
      0 k4 A9 d& _# q) j, F
      3 h8 j( \/ I+ J/ F' Z
    • + {5 U  v1 u1 `( W
      7 C" \; o9 \6 A3 p, D8 P2 c9 r2 k
         s=q;  /*待插入的PCB指针*/  
      # o: s' n0 I  |% l' s

      1 I- d$ [& ?8 K: I# a; {

    • ! ]" t) l, Z3 \  t
      ) ]' A$ E9 A& V8 f  l
         p1=ready; /*就绪队列头指针*/  ( ^/ j/ A, K  @# ]. `  {: u7 z
      . P; \5 M1 l9 T" v* q
    • / d* h8 i9 d& b& C# G) F

      / ^1 D1 d5 K. v7 R3 X# ^! h0 U: Q   r=p1; /*r做p1的前驱指针*/  
      ! E: m6 c# g8 Y4 p1 o
      2 o2 B: R# o7 F. C# H2 ~  X% R
    • & ~+ E4 ^  H1 l2 x9 b* h- \
      3 E# [5 p1 U0 ~' C: e% K
         b=1;  3 d/ E9 p. ~3 M6 l
      & y0 G3 x5 J8 F

    • / T* H! d( w) a' S3 g, j: W
        \; q, s/ [0 x/ ]6 E. K
         while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      ! ^% s% g+ C. G  V& S# k: N" w
      6 L$ D2 d8 B+ ^( g$ M3 |2 i

    • 7 B3 L1 N; J8 t. l/ ^
      3 C* _4 k1 T" m& v5 ?: j
            if(p1->prio>=s->prio)  8 h4 `% L; p2 R
      - Q. w1 V' }0 |

    •   f" u# G! j3 K1 I) v

      # n. R" t! i0 o. Z: t# F% c      {  
      3 }- \& Z& d! T  p7 h

      " W+ k) Q% O' x0 M! q
    •   ~" q: [0 U% X: n( F9 ~6 E
      % P( r3 d9 ]2 Q
           r=p1;  6 @5 \1 }( j1 P$ h2 F9 q% A
      7 |9 m' o& G% S/ M! R1 s9 g; n
    •   ?9 W, @9 n9 r$ q( U$ {
      2 o3 J9 a: {0 D9 A1 {! F
           p1=p1->next;  ; C/ ^: b. U; w! u2 z
      & Y  z! s/ E( N2 h0 P( s5 R
    • / O/ C4 D5 T6 J2 K, Z6 k
      * G' Q; Q( t- x& I9 x
            }  0 \( z. ]3 w/ X3 |; |" t

      9 j  v: p3 H, K4 t+ I4 |" ?

    • 0 m5 K) M3 M, t' Q  y
      3 ~. T5 ^/ |. Q$ }+ w7 E; M. x
            else  : R* z" I( n; p  A

      5 x0 e# u7 S9 Y8 N5 }7 A# {/ }

    • 6 Q3 l' J* @* g. O: B* F( J

      & Z: F9 D3 r, M4 ~; ?  G1 n4 s     b=0;  * R- U( A/ {0 o: q/ ~7 t& O- N. C

      , M; M# F' f# A$ n% h0 X
    • ) D: B1 E' M0 K4 x; @9 O
      & k: F7 @( z1 _1 ]7 G- L" \7 s  M0 \
         if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
      , a4 W9 G& {2 A( ~) U% M

      # _1 k$ c! P! S# g

    • 7 X, r" ~6 n$ V2 k1 C1 m) M
      ' k) @9 V" p0 B2 {+ k
         {  , x* e  J9 i: L4 L/ Y; F

      1 M" ?5 m5 ]7 Y- f9 ]. B8 `

    • 8 L' U' {, s6 n5 N9 G; @& l

      6 Q! N1 q3 i3 g$ \) S8 |" `% D      r->next=s;  & h( t# v& q$ [: t
      $ _! S6 h, d2 [7 p0 m4 z: U

    • 2 P: m: D: w6 o! l+ ^

      / E2 p. c$ H: i$ m      s->next=p1;  
      9 q3 U6 m6 g0 Q

      " o3 O+ ]4 R" |( f, U* T% l

    • ! F5 z* J) m/ a3 B" D1 t

      0 B: }0 }/ z( a0 y   }  $ t& r. {4 e1 b0 J- O$ P( ?
      : R+ p- R5 m1 U  T
    • ! k: M- t& H7 v! z1 z. p- b
      ) m4 ^6 k* Q5 a& J8 u. y* k
         else  
      " R. F: ?" m( A( M. ~& H

      ' W/ w% q) F; e5 y" g; B" \! s* Q
    • ( b; H; R  V1 N' W- R/ k

      : r2 q* d+ {7 t0 ]& Y3 p+ k   {  
      ; y* ~) E4 W: [
      " E2 u$ k2 \9 b6 Y
    • : t% A& Q  {1 j  g: a- _

      / Q$ D+ m5 x" C4 Y4 Q      s->next=p1;  /*否则插入在就绪队列的头*/  
      " n  N1 x4 D; Y
      + U/ E" f9 g! \0 m
    • 9 ~* U% I- d6 q! j, K0 L
      6 r+ Y, O5 q& C  u; n
            ready=s;  , E3 n' f! F4 q7 {
      * Z3 J- V. L( K  U7 E
    • 5 H, D: n' F1 s+ u* q$ O
      / u( d8 X( q4 y8 s1 k" }
         }  
      ; E1 f  W, _/ W5 |# K
      6 S, I+ ~  M: X% J9 I
    • ; D0 ^5 T, z. ?, w$ R

      - B* A- T( W7 {}  
        J. m0 O9 t1 \( a
      ( ^1 h% o) z0 q- x0 `

    • 8 a" z2 W! V/ H1 `

      , T. T# W: @4 W/*优先数创建初始PCB信息*/  
      4 t7 _! k4 |: R* K$ @
      % h. ^9 z9 d/ k) x; I) z# l
    • # U+ }& K0 J/ U, P) H
      4 b  b( C: c  o  r  Y) z$ P
      void create(char alg)  
      + j6 l! ~2 S! k2 s! f% T

      % ?7 ]8 u4 K, B& e: z
    • : s! ~9 G. r/ E/ J$ Q
      ' i7 e. U# w  H" m8 Y
      {  
      / @7 n5 @, Z, M; p

      4 U1 P9 E7 J/ w! W& H

    • ) \% S0 W/ }4 t# B( I1 v) p  q
      - I, _* _/ J9 s3 p5 l$ z" ?, z9 x
         PCB *p;  , D9 {- G4 |, ^0 n$ n! P

      7 h( W/ n' c7 x/ \( R2 f

    • - ?7 ?# H. l! a" k

      5 v+ _# a, v( M7 S) p* C$ R   int i,time;  
      . E0 k) s& J, @  F- ]& k
      , `* i  _2 W3 r- T8 g0 ~. Q. n
    • 9 ?1 H4 z1 }' L( ^

      ; l8 W# g1 E) n   char na[10];  ; ?  U; Z  A+ B* J  e

      5 p$ {5 d1 ?" |& x
    • & ?9 g# r6 L# Y, y4 b
      5 l* _6 ~/ j) I- |6 h
         ready=NULL; /*就绪队列头指针*/  
      " J" K0 R. j3 `
      3 d# f, x# n" d1 R' D

    • 0 c: U7 s9 y- R7 R) T6 w
      , W! p1 q' |, z& V
         finish=NULL;  /*完成队列头指针*/  
      9 g5 T! n+ H) L9 G- V

      7 s, v- u5 G5 s: i
    • , @! r; m- n* E4 Y

      , q0 m4 ]- O1 H9 k0 Y' W2 w   run=NULL; /*运行队列指针*/  
      $ A/ X1 }0 D7 n/ C7 O8 b7 b$ n

      % y% Q! b; v, |
    •   ?3 k  U5 _& Y  V
      # ^+ ^: D5 E7 ?
         printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
      7 ?* M5 F  X7 s5 ^

      % @% C9 K/ g5 R! d) P
    • 4 ?$ q( G; I8 s- Y6 V1 F, S+ h

      9 v8 E/ C* i# {6 ~! v% v   for(i=1;i<=N;i++)  $ L9 f4 e" |. T

      ! e8 I) e+ }( r, R& z2 |
    • . ^' i( s8 O1 s! P" L# N3 L
      # e6 k* q* ]3 \" E' Y
         {  
      1 B4 b( u6 d$ D

      : j3 B6 Q. J% c) c5 n" ^

    • & p8 c9 @( b; S4 e  b. l/ k

      ) i) B  X! s2 R* x3 J      p=(PCB *)malloc(sizeof(PCB));  
      ) b$ s; \7 M* L% ?  g
      # ~+ P/ a) ^# O( [6 V" ?# X

    • 4 _2 n9 }- r% y9 g
      7 V7 k: q. k$ N( J
            scanf("%s",na);  5 w/ P% x. F9 C# M% q. ?

      9 x  W9 o3 w8 i' ~' N! ?- S
    • ' w4 R: o2 I9 l9 Z) w9 I7 G" q

      ' D+ A$ }# R9 r! `4 Z      scanf("%d",&time);  
      ! t4 G, W  m+ w. a

      8 y7 N1 p# J; s& [4 n
    • , l1 x# P: x+ S) \
      : O* b* ^' f, A' O, h
            strcpy(p->name,na);  
      : I2 Z4 g4 W7 l. U- `7 ^9 P

      5 W' t) m# y; @, O1 d
    • , Z7 K% d  B# j; J

      ( B+ _/ R. N; u$ M3 n      p->cputime=0;  
      . W# R; D" w: F6 A3 E+ E' j: q4 X2 A* K
      + y& F2 O& `9 B8 L

    • * ]0 E1 S5 Z7 B- z$ m

      : p% Y1 D9 g2 y6 V& V      p->needtime=time;  
      ; H# b% q3 [/ j* A5 C: ]/ k; T3 b

      0 d* y8 V( R+ j" V
    • ' h4 q+ l' e$ ?$ P4 V0 x4 K
      " L% M8 l' D$ E4 E
            p->state='w';  
      + K/ ^- c  j( Y# G

      5 G0 V9 \* _- G% I
    • ! ~5 U1 \, {) @! U7 j5 }+ ?# n
      1 n) j! u7 x. C, U
            p->prio=50-time;    V2 s* A$ s  s( e: s/ y8 N

        l2 `2 J  D2 O# Z: R6 l. x

    • " O9 A" x* E9 D* l9 k
      6 V$ [* l' o/ R
            if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  9 s( w: J& }5 o6 N" G  F* M+ @: L8 W
      ( T/ \) D3 h- ^! p# ]
    • ; Z+ a* d4 |9 \! N
      : n0 N9 p- q6 w6 q
           insert1(p);  
      $ _' U5 x  n! X0 s

      4 F! B; ~! s) x/ s+ H& {( p, _

    • 0 K) ~8 K4 X  Q/ F# O

      7 ?( B9 n( _7 q7 |7 P& l4 U; F      else  ; H3 w% r* I% v* e

      ( p& m6 {$ k( \
    • + t+ ?% ]) J$ b, L3 r4 s

      ) b2 S$ V) I3 n$ B3 l      {  1 b+ ]" H. @! U+ a( d4 {. _/ Z

      7 V' o- I- {" Y- r& M* [4 p
    • $ f6 x: M) Z) R) a

      & C1 g% w$ u3 {     p->next=ready; /*创建就绪队列的第一个PCB*/  
      * i& ?8 d, e1 P. z7 K! ]+ U" h8 R
      , m) }: d) c( D1 s8 Z1 P
    • + `7 {1 {; D2 M4 c! a0 ]

      5 z0 {; }" W9 \: e9 J0 W     ready=p;    ~8 z8 r/ C; w) V
      4 }+ G' F" x+ T% U' M+ R+ Q1 ^, s8 L
    • 1 c# I3 V/ Z" p7 r
      & V7 r7 ^- x7 Z" M* `/ t8 \& d( `, r
            }  / y. E. R4 [' b/ v/ [& B

      3 M4 V: a# b- `9 L8 h

    • : d% P) `! M3 z9 l
      * f) O' A, |. [, w1 f  Y: K
         }  
      4 e* ]8 W: e! G
      ; m+ G2 E" y, q" r, N# d

    • 1 i( v# \! `+ ^4 v& k8 e! z
      3 [& D6 M  ~- p
         printf("          优先数算法输出信息:\n");  
      # l( i5 Q1 K! S" Y

      4 c2 b1 F4 v$ d

    • 0 L+ i- g4 P6 P$ F

      - M( j8 Z8 E! Z- o   printf("************************************************\n");  
      , _" n/ J' y: V  i+ n/ `
      # r! D& U* ^1 w, V. g0 P0 [+ Y

    • ' y  g% u+ V0 u3 a: W
      * G# r5 T. n* s, R# P
         prt(alg);  /*输出进程PCB信息*/  
      3 ~' g  R/ x/ N9 b5 P  n& d2 O5 z' Y

      : B5 I+ w5 ?7 X* }! Q7 ~7 h1 X

    • 0 ^4 y9 O( V. w' D: ]0 u
      5 r2 x1 ?  N2 u; C0 Q  d# U
         run=ready; /*将就绪队列的第一个进程投入运行*/  ; \5 v1 |3 {* ?

      , K6 Z1 |6 n5 d, o) }' D  r8 _

    • 2 w/ g! ^; t% k2 U# u

      3 N$ B6 Y2 d+ x, U# o, ?  O/ D   ready=ready->next;    a& E* V3 u, C  H

      . W+ L* G  J' A! t- I9 I: E

    • 9 O) q  a2 x2 S0 T# d# A7 K
      . c) c, x* |* e, g7 k
         run->state='R';  0 \) v1 h8 O0 J3 n$ Y
      1 ^9 G5 h- q" U/ E! z- r; m8 \# `

    • 3 T/ Q8 n, L0 d0 y' f) x
      8 U% r( C) l5 P4 i. Y2 t
      }  ' ], c; _0 _$ z" B: ^9 U
      * Y- r4 d- l3 y+ j& h! J, I  b

    • & c- w& e; I8 E4 H3 z
      ; `$ f2 |. K  h8 W6 V) C
      /*优先数调度算法*/  
      5 j5 e3 z5 Y' Q. w* {& L

      / I6 e4 l8 h% @
    • ; S0 q2 `0 ~1 Z
      & y9 `: v2 T3 U( Z5 q, y% a: ?
      priority(char alg)  
      + H0 J" ?; [7 l8 p" t8 N* w. r, q
      ' L( n& J2 s4 E/ S8 }# t- T

    • & k5 y8 |6 D, J! @( G; D7 {! x

        R) J1 m: u  f+ m8 v0 i{  
      3 Z$ ], ?7 L( M' I! n3 ?2 [$ N$ k

      & C& d8 M( ?7 t2 i4 H

    • % _  }0 ]- N% L/ ^  q) g8 }6 `

      % T) u5 h3 c. o( ~   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  % G4 _0 G( Q/ [: t8 y2 j
      , J$ D+ U) |' z, A$ n

    • $ l- Q; \/ W. d! J9 J
      % r/ D( x2 H* A7 t  L
         {  
      - O. h" d6 ^. K2 @6 m/ Z0 w

      5 C; K. e5 l5 Q9 W9 X# o; W" K
    • 8 \' n1 d, u1 ?/ ?& S+ F$ R
      # c3 A6 l) E$ L
            run->cputime=run->cputime+1;  $ A8 U: N* q3 x

      , z( O8 |. J3 T2 h- l3 B* \
    • 7 l( ]9 L4 r9 l/ A* S, D

      ; a- R: x9 y1 h. n) P0 ^; j7 S$ ~      run->needtime=run->needtime-1;  5 K2 O. J! x3 u% o4 l; y% f$ |, X# P
      * h1 i  t. t$ e' K  f7 ^
    • # ~6 r3 l$ s" V% C+ T9 h. j- Y
      ; F! Y* k7 ?5 v/ u6 v9 @
            run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      5 J' P: v! J! s+ d2 T' i; n
      - i: J2 L! K6 T6 }4 h+ V" s
    • ' m2 C* F  I+ e5 [6 O9 Z5 M& s

      2 T3 \7 G+ e# r6 X( P      PCB *p;! [( D" t4 D, P6 P4 M
      3 ]1 I6 {- W3 A: t# B9 ~, B

    • , m1 j! {/ c8 J3 X; y3 Q
      0 P' R0 K1 v. C
            p=ready;
      2 V- \4 L$ x3 m* b: m4 Y) \$ \, ], N2 B
      3 X. {' @8 B7 u1 e4 X
    • + A- @! v4 `! m

      ; k0 L9 f5 Q6 @      while(p!=NULL)  & G3 n" B8 F  ?! W- g
      ( N# g  X% l' K) I4 _9 G
    • " k' |0 G- U$ Y/ Y

      - H. d& F. m7 Z" W4 p8 A& Y9 I$ m      {  
      # s; _- j) \/ y6 q
      1 }. ^, E  ]6 a' _
    • ; u7 I# w! m! p; z

      * q) L4 @4 b6 M' ^  j          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/   
      : B5 f2 @, ~/ x( }
      1 C) g4 |- ?; {
    • - ^/ n2 {  b# W1 B0 x; P
      # \8 B4 m! R9 ?! p
                p=p->next;  
      # R( H+ z' Z; A3 r5 G
      ( ^0 E$ g  f/ _* K: ~
    • " q1 M8 [+ r7 [' x8 {' g

      ( M8 t" D( \" q" q5 o1 V, K0 a      }  9 \9 U* q# N8 w# P: M* [4 Y

      & I5 W8 H+ @, W/ m1 _

    • 8 x) X6 d3 ?1 m

      " P4 f1 g4 Z$ J      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      , T) l! ?! p- ?; S1 H

      & q0 D& O0 F* G& u: E3 k
    • 5 s' q% j/ c0 o4 s( v

      * e0 y" V7 K  F. r0 ~- J8 f      {  3 q+ t- u& V& f) Z4 Z
      " ?& O9 U8 t6 B+ T3 Q9 o. C) ]
    • $ c  r8 o8 P, C: h
      4 B3 o8 p3 V; y  K, w* v
               run->next=finish;  
      9 w; C; R  b/ j- h4 p# r
      1 X/ q& y& |( P1 p! H2 a

    • ) i' C9 F0 D/ A5 b/ q1 Y# y
      / ^8 f, }; _% D7 Z) j% g4 z$ k
               finish=run;  
      ) t: g1 l' a) \' ~* H

      : ~0 R1 S. X8 r* O
    • ' u: t2 Z- }4 u7 V

      7 c; D9 B5 o5 `/ x" _& y3 E         run->state='F';  /*置状态为完成态*/  
      7 |2 n3 {3 D- X* K7 ]! Y

        S+ `# n& @9 N7 `: P% z. T
    • % y& o' V* X) G* K; ^1 N# L# {- p' \

      4 P3 l5 Y" M( E8 R         run=NULL;  /*运行队列头指针为空*/    E+ q8 C' M2 _1 V5 {$ Q
      ' B( B3 Z1 `0 F6 e

    • ( @/ x6 h: Y; [' R; l% a

      ) ?/ A- L8 c, P( \& D" e( J& W# [         if(ready!=NULL) /*如就绪队列不空*/ + C* X- K7 Q* t8 z! k+ R
      / o; X7 e+ E  Z# ^2 T3 M
    • 2 P6 y2 t/ i) O9 t$ Y9 N

      8 Y5 {- ]; ?) z2 ?, G         {  
        g0 o! a+ [+ f/ b- l, d

      / [0 N- q9 L+ `; ^
    • ( @( K3 l+ l* X8 V# {$ E# A
      7 J+ w* N7 I/ ~, U' t5 i
                  firstin(); /*将就绪对列的第一个进程投入运行*/  
      3 D- S8 v' K. f3 y3 ]8 y. c( n

      ( I- h& B+ K0 R
    • ) _7 [. T. ]% g' F) }2 l/ C- v. x

      7 s7 T$ a. ]2 c- ^( Y# h5 m: L0 N         }
      6 ~, [$ h2 g  x+ ]# |3 D1 `

      $ v. ?4 U* s0 C) B' c* k3 m+ a/ |
    • ) \" E- Y) S$ b/ D

      5 z7 X& T$ e- i5 k8 J& f      }  ' g. p" Y4 @( K$ s- x2 n% k! C

      9 a' L$ Z* w9 _& ]2 M4 g

    • 0 j6 F% a! X  s& d- E' Q2 v
      5 O: J2 n+ h, Y: Q
            else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  , x  Q+ a/ [' ?2 u+ f
      % S8 o% U8 g1 E" ^, P
    • % I9 j0 _. z; t
      ' z! [' R5 B  a3 {, O1 O9 }3 L
           if((ready!=NULL)&&(run->prio<ready->prio))  
      5 N5 N- g' Z: ~" t2 g
      ! n7 C# a6 T  x6 r' e
    • 1 y3 V  ~# n7 {  ^
      & y4 r0 {+ O* D; C2 L" A- r
           {  ' W! F, T2 j7 N( q% x6 e

      + }+ o1 @0 ^) h: u8 @: r

    • # Q5 Q; _5 u8 W
      2 o. R4 q* ^* h7 }9 Y$ v2 Q
              run->state='W';  
      0 |3 L9 M1 u) p6 t- l- r6 P

      % e) P: H! e" i
    • ' i+ I* D7 w( @9 _; w+ T9 I
      7 r" S7 O5 W, \! o: R; }2 E) ?
              insert1(run);  , }+ J9 ~( V& K5 l0 _; ]

      * R0 T/ u4 s& M

    • 5 W1 S+ L; w8 p/ U# x5 `
      5 |# p2 k% M! h) t0 z$ [2 P8 R
              firstin(); /*将就绪队列的第一个进程投入运行*/  + }( m* X1 b; L9 t0 H' a+ I

      * d% F6 I; Q# l, M; a% u% {
    • : s( I* m7 @; M5 k1 E, M9 o: `' |6 p
      5 ?" C) V' c) O" Y/ S% N0 n4 b
           }  
      % J, b* E: C7 a
      / E7 J: W: x7 }% K: F. ^
    • $ r0 F& n! H( g. X) `( O: K" P' `
      . m' {( b) O0 J2 E% {
            prt(alg); /*输出进程PCB信息*/  
        Z' K8 {) z. f: v6 ~1 N; s$ P
      0 m0 t- D7 O9 A3 ?
    • 4 i) p% E. d. x, ~

      1 I9 |% J6 j% A   }  + n; x, g+ ^$ g+ S/ _( i8 y; u: B

        a) Y, r- I& d# g
    • 5 A# {9 R- E. V0 D
      8 t# [, O" }. ~8 e
      }  8 o; t; U1 J" x0 g+ r4 V9 w
      # o) d, {/ H- B# n# F6 x
    • 0 C, B1 T5 X- F, q2 a

      8 Q& s+ `: Z' M! a+ N/*主函数*/  
      2 x) T/ S. {3 z% z2 X) p) O

      6 U8 \' e1 I5 m. E/ e( w

    • , Y% N! _  ]8 W

      # b* |1 J. R2 C9 k; ?. jmain()  
      7 C1 _- A" s8 K$ O
      % W$ @) l2 k  o' ?. s% B

    • * r0 L7 S  D7 f5 g, T" C! z
      ; Z: \$ L2 C0 m- s; g
      {  
      : w9 z$ @! n9 T) v
      , @' Z+ I7 Y. T. v; j  [
    • , ~9 x3 j) s! J4 s  R

      ) k, `0 f2 @3 W# |   char algo;  /*算法标记*/  
      0 m5 a) ^4 J+ q- w
        z7 i' f# @1 p$ c+ [% V  d
    • 6 ^: x4 }' U8 j

      0 b7 Q$ Y' D6 e* \2 t* K  m   printf("输入P确定算法:优先数算法\n");  6 U( T# S) v/ \  [# Y7 K) c5 v  g+ @

      1 X/ i/ b/ [: e( R( ~. Z$ \5 U

    • 3 C! {3 s5 i1 y
      1 }) N4 E3 |  K; T3 w* _0 Z% A
         scanf("%c",&algo); /*输入字符确定算法*/  7 V+ R2 S# a! F1 ?$ B2 }* k
      " I9 ?  t' ]5 n. P( M7 e& I

    • ( x0 w  k, U+ _# I- }( s
      ( _! D( p4 U2 B
         printf("输入进程数:\n");  
      7 r/ B0 p8 n2 l$ ]8 ^% G+ d

      * B# S& M) w, s+ X4 n+ G" V% Z$ B
    • ! d  T* ]% I8 v9 i* Z

      ' D) X" k7 u+ U6 |1 s) S' |* k& l   scanf("%d",&N); /*输入进程数*/  
      5 \1 R% Q+ o' N" d) e9 x# @
      + O& o( S! l9 G; {5 a* @
    • * w* w2 U: Z# ?8 [( c3 s$ M5 S

      & {! H* }9 ~# p" T& r  f- c   if(algo=='P'||algo=='p')  / |, i! G# p- M7 e: V% K
      ( L8 N, A. s/ x

    • : C- A, B  \5 X" I1 e* L# p

      , h" x5 _- Z% d& I) f/ S) v   {  - s/ j. F) j, K; p5 J4 Q0 P9 `$ A

      2 j7 q4 @+ z( n! W. c

    • + g3 x/ g: }: i. K# p1 D  @/ ~* [4 i) ]

      # N. y* |& L( {) m      create(algo); /*优先数法*/  % _5 O2 X' ?- e  B
      5 ?/ f; P9 q( z( G9 n! a8 q! H

    • 2 x, ~! k* o+ K6 ]
      ' P+ E  b0 n' R
            priority(algo);  0 J! S1 S6 P3 {
      7 F! {; X4 }9 w7 k3 n  j& D+ D# F

    •   \% g* }3 e" f4 j( F3 q

      8 r" Q/ C; h2 c# e  Y   } 8 T* T0 A3 G' M6 X# _
      " z2 {6 [9 w$ v7 z

    • # m/ T) e+ N7 u. w* D

      / f3 Y/ M- l/ b7 [9 T1 g2 G}
      & g6 P/ B0 i* b3 f) W

      ( R5 J7 \5 j7 I0 I$ @; j9 @& V$ d2 L$ `& F1 C

    ( |; a: G: \: u# U
    输出结果:
    ) D& [# M& P2 h; u7 ^


    - D! ^) T# q9 {' L8 n原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

    4 D2 t" S% j' S+ X4 g; j
    5 r& O- k8 h/ Y. j" }$ q/ R" \
    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 01:54 , Processed in 0.407479 second(s), 51 queries .

    回顶部