找回密码
 注册
关于网站域名变更的通知
查看: 542|回复: 6
打印 上一主题 下一主题

C语言源程序代码-进程调度

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-7-2 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/* ^$ l' ?( l4 Y- s! H: I# \; U
#include "stdio.h") W4 a/ |& f$ W* D$ @; [% P
#include "stdlib.h". \/ u; b0 z% R* L7 w4 z
#include "string.h"/ t) W! B3 s/ O4 q% `9 E# s7 [/ j0 Q
typedef struct node8 \) s( _  w3 ^1 Y. N9 ~. ?
{
, J* I% J( Y) \: j" S$ T4 F   char name[10];  /*进程标识符*/6 Y3 ~. i2 J( H% ]: E% J
   int prio;   /*进程优先数*/
% D% L* Y! z- i! O* A   int round;  /*进程时间轮转时间片*/
. l0 {( @7 L$ ?+ D5 b& d6 f   int cputime; /*进程占用CPU时间*/5 o. j5 y4 h( g' O1 E
   int needtime; /*进程到完成还要的时间*/) d' C$ [* i1 E4 Q
   int count;  /*计数器*/% y# b& y; l3 T& P: @
   char state; /*进程的状态*/: d6 |: Y: W; I/ q0 A- Y
   struct node *next; /*链指针*/# c: |' q' U. t  ~+ b
}PCB;0 J% R2 P  d9 [/ Y  J; @
PCB *finish,*ready,*tail,*run; /*队列指针*/* \9 A! h" b9 s8 J5 ~) S
int N; /*进程数*/6 U6 u& Q8 u% \. S; ^
/*将就绪队列中的第一个进程投入运行*/- M0 ]: {$ G1 D5 h) _" b4 B
firstin()
! ]) H% c- o# g! p6 x/ ?* v' z{
* N( c; ?( ]  k4 V" g5 L   run=ready;   /*就绪队列头指针赋值给运行头指针*/
3 @9 z$ }" ?" |" l   run-&gt;state='R';   /*进程状态变为运行态*/1 z: Q9 a8 g7 B. x
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/
! v, M- D3 A) e+ l4 b% h}8 p/ f( T  r- a
/*标题输出函数*/
) C2 ]+ q" `1 F& cvoid prt1(char a)& ~; j0 |6 f0 g+ v' A" M
{3 [% g* o7 @  p7 @
   if(toupper(a)=='P') /*优先数法*/+ W0 L$ N+ c3 D: H6 a
      printf("  name     cputime  needtime  priority  state\n");
# b# c' \) j0 Z   else
; S. k. U5 l9 F+ z4 V: a      printf("  name     cputime  needtime   count   round     state\n");! k" F, r# K! u( P( J
}
% k9 v! K5 u/ w. V) q* M/*进程PCB输出*/
4 j5 B& i& Y1 K7 _0 g, p0 G6 Uvoid prt2(char a,PCB *q)
/ N0 i! E0 _8 b2 v8 g9 K  o{9 f0 [. `& e3 m+ }6 D5 Y
   if(toupper(a)=='P')  /*优先数法的输出*/- I# H, \7 t4 K9 f
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
* v; H4 b$ C8 L7 m* E/ ~       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
  m$ p& ]+ }, m; D: o. E   else/*轮转法的输出*/
( s( t5 Q& @) ^. }8 A! O6 g      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,) l: s9 ^- w( z
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);
% y: ?: @# H  u0 D}
1 ^4 `2 ~. M( @4 N0 ^. G' i! }/*输出函数*/  i6 |8 k+ r- a( h) u9 a5 @
void prt(char algo)" [5 {6 o# L+ \! Z8 ]1 M
{
# }: I- Q# ^- q0 T+ O   PCB *p;
2 ^7 \! _5 s- t3 Y1 L   prt1(algo);  /*输出标题*/6 ^8 r; }" h+ u/ d' R3 a/ X
   if(run!=NULL) /*如果运行指针不空*/) H# x9 G) P3 C) p
      prt2(algo,run); /*输出当前正在运行的PCB*/# R# j* s5 m9 ?: [, u' V
   p=ready;  /*输出就绪队列PCB*/% r$ ~5 f: P. L4 q6 |: F% C$ @
   while(p!=NULL)
0 j: a* \( j' ]6 `, v( W   {6 ]% t6 m$ q7 }
      prt2(algo,p);
5 {# n4 z$ B( f2 o& a* [. `+ @      p=p-&gt;next;
5 W/ s5 G  j  _/ U$ K   }- B0 M+ }8 @* y/ G) Q, w
   p=finish;  /*输出完成队列的PCB*/
1 @: j3 @+ E* k6 v# B6 m* M   while(p!=NULL)! m! Q$ s! Y( N/ c8 u$ r  K* L! O
   {  i  h7 V0 |2 g: E! K
      prt2(algo,p);
+ A* e+ [2 x: V. B      p=p-&gt;next;1 x& I; n& d$ F: P3 F
   }: M( u) h5 P& ~0 ^8 e4 W9 b
   getch();  /*压任意键继续*/# ?7 y( B6 D0 H) f7 n( |$ C1 j% h9 ]
}0 ?3 t* z0 I/ m; O! R5 \6 x3 \: z
/*优先数的插入算法*/# v$ U# t0 {7 U5 H2 M6 ], i" i
insert1(PCB *q)
: k! W" n" a: {4 I" N3 H{
0 O4 J9 k: R& ~( E: @7 _   PCB *p1,*s,*r;
% `. _0 X" Z" |. Y& S6 C( v   int b;
2 ]5 K; I" A1 r5 `/ G$ `   s=q;  /*待插入的PCB指针*/6 W6 J! k, \! k6 P: [3 d' n
   p1=ready; /*就绪队列头指针*// i# c/ `1 t" |: {$ ~8 a
   r=p1; /*r做p1的前驱指针*/
- p2 A; m. X7 M, ~   b=1;
$ C7 E& @5 y/ n; G# D4 f   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/
7 r) x9 x' F  e2 X      if(p1-&gt;prio&gt;=s-&gt;prio)- M: s" j. k$ y
      {
( |. n. H# j% Z# n1 X) d         r=p1;
; }6 Q" q& O/ N% Y/ ]& h         p1=p1-&gt;next;
: ?9 p! U" _9 s. V3 Z. `# w+ i      }2 o$ B) K5 x3 O( s! v# T
      else  p6 {! w- K/ x. B
         b=0;
& O) M, x# Q/ j& \' w   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
+ ?. n' Y" d/ S  I8 J6 c) G) s   {' A9 D5 x) K6 h0 h$ \% \0 H$ f5 |/ `
      r-&gt;next=s;: H  T( W* n  V9 M0 c# c$ c
      s-&gt;next=p1;
3 d% B* I0 g* v4 e4 m, A   }
: S+ ?& ?( b# N  g   else$ a  W1 S! L  |9 A
   {
' x) }# Z/ K! G/ M  q0 c; H3 B      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
8 E% f) @0 B+ O( v% i9 k6 s      ready=s;- A9 S7 Z+ {+ q% w8 ?3 W
   }
9 ]- v3 A; h0 r( Z}4 R: v, l2 u! v3 M8 B7 O
/*轮转法插入函数*/- e1 n" y# b9 s6 p
insert2(PCB *p2)
% Y( D* {, h' @6 {9 @{
0 A2 E) E# [) q' h   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
3 y# L9 @0 d) l3 U; D   tail=p2;. T9 [2 ^9 M' ~
   p2-&gt;next=NULL;
/ B$ j+ l9 @4 s' l, G. m  E) ~}
$ B- U8 f5 D' c: V/*优先数创建初始PCB信息*/
$ ]" e$ A. H4 }; j' D; x. \void create1(char alg)5 x/ J+ ~6 [, i* m8 _3 \) l
{
" h# c/ g( G8 F   PCB *p;: W9 v1 F: ?% s3 b, }
   int i,time;
' Y  P, h  b& `9 i4 j' N   char na[10];( |. I+ ]1 c& V$ M
   ready=NULL; /*就绪队列头指针*/
+ k* N- H  q( {* d7 y6 S0 b6 F   finish=NULL;  /*完成队列头指针*/
) N- l. f2 H' e   run=NULL; /*运行队列指针*/$ C  }  I: b( m# ~: F
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
: o/ I- m3 l. K7 A   for(i=1;i&lt;=N;i++)0 h& m9 l/ t# K8 A8 P2 B
   {
, P2 J. O% j/ d2 d      p=malloc(sizeof(PCB));
" I' ?3 L0 `5 ]' `6 ^% }      scanf("%s",na);
9 F. }6 ^( d7 N      scanf("%d",&amp;time);
" Q+ [5 s8 x& K      strcpy(p-&gt;name,na);+ i# [- |1 i0 `8 Z
      p-&gt;cputime=0;2 W! D  g% p* j0 M
      p-&gt;needtime=time;4 V$ b- H' b; n" L5 N
      p-&gt;state='w';% D; O# [2 m; E0 @
      p-&gt;prio=50-time;5 T6 b. ?+ z2 \: s7 [. }
      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/0 d& g* X& H3 \7 }
         insert1(p);& q: N  `; K7 I1 z( }
      else
* }2 _0 n4 l7 V( @* W) z& O      {
9 J" ^- F8 g8 [, o         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/& r/ Z: J5 k! C( \
         ready=p;
9 ~$ Q5 R# u1 v      }
9 T& \4 n& H# W4 q2 S   }1 ^/ A# q: S% _4 w* R9 O9 N2 k9 Q
   clrscr();  `- g6 N! |( T3 w
   printf("          output of priority:\n");
: y# c( X  P4 ?+ ^) N   printf("************************************************\n");( H& R$ G$ T4 _5 \6 ^4 ~
   prt(alg);  /*输出进程PCB信息*/
* _9 b! R" G% X( E   run=ready; /*将就绪队列的第一个进程投入运行*/3 [. Z4 k) }8 [3 h
   ready=ready-&gt;next;
$ R1 n$ R. ~$ E) u9 R   run-&gt;state='R';7 q0 C- k7 o. q
}& T3 G% E! t7 v$ ^* F/ P
/*轮转法创建进程PCB*/) Y( Z3 o- K! S! k+ _& O. q- f) F
void create2(char alg)3 s/ Y/ l6 Z/ `0 N/ h
{  G% T+ `" G& V8 A4 n. e
   PCB *p;
* L( C+ }5 @! W- ?4 l$ ^4 P' l   int i,time;. z+ Y6 @2 D! B* q
   char na[10];
* l- ^9 d/ ?4 A  C. X5 X   ready=NULL;- x9 b# r3 W9 ]7 `
   finish=NULL;( }! @: e4 j/ Y+ _* a
   run=NULL;
  r6 L+ p. m- n7 t) k   printf("Enter name and time of round process\n");% |, X4 f- j, G, M
   for(i=1;i&lt;=N;i++)
) j& J7 N3 T9 u5 t' c* O* Q- O   {
- T- p3 L  W* w! C      p=malloc(sizeof(PCB));* I* ^( V, [6 C) t: z$ D
      scanf("%s",na);
; Z/ V6 c2 K" t/ y+ T      scanf("%d",&amp;time);
) \7 a% K* _& n4 z+ i/ v5 r      strcpy(p-&gt;name,na);9 q% }' u- M: M$ n- M8 m1 |
      p-&gt;cputime=0;2 L( V% ?( @2 q% H7 r2 x+ P
      p-&gt;needtime=time;
# J( u( N/ u! ?. W4 y5 v      p-&gt;count=0; /*计数器*/8 q* W9 _& j7 I9 z
      p-&gt;state='w';: I2 f# T8 C1 J: c: |% Q: r9 M3 v
      p-&gt;round=2;  /*时间片*/
. v; C$ V  c9 H2 ]( c! w: f  }* S      if(ready!=NULL)( j/ [  l' F( ]4 e# l) W; L& [
         insert2(p);
5 ~0 a3 k  U5 q* o2 `" J+ m      else) O) X9 R  `. ^/ j6 u7 U2 e
      {
8 q7 V0 R4 g* P         p-&gt;next=ready;; ^* T! @' f" u5 x9 [
         ready=p;
" _% l) o. \  {: D+ |( O9 x         tail=p;. W" `0 `  i+ p# \1 ]$ U
      }
4 D) G" I- M0 D( E   }% d- H+ O7 x* ?- `% m8 I# ~
   clrscr();
! U& m. s1 ^8 G0 s   printf("              output of round\n");
! f" z' f8 I1 H5 i1 A- j   printf("************************************************\n");
5 b9 d% d3 j" R) x; M  H! h   prt(alg);   /*输出进程PCB信息*/6 ~0 j, q4 D8 x0 F% p8 d
   run=ready;  /*将就绪队列的第一个进程投入运行*/
% t+ D  }( I8 T/ S" N   ready=ready-&gt;next;6 |( Q$ p  s2 N8 k- v, t0 |
   run-&gt;state='R';0 A$ |+ @3 x) P1 z( U
}1 s, w9 i! {  d! k/ ?
/*优先数调度算法*/
2 ?0 _/ M/ R  I+ z% jpriority(char alg)! P: C; f& h  ^2 a& ^2 M) T, W# ^
{
# \' F2 X3 f7 G4 Z0 u2 r   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/
9 s% z0 ]1 y( ?4 k   {; u$ `' S9 w  {( J
      run-&gt;cputime=run-&gt;cputime+1;6 U- |# {/ W5 t" f0 f! e
      run-&gt;needtime=run-&gt;needtime-1;
' g; c4 W  A, i( O9 _) H7 H. S' l9 v      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/8 n1 x0 L2 Q1 k6 J, B: a7 q. E
      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/' C$ P: X* f: g* b
      {
2 D3 X2 ~. R+ j9 V8 L6 K6 g         run-&gt;next=finish;
: g( g6 A. j3 _& {/ o8 ]         finish=run;
  s+ `/ l  n6 Z$ X  y6 q  S' q$ |         run-&gt;state='F';  /*置状态为完成态*/. t/ B  h5 |% h
         run=NULL;  /*运行队列头指针为空*/' |( \& h, \& D7 m, R
         if(ready!=NULL) /*如就绪队列不空*/
0 T$ `6 Y) s6 b0 A$ G7 y, V            firstin(); /*将就绪对列的第一个进程投入运行*/
( e& z4 s& j7 V3 k3 }9 ?      }
9 e) c2 }+ G4 z; _      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
' b! g0 `* }1 @         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))
, T, q/ z0 V8 L: `         {$ ~; r3 E; `! y; x) K  z4 S
            run-&gt;state='W';
+ ]6 C( T( ~( `, s5 p* k. s/ l) L& {0 i            insert1(run);
0 g/ H  D/ V4 x6 p1 ^- v  d+ `! F" l            firstin(); /*将就绪队列的第一个进程投入运行*/, W) b" H4 a7 @0 v7 d
         }) [, O3 P& M" `6 Y' u+ c5 c& L6 c
      prt(alg); /*输出进程PCB信息*/
" Z0 M, z8 n* {/ B& y  i   }% d, T! N7 [( y8 M; P
}2 E+ k" |2 C8 w5 \) K9 m& @& l. ^
/*时间片轮转法*/
( }5 q! u7 R' {# e: Troundrun(char alg)
2 D$ p1 u9 }1 n) l" L- A{
' Q$ T# b$ Y, N, R9 P, T: l/ N   while(run!=NULL)
- S$ {- s/ M/ K4 z+ m* ^. B0 O6 q   {
0 G$ S' ~9 a  K      run-&gt;cputime=run-&gt;cputime+1;, j5 c  H  I, b
      run-&gt;needtime=run-&gt;needtime-1;' B( L5 z# s% u1 J' p1 W7 }* }
      run-&gt;count=run-&gt;count+1;
% n# u! [. V  n0 |  b( h$ D0 c      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
2 w. E+ ?5 h4 _+ h      {& Q4 y- l; R8 ~$ S, A
         run-&gt;next=finish;. H+ U" n$ ^0 V* g  G7 q
         finish=run;/ }! x" \6 S- S1 W2 {
         run-&gt;state='F';
) e! a  Q3 V, L3 v4 j( M+ ~8 ~         run=NULL;6 r" I1 h" M8 j$ n. ~8 Q% e+ E
         if(ready!=NULL)
! m: _4 S' U3 p: N  ~/ w, a7 j6 e            firstin(); /*就绪对列不空,将第一个进程投入运行*/* p2 i' H, o9 V3 X
      }3 Y; ^/ s0 w0 B! b8 F
      else, d) ?" j/ y) }3 V: P4 j
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
- z1 m3 \( Y4 z2 n         {- f, m! O! W9 ]/ ]4 Z8 M  t
            run-&gt;count=0;  /*计数器置0*/- R1 i* U1 e% }. N8 l
            if(ready!=NULL) /*如就绪队列不空*/  `# l. \4 f/ p
            {1 i2 ~9 Y# d6 |- v9 d* l
               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/* N: g# ?+ F: d7 r7 a9 c* D. Z
               insert2(run);
8 Y3 G9 k, G) h# R. |8 N6 T* K) A               firstin(); /*将就绪对列的第一个进程投入运行*/
/ b( u- u0 E$ V4 E. C$ j1 M            }
2 K/ }; P; U5 i& _" g& g         }( ?, P( ^: X6 [+ ^, C. j6 O
      prt(alg); /*输出进程信息*/
$ i' |, X9 h0 U5 @% J   }7 B$ h2 _' n: B2 D" c4 B/ T( f* g
}" `$ y' I* f% z, V* `
/*主函数*/
! v: T2 L; @0 q2 Z/ H: g  T4 [main(); u3 |4 I" z  v7 O9 x6 t
{/ Z4 e1 J* f- a  F( t: F1 g
   char algo;  /*算法标记*/. Q9 Q' ~7 {) P6 M) e9 ?% o
   clrscr();, @* }( v8 c2 Y2 @
   printf("type the algorithm/R(priority/roundrobin)\n");/ B- m; r* O6 g  c
   scanf("%c",&amp;algo); /*输入字符确定算法*/
+ Q. v  T$ f$ O( e; ^5 j/ T   printf("Enter process number\n");
* h. l- S8 z" J% W! P0 ]   scanf("%d",&amp;N); /*输入进程数*/, ]6 O$ e3 d4 B1 L2 R3 T& y. ]
   if(algo=='P'||algo=='p')! s% T2 {( F) b2 @# b9 H) i
   {
5 \4 }8 G- z% P0 ?2 f2 Y! }& j. `      create1(algo); /*优先数法*/
( @$ U0 s  i- p0 W. u! k      priority(algo);
, d, i, y9 K7 C; u& A. z   }0 V( |' Z/ E0 `2 [# B' Z
   else
3 f4 I9 F& k# q0 Q/ L" k: h      if(algo=='R'||algo=='r')
# P6 ]8 ^2 g, d9 ~1 J0 X      {
5 t2 ?. W& ~  G4 S% ]         create2(algo); /*轮转法*/) r% P  d4 u2 _
         roundrun(algo);5 a' p3 N+ g* D
      }4 _& ~- D" {3 l$ y- [6 k8 i( x& g
}: U- Z, L- w- c  ]3 Q; {' ~( w0 M
</pre>

gVBZFryb.rar

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

该用户从未签到

2#
发表于 2016-7-2 14:15 | 只看该作者
谢谢分享,必须赞一个~4 G6 y6 S$ D- W; I% @% W

该用户从未签到

3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
5 `, p2 I2 E- F3 J( m* q

该用户从未签到

4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!  _' P% `$ n' O& J

该用户从未签到

5#
发表于 2016-7-4 15:17 | 只看该作者
支持一下,很不错哦!

该用户从未签到

6#
发表于 2016-7-5 10:58 | 只看该作者
支持一下,很不错哦!

该用户从未签到

7#
发表于 2016-7-7 09:06 | 只看该作者
这资料确实不错……
; N& ?' `" g( ]  Q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 19:07 , Processed in 0.171875 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表