EDA365电子工程师网

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

作者: Titianyeer    时间: 2016-7-2 13:48
标题: C语言源程序代码-进程调度
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
% }) t0 T8 M" k  P1 {' F3 K#include "stdio.h"7 a$ C) \8 T- W/ l
#include "stdlib.h"
  w! c, u7 z% j$ Z' ^3 p#include "string.h"5 G  T5 |% i; F: e) p3 E6 ^( }2 @
typedef struct node2 o1 R8 H2 O3 J3 f: Y- v$ Q
{
% \2 R1 Y& @7 o5 Z6 @7 a4 w   char name[10];  /*进程标识符*/
$ h4 X3 h9 D, A- n! q   int prio;   /*进程优先数*/& b  ?7 H% s- Z
   int round;  /*进程时间轮转时间片*/
3 |4 y' |1 f7 P* Q! [   int cputime; /*进程占用CPU时间*/; H' g% {, o& [/ W9 Z
   int needtime; /*进程到完成还要的时间*/  `% r, |  o+ M" x2 v4 A
   int count;  /*计数器*/
" P6 b. B7 `2 o# l7 O0 u8 S, f9 ?   char state; /*进程的状态*/
$ A. J  v% X1 T, M   struct node *next; /*链指针*/
$ b% c6 L4 C  g. m- f}PCB;: H+ C/ i1 T# H% }& Y8 }
PCB *finish,*ready,*tail,*run; /*队列指针*/
9 o) q, O" a$ F- Kint N; /*进程数*/
; X  B! |9 R% h8 Y/*将就绪队列中的第一个进程投入运行*/% S. H7 i" i- P2 g# S
firstin()5 @! I+ a8 t" \6 P
{
3 }: t6 p( m* T9 h2 }; Z5 C   run=ready;   /*就绪队列头指针赋值给运行头指针*/
4 H9 I, e* C# q- G# g/ w   run-&gt;state='R';   /*进程状态变为运行态*/
4 _# f; o# d8 }( m& N9 j/ t. k   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/
* ^7 P4 m' _" U6 L, J0 J. g6 v8 a}8 K) D. j1 ~) R
/*标题输出函数*/
7 s. X& G. M& \, hvoid prt1(char a)( v( \6 ~0 ]2 Z+ I8 G
{  U  C  j, q, J2 }. Q
   if(toupper(a)=='P') /*优先数法*/" |- J9 R+ ^& I0 o
      printf("  name     cputime  needtime  priority  state\n");
' j. E  H0 J" u* f5 Y6 x( D   else
- u, P7 V2 s3 n$ N- A. {      printf("  name     cputime  needtime   count   round     state\n");  E9 R! l+ m- g, g. k, q
}
2 Y/ Y2 j6 b8 p2 g/*进程PCB输出*/
; \% i0 d& {/ q# Nvoid prt2(char a,PCB *q)
; ]  Q8 X: \6 U{( m# E! `5 j8 E% e2 O: c3 x, V
   if(toupper(a)=='P')  /*优先数法的输出*/0 o- b& u9 D& ^  K% ~8 o1 V
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
2 i6 {/ l+ f9 _* F0 @% M       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
/ Z& m. q5 `) ]! a1 u: P   else/*轮转法的输出*/5 t# a0 ?6 M9 @- d2 o( p
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,
" d3 b1 ?. j" q4 d       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);
" s4 w* z5 {+ m* H' [! e6 E}
* C, e5 p8 Q# r% O/*输出函数*/) }) r, X1 \$ ^. s" j( I7 ]
void prt(char algo)/ d$ ?- F( e2 u
{2 X, q9 b7 H+ s- I& L/ X, U7 u/ |+ c. x$ s
   PCB *p;3 ^) y% Z& F) F* H6 }/ ~4 a
   prt1(algo);  /*输出标题*/' N6 G% t8 T5 `! j9 ^9 |
   if(run!=NULL) /*如果运行指针不空*/8 `0 w' C! f6 b: h
      prt2(algo,run); /*输出当前正在运行的PCB*/
# n5 }) e0 y) D( \" S   p=ready;  /*输出就绪队列PCB*/9 d2 q* V$ @1 R) n3 P) ^
   while(p!=NULL)! E1 N; E6 j1 Y, v6 m4 X
   {: O; t2 \6 C5 c% X) _' [
      prt2(algo,p);+ S# E4 M7 I, A. ]
      p=p-&gt;next;
9 w& n+ S7 h9 Q: b   }+ {3 H, }) m: a  l
   p=finish;  /*输出完成队列的PCB*/
6 \2 ~! G9 p4 P: \# V* w   while(p!=NULL)
0 c* B- l9 G! s$ P   {
6 S, r; Z' S) t      prt2(algo,p);
) S. u8 o/ q' j$ M' {% J- @      p=p-&gt;next;2 h! _. v# o3 c! q- y0 C
   }
2 x/ J# u' L9 r. n   getch();  /*压任意键继续*/# z0 I6 g# u3 x$ c
}- \3 n& q6 @2 V1 K, o
/*优先数的插入算法*/
4 B$ g+ x' A" h% q3 X0 kinsert1(PCB *q)
8 `& \  m3 ~' E# R/ q! x. J. Q/ i3 ?& K) H{" P, ^& C2 y; l0 ]% U& ]
   PCB *p1,*s,*r;" }( W8 r5 a# M3 a1 s) r/ s3 h0 F. v
   int b;, B2 x/ P- c, r, ~  N0 D) i+ ]
   s=q;  /*待插入的PCB指针*/
6 g6 n1 Z: J! U# s. l4 Z% z   p1=ready; /*就绪队列头指针*/, A- n& f8 m/ ~7 ?5 E
   r=p1; /*r做p1的前驱指针*/# \* N, }! ?' i! S7 a% H
   b=1;* z* o* D7 Y9 m/ i" R! p) ?! T
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/7 T8 H# J+ d* v" Y
      if(p1-&gt;prio&gt;=s-&gt;prio)7 j' f' d' g! I5 V
      {+ B+ `+ P& Z  h2 I: @
         r=p1;
% r( b4 r, V% k1 r         p1=p1-&gt;next;
8 y$ c8 k4 Z/ ^: W  ]: |9 H/ b      }
/ |. P+ c7 _' Q      else
$ \2 y1 R) B6 e7 `) @+ z         b=0;
! ?. C0 t6 F& H7 C   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
4 x) I/ u, Y1 f+ A! v; ?   {) m; u+ ^8 M2 _  i7 |
      r-&gt;next=s;- q; H; V. W  e( H9 M3 f7 O$ L0 I% J
      s-&gt;next=p1;
4 Y# w! _7 D+ M2 i/ x   }& R, s, D/ S9 _# X' g
   else
( h1 ^8 O  `1 `/ r   {* y% r5 u, I0 K8 y
      s-&gt;next=p1;  /*否则插入在就绪队列的头*/$ O/ k, z& l" ~
      ready=s;& h+ d% _) L5 z) A: r5 s( y0 |
   }
* ?0 {: b$ q5 c) H+ q6 e$ q0 t+ m}- ^( j' v6 B+ g. J$ J! x
/*轮转法插入函数*/
; q8 {/ N& j- J) i" A3 Finsert2(PCB *p2)
8 {! q, O" `5 B  E# N7 [: x% |2 P{/ |- z- K! B+ \7 u9 V) o" s
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
) \2 @" R8 |! G  J& g$ K  \   tail=p2;
0 X- Z! L0 S7 b6 r   p2-&gt;next=NULL;& d0 {9 g( z0 s3 v6 |  w  O
}
0 ?; w( I& ?6 t3 G% R1 C* L/*优先数创建初始PCB信息*/
8 x, t) s3 N5 u0 A8 O3 Lvoid create1(char alg)) {& c0 d% R1 D$ Q
{
* ]: i' V# V3 n/ @+ J6 u0 ^   PCB *p;
* z6 G) g" p4 O: k/ H- A  S( `   int i,time;
# y& Q. G; h; k2 @  M# n0 x   char na[10];
$ B) U0 E; [: f   ready=NULL; /*就绪队列头指针*/
/ b8 G, g) i5 _4 x! l6 T   finish=NULL;  /*完成队列头指针*/6 Q- N, w5 ?1 S: S/ Z- ^% I. ?7 x
   run=NULL; /*运行队列指针*/
: y$ J+ W5 {5 X$ J   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/6 [* Y: o+ L" z1 v) V1 O0 F6 y6 Q
   for(i=1;i&lt;=N;i++)
& Y& J, [0 P$ D4 D9 ]9 ~( y2 b3 P   {
& r" N9 E# [1 r, c( k( S4 w      p=malloc(sizeof(PCB));
, U7 F0 f& e" y      scanf("%s",na);
5 S3 ?- |* S! o      scanf("%d",&amp;time);
; u5 `7 t- M5 S  P8 O  U      strcpy(p-&gt;name,na);
: N* C% H- I; ~# Q$ q1 u3 g      p-&gt;cputime=0;  k, h: o! S' H9 C; L4 b. p! r$ @1 S
      p-&gt;needtime=time;( y$ Z: s3 V. W8 ~9 c2 T- K1 k
      p-&gt;state='w';
# p1 h; {! W: Y! Y0 |1 w      p-&gt;prio=50-time;3 f7 B, ?( X; T. y5 s+ O
      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
/ W3 q' b- ~2 B- ^, i2 g         insert1(p);
" J. w; T6 V9 O5 z6 `( ~! G  r      else. n, q0 {1 \! G/ r! Y
      {
5 p9 g8 Q% X' i) Q! G6 y         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/- \' O$ v% R  l  K' D
         ready=p;
# L' x+ w7 J3 A3 q4 T8 A0 z      }
$ r; w; C' U6 R# R7 G   }9 p0 f5 r# V2 d- Y
   clrscr();3 S' R& Y- D* n6 N9 N- l* v
   printf("          output of priority:\n");/ H' J9 u6 i1 S# O
   printf("************************************************\n");
# f/ F! [7 ~2 a' y* L6 m! j) ^. R   prt(alg);  /*输出进程PCB信息*/
0 L* ~+ g% X% \9 g0 T   run=ready; /*将就绪队列的第一个进程投入运行*/
) _) ]) |: z, C   ready=ready-&gt;next;
( K  b4 C" Y3 m7 _2 U- Z   run-&gt;state='R';8 t/ j  Z; d; A, V" N% X7 H' i# K
}: K6 v' y+ x' F
/*轮转法创建进程PCB*/4 u) Y1 `" q* X, e
void create2(char alg)
. y( Y- e! p( u9 \  l{$ W* z  W9 }& J2 J
   PCB *p;
* q- T0 q8 z- \  b( k  f   int i,time;' \# c% J& o* P2 r. H7 A7 H6 Q
   char na[10];5 a( Y: Z$ |/ B1 `
   ready=NULL;$ P8 q; x9 b* W, f; F/ x1 H
   finish=NULL;
  J2 l8 Q6 W+ A# P$ I. L8 m# H! l% n: L   run=NULL;  V( ~" Q% }8 D8 ~4 b7 a
   printf("Enter name and time of round process\n");6 e# ]5 \( V" \. b0 b
   for(i=1;i&lt;=N;i++)
; C: ^* R/ c2 i* p# c   {8 j8 o) R3 |8 S: J: S
      p=malloc(sizeof(PCB));
& h. F# ^3 l+ c4 d8 w$ l- u* g      scanf("%s",na);
5 f, c/ A' G. e" K9 W& I- I9 n      scanf("%d",&amp;time);3 y7 C$ f7 V7 m( }  R! ?# ?. e, K2 F
      strcpy(p-&gt;name,na);
2 c' c- u1 d( x1 D* P; s      p-&gt;cputime=0;
1 w) X$ o' q7 n# _3 R      p-&gt;needtime=time;! K6 I. g  G3 A; E# g. A
      p-&gt;count=0; /*计数器*/* h/ ?! o# L& H. U) R2 U! r
      p-&gt;state='w';; y( p2 [6 x* X
      p-&gt;round=2;  /*时间片*/
* v& ^. a3 ~) Z6 V4 M$ T4 n      if(ready!=NULL)
6 o5 i- X9 ?! @0 ?! U# j# k         insert2(p);$ z5 l5 E; ]* t% a0 X
      else6 q, O# f5 `; w4 n/ o% I
      {
" L# m0 U8 a/ G; F         p-&gt;next=ready;# L: R/ Y! q) V, {
         ready=p;
' i" Y2 k' Z1 {9 [2 w  ~         tail=p;3 c* m( J6 x$ X( F( B! j% M" V
      }- j6 n; v- e- ]4 f5 Y! k6 P
   }/ h  v; q; g$ @/ R5 u
   clrscr();
5 }$ c) J  n3 X: X) _5 d   printf("              output of round\n");, C& h5 V/ R0 Y8 ~) T5 Q
   printf("************************************************\n");; S$ s; O" {5 k% G4 u5 C
   prt(alg);   /*输出进程PCB信息*/
) C1 ?# ~" h. Z# v   run=ready;  /*将就绪队列的第一个进程投入运行*/
* R- n- h% c: f   ready=ready-&gt;next;% Q- X# K& M9 \' v6 i8 |1 K
   run-&gt;state='R';, w) p  f( ]' ^
}
. F3 K1 m' E, Q* ~- M/ r/*优先数调度算法*/
7 {: o: e' W. Q, G% b, H) qpriority(char alg)
! p) z" X! R% l2 O/ Y  P2 m{+ ?+ U  J# U5 \& i
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/
* {- D$ `+ v. B/ L; c# q   {
0 ^1 I# c3 o8 H2 B      run-&gt;cputime=run-&gt;cputime+1;
7 g3 _4 @3 V' b5 z6 u      run-&gt;needtime=run-&gt;needtime-1;
7 t! l" `0 L1 G' ~      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/! R: L; A% c3 e1 w4 e, f1 Z
      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/: f" d8 G& E$ k! n7 ]! q; ~5 ?7 u
      {
# d" f& c: l2 I0 B4 M! J         run-&gt;next=finish;
5 S8 v9 I% j8 P) L& f         finish=run;
  X+ r% @1 s+ \: p         run-&gt;state='F';  /*置状态为完成态*/  M* E/ N( c" T9 i! V; M
         run=NULL;  /*运行队列头指针为空*/
" C' m9 z3 v8 r9 y  M$ w. ^         if(ready!=NULL) /*如就绪队列不空*/, t9 ?9 _, o! q/ ^3 k. }
            firstin(); /*将就绪对列的第一个进程投入运行*/2 h6 G/ l2 v2 B
      }- v7 t8 k" u* L. A
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/- e4 o' L8 e8 c0 B& T4 l9 j) x
         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))
% J& ]( l0 j. e4 _- f, R         {9 d# B+ u3 g6 I" D
            run-&gt;state='W';
4 p5 g% m9 h- O  c' E% a            insert1(run);
( c6 F0 q) f& T            firstin(); /*将就绪队列的第一个进程投入运行*/: T& f1 ?7 w8 n5 u/ q( r7 B/ a$ B
         }
& `" g1 ^# R& t      prt(alg); /*输出进程PCB信息*/
; ^* ?# ^) O8 \- X   }. \; e. V5 j* M  {* N, k
}% s) U9 R- h" W" m* w
/*时间片轮转法*/
- N; A) A( n1 E: B; E! Iroundrun(char alg)
8 ~' o& m% r* I4 t{: `6 h/ t3 K* N/ y* O' e, c1 t
   while(run!=NULL)/ E+ L% n& B' M( T
   {
% b3 P! b1 H9 F- A2 b- ]  @# n3 e      run-&gt;cputime=run-&gt;cputime+1;
: F# J9 I& T! e      run-&gt;needtime=run-&gt;needtime-1;: d+ p9 J0 J: a) Y
      run-&gt;count=run-&gt;count+1;
8 B/ [  _% ?& G# F5 q; A  |: [      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
: F  W  X/ ~$ Q/ [+ N4 w      {
8 L* n* D+ [6 ]         run-&gt;next=finish;
1 @" z. I% S" K2 V% a( B6 w% A         finish=run;
# k  t& |) h) @) G" t" T) ]         run-&gt;state='F';( \6 ~5 G8 d3 J0 H, h$ `2 P
         run=NULL;; q% v- z' K' d# ^* ?6 J) A3 _
         if(ready!=NULL)
: L& Z% D7 {# K3 \1 }, z. @            firstin(); /*就绪对列不空,将第一个进程投入运行*/
* @" D$ O: [: r3 D8 Z      }* O- B- J$ y" u& j7 u
      else1 ]2 o. ~& E! Q! y& {
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
* b5 v1 @6 W! b* p         {9 T" [. N! r4 H9 c. t2 m
            run-&gt;count=0;  /*计数器置0*// `. f- i9 h+ x+ E1 K# n
            if(ready!=NULL) /*如就绪队列不空*/2 u& `- e9 t4 s
            {
" {0 F* S5 T5 F, l$ o               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
) @- {4 X0 P6 u9 P+ m0 j( L               insert2(run);
# n$ L4 K3 T8 \# x               firstin(); /*将就绪对列的第一个进程投入运行*/
7 {, M. S% s) e! s6 J0 G9 f# [& G8 K            }1 P% U+ i5 c7 ~+ a( a
         }: A8 a5 Z7 m* O% j& c
      prt(alg); /*输出进程信息*/  N% _  f" S# q8 f/ k% m% J7 r* ?1 a* ^
   }
8 P$ H) C& g( Y: g# m2 ?}" y/ o1 ^) j/ P
/*主函数*/( s: b( ~! {7 h0 f, s- Y3 M5 V
main()
9 Z9 t1 Q9 t4 U% Y* o{
9 Z& e% y& p: C) ]; c" p9 g/ v   char algo;  /*算法标记*/
! H% V4 f% c1 u& O/ ~, E! `   clrscr();1 W1 P3 }8 ^8 B
   printf("type the algorithm/R(priority/roundrobin)\n");
0 N  A+ l4 y" X/ U   scanf("%c",&amp;algo); /*输入字符确定算法*/6 {! n9 E6 A: U/ L5 K
   printf("Enter process number\n");- j" s5 [" X) \1 i
   scanf("%d",&amp;N); /*输入进程数*/
9 F8 _: r1 L4 A( t# |; i   if(algo=='P'||algo=='p')
! o/ z$ s5 i$ k   {
" J4 q3 X5 q# s9 Z/ f7 `' [4 |6 e      create1(algo); /*优先数法*/
, a" L$ S4 [4 R3 R& M      priority(algo);# q) K% n# d- `  u+ q
   }' t9 J# P. E" L% I
   else
9 q" e" o- C/ f  m& d      if(algo=='R'||algo=='r')
; m8 x) b1 d0 C6 I) s3 h9 r, P9 ]      {& L) i9 d* z( }% s! ?2 f6 Z
         create2(algo); /*轮转法*/
2 o2 S+ j% x  v9 a         roundrun(algo);. O& `8 A  c7 n& D# d2 l
      }, t2 C+ u5 A$ y: y
}
% `5 Z: M1 i3 J0 U; @0 f</pre>

gVBZFryb.rar

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


作者: Hh0203    时间: 2016-7-2 14:15
谢谢分享,必须赞一个~
) F3 _1 U" C6 K, Q- I, K
作者: Wenghezhong    时间: 2016-7-4 14:27
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
& G3 R9 Q7 ]9 G( _* \+ `
作者: 10929390    时间: 2016-7-4 15:12
支持一下,很不错哦!& @' ?; p# L7 V" c4 C. ^

作者: Pang8343569    时间: 2016-7-4 15:17
支持一下,很不错哦!
作者: Dedy01    时间: 2016-7-5 10:58
支持一下,很不错哦!
作者: ygcgsa    时间: 2016-7-7 09:06
这资料确实不错……
& O  y: B2 C$ p' h/ Y4 U6 l




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2