EDA365电子论坛网

标题: C语言源程序代码-进程调度 [打印本页]

作者: Titianyeer    时间: 2016-7-2 13:48
标题: C语言源程序代码-进程调度
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
+ b! o4 q; r  [+ p% H7 Q4 p% |#include "stdio.h"
' f! Z# }" g$ C; M& h" n#include "stdlib.h"
5 v# Z% I/ l. f#include "string.h"4 `: r7 N( H6 A; j
typedef struct node2 r/ F3 B3 q" Q$ z8 m; b; g
{3 k4 s3 [9 b& u( w+ r' @# `, Z' a
   char name[10];  /*进程标识符*/! e- v9 h6 k/ |* J( V( ~. M
   int prio;   /*进程优先数*/
( p" Z1 H$ P. |0 @   int round;  /*进程时间轮转时间片*/
! K- _3 V! s5 d. @   int cputime; /*进程占用CPU时间*// i' }$ G' ]1 h
   int needtime; /*进程到完成还要的时间*/
, V& U' O7 T* I0 q5 T* Z   int count;  /*计数器*/
2 j# {2 {+ k' l# @  N/ S- t- |! ]   char state; /*进程的状态*/
$ e- h, ]  d2 y) A4 D2 a! U   struct node *next; /*链指针*/8 Q. E' Z4 F* ]
}PCB;' Q! b7 r7 |0 h
PCB *finish,*ready,*tail,*run; /*队列指针*/
4 C% D' |4 E6 B3 O- Sint N; /*进程数*/' ]# l" q4 \) h' Q# ^7 n9 t) d
/*将就绪队列中的第一个进程投入运行*/8 \$ }. ?: w6 a& e' @
firstin()+ c0 C* k; N" o3 R# h, q3 C
{/ \8 Q5 S. N; M/ a' ]
   run=ready;   /*就绪队列头指针赋值给运行头指针*/9 \8 ?% @: Z0 W1 g2 C
   run-&gt;state='R';   /*进程状态变为运行态*/5 X  ]  F! r0 ~# H( L7 N
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/7 S) x% t% ]4 ^* q9 ]3 Z
}- \( P  i# k1 K' p
/*标题输出函数*/+ m4 b4 _# m% Z0 r8 N' g$ t
void prt1(char a)
! Y3 Q9 O9 I0 ?. @8 `9 b" t; G: E{7 ]; F$ \, r& n$ ~, J0 T7 n3 e/ y2 v
   if(toupper(a)=='P') /*优先数法*/
/ K6 {- {/ O7 C      printf("  name     cputime  needtime  priority  state\n");9 ]( ?4 @/ H' y, y9 w! a. W/ a  g0 D
   else
, V$ J2 @( s: E6 d      printf("  name     cputime  needtime   count   round     state\n");# P' Z0 U5 S' ?0 A2 c
}
2 m  b. H8 U2 R6 U% j/ V/*进程PCB输出*/. r# k) A' U( {
void prt2(char a,PCB *q)
* h2 `. N3 U! T{
( H% x% K" i' ?5 v% h. s8 x   if(toupper(a)=='P')  /*优先数法的输出*/
$ E3 D3 h9 p& H0 q8 Y4 P! \+ M1 f      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
: o* O  h- X+ y6 |. M, k* |! `       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);: B  D/ l2 d3 ~& S4 {& x
   else/*轮转法的输出*/
* Q, w* Z7 W: [5 [      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,
6 `( a6 }& E3 ]2 S- d, ~       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);
7 B/ [7 }1 n, ~; h. \}
; i0 S/ W+ K& X4 z1 s1 B6 g/*输出函数*/
+ i' [7 u& x0 R1 Hvoid prt(char algo)( z, m, ^9 w2 U  I$ B
{
- o- B% p! B- X* I' e0 I# Q2 h   PCB *p;, r; z! Z" c8 n; X2 M3 ]* f; o
   prt1(algo);  /*输出标题*/
4 g' H: y) X% ?2 x$ |3 u   if(run!=NULL) /*如果运行指针不空*/
8 E2 _' ?+ l$ t* T8 O      prt2(algo,run); /*输出当前正在运行的PCB*/
% n0 w; N1 G! X% @   p=ready;  /*输出就绪队列PCB*/
9 Y3 k4 F% X1 g$ x4 y   while(p!=NULL)1 J! N: b4 G* t+ \: m+ @
   {' O$ l5 w4 C" g, V5 j/ P) e8 l5 n
      prt2(algo,p);
* n5 e9 b. R9 V' k9 S      p=p-&gt;next;5 x. Q( i: N: |! _) ?: u
   }" d4 K5 E  ]4 {8 G( Y% w) e
   p=finish;  /*输出完成队列的PCB*/
3 [0 o6 V% _+ ]+ ^: [- Z/ A7 a   while(p!=NULL)
% n! j) t9 y; R   {
( E! T  G& G+ a: e) v      prt2(algo,p);
6 w  ]2 r% W" h; q2 I+ O      p=p-&gt;next;2 y' q- G+ a) T  ~6 X* |
   }
1 n/ J9 {. X( a$ H, c+ k3 b   getch();  /*压任意键继续*/" o" y) x5 |+ L# j! v& i/ u: A
}
4 R: {! O" z4 R1 y/*优先数的插入算法*/; f6 v# }# n( b! E5 [
insert1(PCB *q)
$ s, U; g5 j% Y7 ]8 P{
' i1 g+ V9 J6 S% f   PCB *p1,*s,*r;
! o0 T' U* W4 y; P   int b;! G/ r% F& e! F# W- z
   s=q;  /*待插入的PCB指针*/6 F: h) v5 s3 Z9 p' M5 B1 [4 {; y
   p1=ready; /*就绪队列头指针*/0 I( K/ f: C+ x# D7 J
   r=p1; /*r做p1的前驱指针*/2 ]- n, G9 B; b% V2 v- d/ }, z
   b=1;. A0 v! G9 h; O
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/2 M$ ^; v5 E7 L
      if(p1-&gt;prio&gt;=s-&gt;prio)
* i5 u/ V) e% c& }      {
- c, }/ N$ x" B9 q% Q         r=p1;
8 e9 U! G9 [# z, y* }( z. g         p1=p1-&gt;next;
1 `* ?9 r9 C7 d: u3 `: n      }; N& Z2 g2 i6 N
      else
4 O  A4 T1 _+ `. F0 A5 B# ?% u. ^4 O3 a# x         b=0;
+ |& B" p4 W3 b% e9 y5 n   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
9 T% z2 R; ~/ H+ R: \   {/ z3 G# G& `4 u  P% ~, V( h, m) a
      r-&gt;next=s;
/ w& m  I5 C' ~6 X      s-&gt;next=p1;7 P1 r- F' a& g# f
   }0 }& z8 s: w+ }( Y: g
   else
5 v" |2 ~. x' l- L  E" p1 \9 }2 v- ^   {0 }3 C' Z! h# g* v2 o
      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
1 O6 {$ l# {0 u5 d: q      ready=s;2 T5 _- Q6 _$ ]$ x% W( f
   }" f$ t6 Z0 d( {, x* l  |
}
# E$ g3 ~' y4 j/*轮转法插入函数*/8 B: w5 a% `0 y" c
insert2(PCB *p2)
  B5 r4 `( K( D. J) {: C{$ L, x! p0 q" f
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/$ `9 p. M1 e5 Z* _) }( f+ l( |
   tail=p2;& b) B7 N0 w. A) ~2 p
   p2-&gt;next=NULL;
0 K4 Y! s% ^+ d}
$ x& z: [8 k' z/*优先数创建初始PCB信息*/( z7 `# `+ R- a, ?1 z
void create1(char alg)# A* K* W" j, H6 F+ J+ {
{
' ?, }1 g& M9 O  T9 f$ @   PCB *p;
7 t& r  \1 |" I! @9 F& P5 d" i   int i,time;
2 u1 ?$ k' [: [- i: Y! o8 H   char na[10];' {4 e* C" k! d* i2 A& R6 k
   ready=NULL; /*就绪队列头指针*/
0 [: b) U" a9 O! L. Z, X" B   finish=NULL;  /*完成队列头指针*/
8 o! J/ o( P( X! y, V   run=NULL; /*运行队列指针*/0 w! v. ]1 H9 I7 x- @
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/7 I) h8 w7 }) n3 N# k
   for(i=1;i&lt;=N;i++)' q1 t2 x- I$ E$ f
   {( j: ~! T& s: x7 ]1 o- R+ m
      p=malloc(sizeof(PCB));, M2 a. k% D7 V1 r
      scanf("%s",na);4 \% @; L& K- ^2 u8 N2 W: S
      scanf("%d",&amp;time);
6 S+ i% x2 T7 y( y+ g2 x      strcpy(p-&gt;name,na);) y* o8 r' a! g9 m: p: e$ C
      p-&gt;cputime=0;& c7 d+ ^" `; f
      p-&gt;needtime=time;8 U; T6 m: n; Y  `+ [
      p-&gt;state='w';
' y5 R1 ~+ t5 o# C6 s' j1 J      p-&gt;prio=50-time;
) d2 T& d9 d, m1 `      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
. _" E8 P$ C# D( {9 B         insert1(p);
1 |$ ?; l( H: X# `4 u      else
3 K* B6 t7 U+ E/ d6 ~2 N0 g      {* e# x3 _# Q) c- A" W* p* n! F
         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/" K( D7 B  D5 B8 ^* @/ V; x
         ready=p;3 b) ]( \5 J3 c* O9 J$ N
      }  ?0 ]; j' C. h) B9 ]( X7 k; [% w
   }
) m- ^/ @8 ^/ U  X1 ]$ P, S/ ~   clrscr();  D' A9 w3 _( A% s
   printf("          output of priority:\n");
9 S) @* F4 j2 i# W   printf("************************************************\n");
9 d8 |$ X- l1 E1 A! B   prt(alg);  /*输出进程PCB信息*/8 N/ ?) B2 e. g# n
   run=ready; /*将就绪队列的第一个进程投入运行*/
. |. p3 m) k& C   ready=ready-&gt;next;
# A9 E: d7 r; u) I$ ]6 J" V* b   run-&gt;state='R';0 `0 l# b- ]/ `% U- V
}
5 g& O3 e5 r3 A7 k/*轮转法创建进程PCB*/
+ @' q4 P; z; l8 C( _2 g' qvoid create2(char alg)
; c4 n, \5 U0 w; ?{
* P, x  b3 b, S   PCB *p;
6 ?# i8 C# K* I5 W9 N; ]$ k2 f- d   int i,time;4 x7 _. D. Y# U# ]* J2 q
   char na[10];$ [5 H# ^/ D# _) ?2 L/ T% {! b
   ready=NULL;
# w, k* {+ Z+ S8 g- \# l9 z   finish=NULL;
% t# S2 V6 f. W! i( ]* e( o   run=NULL;- x& W% e" N* ^% _
   printf("Enter name and time of round process\n");& n5 Y/ ]- ~  [6 z1 `
   for(i=1;i&lt;=N;i++)
4 J+ `0 N) N! j0 b   {
3 H: @  e- q9 n3 Z      p=malloc(sizeof(PCB));9 X& `3 _% _- n* d0 _
      scanf("%s",na);
* p8 w4 n" v2 j9 s      scanf("%d",&amp;time);. A+ e. q3 z4 k* N' M
      strcpy(p-&gt;name,na);0 f( ?  l+ ~; `; F. O( k
      p-&gt;cputime=0;+ c$ l: A) O8 w' O% H, k! a
      p-&gt;needtime=time;
* m  J7 A7 k' g, n- H+ ]+ e3 `      p-&gt;count=0; /*计数器*/
2 [$ ?4 _- s+ @* Q1 b      p-&gt;state='w';
2 c5 |3 [3 u# [! P  Y& R' k" @3 J      p-&gt;round=2;  /*时间片*/2 u8 S& i: w! k% g2 E( t/ R
      if(ready!=NULL). j( W! b7 r% Z9 L% }; l
         insert2(p);, p+ A! @3 |4 W- l7 G6 `
      else
+ u/ p0 o1 c" {3 l# d      {
8 z+ C1 B; J/ U         p-&gt;next=ready;
! k3 Q) i8 X# p8 s: R         ready=p;
, f. w7 ?. E$ G: H# ^) g5 [         tail=p;
8 \& d0 A) F& _, A      }
5 S. T3 f! Q0 J( j7 N+ K, ^& V   }4 ?% M  W; |0 O
   clrscr();
% D+ e" k' v) y7 ~0 e+ L& N2 f  @   printf("              output of round\n");6 e- o8 V) U0 F; |
   printf("************************************************\n");  D3 ?. g) H" j  A4 @
   prt(alg);   /*输出进程PCB信息*/0 r" D1 ~$ `& w) G1 @6 a" u$ W
   run=ready;  /*将就绪队列的第一个进程投入运行*/
! y: q; r* f2 E( z  {- X   ready=ready-&gt;next;
( C0 H+ q' r1 e& k' U2 f   run-&gt;state='R';
0 h! A) W3 l& O( S9 F}+ H" s) W- m. g* f) M( }7 Z
/*优先数调度算法*/
( B, C* ^, }4 u# [" ^2 C) bpriority(char alg)
( ~7 s! I! m* ?6 A{: {5 ^4 M, F! c3 u) t4 ]
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/
! y: Z6 ?9 ?" x# q; {2 M   {3 X% h9 v7 e3 q
      run-&gt;cputime=run-&gt;cputime+1;
% A5 f4 x0 T" q# M      run-&gt;needtime=run-&gt;needtime-1;2 i3 z% n3 M& v& C3 s
      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/3 ~4 o6 i. M$ p+ U3 Y
      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/
/ g; Y2 i% e; ~3 _  x0 Y  i      {
; K; P! {/ e$ L# J0 A" s         run-&gt;next=finish;
3 j1 _6 k6 B& j: p# i$ m% v$ D         finish=run;
7 o2 }1 c+ C# W         run-&gt;state='F';  /*置状态为完成态*/
2 A7 H: k5 t* m1 I' C* x5 H         run=NULL;  /*运行队列头指针为空*/
# j/ S" D" T. b, u- f$ M. n         if(ready!=NULL) /*如就绪队列不空*/" P9 B/ R: [0 X
            firstin(); /*将就绪对列的第一个进程投入运行*/7 D' `3 `6 G9 D2 ~
      }8 P: v0 a- P2 [, `
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
( A1 S5 U+ W' [         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))3 z9 H0 ?. ~0 z9 a
         {
8 F, o5 {, `/ K  e/ W) p1 D            run-&gt;state='W';1 Z+ f) Z! e- P; W
            insert1(run);; a0 W, V0 Y; _1 W
            firstin(); /*将就绪队列的第一个进程投入运行*/" c# e2 i' H  @6 n3 Z6 [
         }
6 u& O0 |& M/ z# \' U/ p" F      prt(alg); /*输出进程PCB信息*/3 Q8 B* S( a$ G6 G
   }
5 u% E& @$ t  ~}- D1 A1 V$ [. N5 `( J4 s( k/ t
/*时间片轮转法*/
/ U/ \( v6 a$ @# H3 O% F& _roundrun(char alg)
4 S9 K1 l* M: u# v  L8 H% K{( ~, ]" X; \$ e1 |2 y9 _
   while(run!=NULL)
2 m! y/ `9 h0 o+ O; o# ~   {# |8 M7 |" u# p2 t2 w. _
      run-&gt;cputime=run-&gt;cputime+1;; w0 v4 V# L# ^$ X2 F/ z8 |9 O
      run-&gt;needtime=run-&gt;needtime-1;0 s4 ]+ ~# J* o( x
      run-&gt;count=run-&gt;count+1;6 L! \5 b, H" Z" w6 ?
      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/3 E9 |' R  N! T# \% A' [
      {- W/ }* C4 @2 t5 M3 q7 ?! `
         run-&gt;next=finish;1 {  F+ y* e& d$ ~. q+ r
         finish=run;) j4 E$ ?/ o* r4 r2 r: b# S
         run-&gt;state='F';
& M& W( U$ }7 S         run=NULL;7 E5 @/ {5 ?/ ]( M/ q3 o5 N" }
         if(ready!=NULL)
8 ~$ w9 U& M9 k9 \) O3 q6 w            firstin(); /*就绪对列不空,将第一个进程投入运行*/
4 R9 ~* F7 ]; V; }; @& E3 e      }
- Y, i* C' J$ @% ?7 @& S* g7 h      else) K/ ~; @! {- O7 E" B) E, R0 X4 ]2 |; o
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
) a$ Z8 f( S  b/ [. `1 i         {# g- M0 e5 N  {
            run-&gt;count=0;  /*计数器置0*/
6 v0 j8 e$ J! m2 ~; `: T            if(ready!=NULL) /*如就绪队列不空*/
1 n8 I* N6 t% j            {3 A9 `; Q. x9 `  @
               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/6 v5 n  E  L6 L8 V5 L9 \. N
               insert2(run);
! k4 S2 r( E& P2 V               firstin(); /*将就绪对列的第一个进程投入运行*/# Z: V9 k3 Z- L, x
            }
( S% L: Z7 K0 U7 i- `8 j( z' a8 o         }
8 ?% a! K  n5 p      prt(alg); /*输出进程信息*/1 N: ]1 f6 z: T2 d' C
   }
, o& n& Q. w+ A}0 S( e2 r1 ^" S* u& \/ Y
/*主函数*/
7 T7 T- c. u. t  f6 s1 \main()  f; d5 v% k' A. Y- s7 _
{; P+ e1 g+ ~; e2 W5 U  o
   char algo;  /*算法标记*/
* f6 C/ n9 ?4 V, ?# v   clrscr();# j. A# M/ c& y1 ]' ^
   printf("type the algorithm/R(priority/roundrobin)\n");
; D6 N/ L. w4 }7 k" _9 _: T% E" [% T   scanf("%c",&amp;algo); /*输入字符确定算法*/% K+ E) M4 I; S; {- h; e
   printf("Enter process number\n");/ d- H: P1 J# B" e+ X3 U# U0 C% \
   scanf("%d",&amp;N); /*输入进程数*// A4 M7 O2 l' |2 r! H
   if(algo=='P'||algo=='p')
! g) w) l$ f0 M( H6 M9 Z5 l   {2 Y4 k/ z- Q  c) e3 h/ X! ]
      create1(algo); /*优先数法*/) C9 d, ?1 ^2 u" E2 r+ }
      priority(algo);7 ~* ~6 j. X' w3 t! y# g9 N2 R
   }& `$ ~) t0 }+ G1 k
   else6 A0 E) v3 j# e0 E/ H8 N
      if(algo=='R'||algo=='r')
* i: w* Z% `( v      {4 M( }4 e/ S  \6 i
         create2(algo); /*轮转法*/
7 P  E, G; p' S! r7 w; A; k; g& P         roundrun(algo);
. A$ c: f, c% H8 e3 j      }" n) p1 p8 y* v. J0 a# s
}0 }. y+ l6 l- Q- R) Y/ p
</pre>

gVBZFryb.rar

58.04 KB, 下载次数: 0, 下载积分: 威望 -5


作者: Hh0203    时间: 2016-7-2 14:15
谢谢分享,必须赞一个~1 S$ z( V, ~. K3 B4 C6 ]* r; E8 _, G

作者: Wenghezhong    时间: 2016-7-4 14:27
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈8 T! K' L: M! j7 a' x

作者: 10929390    时间: 2016-7-4 15:12
支持一下,很不错哦!
, T/ u: O7 J" T2 M
作者: Pang8343569    时间: 2016-7-4 15:17
支持一下,很不错哦!
作者: Dedy01    时间: 2016-7-5 10:58
支持一下,很不错哦!
作者: ygcgsa    时间: 2016-7-7 09:06
这资料确实不错……4 x, n+ F; n' X4 u% R+ X6 Y0 t





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2