找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 92|回复: 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 源程序*// s3 B0 Y- n5 d* v9 i* n# E( U
#include "stdio.h"
" u9 i- K* D0 b: ?+ {4 U5 y% h#include "stdlib.h"+ T3 z' V4 D" S7 G$ G9 [  }
#include "string.h"! ^  {2 ~; l5 w9 f' J
typedef struct node% d3 h/ ]( b7 P% B# }3 A
{
) ~# a5 d2 i2 a' P   char name[10];  /*进程标识符*/% f4 u9 |7 P" ?& J& [% H
   int prio;   /*进程优先数*/
- H) J  K7 P0 T; U8 X, I   int round;  /*进程时间轮转时间片*/# W: X6 I) p/ F7 [
   int cputime; /*进程占用CPU时间*/, q& `6 c4 d, F( p
   int needtime; /*进程到完成还要的时间*/
5 X( j% j- B1 Y   int count;  /*计数器*/) u1 J; g6 e# B' s2 n
   char state; /*进程的状态*/  M. E* u: B/ s
   struct node *next; /*链指针*/& a" h# O( J0 B- E! s. h5 x
}PCB;
. J% s0 ~0 U5 JPCB *finish,*ready,*tail,*run; /*队列指针*/
2 {  Z8 B+ p2 h5 V) nint N; /*进程数*/3 p% p, k$ w. C6 z
/*将就绪队列中的第一个进程投入运行*/
& _6 b& b) `0 @& @+ ^firstin()( Z: O# b5 ]/ o" K: N2 y
{4 A7 Q' Y4 e( e! z, x2 j
   run=ready;   /*就绪队列头指针赋值给运行头指针*/
* z4 B  y$ o4 x* K- ^1 H& V$ g, T/ Z   run-&gt;state='R';   /*进程状态变为运行态*/$ c+ g- t5 `6 }% B: {6 I9 [2 i
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/3 j. ^1 c$ N2 S' G
}) `, W8 p3 h/ X( @" {! o
/*标题输出函数*/+ A7 d! Y0 U8 {% E5 b
void prt1(char a)
* L) `( v' Q$ S+ T{6 T- _3 j. x3 c7 N: u8 o# E, I
   if(toupper(a)=='P') /*优先数法*/
  E4 N  a: a5 C# ~5 T- G      printf("  name     cputime  needtime  priority  state\n");: B$ U( z) O- Q+ _& D( Q2 M( D3 }. h
   else
% Z+ H! ~! ]7 n4 M! A      printf("  name     cputime  needtime   count   round     state\n");/ I9 R  S$ a7 X& p( Z$ I: y
}& t( s4 c" N* x# |; K
/*进程PCB输出*/) O" W+ s- p! N) s
void prt2(char a,PCB *q)( b$ L. P1 Y, t+ {7 Z
{- {( h) P9 W  z, k1 l
   if(toupper(a)=='P')  /*优先数法的输出*/, t9 B0 _$ H& A$ G
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
4 z: ]* o1 R0 G# K       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);) ]2 u8 E. h8 Q
   else/*轮转法的输出*/3 Z1 v* @( G  K5 v/ y/ |
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,% w  ~- i% y% J! s2 W
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);' c1 u9 X- O  J; @
}
9 V. i( _1 `! e& s  \) }/*输出函数*/9 d/ Z4 u* A8 A% i( \4 D, H: s
void prt(char algo)
& u& {. X; k& ^& b0 ~3 t# ]{+ m4 p. S& P3 ]% G1 d
   PCB *p;( V( W1 T2 A, {. L- n- Q# ^
   prt1(algo);  /*输出标题*/
! n( d$ v! Y  \. w& t   if(run!=NULL) /*如果运行指针不空*/
& |  B$ U4 y3 ]+ B      prt2(algo,run); /*输出当前正在运行的PCB*/6 M1 A7 e# r1 T" ^3 t! p6 T0 k; k7 A
   p=ready;  /*输出就绪队列PCB*/1 p. l& L9 b  R7 H
   while(p!=NULL)
* _: N% f% O7 z- J% v* D$ P   {
9 m1 J" E# E% t* @      prt2(algo,p);
; n% G9 n# V3 u* `      p=p-&gt;next;7 N' m* V1 q. ~6 G0 A  p& b
   }
# [# |1 [6 g7 t. S7 k   p=finish;  /*输出完成队列的PCB*/
, U' I$ h) R1 S) l   while(p!=NULL)
0 ?: Q$ r" J- `   {: G& ^" S7 C8 M7 a! t9 k8 }7 {
      prt2(algo,p);
2 ^7 x- m- l" A: x& p( P$ e5 l      p=p-&gt;next;$ j( U4 I* a, x8 E$ K
   }
4 Q1 Z( z5 x. C1 e   getch();  /*压任意键继续*/
9 W, w4 r7 l7 F( y) R% P8 N}8 c" k% S. A- F5 y
/*优先数的插入算法*/
. c4 ^- }7 ^7 R0 l- winsert1(PCB *q)5 s  g. ]9 R) e
{! f1 C% L8 E; F' W" ~7 a
   PCB *p1,*s,*r;( v% Z, ~6 p' ^/ x
   int b;
0 _' N( ?: t& A7 M. k& ?: B   s=q;  /*待插入的PCB指针*/
1 R% A) h4 `) [) v+ S   p1=ready; /*就绪队列头指针*/- N$ i( {: f6 t
   r=p1; /*r做p1的前驱指针*/6 q+ o' j* a, u5 T+ e0 H; ?" i5 Q
   b=1;: r- U4 G' y* O
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/' T  n3 C' _: V  y
      if(p1-&gt;prio&gt;=s-&gt;prio)' \. ]; M/ X  u+ ~. g3 C% u
      {, Q, ]6 |% p# U+ F
         r=p1;0 }1 @! S8 y* \' y# o; Y
         p1=p1-&gt;next;
; j+ P4 v% s3 w% E2 A" k3 ?' k      }
5 H; n1 O$ a1 P      else( R5 f' n! D' S/ ~; g
         b=0;$ E( K) b. w" N3 a1 m% e
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/7 h" R; m' h. B1 ?
   {
% d- M' n0 k8 [5 Z) r8 Q      r-&gt;next=s;& o% Z  C  d  a8 Q2 @  ]- ^. c
      s-&gt;next=p1;+ _, l2 I9 [) r& p0 Q6 z
   }
- V3 X; Y! r/ _   else* H4 V! \- ]7 s& w0 I0 \
   {
0 d  R6 y* N3 H( ]7 Q; _      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
& g. \. t0 I" o; l9 b4 W      ready=s;
4 `9 i, E! M- T( o1 O8 h: Y# l   }* t# n' Q3 R. ?7 m8 V
}
6 h& g/ o/ z  h! a0 P/*轮转法插入函数*/
6 m" l% D0 J3 U2 winsert2(PCB *p2)
& e! u4 ^+ I; n( j* D1 d6 x! o{
8 E0 ]: c+ c" b1 e   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
" j# t, j' L7 S8 J2 B! Z. Y/ j! i   tail=p2;# D. Z2 E1 T  n! b/ y. p$ S/ a, d
   p2-&gt;next=NULL;5 p8 N# k) W, x  [0 ^
}2 r% |2 F" a  s# s* v3 a6 \3 U
/*优先数创建初始PCB信息*/) \. W: V8 L0 n' Y, u. Y
void create1(char alg)) M: `5 e6 F3 s$ F) I6 }1 D
{
, @3 \% \1 a( h$ F- ]# ^. g   PCB *p;
1 K1 N5 G1 b7 E8 O3 M& A, h   int i,time;% u5 u2 S% I* T
   char na[10];
+ R2 h4 [5 w  B. y8 i( X) f+ j   ready=NULL; /*就绪队列头指针*/
- K/ y( V3 v, J' I6 p' y   finish=NULL;  /*完成队列头指针*/
! k% t6 S' N0 v& E7 r  P, F2 D   run=NULL; /*运行队列指针*/
8 Y$ S' {5 w: Y* N- q% j   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
% }  M* D2 c& g. l4 T% ~   for(i=1;i&lt;=N;i++)
) F( d: P& ^$ H   {
6 T* _5 |+ K' |( R9 s      p=malloc(sizeof(PCB));
3 _/ v5 M& F$ Z9 S      scanf("%s",na);6 b( i7 z8 Z7 ]0 Q) `
      scanf("%d",&amp;time);
& V2 t/ [0 S  @; u) |      strcpy(p-&gt;name,na);
1 k4 U- M1 L8 O0 \8 H4 s3 {, w      p-&gt;cputime=0;. X! Z, D5 L7 M& N' Q
      p-&gt;needtime=time;
4 s0 U; j: q$ ]( I/ U( u6 o      p-&gt;state='w';
4 T7 o" v" J, @3 }8 [2 a6 D      p-&gt;prio=50-time;' o- X  ]- E4 y+ U. d8 k  F$ S% B
      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
8 S+ e/ n! Z4 @  ~4 Z         insert1(p);" @& `, p& U  g) q( G! W0 ~+ e
      else
* u8 ]) w( K" f- J: V      {3 A! A6 o# C# z+ }, A& k, G: H
         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
% U) s! o, d3 O" ?         ready=p;0 f: k$ ~# v; v: u: M4 Y+ N
      }
+ c9 b3 w/ a, [5 n7 h' h. L   }
. N) [+ |) ~) x# j# ]- n# y3 \   clrscr();
# W' c9 u  z2 C   printf("          output of priority:\n");- w0 v; o" ^2 L: _% x
   printf("************************************************\n");
1 E# o9 v" U5 J: ^   prt(alg);  /*输出进程PCB信息*/
. i/ ^. U3 k' N  k   run=ready; /*将就绪队列的第一个进程投入运行*/" B1 M5 C; b5 R8 _% U, G
   ready=ready-&gt;next;
) F& S  R: \3 `. {   run-&gt;state='R';
  ]) {& k5 f3 g' O9 E}. J: V* ?1 q  ~5 V3 d5 b9 I" h' B
/*轮转法创建进程PCB*/
  ?( ]( G! W+ x# S! }% F. Hvoid create2(char alg)1 k+ T$ U+ Y0 e! a. v  b: c
{! K- X5 b$ d9 p" o8 k
   PCB *p;! t, Y) z' S  G4 h; n( h
   int i,time;8 j& a! c  a/ b+ T( i3 l! T
   char na[10];- J  F; N# A$ Q& a- g  }
   ready=NULL;/ ~7 q: w( r8 U! m3 W3 j, A
   finish=NULL;
( d3 m' X7 R! l9 u- }   run=NULL;! z' p) j7 [, p4 A9 S
   printf("Enter name and time of round process\n");( R" q5 L7 s2 n) `2 x6 g3 _- t' D
   for(i=1;i&lt;=N;i++)
4 W3 L3 D5 A( e- N* k   {+ l6 q5 ~) K; B4 ~  ?
      p=malloc(sizeof(PCB));
3 k# Q8 F4 L; W0 p4 E3 k; L      scanf("%s",na);5 q) N2 ~' J4 J' K
      scanf("%d",&amp;time);( _; K; ?  u1 }
      strcpy(p-&gt;name,na);
5 @. A' r6 G$ Z' Q: s$ h8 W      p-&gt;cputime=0;
; r+ b: X! }1 Z4 e7 A      p-&gt;needtime=time;
8 j+ @9 t& \+ p) o% }      p-&gt;count=0; /*计数器*/6 Q9 x1 V; w3 A/ y; G
      p-&gt;state='w';# X3 p8 S: t4 i! F$ Z4 g
      p-&gt;round=2;  /*时间片*/
, g) w& U9 M; g7 O. y* N      if(ready!=NULL)
8 B$ L' R- ]/ G& E         insert2(p);
/ Z5 n! K' I. k9 e! ]. C3 t& t      else- l: ]5 g6 Z- q- g  Y
      {- ?$ d1 A+ M+ j+ D6 m
         p-&gt;next=ready;$ H! \) ]2 s8 B, Q+ e, z
         ready=p;
4 v$ @) r  {2 W         tail=p;: @6 |- {: q( D: X+ I
      }
* s$ n; o( d7 H5 x   }
, [5 n8 x1 ^2 b% B, A   clrscr();+ F! B5 y% _; Y3 y( s: u
   printf("              output of round\n");8 T2 s- }8 B5 R; R7 L
   printf("************************************************\n");
+ b4 b6 f/ }' r5 i   prt(alg);   /*输出进程PCB信息*/
1 q6 h) ^+ z* B   run=ready;  /*将就绪队列的第一个进程投入运行*/& A7 ], ~2 a3 N! V1 w) R0 @
   ready=ready-&gt;next;0 j5 D& m/ ~2 a9 l
   run-&gt;state='R';" T6 M: M* }3 S! n4 I- m6 L
}% d6 E8 v9 q. g, H
/*优先数调度算法*/
/ B  a3 r3 E. n& X+ ppriority(char alg)
+ O, R# d, T/ p5 M7 {; J! w; [4 C{, E( m, c6 s2 z6 ]1 N0 H- h
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/; a7 F  i% w& O, b# U( `, H% _! t
   {
2 ~8 |& \$ a0 d, l      run-&gt;cputime=run-&gt;cputime+1;8 b+ a0 b; x' _7 d
      run-&gt;needtime=run-&gt;needtime-1;% b0 x5 T; |# G& u, s3 N1 x( N
      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/- M7 y) [0 J  a" Y& r. `8 \6 [
      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/
- D4 |3 ?0 R3 o' {- ^      {! L% f! C/ E5 D/ \
         run-&gt;next=finish;
0 N& n6 r# }8 g4 K! ^2 ]( t. b! r         finish=run;6 f& Y" d( N# K# Y* B
         run-&gt;state='F';  /*置状态为完成态*/3 l( F: }8 q% i5 D& b7 B
         run=NULL;  /*运行队列头指针为空*/6 X  Q, k5 J+ n' p" S, J
         if(ready!=NULL) /*如就绪队列不空*/
& r5 H( S  G" @: a, s            firstin(); /*将就绪对列的第一个进程投入运行*/
* q1 c3 g# E. O7 c; Q4 u      }
9 G7 ^0 ^, g4 M      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
, Z. w  y7 W+ |, y4 l1 A         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))3 b, l& D- q. h; W0 `7 I  g
         {
( o4 k3 `7 v/ t( T# N4 {            run-&gt;state='W';
( l. K6 N/ K+ @: z4 J            insert1(run);
& \/ ^- }- N! |% D+ m            firstin(); /*将就绪队列的第一个进程投入运行*/! z) Z0 U# ]8 ]& g8 x0 O
         }; i5 R8 c# o3 w# f) w
      prt(alg); /*输出进程PCB信息*/1 J2 W* z/ u8 p6 _0 N6 M4 a
   }
' X& o: s2 @% V$ Y}
/ X, c" `  w  o' Q/*时间片轮转法*/
6 f% M$ ~- s8 J/ h  H; Proundrun(char alg)9 `% g" k. s/ Q, l" }4 i
{$ k8 V$ U( ]4 v/ l) C; J6 t" q
   while(run!=NULL), O/ m& Z  B2 w2 M/ G
   {" o1 w7 i0 ~6 U: [$ ~
      run-&gt;cputime=run-&gt;cputime+1;6 @) F* j* K( V7 q" j
      run-&gt;needtime=run-&gt;needtime-1;
& d' O( X, o% n9 h* z      run-&gt;count=run-&gt;count+1;
4 W' m6 M! U5 C! f/ d      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
3 @! W) Y& M8 O0 @& M. A      {
6 u" }( r* Z$ V4 g/ F         run-&gt;next=finish;% A6 i4 o# m% p' E  f0 F' h
         finish=run;0 T0 R, ?: R! \' `
         run-&gt;state='F';+ c% V) N. V; A; k7 \( K
         run=NULL;6 r7 u8 l1 K! q7 @; j
         if(ready!=NULL)  [9 n3 n$ L$ ?2 n: \
            firstin(); /*就绪对列不空,将第一个进程投入运行*/
+ T1 K- J5 }* e& f  `! g$ y$ Z/ K      }
# q7 f2 f6 z4 `0 l      else
. ~' z; c: G. j! O$ A( q' W         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/- N, b0 t1 j1 Z% W: ?( n# f8 \2 j
         {; z9 w7 z; s1 T) {8 z! w& |' b3 w
            run-&gt;count=0;  /*计数器置0*/% c- w% K3 ]% q1 z) m7 X
            if(ready!=NULL) /*如就绪队列不空*/; J* I1 n$ C# _. s  u4 I, U
            {
! y+ w8 O3 D  W0 [3 g6 B               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
& W7 H3 t+ z; B0 r; t/ M               insert2(run);
% U( G( }* b6 Y8 \5 z  J* O$ j$ G               firstin(); /*将就绪对列的第一个进程投入运行*/
4 n- u/ }% l; B0 q- ]            }$ C3 R  v3 v8 Y1 P
         }
* n2 X; Q, j; O5 ]6 z      prt(alg); /*输出进程信息*/7 F, F: R3 K  N; B3 j& H
   }2 U/ S3 P" L1 }, _1 }! U+ i
}
* e( x) p  r2 u1 ]/*主函数*/
& n- v; q9 y2 v: o1 Emain()% L8 r; N- V, a1 N8 ~% S4 [: T
{
( c/ G( q- q0 O; S! @7 K   char algo;  /*算法标记*/# V  Z, `  [! |
   clrscr();* U/ ?# U; m0 [' c7 F) a: e
   printf("type the algorithm/R(priority/roundrobin)\n");$ S: s" z% p. f, g" I; t3 \2 u
   scanf("%c",&amp;algo); /*输入字符确定算法*/  E5 n# g1 P# u) I% K& O9 D
   printf("Enter process number\n");
4 t) c, O6 x. G/ Z8 [6 @% V( X   scanf("%d",&amp;N); /*输入进程数*/0 O9 n4 ~( C& ]9 C: U) x
   if(algo=='P'||algo=='p')% N9 v" r( O  H3 F6 F
   {8 [' H: M6 [9 K1 Z0 H
      create1(algo); /*优先数法*/- G4 b  R' s. @  s, [4 P
      priority(algo);
4 z  B- ?# u. R6 m: U; l& f   }
0 y  D% y$ Z+ s- m   else
% u6 V1 ]) E! B: C6 \$ w4 i      if(algo=='R'||algo=='r')7 ~0 O& E% O" o' h
      {
8 {/ H8 s5 a+ `+ y  l         create2(algo); /*轮转法*/
- ?5 H6 @4 {6 r# C0 m% |& m2 F! H         roundrun(algo);: v& d0 m' I% T$ z8 ~; b
      }% T4 C9 t; [. u+ }
}5 y$ j$ V) r" d, k) [
</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 | 只看该作者
谢谢分享,必须赞一个~
% t0 Q" b) P, B2 f$ y

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
. C% [% _0 A$ L9 s0 Z0 [* y& f

214

主题

642

帖子

1658

积分

四级会员(40)

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

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!! c, c# K9 f' g9 t- _

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 | 只看该作者
这资料确实不错……
6 E: A" H1 A' X8 n
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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