找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 95|回复: 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 源程序*/
# K9 I! e0 p! B& Z, X#include "stdio.h"0 P; ]- Q8 u1 Q4 `+ }
#include "stdlib.h"5 h# R+ m" N: g* z; K( ~
#include "string.h"
, H: j, U& Y3 e6 }0 w8 `' otypedef struct node
: l. g5 q8 U5 Q& C, j{
9 O8 w# m; h& P8 \1 M   char name[10];  /*进程标识符*/8 ?. Q( W$ P! p5 K! M
   int prio;   /*进程优先数*/8 f& G; |) M6 b! i  @4 D+ z3 S# B& O
   int round;  /*进程时间轮转时间片*/
$ v9 ^3 w  m4 h& L0 \   int cputime; /*进程占用CPU时间*/& `# D. M( B# h) ]& r- E
   int needtime; /*进程到完成还要的时间*/" _  |( l1 c% \7 p* p
   int count;  /*计数器*/' W3 P9 Y) R% }$ b" s+ Y: K: ^  V
   char state; /*进程的状态*/
$ c5 q5 |! a9 q0 H1 `   struct node *next; /*链指针*/& s! U5 x' P: u
}PCB;  l/ \* G3 y! S
PCB *finish,*ready,*tail,*run; /*队列指针*/$ c4 P# H' k# d+ b
int N; /*进程数*/2 E/ v. L& I5 W/ O7 ^& K* N1 K1 q9 E
/*将就绪队列中的第一个进程投入运行*/
, t0 N3 Q  y2 r  c0 N) Tfirstin()! i; q8 O2 P: x3 T1 X7 C
{. k- }* S2 B. i  H7 @4 @
   run=ready;   /*就绪队列头指针赋值给运行头指针*/. y# u8 e! Y8 I6 {7 [
   run-&gt;state='R';   /*进程状态变为运行态*/
; \3 `5 ^' y) f% E" R0 i* w0 K   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/, s- T9 |' q; J% j) s
}: y) ~0 ?6 H" [0 L2 m) a; m
/*标题输出函数*/
. F" d( ^7 ^; ?6 H! i& a  W: ?, \void prt1(char a)
' K3 E& P5 p& @  e, X: M{! @1 K$ b# ]6 v' F0 S+ F# w
   if(toupper(a)=='P') /*优先数法*/% a7 t# \* q' t
      printf("  name     cputime  needtime  priority  state\n");$ j8 u. e  U; y
   else: h; y: b: d. T
      printf("  name     cputime  needtime   count   round     state\n");
7 P4 v3 B) Q: x( Q0 G}7 m- _8 z+ W* L6 }
/*进程PCB输出*/
6 c+ f! `9 T4 t" d4 {9 }/ q, ]- xvoid prt2(char a,PCB *q)
$ q2 g6 Q: u2 T! V1 s{
" l" j1 I9 [$ b% u5 J   if(toupper(a)=='P')  /*优先数法的输出*/
8 t/ {5 X- a" l( W2 I3 [      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,7 ^& h! H' }  F2 ~
       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
8 u. F" Z& n% t6 W$ ~3 Z   else/*轮转法的输出*/
( E4 `5 i. D+ k      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,$ m1 c& M; r. D
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);4 Z: _# A2 h1 F/ W5 O; Z' y2 z) l
}/ E9 {' c$ m2 d4 Y% b0 g2 L' F
/*输出函数*/" H" [. I6 A  J0 T7 q& I
void prt(char algo)$ f* T9 i+ I4 n+ b( t" W5 ^
{9 ]: O3 d6 V- h+ \1 l
   PCB *p;5 z" }/ \. u3 y0 {0 b
   prt1(algo);  /*输出标题*/& c2 I& D7 ?7 G
   if(run!=NULL) /*如果运行指针不空*/
3 \0 l( F, ]8 N0 B      prt2(algo,run); /*输出当前正在运行的PCB*/
/ `* q" m; z4 k/ k5 C% v7 O   p=ready;  /*输出就绪队列PCB*/' n' S% y0 {! j0 n# D
   while(p!=NULL)" |% \/ @3 D; r; T9 f; G+ _0 d
   {
: D( D( W% a* h9 g* C      prt2(algo,p);7 _9 z( V: K5 w( ?2 d
      p=p-&gt;next;. Q$ i5 ~6 c) ^: B* o
   }
+ |4 Q, ~0 ^* Q: P   p=finish;  /*输出完成队列的PCB*/: L! s! L/ B0 t; c* J/ F* Y+ j) s1 F
   while(p!=NULL)
  o6 r6 ]7 K0 y8 [9 y   {7 S* |7 V. U9 D- o; Y* r. w. N! f
      prt2(algo,p);; ~* j/ z) ~1 ?" g/ q7 S
      p=p-&gt;next;6 |' k8 ~5 H0 a$ F1 k: r8 p6 g: t  L# T9 q
   }/ e- V- e3 K& y# u8 ^! L
   getch();  /*压任意键继续*/& l) n  m9 K1 b+ J5 p
}
) z# k5 _* S9 r/ p- G2 _  A+ F/*优先数的插入算法*/1 Y! B, Z3 Z- q" `( J
insert1(PCB *q)/ f7 L( y5 f- \2 P0 V
{$ n+ m6 e) }2 c( N) a% Z2 P
   PCB *p1,*s,*r;- k- m  N  ^4 ]) Q$ c' r& \
   int b;" B: I1 P4 i3 d0 y% F6 Q
   s=q;  /*待插入的PCB指针*/
7 @8 v5 f( A' s; N2 F   p1=ready; /*就绪队列头指针*/
2 ~& B9 z9 U  }   r=p1; /*r做p1的前驱指针*/! _* z) H% N3 w1 {
   b=1;
: c, _; Q  o( M) b6 W   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/3 Z# y1 Z" A8 I$ y9 F0 S7 @% y2 U
      if(p1-&gt;prio&gt;=s-&gt;prio)
7 g1 h4 N" x5 D4 x8 K% T0 W      {
5 Q6 B7 }7 |& n" [* u) ~8 L         r=p1;4 o) \* T1 y' f. r+ k& X& ^
         p1=p1-&gt;next;
& _2 m. S5 Q) Z0 z" d1 \/ n: ?  m      }( j4 L# I- x6 B6 i$ R! _
      else
  s  A" n+ n3 t8 t3 v         b=0;0 N5 n" W0 o2 K! W0 J' u# R- x$ ?9 ^7 R
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
6 Q5 K- L! ^3 I: S   {$ ^9 ~/ H  T: R) Y
      r-&gt;next=s;
2 Z3 p; P0 w- |, o6 N      s-&gt;next=p1;& G  C' x2 B7 @2 o9 H. I+ R0 V
   }* R) |8 y- |2 W# m$ Y& I
   else9 T' e- d% k% ]* e" o+ B7 Y
   {
! @* B- I! `3 Q9 l% Y+ [      s-&gt;next=p1;  /*否则插入在就绪队列的头*/
8 H9 u; n# h5 V; n) X. y+ p8 `      ready=s;8 L& W+ ]! y2 C8 k
   }) _. `, K, K+ t% w2 e
}9 Q3 C3 T1 L; \/ U* r
/*轮转法插入函数*/
& [$ b5 t, q9 \; i- e6 f5 T/ rinsert2(PCB *p2)
6 l* D7 l% B% n: |; `8 [4 K3 G{" s$ p* W! ^8 R6 [) I
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
% n; I" o( V3 ^+ T   tail=p2;0 h- ]% g" r3 J" P- h
   p2-&gt;next=NULL;
" P; y$ H& ?# Z}
2 L( i  j. l/ W/*优先数创建初始PCB信息*/+ t" h. `$ h2 |/ L
void create1(char alg)
: V, t  R7 l0 _7 n- E* \- s" J{! C# v6 ?! j9 m: Q$ o% J
   PCB *p;
; V3 ^4 v9 o( V) M8 p: t9 y   int i,time;8 s5 ~* J  }" S$ r( K
   char na[10];0 x$ f4 B2 X: }7 F
   ready=NULL; /*就绪队列头指针*/
$ L0 ^. A& ~3 D6 Q, q8 o- G& l4 W   finish=NULL;  /*完成队列头指针*/8 P! r5 _; y9 F) h% ^
   run=NULL; /*运行队列指针*/' X+ E/ o9 b# b
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
) ^! E4 P' }$ `/ X, B& {   for(i=1;i&lt;=N;i++)
! N9 j+ D' N# n, j   {
* A' h- f; S& }8 W) r1 [      p=malloc(sizeof(PCB));
+ e/ v) O/ N: _8 z0 k( }      scanf("%s",na);0 c' j6 M0 n$ z7 D6 E- X6 y
      scanf("%d",&amp;time);
9 N+ U. @3 m6 _) t/ r- ^* ~1 @* }  I) X      strcpy(p-&gt;name,na);) C5 l0 q) {9 c3 C; Z! v- ~" l
      p-&gt;cputime=0;4 H3 \& _( I5 D
      p-&gt;needtime=time;
) d% D) i! h1 L+ L7 d      p-&gt;state='w';
7 g, l/ C' {  N+ X) y; n      p-&gt;prio=50-time;
3 v/ r) K! x3 F3 U8 T* P9 [$ F      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
! t2 A; ^3 m2 v# A. U& s9 z+ L/ B         insert1(p);
( v! U; i" \. J2 _      else" r& A' J2 Q: o
      {
; {; [8 i% U& V: v! {' d, g9 A4 u; x& k         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
2 {- [+ v; ~7 u( R  b# F; b         ready=p;# s! F8 g' Q9 F0 T  ~) ]( s
      }
  t) J4 e6 A- W- ?$ I   }
+ k' ^% [" S3 }   clrscr();
/ N% t$ T" g9 N' J3 _* A: E   printf("          output of priority:\n");6 h* e6 n' _2 k
   printf("************************************************\n");
# G0 H8 p6 G8 A, V) y+ ^$ c   prt(alg);  /*输出进程PCB信息*/
: ?! H& n6 p  X/ k- F   run=ready; /*将就绪队列的第一个进程投入运行*/" B% }* R1 c) c8 p, [9 Y& F+ L
   ready=ready-&gt;next;
7 G, B/ B  Q5 H   run-&gt;state='R';% c0 f* M6 j6 x/ [& M) {: B. F
}' s2 g. w: l, G% P4 X( c
/*轮转法创建进程PCB*/) t* p8 y$ r  ?- n
void create2(char alg)6 l' Z& o& s3 Y. @9 f  N5 [
{
! _: h* T  T% g: T. S% `. g! K   PCB *p;
) w* g3 a8 h8 }( G/ ~& F! P   int i,time;
( _+ C; e( z% m   char na[10];0 c$ [% |7 P& V1 V& H2 O8 w+ R
   ready=NULL;* k$ X: [& W) J8 T% U
   finish=NULL;
4 g2 H6 f) q: U, f( c; C  g   run=NULL;
/ w& o& Y1 Y0 H7 t/ r, X" _   printf("Enter name and time of round process\n");, w# Q! W6 c' G
   for(i=1;i&lt;=N;i++)
" [0 H7 j: [& g5 r0 Y# ^/ ?   {
% c. O) h0 \. i- T( w      p=malloc(sizeof(PCB));. }% F* y% Y; K  V
      scanf("%s",na);
; n( I) H' |2 R7 \* D' k+ K3 U      scanf("%d",&amp;time);1 j6 A- e* h( Z, b8 z* Z) _! w( o$ |
      strcpy(p-&gt;name,na);
  P& g: o6 v. V% U      p-&gt;cputime=0;
3 y. @( c9 l  _% ?3 o" c) G- H      p-&gt;needtime=time;
9 S1 ~# @7 ^) M% r% u2 \      p-&gt;count=0; /*计数器*/3 @3 N; o, b/ P9 d  A8 h( T
      p-&gt;state='w';. t9 H9 U8 l: `$ D
      p-&gt;round=2;  /*时间片*/
1 P$ k, m2 W& D5 c1 Y0 m6 F8 p      if(ready!=NULL)
$ o" \- k+ G0 T. L         insert2(p);( Y  i3 Q/ S$ k+ b$ X- _0 b
      else
% ?. W/ x# Q  O' i3 W3 y( r      {
, O0 E3 u' p9 g8 r. Z% B         p-&gt;next=ready;
' y; ^' y# _2 v         ready=p;
. q/ c# a: b3 y) _7 [         tail=p;
- ~; g" a+ Q# [9 k. Z- {/ L$ G      }; c) S) H) ~" u9 \1 H) c
   }0 G/ ]  M. Z8 O! _/ `. {4 y! u) V
   clrscr();. ^- ]3 G+ q5 ]; f6 @! o
   printf("              output of round\n");
2 G' Y1 D! e  c   printf("************************************************\n");  t3 u, q: J0 K4 U- r5 t4 [
   prt(alg);   /*输出进程PCB信息*/
  x9 J6 ?$ X1 q   run=ready;  /*将就绪队列的第一个进程投入运行*/, e; v  s) }: R* @" _
   ready=ready-&gt;next;
% u. d! V5 g4 m! \4 r   run-&gt;state='R';+ n6 F) y! L( N+ S) A" z/ D  [% d  _
}
5 `- k" Q1 K; F8 {0 U% `/*优先数调度算法*/6 r- A( \) N% v% k; e
priority(char alg)
2 O( c% j4 x# R  x{
  n/ C" t; V( |# R# Y" Q- o/ X   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/5 k- t" v  b* U3 c+ r* u
   {
' d+ Y- I1 @0 W7 |: C" E9 k      run-&gt;cputime=run-&gt;cputime+1;; d& H5 I9 Q' F9 n
      run-&gt;needtime=run-&gt;needtime-1;. Z7 [' K; O" q$ J6 S0 i
      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/
. b9 P+ u& F( T0 I7 t      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*// k5 V# o, [" y* f+ Y
      {
/ }: f( Y. e7 e. j7 N5 T+ R* w8 @         run-&gt;next=finish;% B* K0 `. ^; Q4 W9 x/ u
         finish=run;
# ~6 t3 v/ H; s% _         run-&gt;state='F';  /*置状态为完成态*/
* [6 g1 i- p* S- f         run=NULL;  /*运行队列头指针为空*/
/ S$ r$ i6 C/ u. u/ C         if(ready!=NULL) /*如就绪队列不空*/
; U* e4 R- ?0 ]- x! j  t            firstin(); /*将就绪对列的第一个进程投入运行*/- ]- q  A9 u9 c8 @, h: U6 |
      }
: B4 ?/ L& A. Q* g% E; }      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
% |% G  {; \& }* n; f         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))
+ R( T9 X. ^( |9 g& x% _0 \5 C         {
! j9 ^0 s/ Z% p0 v  j            run-&gt;state='W';
8 ?" B$ F& I' Z  i- l" B            insert1(run);* A. M) s$ m3 z; y
            firstin(); /*将就绪队列的第一个进程投入运行*/% g) i& s; w' u7 e
         }8 j, ?/ W5 Z. m3 \) m7 j
      prt(alg); /*输出进程PCB信息*/, \, o6 H, ?* X$ g- O: x
   }  {4 ~* h2 x$ Y& k9 A  }6 Z! c
}3 d2 D. c" H; a% W# a1 ^- \
/*时间片轮转法*/) |' f5 ^) a/ a. P, j6 K; d1 C
roundrun(char alg)
$ x( f0 b$ n1 Y2 j! F{" z+ `9 ]; T2 h) z) N
   while(run!=NULL)8 O( w1 P, F3 I( _0 {3 B. H' v; t
   {
& A) z1 s: y5 g) p2 A      run-&gt;cputime=run-&gt;cputime+1;/ K3 J1 V5 o- ~$ }( O! u( `; x
      run-&gt;needtime=run-&gt;needtime-1;
" @3 Y% T4 o$ m5 y/ }% l  U      run-&gt;count=run-&gt;count+1;
9 D& J9 k" h+ T9 H9 p" n; \- L      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/% J+ _5 |7 n  w* k: A% U& ?
      {2 ~& v+ `: F4 ^# e/ z
         run-&gt;next=finish;
' z) z( V% t6 [, z+ U, t3 W* d         finish=run;8 ]$ H+ }) p/ M. h
         run-&gt;state='F';( j3 _! U/ a& H% A
         run=NULL;
# S7 s! S# B+ T  v) m- V8 `         if(ready!=NULL)
% Y& S0 Q1 w' c8 C' c) ?: R            firstin(); /*就绪对列不空,将第一个进程投入运行*/8 [% M5 ~5 H+ m8 h  j+ b
      }' _. V' c+ f% j* c: o
      else
! A$ j" r8 F# U6 t. n( N         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
- q( U2 _- h( D- {9 y5 K         {% a) n1 r$ K* w& }4 u: {' F  ~" A
            run-&gt;count=0;  /*计数器置0*/. N  ~+ [) |+ Q. s- N; A# _: r
            if(ready!=NULL) /*如就绪队列不空*/0 t' ?$ j: a4 m0 n. D3 N; R
            {
% {8 a' ~9 v* z' A; q' d: m$ l               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
( X' i9 D3 B: H# j               insert2(run);
4 d. U- _7 Y0 z$ l               firstin(); /*将就绪对列的第一个进程投入运行*// K4 q7 b' C8 |# w& C4 @
            }) Q0 p, k) L/ R# j" H5 H$ p/ V
         }
5 U4 o7 Y2 U; ?' t      prt(alg); /*输出进程信息*/
; P) S; X5 S" _4 ?6 i" R   }
/ Y! N6 z3 O9 L}- _$ t; W8 B1 v: h8 d- \; O& p
/*主函数*/
; |, ?! g4 g" n0 A* U+ Nmain()
& U2 Z8 `4 g* ^4 w' q9 p{
2 W8 I- l4 K" t( J   char algo;  /*算法标记*/. R4 ?# B/ I& ^1 k- V
   clrscr();
' r6 `/ g' S8 N" N) Z   printf("type the algorithm/R(priority/roundrobin)\n");. g" @' u8 g+ e' M" C& U! N$ _+ f
   scanf("%c",&amp;algo); /*输入字符确定算法*/
8 Z; W/ _' V! K2 Y% _   printf("Enter process number\n");: s) E- ?2 G8 L$ l1 Y& m
   scanf("%d",&amp;N); /*输入进程数*/2 h9 `, B4 U) j. v: f
   if(algo=='P'||algo=='p')
) f5 v/ Z1 Q$ `, Y6 K$ s1 Z! M   {
- b$ t: D/ G& l& e9 A/ l      create1(algo); /*优先数法*/
! n  x; ?5 K8 l# o4 w      priority(algo);
$ H5 L8 |) X1 g$ t3 D* v, o   }
+ h# p6 N! @% X) J& B7 o! `, @* z   else; g1 w% t' z# @
      if(algo=='R'||algo=='r')2 u. B; a+ V. ^1 k8 C9 u
      {
/ E! U6 ~6 C  f; R& S* r         create2(algo); /*轮转法*/
3 E% U) T- e. ^% [         roundrun(algo);2 Y) g0 f/ I+ H8 `3 T
      }% a( t+ l: S/ L; j  n' [5 n0 p
}
" A9 V( d0 u1 C+ I% X! @1 L</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 | 只看该作者
谢谢分享,必须赞一个~7 Y- ~' G* o4 {

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
# \8 Y( I9 M$ w# D' j1 H

214

主题

642

帖子

1658

积分

四级会员(40)

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

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!
, \# W: i, F& \; R3 y

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 | 只看该作者
这资料确实不错……1 V. p$ x! j5 B: t% `
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-1 19:53 , Processed in 0.064357 second(s), 35 queries , Gzip On.

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

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

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