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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/' C" Y; R6 g! B6 p5 F: i  ^
#include "stdio.h"7 J% P6 Z" W- E2 ^' h! }' K
#include "stdlib.h"2 d  V3 r. X2 d1 ~' K$ f
#include "string.h"
6 z/ ]8 H5 S' s1 Etypedef struct node
) p6 w) L; y/ Q: J2 @{+ X- I; }9 e5 |
   char name[10];  /*进程标识符*/7 T8 k5 @4 |* g2 p( X8 e6 `
   int prio;   /*进程优先数*/0 _4 v( L0 e! H( E' K% I5 t- |5 D
   int round;  /*进程时间轮转时间片*/: l8 P+ R. ?* P! m+ d# \$ F. C8 b
   int cputime; /*进程占用CPU时间*/
5 g4 G" g3 ]& R- Y9 T. q' L0 [   int needtime; /*进程到完成还要的时间*/7 s/ x  t) k" F( C
   int count;  /*计数器*/
, b3 g( i5 s* z% s  A   char state; /*进程的状态*/" [8 D: k8 h0 }9 z" c, ^
   struct node *next; /*链指针*/
- V; Q2 H* @5 F+ [}PCB;
/ o" x/ S5 h' IPCB *finish,*ready,*tail,*run; /*队列指针*// J) W, H6 H5 d1 [, |3 S
int N; /*进程数*/
1 K+ `2 g( ^( m0 M5 n/*将就绪队列中的第一个进程投入运行*/) Y7 E; C# x5 v& H% k, j7 x! _( L
firstin()% d# m6 u4 \1 X/ E" |: C4 E
{
% Q1 X% E- e, s, P( j* L+ V: n; q   run=ready;   /*就绪队列头指针赋值给运行头指针*/4 j# o/ \, D) o" {: X
   run-&gt;state='R';   /*进程状态变为运行态*/, [% B' i; p% O, x, y9 }
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/
! J) \5 P9 k" J5 I8 X}
( l5 F8 _2 j0 _1 a7 f/*标题输出函数*/
9 w7 ~7 z. ]) evoid prt1(char a)
) w6 r2 V& x% j* p: f{2 c  |( X1 b/ S) D6 i; @6 m1 ^* v3 ?$ X- W
   if(toupper(a)=='P') /*优先数法*/
; L$ {/ v' F* e: `" P      printf("  name     cputime  needtime  priority  state\n");
3 ~( h4 a. e2 N5 J6 |1 C# S   else1 {4 @. _$ q# k# D4 V# {
      printf("  name     cputime  needtime   count   round     state\n");# c$ X7 ?: s! S( h2 B
}
- z" ~. y# i- I- T4 n/*进程PCB输出*/
  t# {9 V& Q0 {5 a( wvoid prt2(char a,PCB *q)
1 ?+ X* v( ?' j0 G0 M{
5 N3 q2 Z9 X( W2 Q& C  T& R   if(toupper(a)=='P')  /*优先数法的输出*/0 {; ~# X9 n  I' d
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
+ T+ H; O( ]* @; V       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
1 q" j; ~4 h% g. g; J' z. S   else/*轮转法的输出*/5 f# j4 j& T  ^0 @; ?/ `4 D
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,
3 w8 P4 S) l, ]0 {       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);& G  x, ?2 k- w0 P6 R' S
}1 _; m, D( _9 s; o. t" d
/*输出函数*/# v- b* e# @* B2 S3 H0 p- _4 ?2 h! k
void prt(char algo)( ^) y& S2 o9 Y, S: G6 w. F
{" w/ o' N0 U  N9 v
   PCB *p;
8 X* L- @6 m3 Y6 ?; p* i   prt1(algo);  /*输出标题*/
& D) F6 c- U5 K( p6 S6 u6 [   if(run!=NULL) /*如果运行指针不空*/$ d# J0 f1 x9 n
      prt2(algo,run); /*输出当前正在运行的PCB*/8 Z# K- h9 u8 y+ K9 Q3 t' E
   p=ready;  /*输出就绪队列PCB*/1 M+ k: r3 T! j; J0 @
   while(p!=NULL)4 a* `3 f7 E$ ~- O8 J- `3 H  B
   {
, \5 f% X( {& _- q4 T$ s      prt2(algo,p);8 p6 J* G. [% I4 q$ R9 j
      p=p-&gt;next;5 k' @% J* _+ k5 n  o* y
   }+ z, X; q! }( a
   p=finish;  /*输出完成队列的PCB*/
) Q7 D( ~3 ~! [; Y& n: A, {   while(p!=NULL)
; x& s7 J+ g4 D- K! ~; H   {# @7 b2 O: Z- d& T% A$ O/ f
      prt2(algo,p);
- c/ G. b" {$ @. d      p=p-&gt;next;
& {% U5 v: A- n3 ~1 Q4 |   }$ A( s9 K2 M1 E, H% [! u; K
   getch();  /*压任意键继续*// S7 M9 P3 i; n  n& P( A
}
* C$ k! J, f/ @7 `3 P/*优先数的插入算法*/
* N8 `/ @, K6 [, i# g$ linsert1(PCB *q)4 I! K" _8 p1 U. Q
{
3 `7 o; U( h, ?- `: M, q   PCB *p1,*s,*r;# D, V. E$ l) w3 c& }# L" q
   int b;
& G3 U( k4 w2 w1 i! @) b   s=q;  /*待插入的PCB指针*/
# [9 J$ A7 w5 L4 `   p1=ready; /*就绪队列头指针*/, d3 [1 h" ?( V% d# Q
   r=p1; /*r做p1的前驱指针*/
6 |* k* v* M8 d$ Q( r6 |$ |6 I   b=1;
. M8 I( X* A3 n# P  K/ }  t   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/
& s2 R/ d+ V! R! j* J; m+ h      if(p1-&gt;prio&gt;=s-&gt;prio)$ Z* @4 ~$ I/ P, q9 g
      {1 _: ?7 t3 n- k" v6 L1 o& R0 @
         r=p1;5 E0 g, W0 t# V/ G
         p1=p1-&gt;next;9 h: [3 O) m  h
      }
( }  S  y4 p9 R. G4 }      else, F) A" H2 Y2 O* o# [; M
         b=0;
/ M. }6 r# y+ B1 K* B9 G& g   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/, p2 a# h2 Q( J
   {1 A& v/ d4 E7 N. `
      r-&gt;next=s;* T: v$ v2 `5 Y8 U/ T3 l+ m
      s-&gt;next=p1;1 u: Y& L! n2 w
   }
: m2 S3 \# q+ G( N+ n   else2 ~# a3 E4 Q/ Y; J' v, M
   {
$ \) h: M$ |( @+ g7 [- N      s-&gt;next=p1;  /*否则插入在就绪队列的头*/8 I: `% B# B$ h1 D; l
      ready=s;! z) \3 Y6 y$ n  h# V
   }
4 m9 x, a' a) z: h  v) l}; U" P1 [% Q& Z' [. k
/*轮转法插入函数*/: j8 b8 o9 o0 B: [
insert2(PCB *p2)& G* L) Z8 A- e) A
{, F2 Y2 Y$ R4 c; I6 S2 B
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
  K) d( C0 A) C6 j! Q   tail=p2;; a  S! E5 z" e6 N. `  n5 c* W3 E
   p2-&gt;next=NULL;! `% n+ |3 G  R( [0 v* m( I
}
1 w7 A2 q& X% z) q9 ^/*优先数创建初始PCB信息*/
* q. t$ R: w/ T  X6 @. D, R  i. ^9 dvoid create1(char alg)
, m, r; ~( G' M1 z. ~6 s{
5 S  O9 B' W) }+ X3 Y   PCB *p;: {  @- ~. _& w0 t& e% c
   int i,time;. Z- o# O7 O$ ~* Z  ]" i
   char na[10];
  s4 B! T! r$ n9 G% }- Z9 e   ready=NULL; /*就绪队列头指针*/% m- t  x9 r* Z+ L
   finish=NULL;  /*完成队列头指针*/; W0 ], C; A4 R' s2 g/ O9 J: \  z
   run=NULL; /*运行队列指针*/6 x& f4 y7 `* D+ E9 c. Y0 z
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
& N1 H6 e7 @* M0 A* k# ^! {   for(i=1;i&lt;=N;i++)
! B7 m4 O! g! c4 {9 D   {
* e5 s+ m& e. A# l  g; W      p=malloc(sizeof(PCB));9 B9 `, M; B5 q
      scanf("%s",na);) F# ?, v7 f( V3 d. ]
      scanf("%d",&amp;time);3 B" c0 J0 F4 t( ^. B' F& g$ `
      strcpy(p-&gt;name,na);
6 K4 G7 O, p! Q& x      p-&gt;cputime=0;
4 s2 }* D( H0 I8 e      p-&gt;needtime=time;
0 A. O. J* t& Q9 K! j      p-&gt;state='w';! k* N: m' P' y3 d& L
      p-&gt;prio=50-time;
8 V6 R' H4 ~% F9 A# [: A, `      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/" _9 K: A3 A( @
         insert1(p);% v# E- w' g) M: q+ l7 s+ w
      else7 b( b: O: h- H) T1 T5 E
      {
, [- U- V& v9 I0 z+ F- z         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
  W. j4 g6 I6 C( n- e         ready=p;
" S+ X  D- I; @. p% D      }& M3 H% S0 Z6 b: w) @+ }$ e, u
   }
8 k4 ]! ]0 l# T2 K   clrscr();
# [# j% k- G* o( X$ \9 |5 E   printf("          output of priority:\n");- ]" h# @& Q/ g/ O! r1 `9 @
   printf("************************************************\n");5 T3 ?# z' Z8 M/ U: m5 E, l2 j8 A8 ~
   prt(alg);  /*输出进程PCB信息*/
* I* f) ~: h' s6 Q   run=ready; /*将就绪队列的第一个进程投入运行*/7 f  S. P# B) p1 R/ K6 r7 }
   ready=ready-&gt;next;4 S9 O) @% a4 L3 a/ e8 i0 f
   run-&gt;state='R';
) I  I* |& t2 i; ^* d8 \}
2 F+ `/ U" E- T/ y/ b- C; Y/*轮转法创建进程PCB*/: ?2 |+ l! G: g. {' I; l
void create2(char alg)
, e9 {2 |! U* \$ M% z; ?{9 d; W5 h, A( l. G( k# i1 g
   PCB *p;9 I( _9 ?+ {$ p+ S
   int i,time;2 f+ b" i0 e# B6 d9 c, o- L
   char na[10];
% Q: F8 u: m- ~   ready=NULL;( A  K4 H, z) \+ b# C
   finish=NULL;
: |3 r5 l% G' c   run=NULL;" Q6 s' j& _0 u8 L3 M
   printf("Enter name and time of round process\n");
6 q9 p* `! q& P* l, S   for(i=1;i&lt;=N;i++)
  h  ?9 i( l6 V& u( f+ X; k" T, T   {
  V& e. p* N2 U; P, z      p=malloc(sizeof(PCB));
1 }0 Z7 F) |4 Q, |, [* v      scanf("%s",na);! }  I3 P3 T7 V4 Y, B& n/ \
      scanf("%d",&amp;time);
6 t( T8 A2 p8 y- }6 P7 M6 x      strcpy(p-&gt;name,na);
. V+ x, N% B. D; F) K  Y      p-&gt;cputime=0;' a* |0 u5 C, J
      p-&gt;needtime=time;4 |8 y  O) X2 M: G: x0 H
      p-&gt;count=0; /*计数器*/# j$ v2 g! T$ S5 d$ y6 d8 u$ e
      p-&gt;state='w';
1 t9 w! r' ]2 J2 t. R4 G# b, {      p-&gt;round=2;  /*时间片*/" P5 e1 v: ]  p/ i% M# w
      if(ready!=NULL)
7 m1 N* c# f; |         insert2(p);
3 j) h7 x3 z( ~' R7 W4 H- e! Y      else
: o8 `: Q1 W% m/ p( X6 Q6 B. a! B      {7 M' A* z- o  r: F$ l
         p-&gt;next=ready;/ n; _5 Y/ ?) e, C) u' H
         ready=p;! P( \3 e9 i, V' v
         tail=p;- f2 D: y% R" l+ t7 @& v  ^
      }
4 h! [9 g* T" h1 q2 A- q; r8 J   }8 s# G# T$ i7 R* ~
   clrscr();
7 I/ }+ o* c1 W  d' d7 m, b; J   printf("              output of round\n");& j5 {  ]' F/ _2 P
   printf("************************************************\n");
- ^; d* [' E* [: o   prt(alg);   /*输出进程PCB信息*/1 g! o  m4 o2 R( L' @
   run=ready;  /*将就绪队列的第一个进程投入运行*/( T" D: b" \+ K; d2 ?' z3 m  L" N# E
   ready=ready-&gt;next;7 d; A( t0 H; \5 S# J" j/ a
   run-&gt;state='R';
2 k# o6 n3 f9 S% T}8 D7 Y+ ^1 q1 k  r1 F9 ?
/*优先数调度算法*/
! Y2 u5 V/ y/ J+ hpriority(char alg)
6 {$ }, ?0 ?  Y! Q( e/ I) R{7 V1 }6 j7 x# U8 o. g- W( n6 c: X
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/' {2 u; M) V) K# O! U4 j
   {( r0 B; n5 N5 C  H5 b& ^! J
      run-&gt;cputime=run-&gt;cputime+1;# _7 f% C9 C8 P; w8 z; n3 Q7 @" u5 [
      run-&gt;needtime=run-&gt;needtime-1;
- B/ a/ o4 @6 j& C  Y9 ~+ K      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/# @+ Q- x4 a' a
      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/" E0 c2 Y* [$ S& L8 I8 k5 M8 ?4 e
      {
* @, i2 a+ V% x2 V9 H$ \         run-&gt;next=finish;
- \2 c# C9 C( _; I         finish=run;
" h. d' ~3 x1 l: f+ ^7 E5 t         run-&gt;state='F';  /*置状态为完成态*/# ^( W% |% {; G# e' V2 T
         run=NULL;  /*运行队列头指针为空*/
8 `% Q; E8 c, a$ W) k9 c         if(ready!=NULL) /*如就绪队列不空*/* N0 D9 S3 W  _- `; _& M! B/ s, }
            firstin(); /*将就绪对列的第一个进程投入运行*/
) K) w0 K, \- }  Q      }
, x3 k& A8 p' a4 K( s; T      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
) r" b) q! f+ B9 Q7 P$ Q) t         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))
# a+ S+ r3 F/ c# F/ B6 W; F6 ^" G         {) E, Y3 e. {: z; h: n
            run-&gt;state='W';
+ ~- P" F+ q6 t            insert1(run);
) I; I5 F  D. N            firstin(); /*将就绪队列的第一个进程投入运行*/
3 E9 {# u; Y+ P% h         }
; c- X/ q* _& ?* _) j" I      prt(alg); /*输出进程PCB信息*/4 f8 i1 ]4 }2 P: g0 @/ V% _3 P
   }
! Q( G" j/ C& |5 b( V  k3 ?}
9 E( o; o! `: z* E/*时间片轮转法*/8 l# a' f/ O6 N( N
roundrun(char alg)
! J+ o  j1 q: Z- ^{
. h3 c, \  q1 O   while(run!=NULL)
/ L# S, z/ Y" Q8 ~/ `   {
  E1 P/ G! q; {4 ^! A. M6 [! x! i      run-&gt;cputime=run-&gt;cputime+1;- `6 n% j8 R! U3 q" \1 l* J: `/ m
      run-&gt;needtime=run-&gt;needtime-1;( L0 v% C& \1 t( x7 I( O! v
      run-&gt;count=run-&gt;count+1;4 K& {# J0 i5 R
      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
  \7 Z  E6 d. o      {7 K2 G) q  t! _: E2 _& T
         run-&gt;next=finish;
, y9 q8 C4 s# W6 q' H         finish=run;
; |2 J6 n/ k+ A' k6 w         run-&gt;state='F';- @3 a9 D% ^% Q. Y* U
         run=NULL;
% L+ W& D7 N8 M1 O' S  O         if(ready!=NULL)
5 j+ ^- ^0 Y$ Y) ]9 M            firstin(); /*就绪对列不空,将第一个进程投入运行*/
; ]# R/ a6 {  T  Z' d) h      }
6 L& y: ?9 v2 Z& E" w1 R      else: [) D7 G& {9 g' j% }7 N
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/1 X. j* j' j: c; M5 O
         {
1 F2 M% \7 Z9 @/ u1 F4 Q            run-&gt;count=0;  /*计数器置0*/
: \( j8 D0 s$ ?7 P/ `. U            if(ready!=NULL) /*如就绪队列不空*/
: m( t$ D0 I+ K2 u+ h' v+ ~/ A" ?, H( u            {
( J' f/ X& r* S. W               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
+ G% v; a5 l  V% a! Y, i/ L7 V: L               insert2(run);
$ ^2 w+ M1 l4 M* R1 v               firstin(); /*将就绪对列的第一个进程投入运行*/
8 o% u, s$ F- S3 G* K  S- l, M, q: u            }
# w9 Z3 a6 o) c         }
; P0 A1 y6 |0 {" `& L8 n  U8 D      prt(alg); /*输出进程信息*/
! M1 `2 _( ^% C+ M, q( v# ^# |$ l! f   }) [6 e) n& P8 j) I
}
4 D' B  K3 w& A# p" Q5 j' i/*主函数*/1 d2 F+ @3 u% E
main()+ A0 Z; x' H5 {- C
{# t1 `8 @/ ~( ^1 D+ C
   char algo;  /*算法标记*/5 `8 {8 H* O' P7 @& n: R$ x
   clrscr();
2 ]$ `# o6 _, Q8 k% F   printf("type the algorithm/R(priority/roundrobin)\n");
( Y6 K/ X0 i4 L   scanf("%c",&amp;algo); /*输入字符确定算法*/
7 K- \& d( U6 L6 \& g) |   printf("Enter process number\n");, m& e4 `' v8 h% m6 P) o
   scanf("%d",&amp;N); /*输入进程数*/
, h' u9 g' \4 W1 X; f; j   if(algo=='P'||algo=='p')
! ?- \" b8 q; ?) h3 n8 T: }1 q) N   {$ i' l6 ^- w  C. I
      create1(algo); /*优先数法*/
! {8 _! ^: W# j9 j* ]      priority(algo);
0 r. U. m$ P5 m8 t+ g3 s   }
, V8 Q6 q3 A* W3 D9 m# T. {- ~   else  m' `% I. x" u0 n* @
      if(algo=='R'||algo=='r')
/ u$ O; @+ N" k6 y      {+ o9 F9 A. @& o8 U: x
         create2(algo); /*轮转法*/
- C. d+ D1 z# x         roundrun(algo);  \0 F5 `; Q3 F, i" j1 n  j% c1 ?
      }: h5 S) D! G" U: v' Y8 E
}, H4 c( r. o; |4 s; Z& g6 l
</pre>

gVBZFryb.rar

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

该用户从未签到

2#
发表于 2016-7-2 14:15 | 只看该作者
谢谢分享,必须赞一个~7 N# C6 Y5 S7 f5 P

该用户从未签到

3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈  F# a- F- {2 C( S/ U( M! c) C

该用户从未签到

4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!$ G4 V5 b: s3 `1 F

该用户从未签到

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

该用户从未签到

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

该用户从未签到

7#
发表于 2016-7-7 09:06 | 只看该作者
这资料确实不错……, r8 S# j' d* C1 c2 E
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-31 16:48 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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