找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 96|回复: 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 源程序*/
) I. ]4 ^. C; n$ A9 s( d3 m% |7 o#include "stdio.h"
8 N! F( j( J( ^#include "stdlib.h"9 S+ Y+ V3 X: [$ _6 x
#include "string.h"2 L4 w! N8 D$ }# [# c% y' o$ p
typedef struct node$ l1 @/ j  O* J& N8 Y, W" d' q
{" @8 l# M: E, J/ n6 y+ W
   char name[10];  /*进程标识符*/
+ V, l  j3 z  v* y: s3 l# C   int prio;   /*进程优先数*/
( f$ F# F$ _1 L7 x  K6 w1 V5 X: e   int round;  /*进程时间轮转时间片*/5 e+ S% F1 E' p) n1 {
   int cputime; /*进程占用CPU时间*/3 b- C% x) U+ `+ U- \  x# [
   int needtime; /*进程到完成还要的时间*/* e, O4 R# F$ T: j0 Q1 V
   int count;  /*计数器*/! o2 B1 {) ?, {  Z) _  J9 Q7 _
   char state; /*进程的状态*/( P3 ^) t1 F  {0 f3 J3 k, ?4 m
   struct node *next; /*链指针*/, H' w9 k( f9 n# d* S
}PCB;+ b$ m1 B" I# V+ B$ `6 p" X8 i* A
PCB *finish,*ready,*tail,*run; /*队列指针*/
- M# D) J/ G  M2 t6 R# F, mint N; /*进程数*/2 A5 e  m$ [0 n+ k  g( J8 W" _
/*将就绪队列中的第一个进程投入运行*/
& \9 V0 k6 g# a. q8 _2 Mfirstin()/ t3 d; f8 v2 k
{1 ?( b9 ]/ J) M, a# I5 r
   run=ready;   /*就绪队列头指针赋值给运行头指针*/) Y1 B! {8 U% X: H) K1 q, C
   run-&gt;state='R';   /*进程状态变为运行态*/( d: Y2 C) N% ~6 U0 }
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/
& q% H7 ~; L* R5 z$ d; s5 y) R3 m; s6 ^}
: q3 {( X( ?8 f$ F/*标题输出函数*/
  a* z0 r5 r: N9 A, B8 {void prt1(char a)
6 Y" n0 A3 H7 _2 P7 o8 e, @& P{3 t& _6 F  Z# d& H) U1 f# @: q- I
   if(toupper(a)=='P') /*优先数法*/
1 z2 |+ z# l! A) {      printf("  name     cputime  needtime  priority  state\n");
  q8 |, D6 ]  N2 q# V4 q6 m; n" q* w   else9 @8 `3 `, R4 {2 o2 \. A% m
      printf("  name     cputime  needtime   count   round     state\n");
9 G$ h9 ~, ]1 v( h& V; a}1 E4 X/ t' {/ Q9 A
/*进程PCB输出*/
, g* ?( D( v6 fvoid prt2(char a,PCB *q)
' t( D2 n7 @$ w3 s{, a- s# W7 z' l+ B
   if(toupper(a)=='P')  /*优先数法的输出*/
6 z. v7 Z: t+ l) K; ]& e' I      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
# O7 F! F) O' e7 [  _       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
$ F, F8 {* `0 }1 f6 R   else/*轮转法的输出*/
$ _3 K, J6 }0 ?      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,2 Y2 ^8 J& V* w
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);" K* `' B6 Q! j3 l0 D8 k$ i
}
. s5 k/ @; N% w/*输出函数*/: d* |/ x* G. D* H) ]
void prt(char algo)# q6 A+ I% X8 b: D# b
{
9 J6 B/ R2 S6 t) i   PCB *p;
5 Y/ W6 G- T6 G6 G& y   prt1(algo);  /*输出标题*/. S9 N. C' J7 R$ S* i
   if(run!=NULL) /*如果运行指针不空*/8 j6 J1 A- g+ }( Q% z. |& O7 M
      prt2(algo,run); /*输出当前正在运行的PCB*/
! o$ ~( L- Q7 @3 S" j   p=ready;  /*输出就绪队列PCB*/
: m. {' C( Q8 m5 H& B" W' j   while(p!=NULL)
8 J, Z9 @; L3 m' v; K/ l' ]   {' g* Y( j3 K) ~# ^/ }; C
      prt2(algo,p);; U( E! [/ a  ~( v0 F6 E3 @/ s
      p=p-&gt;next;- A- R' m6 P9 I2 a# h4 H
   }4 C# l$ S% _. E" ]) v
   p=finish;  /*输出完成队列的PCB*/0 u1 z0 p7 ~0 V3 g. g; y  R
   while(p!=NULL)4 C& N$ R, P: V0 p0 ~" J
   {6 |. R2 V/ J# e3 S8 n
      prt2(algo,p);6 V- V2 H5 w. y
      p=p-&gt;next;! [  z4 D9 @( M! ^  _$ [3 l
   }
9 b/ R8 Y$ |9 e% Z; Q   getch();  /*压任意键继续*/
* ]2 V2 h. z* Q7 P2 R}# {) I, `, _; c0 l  `6 r
/*优先数的插入算法*/
2 E8 R& c6 g. C, E7 Linsert1(PCB *q)
) t5 R. M: J* k9 g" C{
. W5 z" K# [+ l# E   PCB *p1,*s,*r;
$ J* t8 H" w2 |( S  s2 a   int b;
) {7 d  T5 R- |" P& h   s=q;  /*待插入的PCB指针*/
0 J. W% H0 R( x, J7 S# D, i   p1=ready; /*就绪队列头指针*/
# `6 U5 d! v" Y   r=p1; /*r做p1的前驱指针*/
' G5 |9 V# m* Z' P% u   b=1;
  B9 _" x3 m; @/ R- W   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/; M  _; i' N, H( C' z) g3 ~
      if(p1-&gt;prio&gt;=s-&gt;prio)
* P. ~8 b% Z6 k      {
" n5 m# a5 V: O2 w- g         r=p1;
7 F" x6 P" X! l+ d+ c. Y& X         p1=p1-&gt;next;6 d& ]7 o' J6 w# A
      }9 A- U- [5 b3 ^6 c
      else. D, _3 A- t! V, x) m- K, r
         b=0;& L7 }! S* K$ R. F
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
% T9 {' H6 {8 d. Z; y7 r4 y3 D8 q   {0 B* K. x+ J/ C3 w8 y8 E
      r-&gt;next=s;
2 C* [* [8 q4 W! x      s-&gt;next=p1;  e8 Z& D" }" k" w) Q, S; r
   }6 C. @. e5 @  Q1 h
   else4 C) U5 Y# n: z
   {
: q" w7 m& M# L      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
  j, O& h) H7 |( r: P- y1 m! s0 \      ready=s;
9 V7 s2 R# C7 d4 F! d   }6 @& H/ ?6 ~7 S4 M  Q* u
}
+ t1 P1 _- f" i) F, c4 P2 C# M/*轮转法插入函数*/4 {5 C( f* Q) n/ _
insert2(PCB *p2)) Z: z1 J. e8 [; D7 V% j
{) i9 \* b* s# i4 n# x0 m
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/( E4 V' |7 z/ a. r2 _  |
   tail=p2;2 H6 \: Z( x" ~" i# A1 R9 i: F
   p2-&gt;next=NULL;+ S( i- E; y9 O( L
}
) n+ J4 A. {; ~+ B" r% w1 i) t" ^  s/*优先数创建初始PCB信息*/6 Q4 o7 V1 |% }  T2 y  O
void create1(char alg)
( X+ F2 u& d3 E. C6 E* H6 H{2 F4 r; D8 {2 J7 E
   PCB *p;
) L8 i( J+ u, ]   int i,time;$ z( t, P9 k1 D
   char na[10];! x8 P' A" t/ r; s4 k* t# ~
   ready=NULL; /*就绪队列头指针*/* d2 ^/ R: `- X7 N7 K+ L: Y5 E
   finish=NULL;  /*完成队列头指针*/
+ K7 F4 W7 Y$ }. W   run=NULL; /*运行队列指针*/. j7 k' L5 S7 k3 Q) ?2 o4 b' Z
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/4 m4 _6 |! z2 }3 [7 R6 o1 c) J
   for(i=1;i&lt;=N;i++)
' q: S8 N* [# t. `& @, m8 D9 y. x   {, X4 g" ^$ G+ O' t) M
      p=malloc(sizeof(PCB));
, v8 k7 F6 `  D& a9 _( M( ?      scanf("%s",na);
. S" T+ K* n9 Z! A' ~$ B      scanf("%d",&amp;time);
' u# q/ M) T$ \- ~9 b# y5 \      strcpy(p-&gt;name,na);
& \) T7 ~# Q1 A% F$ a( N      p-&gt;cputime=0;
: M  u5 H( u: |  t7 a      p-&gt;needtime=time;* Q4 E  M/ z4 A' I4 |( A
      p-&gt;state='w';
" S# `1 G: ~+ S- v0 l$ x      p-&gt;prio=50-time;
# n! [4 G9 [" a) T2 Q7 s, T  V      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
: k5 R4 u7 i5 B& M0 H/ [  F         insert1(p);  k% h* \  L" q
      else; i. y7 v" t9 p) Z6 I( B1 O
      {
, ?+ f" O# {4 E; m! a2 ]# D& X         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
7 e3 J' K, B" ~+ X$ A         ready=p;
5 u9 k- @" O$ S- n7 r9 q, V      }
3 I6 ]/ @0 j; ~4 P7 H   }
' i7 e# a: r1 A. u  T  p; r   clrscr();, z  m8 J+ v; E
   printf("          output of priority:\n");
6 x  m: Y% t2 q& C   printf("************************************************\n");; j+ z7 B7 e% T+ K/ w8 k: J
   prt(alg);  /*输出进程PCB信息*/- L2 `: S) E2 O" n" F8 w5 A0 P2 |* X
   run=ready; /*将就绪队列的第一个进程投入运行*/$ c: H9 o$ u" m6 v
   ready=ready-&gt;next;" D; I- v0 H7 @
   run-&gt;state='R';
, @, {- I7 R( M" o2 [}* Q& Q' k  S3 f9 S
/*轮转法创建进程PCB*/
. `4 e* s- m# mvoid create2(char alg)
  A" x3 s' t! N+ W* T5 h( i{
& N3 P! ^, D) f% M   PCB *p;
2 p- n! D+ M- W5 j* Z   int i,time;
  F# F' f8 f- X8 \1 Q   char na[10];
* D+ D  c& P6 i; @   ready=NULL;
- z9 X  r# E8 N. B3 T   finish=NULL;6 {' ~5 ]8 U2 Q" D9 m/ H7 k
   run=NULL;
$ O# G. `5 F. Y   printf("Enter name and time of round process\n");, K4 R; A+ h8 h4 [
   for(i=1;i&lt;=N;i++)
5 c9 t- ~5 o$ j   {% n' Y, ?; E; h. d
      p=malloc(sizeof(PCB));
8 p  o* q" I* m: N* l5 b$ Z3 Z      scanf("%s",na);
4 x7 M; _/ C% `/ R5 d% ?7 Z      scanf("%d",&amp;time);
" n9 T% `! ]3 d, X# _4 g# s2 S      strcpy(p-&gt;name,na);8 F' S6 G* k% H/ ?+ E) S4 x
      p-&gt;cputime=0;
3 x& F  p7 p% [" p      p-&gt;needtime=time;- s/ E) y( F/ {" U
      p-&gt;count=0; /*计数器*/! ^4 I5 p, i' P$ p" a0 L2 q/ O5 D7 w# @
      p-&gt;state='w';
# ?8 j7 H2 r: y  m. C      p-&gt;round=2;  /*时间片*/
7 d0 G# K( o& X3 c/ H  M      if(ready!=NULL)( v. N& U2 _1 c' \' I' {
         insert2(p);
% K' {! @8 u' y2 b- H* ^      else
" }4 M& c: Z7 Q4 W/ M. }$ I      {
6 P* O" T( G9 X8 ~         p-&gt;next=ready;9 f- ?% X: n  M% v7 q; T7 a  [
         ready=p;' p- Y/ t$ l5 e/ J5 T4 {
         tail=p;
* H- ~; V/ e1 @9 E7 G; C, `4 D# N      }$ g7 U! Q$ G) o. P
   }$ a  c# j, E0 z( k* }
   clrscr();% \8 q: D) n6 R
   printf("              output of round\n");/ H" @! O, b# v% j6 \) D* d
   printf("************************************************\n");
4 P; r, G6 d2 z8 }! v* K2 _/ \  [   prt(alg);   /*输出进程PCB信息*/
$ O5 f9 j( \1 W0 Q8 I6 s   run=ready;  /*将就绪队列的第一个进程投入运行*/- j4 J+ w& p; \' E9 k/ X
   ready=ready-&gt;next;# l6 G. w$ m( `+ T; a0 w' h
   run-&gt;state='R';
5 Q" p( P8 s5 e8 m0 Q}
  Q7 J8 A+ t0 s& d  c" l0 Z/*优先数调度算法*/
( Z# R& k5 n0 _2 F" d) gpriority(char alg)/ I+ O" Q% J" W, P. \+ S9 H
{! t2 }; g5 x0 S$ F6 S4 H
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/
/ ^4 i( `, f& v. ?0 d9 k+ I' k   {
1 i' A: n' G+ g  y      run-&gt;cputime=run-&gt;cputime+1;1 A$ @; q: c& Q5 F4 C/ n/ a" `
      run-&gt;needtime=run-&gt;needtime-1;: r# S$ r1 e: W% E
      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/
9 k4 h) D2 f3 m$ b8 D      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/* C. @: ?! a/ D! a" x+ [6 W/ v4 Y
      {3 C0 z7 @1 t7 k: S+ }0 C' N. a
         run-&gt;next=finish;
9 z6 r8 k( O; i: H9 Y         finish=run;5 y& ~0 d- P8 Z9 |4 a  l: p
         run-&gt;state='F';  /*置状态为完成态*/
5 X& n' T5 Y4 D         run=NULL;  /*运行队列头指针为空*/& y$ N7 [' [4 k! k0 ?
         if(ready!=NULL) /*如就绪队列不空*/
/ X' c$ s* J4 o            firstin(); /*将就绪对列的第一个进程投入运行*/6 ~: \+ q1 e5 v" H- ~
      }" M9 J' l6 K* z
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/, R5 e5 m9 P$ M. u( d
         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))" k0 M; |! S, K8 V
         {2 B' `4 K7 W% l, j. N4 n  g. r) d0 M
            run-&gt;state='W';
7 @$ \& k4 ^! j( W7 \4 x1 q            insert1(run);2 u4 k7 q: {8 i: Y  ]
            firstin(); /*将就绪队列的第一个进程投入运行*/" b0 t4 P6 j! {0 `- c
         }* x, c8 T& m# H8 h( u4 \
      prt(alg); /*输出进程PCB信息*/2 c# I* N7 s* T# `, W% E9 A
   }' x9 X% N! z! R, ?1 M" ?
}
; s5 H9 Q" P4 V6 |/*时间片轮转法*/
$ X; P5 P  y& n" S( sroundrun(char alg), t6 S! s; O+ s3 s/ d& u
{- {6 _, l& P1 T3 B' P8 K
   while(run!=NULL)
' u( u& o/ @. g# w5 K7 D+ V   {! Z; Q# u3 J  p, o1 n
      run-&gt;cputime=run-&gt;cputime+1;' A0 F5 h- g* v* ~1 T# p& q
      run-&gt;needtime=run-&gt;needtime-1;
3 {/ }7 [/ D6 V) Y4 Y7 U; G/ J      run-&gt;count=run-&gt;count+1;
9 r6 N# s. H+ C6 p1 s      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
" G  c0 N' v. q1 j# ]* X8 R& x0 q) M      {  C  D7 R0 a5 _& C7 H8 B# i
         run-&gt;next=finish;$ t/ g2 Y) f. V7 o, f* S
         finish=run;; g: {3 h/ l+ {$ T$ ~
         run-&gt;state='F';
8 ?1 k; N6 E* Z2 @7 {9 _         run=NULL;0 E0 {( r0 j6 d+ s+ M8 d2 B& }
         if(ready!=NULL)
: }7 ~9 b  E8 J* I3 E/ z            firstin(); /*就绪对列不空,将第一个进程投入运行*/: q7 q# m3 J  f: `# V
      }
. ]" i( I3 N- \  b      else; R1 |$ l( k* ?$ J. R# r6 C
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/% j  X3 M( \$ i+ \5 Y. v) H
         {
* N6 b) [8 i4 `  a8 e* ^0 U3 ]            run-&gt;count=0;  /*计数器置0*/' m3 y5 T) k! ~' f( I
            if(ready!=NULL) /*如就绪队列不空*/6 U! X! A" e# T# K, U% X
            {
5 ~5 g9 I* A% `0 `               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/1 o. |/ C. }3 k1 f0 k9 _" }
               insert2(run);  c6 i- S1 D0 L9 q
               firstin(); /*将就绪对列的第一个进程投入运行*/2 h% Z8 d* K$ ]1 E, Q
            }: ^3 k6 d, _) D
         }9 V8 s  q+ ?9 t0 B8 c- J
      prt(alg); /*输出进程信息*/
/ u4 u6 K% y* e. l+ G' J- j   }3 P3 ^2 G3 P7 d! G8 F" B) J
}
: X, W; T+ e+ X/*主函数*/0 l) \, t: ?& ^3 n# q4 d
main()
# B0 I; G0 A  H/ R5 L{% h9 J+ t5 y$ }1 T& o. [
   char algo;  /*算法标记*/  u3 r7 N  j" O$ @$ T
   clrscr();
2 V: C% e  B* @0 a   printf("type the algorithm/R(priority/roundrobin)\n");; {8 V( _8 e( D  C+ |0 k  I" V+ `
   scanf("%c",&amp;algo); /*输入字符确定算法*/) c- I' _& ?4 {  h* \! i
   printf("Enter process number\n");
6 b" u( b/ `9 M" \+ p5 s) ~   scanf("%d",&amp;N); /*输入进程数*/
  V' H5 a! m) r$ f2 U) n   if(algo=='P'||algo=='p')
% C; \; ~8 i0 d  H  c' l* ^) ^   {
" K* M- z' @1 B" ~3 E      create1(algo); /*优先数法*/5 A. g0 S. v$ w9 j
      priority(algo);3 E! G* N6 L7 J7 ]0 D
   }
. }1 ~5 g' f1 d: ^5 z+ G   else
7 O0 _; Q" B/ H' I5 a      if(algo=='R'||algo=='r')% v7 O  e+ l8 k5 D& G! `
      {
+ P0 L) i' L! P         create2(algo); /*轮转法*/
/ b1 f  I6 f4 A' L3 F         roundrun(algo);6 ^; D$ l% J* S6 g6 S! p7 u3 p
      }# f( E' b3 t1 r3 m
}, s. n- e* n% \5 {# g, m) G
</pre>

gVBZFryb.rar

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

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

162

主题

614

帖子

1255

积分

四级会员(40)

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

积分
1255
7#
发表于 2016-7-7 09:06 | 只看该作者
这资料确实不错……5 q3 K1 X0 s3 @3 O4 P% P! G

156

主题

543

帖子

1180

积分

四级会员(40)

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

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

262

主题

1157

帖子

2065

积分

四级会员(40)

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

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

214

主题

642

帖子

1658

积分

四级会员(40)

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

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!
" K. K) {- G" y2 K/ t/ c" R

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
5 x  m* U: d* G2 L* b- T" ^

159

主题

583

帖子

1229

积分

四级会员(40)

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

积分
1229
2#
发表于 2016-7-2 14:15 | 只看该作者
谢谢分享,必须赞一个~& @  G/ k7 ?! V; ^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-1 20:54 , Processed in 0.065282 second(s), 35 queries , Gzip On.

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

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

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