找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 91|回复: 6
打印 上一主题 下一主题

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

[复制链接]

171

主题

616

帖子

1306

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/- s: i: s- h# r- f
#include "stdio.h"
0 M# P/ T. p2 d, b1 A#include "stdlib.h"' m! S- |- z' K) Q7 Z' e
#include "string.h"
7 q& S1 p' w" S: k5 Ftypedef struct node- `5 N5 r1 M. y- f3 _5 [
{
5 \1 Z$ \; N$ I! Y$ T4 m- w   char name[10];  /*进程标识符*/
* t, ~5 D9 e( g9 h1 D; A- P   int prio;   /*进程优先数*/
4 w/ L  F% Q/ ?6 k3 a   int round;  /*进程时间轮转时间片*/$ p) U4 B! v( [2 q
   int cputime; /*进程占用CPU时间*/& J8 T9 Z5 i! t  T4 K* j
   int needtime; /*进程到完成还要的时间*/) I1 l" i5 Z( l$ _0 f3 [7 o
   int count;  /*计数器*/
2 y' M* @; \8 F! m1 y   char state; /*进程的状态*/
; Y3 `1 A" p! a   struct node *next; /*链指针*/5 K9 \/ f5 X2 C+ x2 F2 C7 P. l
}PCB;6 k0 _6 D# X3 T
PCB *finish,*ready,*tail,*run; /*队列指针*/, N4 {5 d2 f& d' }1 ?
int N; /*进程数*/' F" x% d% }  P# B; _
/*将就绪队列中的第一个进程投入运行*/
- J# b# \( {2 ~) r% f" O& tfirstin()
' c* A; Z6 a8 d9 W{1 n" k  x7 c' Z3 T$ w
   run=ready;   /*就绪队列头指针赋值给运行头指针*/# M) A8 E3 R: M) X
   run-&gt;state='R';   /*进程状态变为运行态*/; ?( n+ N8 f2 }4 `
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/
* `1 ]7 w- Q" V4 B/ A  y}0 @6 |) [! f9 |' X3 w
/*标题输出函数*/
; E. F0 q2 d. i2 ^6 K2 uvoid prt1(char a)( W" N$ I' T' I9 }- ~, _9 _3 @
{
+ C1 Y5 [% w; }2 k2 M3 ^$ K3 p   if(toupper(a)=='P') /*优先数法*/
* n0 i0 U6 e! G: i, O; q1 Y      printf("  name     cputime  needtime  priority  state\n");
8 g5 i; q* w8 W. q. Z6 C4 d   else# B' [5 _& N, f3 G: W2 k& K- D
      printf("  name     cputime  needtime   count   round     state\n");
, s: z3 b& w- M8 W}
1 \; K  r+ U) e5 q/*进程PCB输出*/
4 q. `; A5 K' G! \, f: ?$ `3 |5 Gvoid prt2(char a,PCB *q). I# q* N- H+ [1 J
{6 K; D9 K: e, S. K# d# z
   if(toupper(a)=='P')  /*优先数法的输出*/
8 _2 F( Z2 `% f9 w8 s8 H+ A      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,/ s4 N( _9 ?) R- Z9 F  r
       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);7 L) [3 f* t) u0 z, |$ x: E
   else/*轮转法的输出*/
7 S. @7 ]4 }4 h: H/ @      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,
4 O1 c; {; L6 N# ?! I' f1 ^. H1 j       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);! p: |5 j9 ?( C& ~- A9 `+ x9 j# t% w
}2 L* T2 R  d3 q/ l( x& O+ ^
/*输出函数*/  {& e& o9 }; `: h3 i; g
void prt(char algo)
5 ~) ?+ l. c/ D( L; E0 W4 F{
) ^; a8 W* l! A6 p" i- y/ x   PCB *p;  {* V' O! T) j+ ~5 W: r0 |
   prt1(algo);  /*输出标题*/
# z" Z, ?7 }1 s/ ]# L' d+ d   if(run!=NULL) /*如果运行指针不空*/
$ N+ C  f  M, b' i/ y      prt2(algo,run); /*输出当前正在运行的PCB*/" s6 Z; i, k& p
   p=ready;  /*输出就绪队列PCB*/
4 b: K) U' K, u   while(p!=NULL)- ^  j: i% J. w' }/ }" z4 J2 d! ~2 \
   {
0 l8 d9 i& c* U2 @; R      prt2(algo,p);
1 G/ x2 j+ V. V0 R9 F6 U& u      p=p-&gt;next;8 O3 m4 m. R( r: H
   }1 l) R, R; k# f  T; J# u% c- r
   p=finish;  /*输出完成队列的PCB*/$ a5 ~% [4 t8 E- Y: k
   while(p!=NULL)
7 [& Q+ R' h) Z   {
6 d9 e1 y9 Y5 r- i' h      prt2(algo,p);+ t( l% T4 z4 P" k
      p=p-&gt;next;
2 c9 t0 u8 l& d9 k, P, I   }, s, W5 ]6 Z) m* l1 y8 P
   getch();  /*压任意键继续*/
) y6 r& R7 R3 k; D( C% U, g}8 P+ q4 l- G! x4 Y
/*优先数的插入算法*/7 t# W5 F( q) Q9 C! k# c, ?
insert1(PCB *q)
! z, e6 z$ c' G* @2 t; y{
  V. b* @* b9 I; Q" l2 }   PCB *p1,*s,*r;
* t3 l' \; v: }+ b7 @' m   int b;2 Z$ H( {2 i9 R/ g! a9 g: C
   s=q;  /*待插入的PCB指针*/
2 r( _6 }* Q- ^, K& X+ |   p1=ready; /*就绪队列头指针*/, M% V  \+ {" K& C
   r=p1; /*r做p1的前驱指针*/: Y+ \' v( o1 u- P
   b=1;+ S$ ]8 j( r! \
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/0 V/ B. l8 d5 I) h6 X5 y
      if(p1-&gt;prio&gt;=s-&gt;prio)
/ t. U5 l+ [7 V  N      {
+ M# S* a* o7 S! {4 X         r=p1;
0 [: A% i- V5 J3 I) e6 r6 o1 K% i         p1=p1-&gt;next;
9 i1 i+ U8 n4 q' ?3 A      }, a3 q# l& u9 k5 |
      else
; z0 R7 x! Z  Q& @* {! w         b=0;; e+ s) I8 L. k6 i) u3 m
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/& @% F  D7 n: `: ^
   {
3 l& u0 P, K1 s+ q% U! g5 c$ d" T      r-&gt;next=s;
% i* M9 M1 i% D2 @& j$ R      s-&gt;next=p1;
5 q8 g5 k; E9 W% F" z3 y   }
& u* B* S- G: t2 e8 k( h, y* o4 j   else9 G/ |. ?5 S; J. P
   {
# R0 N# K$ N2 k& N      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
  B! S/ a6 ~% {. w7 j      ready=s;- s( J. U3 F% O# q6 Q& ~8 ~% N
   }+ q% C. a* Y/ z& y- ]% ]6 I3 t
}9 H# g2 s  X( x( S3 W  [
/*轮转法插入函数*/; G* _+ y- C( a
insert2(PCB *p2)
0 o1 Q, o# Q9 V+ I+ X{3 u6 S$ J# l. }6 ^
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
& M; B  w* z* M3 U$ k, D* o: V   tail=p2;5 p) q, b( c, d8 t' p( ]  v
   p2-&gt;next=NULL;, u9 k' W9 C: C* ?
}
, D) Z: s# k- ^  `0 E/*优先数创建初始PCB信息*/; U. Z  d% f4 }5 r9 l  r& G
void create1(char alg)
- c( \! b# p* T8 ?8 a{
2 P$ o/ L! r* z   PCB *p;
7 x" R! a3 u- r+ p& w   int i,time;
7 a( G0 B# p0 @   char na[10];
* u+ U6 e; X5 h. }   ready=NULL; /*就绪队列头指针*/$ e, ?: k. T. X& x( c# u) Y
   finish=NULL;  /*完成队列头指针*/
8 L7 ~# z$ D2 M3 p9 o! h/ |( V   run=NULL; /*运行队列指针*/) A& J2 p0 k. I% |4 z3 {' [8 F
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/: a# a' Q7 s0 a1 n+ f3 [
   for(i=1;i&lt;=N;i++)
* N" S+ z- j7 Z6 Z% h5 e   {
$ f. {1 F$ Y- M' n6 Q9 m; V9 G      p=malloc(sizeof(PCB));# N# p1 g- u1 ~, ]
      scanf("%s",na);
5 [+ T4 e! y4 H6 Y1 I$ \7 X6 q$ j4 a      scanf("%d",&amp;time);
/ T  V' K' f& p2 }( |# H+ }2 h      strcpy(p-&gt;name,na);
, B3 }) A7 ?9 n" y* P1 n      p-&gt;cputime=0;
/ N, V" N) R8 q  O" p      p-&gt;needtime=time;
- y2 K( p' y1 M3 Y* m      p-&gt;state='w';- a( Y# r  u# |3 R
      p-&gt;prio=50-time;
7 N) D* N: b& }* w+ f  z- h      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/$ D8 f' L7 ^! w  f# q: f% O7 m7 C
         insert1(p);2 }- o8 C8 T1 K
      else3 f4 q0 \3 }( K  t+ d
      {/ b7 h0 v$ {  t4 V0 V* s3 z6 `5 V8 ^) u
         p-&gt;next=ready; /*创建就绪队列的第一个PCB*// p  h( `: \" f& f4 s* R3 J% x
         ready=p;
' _* U6 x* f0 d7 W" Y4 D0 w/ k      }3 O3 }- o0 B' o
   }$ ?/ L3 `" t- {' c
   clrscr();5 {5 g6 r: ~8 s3 ^9 d& t% E2 r: _
   printf("          output of priority:\n");7 B  t8 {- t* T" g. q) q
   printf("************************************************\n");
/ x( Q, B: x' X# ~+ B0 f   prt(alg);  /*输出进程PCB信息*/
% N5 R3 r: f: Q. O/ z   run=ready; /*将就绪队列的第一个进程投入运行*/( f, t# n, Q! B- E3 H( q4 I1 [$ t
   ready=ready-&gt;next;6 @2 O" q2 N% X
   run-&gt;state='R';
- ^1 r3 d- ]( |" O: D2 [}, B* G+ V8 R! }7 i" D* q% s
/*轮转法创建进程PCB*/
: v. T6 ?$ f  P9 ^* vvoid create2(char alg)
% o! K; @5 X. C{
/ [& {, j9 |) ^" R2 R1 p   PCB *p;# ^2 O! A# f% b& x3 o4 ]
   int i,time;
) J6 E; p) s- N   char na[10];" n) u  ^" q) [. Z: D9 I, x, P$ X
   ready=NULL;% F4 ]& J# L# D3 t# y
   finish=NULL;
5 G) p5 F' _9 o+ ?   run=NULL;) f* V( U* \1 X- d! \, G( G! O
   printf("Enter name and time of round process\n");4 s4 d  j7 ]" e! n
   for(i=1;i&lt;=N;i++)
5 ^9 L. g6 t4 W7 F' `# }6 s3 w   {% x8 T' g; ?6 m: H! |' r
      p=malloc(sizeof(PCB));
  O$ @: W; c% Z4 U  W' K! I      scanf("%s",na);
% E/ a1 _3 P( J; P' f' e( t      scanf("%d",&amp;time);9 m9 T, g" L, [. D
      strcpy(p-&gt;name,na);
3 P6 f6 e7 d7 z5 A- O      p-&gt;cputime=0;/ h1 V! L2 ^2 J5 p) Z
      p-&gt;needtime=time;) w) m  Q* J. E$ f% d; A# P
      p-&gt;count=0; /*计数器*/
! X: Y" v$ R0 |9 H' a+ T1 j      p-&gt;state='w';- g4 B" V2 m& ^; W; z
      p-&gt;round=2;  /*时间片*/% F2 ~1 T# z+ X3 T( |6 p# _7 F
      if(ready!=NULL)
0 R9 @- g8 Q" a9 r+ _         insert2(p);0 J; }1 N. f. b3 h* ]+ T
      else
  i% X4 m" v& ]8 J4 U      {- m5 i# f* U7 v7 S: O) z
         p-&gt;next=ready;
. {( i7 n; }+ d2 T         ready=p;2 O" S) y: E" n7 A5 m
         tail=p;
/ n+ x2 D( k5 `2 @& p, C, M8 C      }9 {0 |2 s; K5 |) U* F
   }' r5 j8 r- b6 j% G
   clrscr();4 A" ?, m  H5 n. U! G
   printf("              output of round\n");" N& O$ V1 v" \: p& _8 O
   printf("************************************************\n");
: l/ r( {, ]- D, D- Y   prt(alg);   /*输出进程PCB信息*/+ f9 t- f- N; H
   run=ready;  /*将就绪队列的第一个进程投入运行*/: d& c# Q. k+ [$ |& c% T
   ready=ready-&gt;next;/ [# L! M# @9 g* `/ b0 ?
   run-&gt;state='R';5 r6 J4 ?6 c' C/ f' j: U& M
}
2 {7 e: L& x$ D# v2 x! V. ~0 u/*优先数调度算法*/* b$ F$ C6 `8 K& E* [
priority(char alg); T  Q8 U- k) ?8 A
{$ }7 l. Y8 _8 i$ {7 F
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/
# d, Z" k2 X9 p& ?0 v# z  F, M3 a* Y   {
) Y8 U6 _8 |% F) k0 S7 P! @9 @      run-&gt;cputime=run-&gt;cputime+1;
+ @6 P" ]* b9 ~7 L, A- d      run-&gt;needtime=run-&gt;needtime-1;
3 V4 c, q! ]! ^+ d) O      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/
. z+ l" [! k3 T' r) o) D6 ~      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/! S) T9 F: g! t- U% F6 S; w4 x
      {
( j8 N* w) Q# u; K* C# K4 H         run-&gt;next=finish;. N' p4 g9 |2 _- G
         finish=run;
, }7 \" _- a( x. [: T, i         run-&gt;state='F';  /*置状态为完成态*/
2 ^$ O* u9 g# Z2 T0 m% Z0 V$ t$ f; S         run=NULL;  /*运行队列头指针为空*/
9 @/ Y9 ^# f$ k0 C, G. @8 Z, `. c         if(ready!=NULL) /*如就绪队列不空*/
- F7 V7 g2 p3 p            firstin(); /*将就绪对列的第一个进程投入运行*/! ?6 w) S) g1 G
      }
4 ^6 [7 ~9 j  _+ i      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
" R  A; e# I" h' b, \4 q         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))$ H6 c9 e! ~8 o! _. u2 {' w
         {
' a4 ], X0 Q5 _- L5 Z            run-&gt;state='W';
2 _( G9 C  U+ }% `. Q8 R            insert1(run);7 G0 P5 d/ P0 ?
            firstin(); /*将就绪队列的第一个进程投入运行*/- z$ {8 p. P7 S/ k' ]- a1 J
         }
8 }0 E# W3 e0 g0 ^% a1 o" u      prt(alg); /*输出进程PCB信息*/
9 R! b5 {. h9 {, P2 Q7 j# H2 Y   }
% }+ Q4 H% g/ V9 d8 @0 \( H}
. z( |$ \) @# D8 `! H; z; O" i/*时间片轮转法*/4 D5 W1 ~" n- {4 o3 L& y* |) t
roundrun(char alg)
; C) j) ]8 b# J; ^" Y{& @. q$ M  G0 b! c0 A
   while(run!=NULL)5 P, O# ?2 i) b0 Y6 r  `, i
   {) K! H1 w  Y0 M9 i6 c4 F
      run-&gt;cputime=run-&gt;cputime+1;
3 s" N# h* p, R5 z0 K& v      run-&gt;needtime=run-&gt;needtime-1;5 ]. X" M! [( [/ e) Z% Y4 S
      run-&gt;count=run-&gt;count+1;7 D; ^! y, O0 L" W9 K+ s) }
      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/) A/ A8 X9 B- i! L% d+ k
      {# |5 _* ?; g9 h# X) [: c" D
         run-&gt;next=finish;
9 P: G# ]0 k6 _         finish=run;
6 X, N8 ~( L& H4 q& ^) U         run-&gt;state='F';
3 D8 w3 h0 o! \5 k1 h  ]         run=NULL;
- K( h- K6 Z$ C/ c) E         if(ready!=NULL)
3 ?) R7 [+ |8 @2 m$ Z* [3 F            firstin(); /*就绪对列不空,将第一个进程投入运行*/
* s1 j* }9 y! ?" J' Y      }
7 S5 G: s8 ^& U1 Q4 `$ T      else; p9 D0 O+ q- A1 J% y
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
# n$ s. O  g4 M2 r3 E' \: h# R         {
- o) c( _8 k2 f/ ]+ R9 J' r5 l            run-&gt;count=0;  /*计数器置0*/; |8 p5 ^, Q0 Q0 b/ p& _
            if(ready!=NULL) /*如就绪队列不空*/
9 h3 g( ?& k& f7 Y5 D  E8 u            {1 G! [* h' [# E1 l- _5 Q1 V4 }6 U
               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
5 H, n7 ]. m1 ~, d               insert2(run);+ I  c+ ^3 w+ _" _
               firstin(); /*将就绪对列的第一个进程投入运行*/
* H0 K( d- K, D7 {' V! n2 ]            }( n: h& H8 f# i% x( @6 b' b/ Q
         }. p3 Y3 H, ?# d* r) w
      prt(alg); /*输出进程信息*/
+ a" T1 K& X; |3 h2 ?   }
4 L- y3 _  a  T7 @- _}- l9 X! t5 @7 M) x7 I/ N
/*主函数*/
7 p9 L" y: Q3 y! K; |main(): t9 }5 Z  o% W+ `# _" ]7 D9 d
{
  j& q. R% w8 [$ p  c4 Q  B   char algo;  /*算法标记*/
6 P$ l  U0 h6 a; I0 G/ r   clrscr();
  H4 h: G1 V4 E   printf("type the algorithm/R(priority/roundrobin)\n");7 ?& g8 \; I; O# J/ r# ~4 C
   scanf("%c",&amp;algo); /*输入字符确定算法*/; Y$ U& l+ {$ [& L
   printf("Enter process number\n");
- y& P# `# p) ]+ m  P' z/ A   scanf("%d",&amp;N); /*输入进程数*/2 v2 h- L# F$ v; s. E3 V- \9 r
   if(algo=='P'||algo=='p'); ^5 o$ c  C" y  Y7 s4 a: @* s/ ?
   {
5 \2 O" ?. W$ `% t+ \. B      create1(algo); /*优先数法*/' k% k. G! d* f) ?
      priority(algo);" V1 L3 i- {: z. Y' F" N5 k; y
   }
! }3 N! |: U* _   else
4 z$ n( ^% w4 e0 B! M      if(algo=='R'||algo=='r')2 l2 c( O6 ~/ b& k$ ]" m& N6 d
      {( M, R# ~0 t& p/ O) l& [& V2 \6 N- P
         create2(algo); /*轮转法*/7 O2 }. r3 Q7 U* E* L# z
         roundrun(algo);7 r+ ^  D1 x& p- [; Q
      }- W" E- |  z4 P& q
}
0 f% [6 ]0 ?% i: i5 Z7 y  ~</pre>

gVBZFryb.rar

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

159

主题

583

帖子

1229

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1229
2#
发表于 2016-7-2 14:15 | 只看该作者
谢谢分享,必须赞一个~
4 k4 ?" G, k: _& `/ \

183

主题

642

帖子

1350

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
) x1 ~: V7 f, w" ^, A1 @3 Z4 A

214

主题

642

帖子

1658

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!1 m! \* d& B1 M  Y" w

262

主题

1157

帖子

2065

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

156

主题

543

帖子

1180

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

162

主题

614

帖子

1255

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1255
7#
发表于 2016-7-7 09:06 | 只看该作者
这资料确实不错……
; |( X, d$ g' X4 b! S& M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-13 04:11 , Processed in 0.061141 second(s), 35 queries , Gzip On.

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

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

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