找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 93|回复: 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 源程序*/
' A5 [; V) B, \1 Q8 V% q  O+ h#include "stdio.h"
! G; X7 p9 y2 W! G, u/ n6 F! p4 O#include "stdlib.h"2 x/ m) t% D# L
#include "string.h"# C/ j. K4 p" k, q* W* K
typedef struct node& L8 O1 a. y+ o1 X1 S& D. `, }
{* \7 `6 N: ^( [5 L) l
   char name[10];  /*进程标识符*/
& a) r" q5 F9 `# r   int prio;   /*进程优先数*/+ g' Q% a! A2 Z" L+ k4 Q
   int round;  /*进程时间轮转时间片*/& m: |) S3 C- x/ x3 g0 p* O' g
   int cputime; /*进程占用CPU时间*/7 @6 F9 |* m. h- I# D$ |/ E
   int needtime; /*进程到完成还要的时间*/
! h+ q# }9 S8 m   int count;  /*计数器*/
4 G6 H7 A3 K  g0 O  _! r   char state; /*进程的状态*/
0 `. Y8 F( A' e' r: G  p$ x! x   struct node *next; /*链指针*/
# l3 n' ^0 m# y4 s+ H}PCB;7 ]0 T1 a8 a( v; w( L& ?# u
PCB *finish,*ready,*tail,*run; /*队列指针*/
8 V- g" g8 a; r! O' ~5 gint N; /*进程数*/
/ \" c2 h; {' R$ g0 N1 c9 |/*将就绪队列中的第一个进程投入运行*/& q5 o4 V& u3 O& {! P
firstin()
( b0 B" u4 k, f" }# T8 K2 S  o{
6 q) u' A' V( V5 z   run=ready;   /*就绪队列头指针赋值给运行头指针*/  a: `6 `( j+ ?6 K" [+ [6 q& [3 v3 v
   run-&gt;state='R';   /*进程状态变为运行态*/
7 y& F$ K& v9 g5 y   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/4 F) A7 h. Y7 l% D& ?
}
. o( T  H1 x2 b0 y* m+ V/*标题输出函数*/
  @9 ?/ T& \6 Z* Qvoid prt1(char a)6 Y" }, V. _; K9 {8 m( M9 B
{- i6 a' a* E6 Q. {/ J6 ~
   if(toupper(a)=='P') /*优先数法*/
8 u9 A) w0 C+ Q) N  ~      printf("  name     cputime  needtime  priority  state\n");$ G' p  p& R+ k" H/ K* s  S
   else
9 o- x% K" ~& z8 N4 |' N      printf("  name     cputime  needtime   count   round     state\n");/ u! |6 M9 s- W$ d2 [9 q$ `6 Y
}% k4 \1 {) _0 O. s: D
/*进程PCB输出*/
+ [, [# X- l# S) ^) Q8 _void prt2(char a,PCB *q)
8 u: H  c9 @; l0 M: W! x{- s9 n  K7 A) O9 k2 Z
   if(toupper(a)=='P')  /*优先数法的输出*/
' J4 J3 x/ ]. R& e5 ?      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,) a) f7 ]  i+ A+ T# k0 j% a
       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);
" m9 j- w7 f% \" w. h1 b* Z( n   else/*轮转法的输出*/- Q( j" M% u1 n% O! ?
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,  Y4 j+ b) g- D0 [. y' w  s% j
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);; u% R' W+ b2 n" S
}
  [# q/ G2 n3 E7 `/*输出函数*/
3 |: h8 G" ?4 o& e# Cvoid prt(char algo)+ _8 b( A7 k5 S8 S& X4 K
{
/ q- z/ i9 |0 C' u. K9 V0 ?* O   PCB *p;6 n  G% p: ?; V9 j$ [: u8 r) p
   prt1(algo);  /*输出标题*/; R8 Q1 B" _' Q
   if(run!=NULL) /*如果运行指针不空*/
2 b/ E; V- g  _' o& u9 h! _      prt2(algo,run); /*输出当前正在运行的PCB*/& ~4 J0 _! `& B6 j& {) Y9 N' p
   p=ready;  /*输出就绪队列PCB*/
- i4 I1 i. L) C  ~  y   while(p!=NULL). d5 @& ~! b( m' [% D! t2 V  h
   {
( e( x0 Z; p, s0 c8 l      prt2(algo,p);
8 s9 K: s, E; F& p" F      p=p-&gt;next;3 B% W" `: ~$ |) s: \, i1 |2 y! a
   }' i# I& A! {3 ~* t+ `- \. c/ c3 Y2 L
   p=finish;  /*输出完成队列的PCB*/# m2 R6 ?8 p9 J. i1 U* C( U
   while(p!=NULL)
; D9 d+ ?, R) b$ Z6 e) z! a( o   {$ ?. c" ^' e% A+ _4 L" r% n, s
      prt2(algo,p);, Z0 y6 q1 `3 ]$ d
      p=p-&gt;next;
% `+ r4 _0 g7 \& Y6 ~% ?7 y: e   }
, F& {: n/ S8 {$ d   getch();  /*压任意键继续*/6 i" r* g8 Q& W: r: I
}
4 J% @& e6 J8 h, x- C4 p/*优先数的插入算法*/
& q4 S. F0 Q2 Ninsert1(PCB *q)
: {* t, ?! f" g) f{+ H& `) t7 P; c0 K4 ]* r$ t( A8 ]
   PCB *p1,*s,*r;. S& @1 \* @9 A. V$ H0 [& X
   int b;
- d: M% [: a1 c7 g# q6 A9 q) Y   s=q;  /*待插入的PCB指针*/1 Q) z. D  M+ w6 N8 x3 `
   p1=ready; /*就绪队列头指针*/
/ O/ y: H! N/ p+ T( o   r=p1; /*r做p1的前驱指针*/2 I5 `1 h/ D4 o
   b=1;1 {5 S2 H7 T# D+ g
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/
$ `/ J0 v) Q$ `: b8 _      if(p1-&gt;prio&gt;=s-&gt;prio)
# P- J) f, W( o- X5 P0 e      {
2 X$ I. r) o3 V$ s7 e$ ]$ b8 d; i. M         r=p1;% l3 ~4 ~7 m8 v, E5 y- f- |
         p1=p1-&gt;next;  o3 m3 l/ t/ e% g9 j
      }4 O" }, S8 D: L! C( s' O; L( l
      else! {/ H' `/ {! K5 {+ x9 s3 N$ [
         b=0;
$ X; L5 V& t( h/ ?5 w   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
! b1 p, J, N) @- ]+ O# {* I   {, i1 R8 t/ ^; n* z) V0 B% m
      r-&gt;next=s;
: p- C& Z9 O3 w* s      s-&gt;next=p1;. G/ G7 `$ a. G8 u
   }
$ @6 X, _: G9 T0 A   else7 C. t) E" Y- M/ V3 }9 c& I- z0 H
   {4 g7 Z2 w. j# o) i% e
      s-&gt;next=p1;  /*否则插入在就绪队列的头*/8 _& p" u- P1 d8 `) {2 S
      ready=s;
; |4 V2 l8 j8 [/ X0 N   }
1 [( U4 w" G$ y' F. V0 a' `}
* [7 y5 D& ^7 y- c* L+ d% q/*轮转法插入函数*/; X' B+ t, y% ]. X
insert2(PCB *p2)8 @7 w7 G5 |( d0 t+ S& k
{1 u" {- n1 M* E! m4 q1 K, o$ Q
   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/
- q1 q0 F/ ^  L5 A3 G   tail=p2;
0 |6 f1 p% l0 q8 z   p2-&gt;next=NULL;
& `# T+ A! K, q3 S! z2 |/ A}
- I! k9 J" y  @6 ]/*优先数创建初始PCB信息*/& o/ @' G& D( W' e: {0 ]1 D
void create1(char alg)9 J7 G' b) ^' p* S3 M& N3 I
{
0 y6 ~7 H+ |' e8 }" k   PCB *p;
% t0 p4 J9 b) [# \& v   int i,time;
1 T$ g7 m1 V5 z7 b$ v   char na[10];
: l$ g/ G2 Y3 |& i7 X! P  e   ready=NULL; /*就绪队列头指针*/
9 T% W- i" ~+ T" G  s   finish=NULL;  /*完成队列头指针*/
; M7 q! z0 H7 c( P& @- \( A/ P   run=NULL; /*运行队列指针*/: ]7 ~! _7 q! Y& e7 p' S
   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/, e' |2 H$ t8 s8 U/ {* d/ y
   for(i=1;i&lt;=N;i++)
# e$ n# j6 }/ Z- a8 @% \# O   {
8 D4 O" Z3 o6 I( |. E2 \1 _  M      p=malloc(sizeof(PCB));; D1 [# T1 s7 h, X
      scanf("%s",na);
$ U( k! z" N3 D! l. C4 d4 B      scanf("%d",&amp;time);
' }% c/ Y" r7 s6 J      strcpy(p-&gt;name,na);- k; S: v3 y) w4 N8 a
      p-&gt;cputime=0;
- j) [, |1 S5 d& R      p-&gt;needtime=time;4 M( ^! K" E* B' A
      p-&gt;state='w';
, _6 Y' f5 f  D8 J- \0 @      p-&gt;prio=50-time;
% F7 t! n. c8 b# |) w% b      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/: K/ {9 |  x( |9 v$ P6 U. {
         insert1(p);. t4 W, r5 H' M' f4 {* I
      else) L2 D. z9 l: }, K" X& h
      {
4 G- F: s1 Q0 P         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/" ^$ G1 D/ k5 u0 B8 s
         ready=p;
, ^8 c% U* T3 b9 F4 h0 q% r      }
5 n" p( B5 _/ W3 N2 G   }
3 x7 a, c, y; y   clrscr();
1 d7 g5 G0 w8 L7 C   printf("          output of priority:\n");
% [8 Q+ l5 W# n8 F6 ^; S$ i, s( V   printf("************************************************\n");% r+ Q9 h9 z! L$ G6 I: s2 Q
   prt(alg);  /*输出进程PCB信息*/
8 V, `. |  W/ U1 f, a/ A   run=ready; /*将就绪队列的第一个进程投入运行*/  u5 Z; T/ O1 R& o% r/ y1 b" i
   ready=ready-&gt;next;
% F3 T" Q0 P; I( f/ Y6 N   run-&gt;state='R';
8 B9 J* T  Q- @. M}
, F0 N: u& `9 C/*轮转法创建进程PCB*/
% k' u9 L8 b2 r! Y# h+ @void create2(char alg): G- k7 i$ `* V7 w+ q$ y5 C
{
8 k# ]* e5 N) v! p& L( t   PCB *p;
6 ]4 w8 H) C% P5 p6 I   int i,time;
# Q# N1 ?) c% B% L- z: G   char na[10];
  \" g5 q  R" J0 ~8 @) w# e+ n9 \   ready=NULL;8 s, V7 q' O  d; K
   finish=NULL;
6 O+ m" P: i& A! i' z/ s   run=NULL;
$ v8 ~/ j) ~: f$ {' N& O   printf("Enter name and time of round process\n");# m4 V0 \$ P, B1 N( j+ u+ |
   for(i=1;i&lt;=N;i++)
  ?7 [1 F9 \) k; T0 w) a( V" O   {
! A6 B1 P* y& o+ `& Z: T' f      p=malloc(sizeof(PCB));" ]2 Y* j% d* c$ z
      scanf("%s",na);6 F/ O+ n& ^9 y/ i# C
      scanf("%d",&amp;time);
, C5 h8 V4 X' K, p  }      strcpy(p-&gt;name,na);6 y$ Y# k/ d; \5 k; w7 R
      p-&gt;cputime=0;3 u) g) k4 S9 B% a- [
      p-&gt;needtime=time;
) u. i$ v" L6 n* I2 S      p-&gt;count=0; /*计数器*/
, o* C5 x2 E0 ]" H' D6 G      p-&gt;state='w';) P0 M, \$ V9 @* o8 K6 A4 U
      p-&gt;round=2;  /*时间片*/; G0 f+ ]  H1 u9 L' {) d- A
      if(ready!=NULL)
$ x1 K/ _% W7 R" Z         insert2(p);/ b+ r, R& Y) y
      else
. s  ]. ^& M' _: M$ G* S      {' L+ W4 X# @0 S) @' K
         p-&gt;next=ready;
2 _& ~' \- J- x, l2 g! i: V* O& @         ready=p;' p% W( q& i$ p& G0 C
         tail=p;( x/ v+ {5 Y0 W5 i5 V+ q
      }' Q3 n2 B5 ], {
   }3 U6 w+ l/ A- ]) u- \7 f. j, Z
   clrscr();
, A( e7 U* n5 Z  V, f) Z' W   printf("              output of round\n");
& R; |4 G+ ^# X2 ^# B   printf("************************************************\n");; ~+ A% ~4 |# z' a' X& B
   prt(alg);   /*输出进程PCB信息*/
3 Q$ w; D* |$ O" K- t   run=ready;  /*将就绪队列的第一个进程投入运行*/
% {# |0 G1 j/ A6 o/ L   ready=ready-&gt;next;+ P7 y3 V8 a- Q
   run-&gt;state='R';
# j1 M3 D+ ~3 m3 d1 p* e}
5 E; Q" Y/ t8 K1 k+ a; J! R/*优先数调度算法*/0 l8 I* \0 i- e, i- _! ~
priority(char alg)
0 [+ N* ~6 l" s3 y- J{" \+ Q! r* A$ c- R
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/
- o" z$ v( B& \0 P. P9 ]+ i0 U   {
) C0 }& F/ \3 t1 W) r: E      run-&gt;cputime=run-&gt;cputime+1;
; v/ G! ^1 w$ @3 Z      run-&gt;needtime=run-&gt;needtime-1;  h2 c2 W6 @4 @$ v, N) T$ j  y7 k. O
      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/
9 n, Y; ~$ u, e/ ~. M+ U0 C; r9 l      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/
1 u7 P. A$ y% j2 L/ v3 G! L3 t      {5 Y* n, `- X* Y- Z) r* u0 R
         run-&gt;next=finish;( _( b2 G3 ?) B
         finish=run;, o  q/ B$ M# E9 _3 f& p
         run-&gt;state='F';  /*置状态为完成态*/$ x6 Q6 h, h) L7 e7 B) T( z6 H2 [7 z% C
         run=NULL;  /*运行队列头指针为空*/0 L" e, {/ g& F0 D6 H! T
         if(ready!=NULL) /*如就绪队列不空*/" k1 d, V5 h+ \
            firstin(); /*将就绪对列的第一个进程投入运行*/0 B2 i5 B+ U- ]0 ^* A
      }/ F) I2 d, k3 T. d
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
) [- F" y* h  j0 G- `# Q; U! T         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))- a& {3 Z* o+ G5 y: ]) E$ h* D
         {1 X2 _( C, \. Z
            run-&gt;state='W';
7 y. O& j; C8 w2 C            insert1(run);
2 Y+ {  G1 w9 ]; E+ Y9 \, x            firstin(); /*将就绪队列的第一个进程投入运行*/
5 f- v: i' O" X" e4 q; j; ~3 }  U* c         }
/ F8 n. [, H) ^+ e/ ~      prt(alg); /*输出进程PCB信息*/
  n5 _, [, ]0 f, j9 Y% K; A   }. G4 v1 O1 q) q6 E- z2 m: l
}
5 s9 J. c# @5 _0 ]5 v  a/*时间片轮转法*/
) U: ^* o3 j- u" f% T3 j; Croundrun(char alg)0 ~5 S: v# Q/ j. x# r. \5 P
{
9 s4 g+ s+ c' l& ]9 n% @/ L   while(run!=NULL)+ D' ]6 F: I0 d
   {
# H) W. _* \0 y! G  T      run-&gt;cputime=run-&gt;cputime+1;5 Z* c# \" s! L5 _% G
      run-&gt;needtime=run-&gt;needtime-1;. u9 c4 j2 g5 m+ x6 `
      run-&gt;count=run-&gt;count+1;, e: F. r1 n/ b# P; b0 g$ s
      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
4 Z% l1 S' v$ H      {
$ K/ c+ A& @6 n- ~0 i/ {; ?         run-&gt;next=finish;
2 R9 ]# I9 N5 M3 I& z- R9 o         finish=run;9 I" g  w9 L# K- a' J& d
         run-&gt;state='F';: U+ O1 N4 M8 w! _3 c- T
         run=NULL;: e, s2 l: O  @3 M6 Y) @8 E
         if(ready!=NULL)! u2 K, F7 x& S* b
            firstin(); /*就绪对列不空,将第一个进程投入运行*/! [- l3 U6 |0 [5 _
      }
8 X( p. @6 T, l/ e      else! y( a+ Y2 q9 i9 x
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/6 Z. [2 K2 y0 L+ K6 U. x
         {
! r: U8 V* s6 t, }9 h            run-&gt;count=0;  /*计数器置0*/
; a. O0 [' Q; I2 s            if(ready!=NULL) /*如就绪队列不空*/+ y" }5 `! d" Q0 I# F8 J
            {
7 J! O7 F+ ?$ Q+ x' Q: [9 Q               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
9 w3 Z2 {2 |% Y. ?( `  I3 x5 c               insert2(run);# m# x7 M0 i4 ^# b9 G  d( @) d
               firstin(); /*将就绪对列的第一个进程投入运行*/
1 W! m; W  P" Y3 q* ?            }: Y" R2 G% l0 c
         }
( W1 n* Y0 ]3 `* G$ d$ m+ d" N$ G- G, I      prt(alg); /*输出进程信息*/1 h" L: N! `1 P' P
   }0 V1 P* ]5 ]# P
}/ [" L4 _& |6 ]/ L+ s1 M
/*主函数*/3 I2 L: Z$ T& r, A. E$ x- D
main()
1 x/ Z8 A5 f! [3 A) N( N1 m0 `{
+ p! r6 C4 u: y2 c5 r8 |/ |! Z   char algo;  /*算法标记*/
' `/ \- A# Y% ?; y- ~   clrscr();1 v3 x- N3 }* _! R/ j
   printf("type the algorithm/R(priority/roundrobin)\n");7 Y' p, c/ |/ Z) O
   scanf("%c",&amp;algo); /*输入字符确定算法*/( i% t; i* a8 Z3 W8 j' E
   printf("Enter process number\n");
  Z0 F3 ~, `6 [/ x' i) i+ }   scanf("%d",&amp;N); /*输入进程数*/
7 U3 w8 N4 f2 v2 u% u- i) U' S   if(algo=='P'||algo=='p')( d. Q, C* e8 z1 b
   {  y$ y* _: |# D5 A
      create1(algo); /*优先数法*/
, v+ d1 d4 S, j1 V$ I  D1 P      priority(algo);7 o- x+ z0 {3 m1 _% I1 e
   }
6 N7 m" Q' {1 R" g   else
, ^- ~+ R2 \0 B+ V: c  t% V; g      if(algo=='R'||algo=='r')
9 X. w" Z& w2 T: w) L( u      {
: X0 R2 u7 |4 [         create2(algo); /*轮转法*/
. ]( a- V* B* y9 p5 J6 D7 G$ m( ]3 r# l6 P         roundrun(algo);
; H5 l" A. g- m2 T7 g  C. e2 e      }
( m% ]6 D$ x& x" n}8 w) L% i# Z4 W. d; v
</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 | 只看该作者
谢谢分享,必须赞一个~
$ y& v. c) A3 |; E8 _0 J

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈3 D$ ^0 u/ o4 L" K4 F. q

214

主题

642

帖子

1658

积分

四级会员(40)

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

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!1 V$ g( Z; }. W$ p) L9 d( 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 | 只看该作者
这资料确实不错……( [0 G- b2 [6 d8 K* Q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-1 17:49 , Processed in 0.069064 second(s), 35 queries , Gzip On.

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

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

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