找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 94|回复: 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 源程序*/
2 l3 j! @% w0 {( l& O#include "stdio.h"
. N, p1 q& c* N8 i+ O#include "stdlib.h"3 w% w* R1 h* P1 o/ c
#include "string.h"1 e1 h: w. @/ P
typedef struct node2 h, x- t& y6 }' c& U- }  d- }
{
% J) t/ G5 ~. S- P& ~7 g+ G; K   char name[10];  /*进程标识符*/
. d4 X7 a% D  H+ h: \   int prio;   /*进程优先数*/9 |) u0 A5 U: N8 a1 s4 E4 B4 E# Y
   int round;  /*进程时间轮转时间片*/7 K+ T% s% p# _0 Z: R
   int cputime; /*进程占用CPU时间*/$ N$ N1 l% ]( A0 O+ J4 g: L
   int needtime; /*进程到完成还要的时间*// g6 l1 ?9 M" {6 c+ _2 H8 ~
   int count;  /*计数器*/- X& B  Y# v4 p0 L/ l4 l$ [5 B
   char state; /*进程的状态*/% J/ N. X* ?$ A+ d8 W( u
   struct node *next; /*链指针*// p- P. D- C7 z2 V
}PCB;
1 W& C7 n# ]' |2 T" @- nPCB *finish,*ready,*tail,*run; /*队列指针*/
- Z4 Z7 E, ~1 Z7 _# kint N; /*进程数*/5 T# }: f) P) m) T5 t. ^
/*将就绪队列中的第一个进程投入运行*/; Z1 M% N5 c: O4 q, e
firstin()
7 Y6 j0 E; c( R' E{
: S" G) H5 X( M1 Z& e) S   run=ready;   /*就绪队列头指针赋值给运行头指针*/
+ i3 h. z4 n' _* h& T+ T   run-&gt;state='R';   /*进程状态变为运行态*/
6 q+ @. t' _% W8 b) O2 E/ p- K0 q   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/+ o' ]% X% w' g5 S9 y3 e
}, X. h0 W4 g9 a: P: n
/*标题输出函数*/% Z/ ]7 w1 U: r3 y+ S' s2 _% T
void prt1(char a)
: O* Q# w, c. g# [{: W) V4 A6 \! h) {1 L; V. w8 [
   if(toupper(a)=='P') /*优先数法*/( x+ n! S6 |3 k
      printf("  name     cputime  needtime  priority  state\n");
5 n) G( U: Y# w$ T- c1 i2 K   else! y! O8 L+ v8 N" Z
      printf("  name     cputime  needtime   count   round     state\n");
- a9 m0 y  i6 U% Z+ y% j. h- |  Y}
! k/ \  q( J: g; u/*进程PCB输出*/
1 f* W8 x$ a( B/ ~% w. lvoid prt2(char a,PCB *q)
3 G8 i! J  }# w) o{* l8 O$ E' t  x3 V
   if(toupper(a)=='P')  /*优先数法的输出*/& \  M! K& e# {4 x: }8 V
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
$ s8 ^* B. P7 Q0 h" J$ y       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
- W- U; F+ P: W# v  o   else/*轮转法的输出*/& k, L: I1 n. {5 J( L
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,
- a, H2 M( d+ p( M8 D       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);
) F$ {$ c! m4 w7 i3 T6 D}
! H# _& D  m, w( u1 D1 a/*输出函数*/
5 O2 q4 T* `: t8 z5 R5 Avoid prt(char algo)$ O3 o! i8 p  g( b* O
{
" Q- M% V# I. p1 G9 E   PCB *p;1 D3 p7 U5 @4 L
   prt1(algo);  /*输出标题*/, m# e. _0 O/ M$ L0 Q, y2 a
   if(run!=NULL) /*如果运行指针不空*// y" d+ _, C+ p4 R$ b! {0 V
      prt2(algo,run); /*输出当前正在运行的PCB*/
4 O2 U& J- Q. O: L   p=ready;  /*输出就绪队列PCB*/) L" U$ S( `$ F% b% W
   while(p!=NULL)
$ U0 g) z9 ?* [0 i9 P3 {   {1 o0 _& {2 W; Q" h( p) U' ]  M
      prt2(algo,p);
, L4 S$ w. a) ^' C: G' g      p=p-&gt;next;
) U7 v7 K! r- n4 h7 i   }
' ?* P( t7 G6 k% s   p=finish;  /*输出完成队列的PCB*/
5 {, t( [! `' _   while(p!=NULL)$ `. c! K" V2 N9 x
   {, c" i6 @# m& P, P# m* R
      prt2(algo,p);7 J( g, T( L4 K0 k0 C: v2 S3 I; S
      p=p-&gt;next;# \# N1 f) w0 S8 p$ U) _" r
   }
3 R. `) n1 H( S; k2 N   getch();  /*压任意键继续*/
1 R& n3 b( i# R}
: A+ i7 W0 `3 A) {/*优先数的插入算法*/' j# i  z5 e9 c& |! U' v, C
insert1(PCB *q)+ A/ }' L, X, k' L0 I
{' G3 `- r( v: m
   PCB *p1,*s,*r;
+ A1 ?4 G- G, j) U   int b;* Q& k) _/ W7 @; m: ?. c
   s=q;  /*待插入的PCB指针*/8 w+ K1 G3 A/ [7 ?4 q9 ]8 g* r
   p1=ready; /*就绪队列头指针*/# c! |9 A4 B4 o, O; @+ {. V' Z
   r=p1; /*r做p1的前驱指针*/. z- s# Q) Q* L0 @2 l& p7 l" w
   b=1;9 j% a+ @" J# Y. y; W4 h7 x6 G
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/% a( @- A7 c! p$ J& ?# }
      if(p1-&gt;prio&gt;=s-&gt;prio)$ `. S: @* J* K& o. r3 G
      {9 L0 ~, h1 x1 d- [( l7 i0 ]
         r=p1;
- d! k" ?8 G  H% ^7 i* c         p1=p1-&gt;next;
* Z* D  b3 Z( r; h* \      }  O1 K  p6 t9 n  Y0 Y
      else* F8 g  f; l( t; T
         b=0;
9 X8 a4 ^- \+ r7 z   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
' i# t  _4 U( F; N, E   {
8 c$ K4 H* B; D: [: O! Z      r-&gt;next=s;
) k% I' ?) _& s0 X9 U      s-&gt;next=p1;
9 g  L* `# H: r6 l: X6 [   }: s) W& F' v) b
   else
& W* |9 J/ a. B0 \" L/ c   {
& \+ t0 r# I& n) i4 F; |" {      s-&gt;next=p1;  /*否则插入在就绪队列的头*/- ]) x' i) K9 k5 W+ q: j/ @+ K
      ready=s;
: [  ^/ x  y0 ]   }1 ^$ C4 a7 T$ i
}
7 d: R; _" n4 ~; G! {/*轮转法插入函数*/
5 P9 u+ _5 |0 q( `: e8 Minsert2(PCB *p2)8 L$ k+ z) y/ J) J2 R; ]
{
* G5 k7 [+ ]5 q; x  Z   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
' s4 R+ K* Z- O: b7 M   tail=p2;+ x' L2 m% l; ^, t4 x, S$ D* O! X
   p2-&gt;next=NULL;
  W! q( O" p3 q}
; C: ~2 F  y5 u1 l: Z( h6 Q% d/*优先数创建初始PCB信息*/& K# ^8 |/ L5 I. H5 {+ G
void create1(char alg)
% N: y; z. m8 F0 ^4 M{
: `. o& Z* M) i$ ^7 H# |, o8 @( J   PCB *p;! w2 X9 g9 {( i" L- e" M, X; R
   int i,time;# k1 |5 }* y' W" b/ e5 a
   char na[10];
$ Q& l) {4 C1 B7 |. d$ P   ready=NULL; /*就绪队列头指针*/# m( P" b3 M: l: G, j9 I" ~/ Y8 }
   finish=NULL;  /*完成队列头指针*/
; _  g* a1 @* }# L. H* }   run=NULL; /*运行队列指针*/9 Q: z3 l/ z( e
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/( ?3 ?: D  _. s! V1 `# P, f
   for(i=1;i&lt;=N;i++); e) h; N. Q6 B: m6 s0 l2 M
   {
% I% N6 }9 ?0 l      p=malloc(sizeof(PCB));8 Y# w; d: b% l( c
      scanf("%s",na);" T! u4 h5 Q: P' F! B3 W
      scanf("%d",&amp;time);
- H" {1 `  g$ `      strcpy(p-&gt;name,na);2 ]+ |3 I3 e' Y4 W: Z; v
      p-&gt;cputime=0;8 X* X# ~3 U# b
      p-&gt;needtime=time;
$ F6 N6 B( j' P8 e. F! T8 J      p-&gt;state='w';3 d- o, L5 z* F' n( z  u* z
      p-&gt;prio=50-time;1 r. @" c+ Z* r+ t* M+ E5 C
      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/# E9 A+ v; C4 p0 I% \
         insert1(p);
! a3 ]4 Q( k7 Z5 B2 e2 f      else
  D, B, P' i" G      {
' }, }% m7 x. ]8 }7 C# v8 |* |         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/- l" ]) l/ ~* w2 H! `  X
         ready=p;
, U$ L$ g( {3 Z  E* i) n7 i      }
3 _: Z1 a5 c- Z   }- ~$ H9 e3 r7 G1 F. i' I
   clrscr();% c) p9 u% R" A6 K8 R; P
   printf("          output of priority:\n");
' `$ r: M! W- i- y  \" i   printf("************************************************\n");3 O( D& F* S% Q% T: \+ C6 f  V
   prt(alg);  /*输出进程PCB信息*/* Y  x3 A- s0 S! \4 e% x9 ]$ U
   run=ready; /*将就绪队列的第一个进程投入运行*/
" ~7 X; L5 f- o$ o, K/ d0 `   ready=ready-&gt;next;
+ T. C  O; \0 |; d" L3 S! [/ k. C   run-&gt;state='R';' E4 q% T" j( E# s
}1 r! i, ~1 M0 }  N/ T  }
/*轮转法创建进程PCB*/
, r1 B, S7 g3 C9 j. v3 F: e2 p: wvoid create2(char alg). _( P( C  x! a0 A: _% @
{& u) w# A3 M8 {; p6 Q* ?
   PCB *p;  q6 V, T, g9 h) y
   int i,time;4 Q" ?6 ~! t! w' i0 a" q! B, C
   char na[10];) L3 e" o  B& w, p
   ready=NULL;
) T7 p( _: r1 M7 f3 ^1 K' Q) Z, V   finish=NULL;
; ]& f7 t4 v* W# \   run=NULL;( o) Q$ a  u* g$ S
   printf("Enter name and time of round process\n");  g3 m! o! w* q$ M4 y: Z: Q5 V
   for(i=1;i&lt;=N;i++)
+ t+ r$ q% r" Z   {
; A) k: ?4 s, q) a! K      p=malloc(sizeof(PCB));
/ E  X( G5 O0 r+ ^& H      scanf("%s",na);
0 B3 o) ]0 s  q( y; }/ {      scanf("%d",&amp;time);& s" i' h' W  y5 i4 J$ w
      strcpy(p-&gt;name,na);
$ \  |0 v. U( c! O6 x7 h1 ?! M( n      p-&gt;cputime=0;
8 F' q( E5 Z' X3 ?7 V      p-&gt;needtime=time;
) D& _( [' `  v" ^8 [      p-&gt;count=0; /*计数器*/
' f5 m" F' V- z- D( b      p-&gt;state='w';" O' S4 Q8 d) m1 J
      p-&gt;round=2;  /*时间片*/
0 E1 c* n7 \: |5 D& F- r" K; a      if(ready!=NULL)
9 `# M. {6 o) `         insert2(p);
0 A' y6 J! z7 n3 e/ c3 k' |6 Y      else6 |) d/ |  f. ^. ?" c
      {
3 f2 c$ {# o) \0 m4 G2 I         p-&gt;next=ready;$ q* J" u& B$ p" i- B: A
         ready=p;3 ?4 _& s6 Z! Y/ g: i
         tail=p;, u; D: C. _2 T" F& a' h9 w
      }9 }" ^: Z6 t0 a9 ?8 ^  ]( r
   }
9 v. A& L7 E, W% n+ Y   clrscr();6 R; g9 q; B9 _8 t/ l
   printf("              output of round\n");' V+ r" I# j4 p" t1 E
   printf("************************************************\n");
8 f$ e; Y) d% ?+ _5 l' Y   prt(alg);   /*输出进程PCB信息*/% U. ~2 C6 x- F" `. P  F
   run=ready;  /*将就绪队列的第一个进程投入运行*/
  y! i, K" n- r   ready=ready-&gt;next;+ |! E; p& M/ S# a) }) C9 R
   run-&gt;state='R';
, m( w- m/ E, ~/ V7 H7 o3 l, T( v}
' i" f9 O# z: q! U5 F+ k/*优先数调度算法*/+ Y" l6 U! g$ L# ], M
priority(char alg), M/ u% E+ j) z
{
4 k/ s7 N# W' m6 N# t( N. M   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/2 z! _8 a9 e# E/ d: w% b
   {" k7 b% v; a8 `8 y, Z: |8 }
      run-&gt;cputime=run-&gt;cputime+1;
  `$ I) y/ j+ i$ ?* ]0 @      run-&gt;needtime=run-&gt;needtime-1;% g' `8 R; J2 q8 B1 m7 {+ E
      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/! @2 }) Z) j  n
      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/
+ a( W5 l, L& m" l      {7 k$ a% \/ B- h  K- Z
         run-&gt;next=finish;
( b9 K- c* ~" D& ~) z         finish=run;
, ?% w  E6 V3 h1 Z         run-&gt;state='F';  /*置状态为完成态*/: z! F/ O! |1 O1 Z/ C7 X, [
         run=NULL;  /*运行队列头指针为空*/# h) y6 b: @, H% f0 F5 \( W
         if(ready!=NULL) /*如就绪队列不空*/  ~; ~1 @5 T, r+ E: i, p) P( E
            firstin(); /*将就绪对列的第一个进程投入运行*/8 Y4 M# L9 M; O4 b" E
      }" h4 `1 c+ ]/ V; `4 V0 m+ X; N; G% l
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/' r- H0 p' l$ I) Q* V
         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))
  {4 p" s4 n- @% C/ M         {
; e+ @* u# q" N5 V6 }+ C            run-&gt;state='W';; K; e- t( [6 ?3 j1 a
            insert1(run);
4 i' j" S7 N0 q1 g% I            firstin(); /*将就绪队列的第一个进程投入运行*/& C+ V; l: G  m' g/ G% K6 l
         }* U1 X5 Z) J# D/ i; B" }
      prt(alg); /*输出进程PCB信息*/% ^1 y" D3 z$ t9 K' _% x; e
   }
4 B) S, D; m. F* X" B( y2 W8 A  |}
  B3 F1 d( Q- v- j% G( P. p/*时间片轮转法*/9 z6 Y' o5 {' `4 _) s/ @( |9 r
roundrun(char alg)$ ], j0 O$ u, G5 ]1 I9 Z
{
; \6 S) q; ]; o2 r, W   while(run!=NULL)" \9 ?3 S: Q. L/ }' L- K
   {) f+ N& B, |% w+ O* r2 L
      run-&gt;cputime=run-&gt;cputime+1;
3 R; F/ l! _. {      run-&gt;needtime=run-&gt;needtime-1;
. G4 X: t! L1 s, j* P      run-&gt;count=run-&gt;count+1;
, v* ^* }" ^$ m' z      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
# K% s7 \. F6 _1 T8 p" @      {
) D* L' d6 g% z% }9 P         run-&gt;next=finish;4 h* E# c- q) K; F& ^% s. }* h
         finish=run;$ u& E& N5 ^+ H. k- p! q
         run-&gt;state='F';# S. |- O. R2 U. R
         run=NULL;
* o! b& m8 g4 A$ G' X; e9 F         if(ready!=NULL)0 k: I) X% s6 A
            firstin(); /*就绪对列不空,将第一个进程投入运行*/
$ b0 H6 a" G: Z/ `# v      }
$ s2 ?$ Y1 f5 e      else; \* D$ F' m  j: C
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
- ?( W2 Q/ @: m1 I         {  y: a# Q. p1 N$ a8 Y" D
            run-&gt;count=0;  /*计数器置0*/
" n3 g( M" @% Q: _2 E: H            if(ready!=NULL) /*如就绪队列不空*/. Z/ @& [) e1 ]' ?' m0 _! f: i$ m! ]
            {* P. @- |7 W. \- g4 `
               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
# f) p2 z2 h) v( k, w               insert2(run);% |  x+ t- q2 e' B' ]% ]
               firstin(); /*将就绪对列的第一个进程投入运行*/
) s) o1 w2 u2 p$ s$ i: e6 m% I            }
) e5 y" [. z2 R- w/ u) F  S         }
! |6 M% P- \& Y% N7 H' R1 H      prt(alg); /*输出进程信息*/
8 A3 w+ e! N: Z, ~   }* i1 ^1 B7 ?* Z# L- G5 ~; y, Y3 Q
}1 h$ }7 K6 B. F
/*主函数*/# v( A9 s4 B, b, G
main()
& o; n9 v: K8 V2 ^{
1 P0 I' \5 @% O) s7 `/ A: t   char algo;  /*算法标记*/  ^3 K! r# A: r" E
   clrscr();  w% ?# a5 Y8 B( u
   printf("type the algorithm/R(priority/roundrobin)\n");8 `, k9 P: L% k* l
   scanf("%c",&amp;algo); /*输入字符确定算法*/2 I  A. p3 L! `, U
   printf("Enter process number\n");
! a: Z: M- b5 l; L9 |   scanf("%d",&amp;N); /*输入进程数*/) n6 x, |5 L1 B, o& D. z7 }
   if(algo=='P'||algo=='p')
" L: \4 x  U9 Y0 g$ B   {( K, q: O8 N1 P2 i1 M
      create1(algo); /*优先数法*/8 a8 o3 R4 g  B2 W5 L$ C) V0 ^
      priority(algo);
9 `. G0 }! @3 \$ M  `   }4 n* u* w& j4 ^/ d6 Y. E
   else
' \+ ~7 R' v* a% |5 E& w. j      if(algo=='R'||algo=='r')
1 Y& k; Q( a4 R% S; x# E  [& j      {) @% j5 H! n+ X+ W7 l
         create2(algo); /*轮转法*/
9 ?. e* m9 S8 |8 n6 P% \) S" _         roundrun(algo);; q& H# ~& b) ]6 y
      }
! D" w% s6 ~" S6 Y& X( Z9 E7 a% E}2 [8 {- Y" I  j. y7 {
</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 `* r4 ^7 V6 r6 J8 T

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈7 E6 ?: j! H% \. ?4 {" ], P( c

214

主题

642

帖子

1658

积分

四级会员(40)

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

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!) w. E4 f- h1 i/ `$ g7 k# l. S

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 | 只看该作者
这资料确实不错……; a, u3 j2 [" a) b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-1 18:01 , Processed in 0.068556 second(s), 34 queries , Gzip On.

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

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

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