找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 98|回复: 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 源程序*/4 ^, J# {! N% c6 o0 X+ E
#include "stdio.h"' q0 S; z( ?, h$ {& S; Z
#include "stdlib.h"
4 `* Y* o# E0 K1 Z#include "string.h"' ~& |9 a/ \9 j% G* o6 o
typedef struct node
# j& y" m( F% v) q" ?2 ]; `! k{! E, ^/ ?# k: q4 W  z! r
   char name[10];  /*进程标识符*/
- y: k  L/ O! h' h   int prio;   /*进程优先数*/  e% W  P! ?* |8 T# v
   int round;  /*进程时间轮转时间片*/8 P% h" {- |. K; |2 k; D
   int cputime; /*进程占用CPU时间*/
: L2 G  f3 Q7 M* }   int needtime; /*进程到完成还要的时间*/  t+ M  @+ q0 b/ N. Q# C
   int count;  /*计数器*/
# ~# q* L5 x: ~/ Y" }* f2 I   char state; /*进程的状态*/0 |9 S- J1 H/ o
   struct node *next; /*链指针*/
( b0 n/ M& ^: j5 s6 l! H}PCB;( S+ c# c8 R0 f8 q' M
PCB *finish,*ready,*tail,*run; /*队列指针*/, v7 J& G9 ~4 D/ v# f" B
int N; /*进程数*// {8 L7 q! F. J, i+ y: r5 r
/*将就绪队列中的第一个进程投入运行*/1 ~2 \& l8 I, k. T( M$ i$ y
firstin()
: Q. \- |7 J6 o) Z{6 y2 C9 _; Z# r4 d& x! k% F
   run=ready;   /*就绪队列头指针赋值给运行头指针*/
0 Z+ S! V- T# Z) e5 |   run-&gt;state='R';   /*进程状态变为运行态*/- r. p/ g. y9 |5 o
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/# \( a9 S' c, l- M! G! c) O
}
0 Y+ F! W+ b& x! q, [7 J3 e/*标题输出函数*/2 ?% v2 D1 A% `# o6 ]
void prt1(char a)
" S9 u& q  K8 n1 P( a$ [) N{" ^0 F0 M5 o: y. p, F3 z9 W
   if(toupper(a)=='P') /*优先数法*/% \0 c- P2 [; l1 k- F! e: P) {
      printf("  name     cputime  needtime  priority  state\n");. A. t- }1 q* D/ J; k
   else
8 c2 P( I+ ]; R      printf("  name     cputime  needtime   count   round     state\n");
! {& w- q* ?3 R3 w}
% [) `4 G( Y7 C* |" i1 v/*进程PCB输出*/7 P$ }8 Y. @8 A
void prt2(char a,PCB *q)
2 I3 B) o: x) s, j- c  S$ G{4 C0 Z, r/ h0 D. y" |1 A
   if(toupper(a)=='P')  /*优先数法的输出*/* c4 d( Q2 R5 Z4 u9 a1 c/ E2 R
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
1 o% f8 ^' i3 B8 Q9 H       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
+ [/ M5 Z5 j% H- \( z7 L   else/*轮转法的输出*/
: @2 k  y7 t' _      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,8 K: w0 b9 p% |) @
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);- o  J0 O9 t- Y8 ?/ L: N
}
0 K7 n2 x. v1 [( |* T/ p/*输出函数*/
; L3 S6 ~9 k9 |" Y- Z; U8 Jvoid prt(char algo)
; l1 T9 d8 z! U) m( t7 t6 {{5 Y* e- z! O/ b, P: l
   PCB *p;
. t" I. E& S( ^  l: L" j% I4 W# |% a   prt1(algo);  /*输出标题*/
1 {0 ^4 m+ k# e+ T. q   if(run!=NULL) /*如果运行指针不空*/9 N& ~- ?/ S# ?
      prt2(algo,run); /*输出当前正在运行的PCB*/
% U: u  d- b, Z) Q& Y6 M0 C' Z( {   p=ready;  /*输出就绪队列PCB*/
: p- ^4 |! W- Z7 e  B8 Z- W   while(p!=NULL)
& [# g( q  K" J/ I$ c3 l$ J: C   {
. x$ a7 s+ l0 d      prt2(algo,p);
0 A$ n: Q9 J" I/ R$ u; v. y( P      p=p-&gt;next;/ _" C3 B: v: x6 A3 [3 Q  R
   }
& |; b/ m4 ^: G1 w   p=finish;  /*输出完成队列的PCB*/
& \! z3 v, v  q4 @" Q3 ?: Y; B   while(p!=NULL)7 L/ n: ^2 z1 W4 r4 `* Z; v  O
   {8 `8 S" k. B, z
      prt2(algo,p);4 U" Y  `/ S- J) i( D5 V+ g
      p=p-&gt;next;
4 X) W, R9 j% J1 r  n   }2 m) a# u7 X, R! k; C# ~/ f
   getch();  /*压任意键继续*/& ?- A( q( ?8 K: J# L' {* a
}
3 o* q# a/ n$ m5 j2 Z/*优先数的插入算法*/: k8 c( i4 |3 E$ u' t( A0 c+ P
insert1(PCB *q)
9 N2 ^# K' D3 d( ~7 a{
1 m* t3 a! q8 y  V) N4 M   PCB *p1,*s,*r;
5 q! I4 J7 [' i- \/ C   int b;
: `4 k8 p; v: o3 a% B" I) v6 z: Q! F   s=q;  /*待插入的PCB指针*/7 y" O& R2 `0 n( [1 u2 W. b+ C: J! `) p
   p1=ready; /*就绪队列头指针*/% g7 O1 w2 j' V9 j" r. N, L
   r=p1; /*r做p1的前驱指针*/
$ K4 ~" B: r7 P- S( m$ o   b=1;8 ?  X. h& g5 m3 D$ y/ l9 k9 F
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/
9 K9 I! Y* S# C' Q7 G0 Y4 B      if(p1-&gt;prio&gt;=s-&gt;prio)
! X) B; s7 O) h3 B1 E1 @* D& e; g      {8 e$ v+ Q8 u/ D  K
         r=p1;
( k# t& p: l- R5 u3 p9 P         p1=p1-&gt;next;
9 ]: k7 z. g5 F5 n. `      }/ I0 n( w5 S3 p* ?. b
      else: S  S8 w4 q9 P% H( J. [
         b=0;- R. q- l( u! L1 b8 z1 w4 l9 k
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
! l+ _1 }* U/ u$ G4 b3 H   {2 L* v, e( ^# U( G
      r-&gt;next=s;
4 L  q4 N8 N. e" }      s-&gt;next=p1;; f% N6 I% y! ~0 ~
   }, i" k8 s* |% ~4 X0 U
   else3 _* }: x3 t% Q* c, @$ u3 y1 z
   {
) Y  E0 S5 n0 b" [3 g1 F" i      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
0 X0 a) u: e/ J/ q- L) Y      ready=s;1 n: f. _! m7 h
   }
7 l) w8 V9 Z  L}
$ u# e& z6 p( c6 {) X% n/*轮转法插入函数*/
: C8 U9 v# F' g' Linsert2(PCB *p2)
, u$ V* M# x* {5 v3 k& ~# C{- c( \. x1 ?7 e6 u- c6 }) ~
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
2 @0 P. g9 k. x, q* {   tail=p2;
) @8 |9 ^/ E* w+ Z1 X* d. o+ j   p2-&gt;next=NULL;
. G' j' f+ u/ w1 p4 }}& t7 ~4 q' D8 `3 j6 p, g
/*优先数创建初始PCB信息*/, z9 }; M2 l5 L& U9 }
void create1(char alg)
6 @* @. \; [2 w! i4 @{: U, c9 m& X  v% I0 ~, |& ~% W( t
   PCB *p;. h2 o  d; E6 ~7 H% w( q
   int i,time;4 E7 ^, C# p; c2 m( V# @+ S
   char na[10];
; z1 y/ S' F3 L9 c   ready=NULL; /*就绪队列头指针*/
. d# w: G/ z- E7 H3 u   finish=NULL;  /*完成队列头指针*/, u3 [. D/ V( b5 M: u
   run=NULL; /*运行队列指针*/0 A' V+ U' O$ u8 l
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/+ t" [( ]0 s; C) [; X3 ^$ Y& O
   for(i=1;i&lt;=N;i++)
) @, C6 s: U2 s   {: I( t) i* U$ h: a! f$ `8 n4 L
      p=malloc(sizeof(PCB));
! M# ]/ i5 y" ]' f# N      scanf("%s",na);2 `) l; @. y$ }+ q1 z0 `. p
      scanf("%d",&amp;time);% e' n+ P& S9 p* v
      strcpy(p-&gt;name,na);
  E$ h" g+ N9 r: a( |0 u0 r      p-&gt;cputime=0;
: g" u, z) j& O( N$ g6 A; ?7 f      p-&gt;needtime=time;
8 u" n! [0 f, v- r6 g      p-&gt;state='w';1 f8 ^; s# ]2 l) m/ S
      p-&gt;prio=50-time;* k6 }& {- E1 Y6 i. G
      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/; \1 g9 J: ]5 N+ D( |
         insert1(p);
# _$ T. e! \/ _' ]+ A' H5 c      else$ E% R9 X, P3 r- v( [' K
      {5 E% ]- y) j; s7 Y, [
         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
, ?: f  I: |+ U1 N         ready=p;2 B9 e" K! U# h0 F+ @5 G3 U
      }
! H" T9 |. {) I9 Z# ~   }
/ B% P+ \; r/ r   clrscr();( v4 m3 {5 l5 U# V
   printf("          output of priority:\n");  _/ D- t. `9 V; L2 w
   printf("************************************************\n");7 X$ o3 B7 ^& `: Z" E: B0 |7 Z
   prt(alg);  /*输出进程PCB信息*/
- S0 w0 L: k; `0 U$ H4 Q: V2 X   run=ready; /*将就绪队列的第一个进程投入运行*/* r9 F$ u! @! ]/ ~& v  Q" P7 Q
   ready=ready-&gt;next;: l  U; d: V; m7 b0 _' Z+ }8 `
   run-&gt;state='R';3 ]6 T2 m9 R; m2 h, H- z- ^, q
}
1 e6 r3 m, m# h  K5 Y/*轮转法创建进程PCB*/: T" G; J8 `9 H1 H; y$ Z9 E! F" v: e
void create2(char alg)
- k6 n8 U/ P* p# i; ^$ p8 {{/ r0 g& M, j; e/ K7 G' S+ ~# W. D
   PCB *p;
5 ?2 @# v8 p7 J6 r   int i,time;
9 V7 _* _1 i5 D$ X  `2 _   char na[10];( d. D& o# P/ _" n; a
   ready=NULL;
# \* a" s5 L9 w* m+ }7 B$ S' @   finish=NULL;
3 X- t3 \- Q* e  V   run=NULL;
0 m5 y0 a' u: ^$ G+ _   printf("Enter name and time of round process\n");
8 r; p( L4 v3 V% o8 U" \/ M   for(i=1;i&lt;=N;i++)
+ X$ e+ P" m' P/ K* T: O5 z3 m: q   {
/ p/ Q6 W, P& @      p=malloc(sizeof(PCB));3 T# G) v! N+ X. S; b
      scanf("%s",na);/ W5 z$ y; T0 @/ n- I2 J
      scanf("%d",&amp;time);" B! t, ~3 Y3 j1 B6 B/ m! D6 d- i" J0 z
      strcpy(p-&gt;name,na);
* w1 n: a7 H; M$ @% V      p-&gt;cputime=0;3 j/ y0 F% l" e$ n- y6 w6 d6 ?  @
      p-&gt;needtime=time;5 ~1 u/ o3 ~4 p) s2 _" D- O- @
      p-&gt;count=0; /*计数器*/
: D8 b% i4 x: L8 t# h5 T6 l  D      p-&gt;state='w';
; l# C$ [. P. |# B, B      p-&gt;round=2;  /*时间片*/; e" E! L0 Q: a5 w- w5 L
      if(ready!=NULL)
; Q. n1 e! I  o6 l* m" a% d         insert2(p);
/ ?: N/ z; J( G+ R+ B2 i$ `      else
9 f2 b" \6 c7 e' }% ~" U      {6 B8 H2 ~$ H% \
         p-&gt;next=ready;8 W: J% Z, V# ?7 K+ d
         ready=p;& U2 e  Y$ l; h
         tail=p;
" x6 V, _0 P3 x- c4 R      }
7 `* F4 R  G3 b6 Q# d" Y3 z   }4 Z. A  l6 L! P1 U
   clrscr();# F8 g! B! S; ?8 C! Y
   printf("              output of round\n");6 g+ Y0 c+ Y) Q; O+ V' o
   printf("************************************************\n");
0 y! T6 U( {9 l4 D   prt(alg);   /*输出进程PCB信息*/
- Q) q& F  x7 s0 k, @  Y5 r   run=ready;  /*将就绪队列的第一个进程投入运行*/
+ V3 j7 _3 k3 i! |   ready=ready-&gt;next;
- ~; W. z5 {  }0 J4 a   run-&gt;state='R';
; m2 F' q% }( y4 f3 t5 C8 G, ~3 _$ [}0 h8 ?  \& q: W) _3 i
/*优先数调度算法*/+ V( V+ T) X0 O
priority(char alg)
0 r  e- A/ H+ r{' d) X2 u- Z$ |; W- G
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/$ {/ T" c, E2 V! `7 c  K* G7 h
   {3 _" w( ?' Q, p
      run-&gt;cputime=run-&gt;cputime+1;/ x+ g" N# w& @7 C+ b4 `
      run-&gt;needtime=run-&gt;needtime-1;& i/ M5 {3 E. `8 F' s
      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/$ |1 T0 U: W# f, v
      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/5 ~' l7 [4 k) I- F
      {- |1 G) w6 J; k/ c" j
         run-&gt;next=finish;8 C1 p' x" x8 y( z
         finish=run;6 m3 Y  z# |- v
         run-&gt;state='F';  /*置状态为完成态*/
9 w* G, |. |" h/ i4 n0 k+ e         run=NULL;  /*运行队列头指针为空*/! x& }+ p2 H: k: O
         if(ready!=NULL) /*如就绪队列不空*/
4 s7 ]( f" |" H7 B4 @            firstin(); /*将就绪对列的第一个进程投入运行*/4 `6 c8 p6 a8 p1 G; @4 j% |
      }2 c5 q: z* ]- L" G8 G
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/$ z0 W$ O7 _5 h2 H$ f) H0 ~
         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio)), {7 o8 v9 f  e4 M8 f4 p9 q
         {
3 J2 r0 v- D$ j& g            run-&gt;state='W';
6 t' C+ I7 [* o" a            insert1(run);* R3 ?9 m" `2 P% z) j6 R
            firstin(); /*将就绪队列的第一个进程投入运行*/
& J& R- y' {" d' x/ y. j3 H; `% J         }
1 L2 j. N# A) s2 C2 c      prt(alg); /*输出进程PCB信息*/
0 S% n; W6 u% ?4 D; d3 G   }+ M% R' K/ I# k/ C+ X! Y& t
}# _! T" X' U$ d% [4 X9 F
/*时间片轮转法*/
3 V7 S/ @# F1 ^) Z, O" R* r' froundrun(char alg)! L% K/ T% W  p% K0 u# f
{
7 h' Y- `6 m3 Z* }; f9 g7 W   while(run!=NULL)' L% N9 s! p* R- Q5 _: K
   {- i) R! s. m( H. f7 `6 T
      run-&gt;cputime=run-&gt;cputime+1;) Q, m9 `) y8 E* {2 Q
      run-&gt;needtime=run-&gt;needtime-1;1 w6 U9 l. u/ P8 }/ \* i
      run-&gt;count=run-&gt;count+1;
* d$ n+ g1 a* E% v  k      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/; m5 G) o" F: }4 F5 h# U; ~
      {
) I" d3 k. n1 |         run-&gt;next=finish;' r' |0 R6 Y) t( I- \
         finish=run;
' _5 V# P" H* w$ ]         run-&gt;state='F';
: e% G) ]) V1 _% g* t# p         run=NULL;
* y3 T) S7 `% q& G: O  Q         if(ready!=NULL)
9 N% \5 ?& K7 ?8 [" {            firstin(); /*就绪对列不空,将第一个进程投入运行*/; v) {6 X6 L  j2 F; V
      }
  ~7 |. c9 G6 p- [( c( v$ _3 H      else  L  c3 V; m7 m, q5 s
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
6 l: C6 U) k+ A9 q! J, [/ b/ m8 {         {
, G$ f, w, `$ Y            run-&gt;count=0;  /*计数器置0*/
: Q4 S2 W, H$ X# J$ b            if(ready!=NULL) /*如就绪队列不空*/3 Q2 ~. d1 X6 v: Z" h  ?  }
            {: V3 N" A$ ?* ^' X9 Q
               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/( Q" c9 k% b: t# @2 s' v
               insert2(run);. H* G, E/ R: \, K& p7 B% k. l
               firstin(); /*将就绪对列的第一个进程投入运行*/0 ?# x6 l$ ?: e" ^6 @
            }: a0 }2 p! M4 W" j
         }
5 |) G0 z% [; u8 W      prt(alg); /*输出进程信息*/
( j5 ^0 F9 R9 K4 I6 _5 e7 u9 U   }
2 q5 U# O7 S, C& O7 h% N* s0 K}8 N0 ]- i2 J# ~" p
/*主函数*/6 F4 D' x  {# X, o& W! o
main()
& X& b/ P; c, z{% ^4 U/ A7 V' V' R0 c- z
   char algo;  /*算法标记*/
( P+ E( K) h- O0 |   clrscr();
$ \+ \* [2 f! C4 y  G* w7 p. h   printf("type the algorithm/R(priority/roundrobin)\n");' o* G  e: l: k: t" R3 S
   scanf("%c",&amp;algo); /*输入字符确定算法*/" v% J( R( ~0 @
   printf("Enter process number\n");
9 y. G: E, R% P3 ?   scanf("%d",&amp;N); /*输入进程数*/4 H: J& }$ G8 y! E+ I( C
   if(algo=='P'||algo=='p')1 X; ?7 {  t$ y4 R2 m
   {
$ i6 W" W4 o5 c$ Y3 [- }      create1(algo); /*优先数法*/
5 X& L- f# {" M& s      priority(algo);: r) E3 n# S4 a6 E
   }& o6 {. _+ _; }5 f  Z! H! m
   else! @- \7 g0 _0 v1 L9 R9 d
      if(algo=='R'||algo=='r')2 p+ F# _% F6 C# |- V$ Z! A
      {2 e) m: R6 o1 {/ c# j. l# G" e& m# W
         create2(algo); /*轮转法*/8 e( |; k! }) h! x
         roundrun(algo);# |; d& T" M- w! y9 y2 o+ m
      }
5 c# w% Z% k; |; z* a# ?}) C7 }  C: [; z
</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 | 只看该作者
谢谢分享,必须赞一个~
% B. `4 f3 R% E9 H+ f2 r

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈7 u2 s4 U3 v! t5 D* z

214

主题

642

帖子

1658

积分

四级会员(40)

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

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!: f# V! \7 g- x2 P9 a9 ^' F

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 | 只看该作者
这资料确实不错……2 t$ n, Y! C9 [4 O& w1 }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-2 00:03 , Processed in 0.065114 second(s), 34 queries , Gzip On.

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

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

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