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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/( M: h7 W2 @6 b& S1 V
#include "stdio.h"
& _. x, p$ d$ J#include "stdlib.h"0 X/ L( B% K  T$ i
#include "string.h"
; w0 \* U, k- Ftypedef struct node" s! o, Y, K. C
{
( a7 @4 c. C! v' O: [) r  ~9 W   char name[10];  /*进程标识符*/. @# F# _$ ?% v
   int prio;   /*进程优先数*/
6 M% @2 o! l2 c$ g5 V, {: X# T' U   int round;  /*进程时间轮转时间片*/
+ I2 c) U7 J( ^; o1 |; h! u+ T) {   int cputime; /*进程占用CPU时间*/
' e9 B( l1 P% T, j   int needtime; /*进程到完成还要的时间*/
' H& m! k" j9 S$ h! k2 L   int count;  /*计数器*/* w+ {+ V* i9 `' N
   char state; /*进程的状态*/# h4 I" P3 |7 ?( @& d. `
   struct node *next; /*链指针*/9 P1 b3 m* s8 {  e# N( H2 C9 G7 }
}PCB;
8 O4 i% [/ l3 Y6 k) w( w  g; qPCB *finish,*ready,*tail,*run; /*队列指针*/. K" |- }7 Q) R8 P4 T% g
int N; /*进程数*/+ {8 B2 {7 k( ^; z/ X7 N3 K/ j+ n
/*将就绪队列中的第一个进程投入运行*/* W  Y5 S: M6 U% X. p- J
firstin()
( c4 Y2 s+ w8 U/ a  g{! _0 o# C+ B' x2 h' u4 |2 h( B
   run=ready;   /*就绪队列头指针赋值给运行头指针*/, X+ a; O- c! {1 O; S
   run-&gt;state='R';   /*进程状态变为运行态*/% G! u2 a# }1 f, s1 `- K
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/+ V( o# Q, k4 G, N* a, w6 b" i" u; m
}
5 S+ ^# b" d( |. N/*标题输出函数*/
0 [5 A) Q) Q' J8 ?0 Uvoid prt1(char a)
' F- W2 ^3 n4 `+ U# E/ S{) {$ N5 G" ^# O9 Q: l5 s
   if(toupper(a)=='P') /*优先数法*/7 A$ F/ r. c  ~& i' n5 V
      printf("  name     cputime  needtime  priority  state\n");% Y1 g! ]' ]& G) {& n4 ?' n
   else
" S. Y1 S1 ]3 J: C) G2 F# C      printf("  name     cputime  needtime   count   round     state\n");# k, [* q) Z/ ?5 X( b& h
}
! c9 ^( [0 J/ x% z6 C/*进程PCB输出*/
) N' R- [+ c: O  P3 i, n" q3 qvoid prt2(char a,PCB *q): q6 Y7 I+ |1 G" d- F
{
6 w" L0 b& T0 A8 W* e5 s   if(toupper(a)=='P')  /*优先数法的输出*/
0 o* p6 d8 A8 b6 S: S5 ]      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,7 V7 {; \; `) G- L, p  b. a
       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);* X' F- g% e4 ?5 H4 W! {
   else/*轮转法的输出*/$ @4 R6 s" j7 t1 d7 X9 T3 R9 y
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,& @6 W7 f% {9 S7 `4 e- Q
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);& p: V, E2 j; v( G
}, H3 G: B. R$ ?
/*输出函数*/- y8 Q  o" r/ w4 }: ~& G! ~
void prt(char algo)4 m) e+ }; ~- w1 ]9 {( m
{
" C$ e, j& h1 x: {  N- [9 o   PCB *p;
# z3 z' ~/ p$ g2 H: k   prt1(algo);  /*输出标题*/
4 O$ {7 f" x+ j& f" G   if(run!=NULL) /*如果运行指针不空*/
8 r$ g( S3 F4 @: F4 F  R      prt2(algo,run); /*输出当前正在运行的PCB*/- |0 y; q, Y6 \+ @0 l8 u' Q/ z
   p=ready;  /*输出就绪队列PCB*/* q  _1 l5 Z! g8 `3 p+ Q# t& u
   while(p!=NULL)% Z4 O' T- Z6 S$ X2 ?" i# s
   {
7 {. J5 P( B& A% ~" h: p/ Y      prt2(algo,p);
* U) o% B& [. B3 o      p=p-&gt;next;/ c5 |5 [4 ?# x
   }3 Q4 Y$ O' O% i) L
   p=finish;  /*输出完成队列的PCB*/
/ }6 n) F9 j% ~- I% ~4 _6 m   while(p!=NULL)
9 Y+ Z" H8 o7 C! A; b   {
) W+ v8 c* z. v& ^      prt2(algo,p);- }: b  y# h0 w/ U5 `; n
      p=p-&gt;next;$ z3 [+ |) ]7 X; s* U9 k
   }2 @, g" A3 J) [
   getch();  /*压任意键继续*/
; G2 B4 D; i- }2 b, a3 H4 f7 x* U}! r% d* w7 h( c% ~) Y/ W/ Z
/*优先数的插入算法*/
8 D2 v! `! x3 `, H1 Rinsert1(PCB *q)
, ?/ V. w+ D! y9 w* g% p{
3 H* T) e! |, l5 a% z6 Y   PCB *p1,*s,*r;# W9 V; i5 B" k$ b  y/ O) o' O
   int b;
* E0 i+ r% {3 D& @7 D   s=q;  /*待插入的PCB指针*/$ T7 M' n9 G/ I, F2 {
   p1=ready; /*就绪队列头指针*/
9 T( R- }, T/ R( E- d   r=p1; /*r做p1的前驱指针*/' a* {' T, g9 v% h
   b=1;
' }. ^2 q* G! ?& F# E   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/$ |. }  x8 W  N  ~4 a
      if(p1-&gt;prio&gt;=s-&gt;prio)6 ]3 Z; L7 b9 F
      {
* f3 _' p3 e4 J1 E# w  r         r=p1;
5 Q2 D( @. B( r         p1=p1-&gt;next;
) a6 @$ D$ j+ W: P6 g2 w+ X$ r      }6 L, Q0 T7 \" |3 H- G
      else: s6 e/ S# P- t5 l$ e5 B8 ?
         b=0;* v- J0 z- t. S' x5 U
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
+ G  J4 ]' ^" A6 `0 E( L   {
* C2 h. ~: j$ q. a8 b# T5 k      r-&gt;next=s;
. i5 A8 D# f, u      s-&gt;next=p1;
  ]3 y' ?1 G0 d9 K* ~# l   }
' J4 J' r5 v1 w& P   else: n8 L1 g" C4 t8 M
   {
% _5 A7 ~4 O9 z0 |; J      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
5 v9 j0 B7 l$ T& H6 u      ready=s;
  }' n' R+ ]" l8 K1 M   }
9 F; h# F/ P. }! M) [6 d; D2 e}  M1 G1 c% Q$ [; \5 I7 w6 i
/*轮转法插入函数*/1 e# H) d& L# ], G' b" @" @' m2 R
insert2(PCB *p2)
1 H1 f3 G& W" d; \& B9 v{0 k# C. b( D! E6 d2 a+ {& d5 X
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
; C: i4 u6 Y6 ?% g; u5 [7 t2 O( u% k   tail=p2;! s8 T! b" t0 M( R, G; ~- L. c
   p2-&gt;next=NULL;
) K" `5 y4 B+ j6 z0 k}! [" ?7 Z1 Y& q( ~4 M
/*优先数创建初始PCB信息*/1 S. F) @+ O0 q4 p8 L
void create1(char alg)
0 T: k- H/ ?. P{
: S% A9 h7 E( }3 _& d; @) T   PCB *p;
8 q0 ^; ]- Z1 k! r   int i,time;
. T/ g, i* Z1 \" f( v   char na[10];, S4 Z2 k$ n$ m8 U/ o7 f
   ready=NULL; /*就绪队列头指针*/
5 |7 v6 V5 s( K. Y9 S2 W0 \: |& ^   finish=NULL;  /*完成队列头指针*/
: y) f6 U) S6 v  |( f8 }   run=NULL; /*运行队列指针*/; X2 Q* |. W4 L
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
, f( _! K  u. j# X) o4 M. A+ z+ ~   for(i=1;i&lt;=N;i++)$ y3 t. T5 [. n  p- y% g' a6 v1 m; k
   {. U2 ^! u  v% ~. q7 C1 ^; p
      p=malloc(sizeof(PCB));
% A! J# e& O) b      scanf("%s",na);4 E, |2 }1 X+ _; T8 @7 W' s
      scanf("%d",&amp;time);1 o6 K5 E  P: G/ Y# N& \9 X/ ~( `
      strcpy(p-&gt;name,na);" h/ D+ n$ `5 x6 g! J
      p-&gt;cputime=0;
# v6 y0 |, [$ h0 H5 b      p-&gt;needtime=time;
8 C& _7 b. S+ ]4 D8 u) q      p-&gt;state='w';+ F( ]9 c" S, ~
      p-&gt;prio=50-time;
4 B/ [+ p6 |* z      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/9 \: H& z' a( y& I8 G& F
         insert1(p);
, F0 {+ `2 @& m' G$ B      else8 D8 I# h5 p- \+ k, w* h) v
      {( l  m2 z! c! |" z
         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
; o; ~* W9 @! }, O% e         ready=p;
% B6 W* q& x, f+ m9 @* Z$ [      }
  l  X) A* f; D( A% h% ~   }
9 J' ?$ F* y* r/ Y1 F8 t: o   clrscr();' c7 @3 `8 I+ p; w$ `% x$ x
   printf("          output of priority:\n");9 P+ I/ `- d$ Y6 ]
   printf("************************************************\n");
" I5 E( G6 o6 [. I  m5 H0 Q   prt(alg);  /*输出进程PCB信息*/
# e' Y- n" g* a, O, M   run=ready; /*将就绪队列的第一个进程投入运行*/
8 V# e5 C2 ]( g0 T7 ?   ready=ready-&gt;next;
# I* V: G. ^4 ?* ^6 b3 D   run-&gt;state='R';
6 {& A" L" Q1 w  {% s5 o* ~}
$ d3 S2 A3 a3 m$ K& F/*轮转法创建进程PCB*/1 n4 g: ]/ }7 V) e5 s
void create2(char alg)' E2 \" }1 h* ]! Y- A8 u5 m
{6 l8 s9 ~( @& k  @' j  Y
   PCB *p;
' e; C- I% E- [  a1 Z3 W  c& Q   int i,time;
& v9 m  |2 x4 @( ~   char na[10];0 r5 V# w% m6 n0 R9 B
   ready=NULL;
" r. y3 ?5 ^: z/ q7 o   finish=NULL;
8 e+ N: n3 I% o, C! B5 s) L) P8 ]% O   run=NULL;
: b+ _" ?( N6 @2 ^   printf("Enter name and time of round process\n");
( ^5 \9 v: m' N; A; J# d! Q! U   for(i=1;i&lt;=N;i++): R" D8 h0 e: E+ _, v
   {9 j1 [" M) Q9 I; C6 O
      p=malloc(sizeof(PCB));; P7 w1 L" K  h' u6 l4 D
      scanf("%s",na);% d0 `3 p0 S: d  ~& d% ^
      scanf("%d",&amp;time);* g4 P2 N9 d, d& w' S4 _
      strcpy(p-&gt;name,na);
* j- i+ ^3 ^7 ~2 e! w/ @      p-&gt;cputime=0;; @  N: J5 L( |  x
      p-&gt;needtime=time;
: z' t( f6 e# b* L4 ^. w      p-&gt;count=0; /*计数器*/3 J" t% W( x% i8 I5 o
      p-&gt;state='w';; ?. V1 h3 Z7 i6 Y0 c; D
      p-&gt;round=2;  /*时间片*/! m& U4 b# R3 X% H
      if(ready!=NULL)# n& L* T! G  B; e6 \% ^8 H1 L
         insert2(p);2 C2 ]; x8 g- ]0 A: o- f& a5 z3 w
      else
8 }& T2 w" |% f/ s; K' f% B6 }      {& M- F: I5 O( T, E) u( Z& z+ n. J8 c
         p-&gt;next=ready;5 J4 B: O9 W; t7 K$ W0 r; t
         ready=p;1 p0 A# e  Q" r' L- s
         tail=p;
& o% Q6 L( ~- k      }
3 q8 D) m5 S+ c% |0 X   }
# A7 L9 T% I+ A2 ]9 x, t   clrscr();
. e/ s- C* H4 U) t" l8 z   printf("              output of round\n");, k  d* l9 I! l9 {2 O$ v: t
   printf("************************************************\n");2 G3 B# v: z# O$ Z+ V
   prt(alg);   /*输出进程PCB信息*// L, W6 {1 f0 |+ [6 g) y
   run=ready;  /*将就绪队列的第一个进程投入运行*/" B2 ~% l1 N2 W! y, x' T( y, g
   ready=ready-&gt;next;: K0 `8 h7 W7 n1 [& a. Y
   run-&gt;state='R';; Z* X$ [" ^7 K5 E3 p
}
- l+ I" z7 r& S6 [! s2 ~$ V/*优先数调度算法*/! f& A' ~3 J) I# H+ T9 e, l, ?
priority(char alg)/ u2 o0 |3 B! ~3 R6 M$ \: Y
{& ]% |* l+ t  j1 c; a9 s: Z
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/- z& i$ U# X# v! D' l
   {- o  N% P. w' u8 \
      run-&gt;cputime=run-&gt;cputime+1;
1 O* s) E0 E/ T# w5 ]      run-&gt;needtime=run-&gt;needtime-1;
4 Z  x) m6 _. l  U6 N, M0 i      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/
$ \1 r& E$ i# }. [! B      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/
& }' `# R( y5 G6 E      {
8 L* Y) K3 [: {6 Y  K6 r- R         run-&gt;next=finish;
4 L2 j* L0 o& g& G         finish=run;- I4 s  p% J" _2 g
         run-&gt;state='F';  /*置状态为完成态*/
  v& {$ }+ N! F! Y. {         run=NULL;  /*运行队列头指针为空*/
- p: m6 f5 q: Q- C# ]         if(ready!=NULL) /*如就绪队列不空*/1 f: f: r$ S, T. G( e% V& `+ ]) c
            firstin(); /*将就绪对列的第一个进程投入运行*/
) \* K1 }, A9 a- H- P/ p      }/ {0 F2 y! j. [% g( j2 e0 n2 @
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
% P* V7 m. d, T/ s         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))9 O) r4 I$ [, f( i; V; D% v% T: K) u
         {
& x6 y5 ]9 H9 Z, g  D$ I+ H% F            run-&gt;state='W';  `$ `+ W* S, ]7 H
            insert1(run);
! f2 Y  W6 a# ?& \8 p            firstin(); /*将就绪队列的第一个进程投入运行*/+ O3 ^6 k8 p* h  n+ `3 E
         }
" D8 H3 Y3 h- s1 |' f1 R      prt(alg); /*输出进程PCB信息*/
. i2 ?9 j$ l% `) W. x   }- U. X$ \3 K& r' o/ w
}
3 H. Y/ Z6 i! \6 K9 h( X) x" y, J/*时间片轮转法*/% F4 k2 v2 L- y- N
roundrun(char alg)( G* n/ b2 O+ J% ?
{2 Q' e: g) G0 M2 P# W
   while(run!=NULL)
8 j- A+ ~* S# c2 y0 q* [$ k7 P& z   {
& b: r! p3 x& c! o1 J7 ^7 A1 ^" h0 q      run-&gt;cputime=run-&gt;cputime+1;8 I& Q0 s2 _) g, E
      run-&gt;needtime=run-&gt;needtime-1;2 x" a5 Q, v0 u* S7 Y
      run-&gt;count=run-&gt;count+1;
" I. K5 v, b; Z      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/2 W5 G' V( p* O: l8 F
      {
6 U# i# [6 Y0 w4 `6 x) O         run-&gt;next=finish;0 [" k7 Q. B/ R3 q5 h
         finish=run;
/ e1 p2 N" G* J5 b/ T# B         run-&gt;state='F';6 V, `* k0 O; r( J( l+ q0 e0 `
         run=NULL;
& y* R" d$ n" m+ L% o4 z         if(ready!=NULL)
9 }8 Y) W: K7 h) Q            firstin(); /*就绪对列不空,将第一个进程投入运行*/. S8 s, x& p& G  O1 W& K- u
      }
- `1 T6 b  W; u2 Q2 a/ t2 R: S& {4 c9 u      else
0 g# ]8 u1 z  K: A/ D& ^( U         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
7 Q. s7 k; i( l8 E& i: P         {
/ B7 ?- h4 K# }1 V0 x4 Q9 l6 `1 r- Y5 M            run-&gt;count=0;  /*计数器置0*/2 r' A- g9 K6 `/ Y$ i2 p
            if(ready!=NULL) /*如就绪队列不空*/
% A  [8 Q3 o4 u9 |3 q! V8 u/ g            {7 h0 V9 w5 e2 h0 A2 D
               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/% O; R- ~9 {# x4 f7 S; \. O
               insert2(run);
+ M3 }/ s7 G5 e' e3 x' E. ^2 X2 P               firstin(); /*将就绪对列的第一个进程投入运行*/
) Z7 ^1 Y; L5 v; a) V3 x8 _0 e            }
( H" Y: t/ D6 \$ Y         }
- b4 a2 T3 u. M+ f; `3 p# M) o      prt(alg); /*输出进程信息*/
% X9 |; f# P' |% x   }
( H8 a' c  z6 w9 x}, B: F3 R. t1 q: @3 @! H. T& n" K
/*主函数*/" Y" D6 [) G5 h, ~
main(), J0 _5 @% V+ M: z4 a
{
5 G2 p1 k) [+ i, j0 P4 d3 a; E, a   char algo;  /*算法标记*/9 d/ J  E. U1 w$ V& t) d0 S
   clrscr();
5 g# P- [! t2 [1 \, T   printf("type the algorithm/R(priority/roundrobin)\n");( b- X* \3 O7 _8 B( }/ u
   scanf("%c",&amp;algo); /*输入字符确定算法*/
1 B8 H+ l7 d5 }+ U   printf("Enter process number\n");, e9 d( z5 w8 N
   scanf("%d",&amp;N); /*输入进程数*/5 G# ~# I* G# E: l5 v/ \
   if(algo=='P'||algo=='p')8 [7 ?, n3 H9 i$ Q# c2 ?+ ?) D
   {
( Y  h( ?  b5 \0 X  R1 I      create1(algo); /*优先数法*/
5 e5 b' t5 x$ P" C4 X- s" ]: b      priority(algo);8 V+ [0 O: Y/ F( R! y5 ^( T
   }
- H* s' Z( U; D; m+ a   else9 S5 ?/ \; d8 n# ?
      if(algo=='R'||algo=='r')+ {) e& e. G: G3 s" o8 m
      {
1 J6 {8 x! U- @2 Y8 B. S" f8 z         create2(algo); /*轮转法*/
  R% l; ]+ q- M1 V; i7 I9 x         roundrun(algo);
: D7 k4 P9 X  X0 [/ G0 v! Q      }9 ~* A! Q* Q$ D
}
( }% t& m8 J& g; J4 E</pre>

gVBZFryb.rar

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

该用户从未签到

2#
发表于 2016-7-2 14:15 | 只看该作者
谢谢分享,必须赞一个~
* I1 w9 h" Y2 ?* |2 f4 G& P& z

该用户从未签到

3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈  ~/ ?5 M9 C$ s

该用户从未签到

4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!1 Y$ v. C* }6 }2 j+ J$ p

该用户从未签到

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

该用户从未签到

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

该用户从未签到

7#
发表于 2016-7-7 09:06 | 只看该作者
这资料确实不错……6 G* D" S" y+ N, V! o& K0 p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-14 01:33 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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