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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
5 X( g  D& u0 p) i#include "stdio.h"; L4 i/ K. a. g* |2 c3 m
#include "stdlib.h"2 R; }# l# u0 L) K
#include "string.h"
8 L" G3 L5 {( R) W( ?typedef struct node
; v% @% }3 i* L4 c% E{' p/ X2 U+ e9 }% z
   char name[10];  /*进程标识符*/
; Z- I7 Y' y. [; J2 J7 l   int prio;   /*进程优先数*/
9 |, E" R2 H& g+ A   int round;  /*进程时间轮转时间片*/
+ C4 Z. t$ a, N% a) T4 X- Q   int cputime; /*进程占用CPU时间*/
# q" r& H8 @# y8 U- i$ O- ~. X' I/ b   int needtime; /*进程到完成还要的时间*/1 G# \4 n$ X/ j
   int count;  /*计数器*/
7 L( n, W7 b! n- P$ A   char state; /*进程的状态*/
, I3 E" @: O5 @% z) I9 n$ K   struct node *next; /*链指针*/
: W; {$ _3 `% L: D* E}PCB;3 i' S) i0 r# _4 m
PCB *finish,*ready,*tail,*run; /*队列指针*/+ t1 H. _6 S0 V9 L
int N; /*进程数*/
# _, z6 I# V  S4 b/ {8 Q/*将就绪队列中的第一个进程投入运行*/: K0 F# f: K) v4 w
firstin()* B7 X1 s% d5 R, X* e
{
" D, M! Z' k: y: j8 }   run=ready;   /*就绪队列头指针赋值给运行头指针*/  |  U6 T( R) p4 E) ?# b! H
   run-&gt;state='R';   /*进程状态变为运行态*/& |! p0 d* w1 X8 Z# b- L
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/* {( h" Z+ ^" }7 Q/ C6 W2 k* h
}
7 i4 b( V) N7 r9 m: U1 Q6 G$ L/*标题输出函数*/
0 }9 @; J$ S9 C# g4 hvoid prt1(char a)4 `) k  Z- [9 _- N( V
{! n/ l; h* h/ F( x- x
   if(toupper(a)=='P') /*优先数法*/+ D' ~' f# \) o1 x* ~0 f
      printf("  name     cputime  needtime  priority  state\n");
" }: q$ R$ Z: J4 F1 w   else
( _: \; a8 e/ H$ T      printf("  name     cputime  needtime   count   round     state\n");3 _' C1 B! I3 s. t, @
}
. U1 d. K* I! W. @% ?/*进程PCB输出*/
7 \6 X8 n9 O8 w/ K; j2 Wvoid prt2(char a,PCB *q)! n8 h; D! z* ^9 A$ Q$ }
{$ h; Q2 d3 g. d
   if(toupper(a)=='P')  /*优先数法的输出*/8 h. ?1 d3 u# }9 K
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name," Y" r: c+ U( [8 X6 ?; }* R
       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);$ V* d. J) z6 `4 |: r2 o8 Q3 |
   else/*轮转法的输出*/* s, w2 n- U  E
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name," t( {: |; j8 o9 P3 W. A% v; c
       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);- e( A$ ^0 k/ p# s4 e" i6 f/ }
}9 y; I3 W8 u, n- u  _/ ?
/*输出函数*/6 p' E' j! |2 m8 d: z/ d# H
void prt(char algo)
, b1 z: J0 e% g0 R/ k{
* o) P0 n) O$ K   PCB *p;, D" W8 E' m; D3 U7 G, q, g
   prt1(algo);  /*输出标题*/8 K0 ?" y: J3 I; J  g2 ~
   if(run!=NULL) /*如果运行指针不空*/
& s0 t0 H# i1 x* y  r5 \! x, X      prt2(algo,run); /*输出当前正在运行的PCB*/
3 R' a3 R8 R& x8 o$ s   p=ready;  /*输出就绪队列PCB*/0 [4 r' u' H( g! J, m7 n
   while(p!=NULL)2 K2 h6 |8 m" {: [  j. q
   {% @: `+ J: C4 ]) O
      prt2(algo,p);
/ j$ v, r1 M9 P: v# ]9 o) v      p=p-&gt;next;* J0 c, G/ {6 g0 Z. G
   }
( _; O9 r# x6 H! c& D1 i   p=finish;  /*输出完成队列的PCB*/7 ?) y$ Q# @+ ?; _
   while(p!=NULL)- q- w1 N9 m) n$ B' y% Y- f4 D5 {, N
   {  Y+ Z: |8 E: t3 C$ `% w
      prt2(algo,p);
1 [8 t6 T; q" Y6 v      p=p-&gt;next;' Z+ A! L- P9 X5 t7 U$ o
   }) L$ `9 ?5 j" t3 o1 ?# N
   getch();  /*压任意键继续*/
, h! i2 S1 j1 ~" [}+ T2 L) g: `  l. B% O
/*优先数的插入算法*/
5 b2 n/ A  ~: r% F3 M$ uinsert1(PCB *q)1 F& x) d. i8 ^3 Z% z7 K+ s
{8 H/ J6 t$ F" m0 y, d+ C9 Y
   PCB *p1,*s,*r;9 `& Z3 v* P( V* ~: U; ]
   int b;
$ V0 i- N/ I+ o   s=q;  /*待插入的PCB指针*/0 Y( J' C9 v7 F9 m/ l" \2 O5 E+ d! _
   p1=ready; /*就绪队列头指针*/' V8 B" h/ T- M
   r=p1; /*r做p1的前驱指针*/
& ]5 k  Z/ {( Z. J5 a5 o3 o   b=1;
2 O5 r  d: Y4 u- k; J; G, @   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/
- K7 N! w3 W/ E( ^2 m! t, `6 `      if(p1-&gt;prio&gt;=s-&gt;prio)
5 S) _6 u9 a" u! O+ u7 \) }1 x* ^      {; R4 t. K8 ~$ n. E1 W
         r=p1;% }3 B# E, t& P) l2 ?& F
         p1=p1-&gt;next;, S" [+ q8 U9 `8 f
      }$ c% C% Y9 P1 ?# p5 F: J8 g
      else
7 {7 _3 ~0 X' h, ^5 O         b=0;6 k8 i) B( b- u
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/
* ^' x& J  u' b5 Y1 ?   {
- l7 [$ i$ h  K1 {. n1 r1 W      r-&gt;next=s;
) E2 O: Q8 N9 F, N, w, j: [) v      s-&gt;next=p1;
# ?3 I$ C2 A2 ~5 `3 ^- D   }
2 m0 T% k. A' R! l: q   else9 N$ G, H2 `, d! u$ M
   {
, `5 [1 p, Y) y# l# L6 M      s-&gt;next=p1;  /*否则插入在就绪队列的头*/# m( W( i" |" L
      ready=s;
1 V$ P4 S- h% z: W- V) D   }
. @! ?6 i$ A1 t2 x5 R( D( H3 ~}. `8 o9 S/ I8 @
/*轮转法插入函数*// Z( P* r! I2 q8 M! v/ y! c9 Q
insert2(PCB *p2)5 L4 C' o+ T/ E' ?& B3 q
{
$ c7 K' |' }5 i+ [   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/4 n) c- p" {0 R6 p! S# u: m- f
   tail=p2;
" f1 ?5 i$ n- S! u5 B8 b- M   p2-&gt;next=NULL;) B( R( p) c+ \
}
9 N; l% {# Z4 {9 d: y. H: _/*优先数创建初始PCB信息*/
/ G  N8 x$ _! cvoid create1(char alg); j0 F. C' j  ~6 \9 l* j
{
; y( Y; n7 D0 @. {8 c   PCB *p;+ c+ \- n, Y! z
   int i,time;; M: ?) ]0 K/ f  F1 p
   char na[10];
5 b0 _+ b) @% y5 n4 t  j/ ]   ready=NULL; /*就绪队列头指针*/
* i: ]: ?3 B" L( v2 A   finish=NULL;  /*完成队列头指针*/
" z' \+ a& w, c$ l: U   run=NULL; /*运行队列指针*/
& v: j; F) C5 e, V. H& K   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/0 ]1 R- G$ k8 N0 d& r3 O2 [* d
   for(i=1;i&lt;=N;i++)% ]; g- U6 G, Z
   {
* p8 C" A0 M6 o- E      p=malloc(sizeof(PCB));8 P) Z5 H+ T; K4 Q
      scanf("%s",na);
8 D% a/ p* g4 f1 y* T8 `      scanf("%d",&amp;time);
+ |4 k+ B! n, A. b      strcpy(p-&gt;name,na);( u8 N) T$ V" h6 d' _9 W) i
      p-&gt;cputime=0;
$ Y* t" x; Y+ F      p-&gt;needtime=time;. r( `* v5 B3 a7 o
      p-&gt;state='w';
  D9 [$ O+ \* F4 a; F/ f% o      p-&gt;prio=50-time;
% r+ Q- H8 _# V# L. X; o      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/$ V) _3 [* R0 `! n
         insert1(p);
. D; ?! e5 N; T( G      else) @" ~$ I4 [4 u7 E3 ^2 F: D
      {# U* w3 k; |( I# N% X7 V
         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
8 A: L( @& H# ~+ C         ready=p;4 ~3 T' I% c" ~- L9 l8 N/ H1 p* [8 {2 i
      }. b* M4 E& G1 j  Y5 l  `! M% ?
   }9 G% Q; Y6 Z* O3 S( k3 L# v
   clrscr();1 ~( l1 l  k3 s& x& x* N  B6 N
   printf("          output of priority:\n");* g& q; T( @: |1 |7 Q
   printf("************************************************\n");$ k; {" r, M) E% U+ w
   prt(alg);  /*输出进程PCB信息*/: G; k* N% q7 D+ c: O' C& H7 }
   run=ready; /*将就绪队列的第一个进程投入运行*/$ k3 e( A! z! a& M1 w
   ready=ready-&gt;next;
' ^& J( K' ^, m1 C9 d   run-&gt;state='R';/ Y4 w0 U  [0 a
}6 {8 r) t2 C% b- G
/*轮转法创建进程PCB*/
7 F6 ~  u. |" ^4 S1 nvoid create2(char alg)' w3 f9 j7 `4 \# h
{8 t+ @7 d! l: R2 u" Z$ S0 T
   PCB *p;2 v& x% r" Z2 G" X" G' z
   int i,time;
& _3 m2 {- O) P# G8 P2 j   char na[10];
8 \7 r5 A; G+ ]: ~   ready=NULL;
& ?' U1 M- h: t# c+ r   finish=NULL;+ Z! [: q! U6 ~" Q: U
   run=NULL;
* `# h, ?+ ~) ?' o/ x6 r' ]   printf("Enter name and time of round process\n");1 }! t) a7 _, u) ]9 |6 g  x4 u
   for(i=1;i&lt;=N;i++)3 G0 J: n0 f& Z; q8 _
   {
( {, W( D' V6 N      p=malloc(sizeof(PCB));
+ N- @4 g  p6 e5 V1 A      scanf("%s",na);
4 @* S9 e0 Y, U) ?# \; ^1 }      scanf("%d",&amp;time);
/ N4 Q9 w: e4 w3 W      strcpy(p-&gt;name,na);
# p0 r. y- K0 J3 G# ^% G) l2 ?1 R      p-&gt;cputime=0;
" H2 Q6 i7 e9 X" e2 `3 o      p-&gt;needtime=time;
9 v/ y- v$ R7 K! i% r" ~* L! \      p-&gt;count=0; /*计数器*/& G" T- k! \# ?! U1 Z& m* K
      p-&gt;state='w';3 `( a/ E8 M4 q
      p-&gt;round=2;  /*时间片*/
! G( E* {3 H( [/ W      if(ready!=NULL)
) X- z* }3 D5 G6 @9 S         insert2(p);
- p+ x4 l; s2 ]& Z) z. h& Z      else  `- b3 k/ n# u7 ^  R! w
      {0 q4 p* B6 P0 ^$ d
         p-&gt;next=ready;
% _" i! q" k! u- I% N& A         ready=p;
1 c2 y9 x2 {" |: V3 j         tail=p;
; l( F( w& N2 r! d2 m2 Z      }1 t6 V* P, ]* X2 m6 l. _& B
   }
+ G! E2 {- \6 d# a7 G% w   clrscr();2 E. p1 Z5 V8 x" ^! C# r
   printf("              output of round\n");
" W8 [2 h, r; |   printf("************************************************\n");7 y; Q" k: D4 F$ R2 L7 t# S
   prt(alg);   /*输出进程PCB信息*/5 |7 _& D1 M. R4 G
   run=ready;  /*将就绪队列的第一个进程投入运行*/
' y! r, I* v1 g0 h3 U' p   ready=ready-&gt;next;" s) C, ]0 K* ^; p: h& X5 q
   run-&gt;state='R';# \% l7 ^. S& T9 b( i
}% v$ q: T6 I8 w  t2 y4 e
/*优先数调度算法*/
" u* P0 N4 U9 L% M# ~2 ppriority(char alg)5 [6 f! X: S7 g- t3 J% I# k
{4 z+ W* E' e# T% c0 d) q1 G; B  V
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/3 `( i6 h- |/ _- H
   {- z! f: I: Z3 A2 y8 p% W
      run-&gt;cputime=run-&gt;cputime+1;
% O. m: y) l& j. y3 ~5 d      run-&gt;needtime=run-&gt;needtime-1;
' ~9 z6 N" a" @0 W  n' g, o0 {4 t      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/
6 A8 ^5 y' l" y8 ^+ d/ o      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/8 n1 u" l3 J7 R2 q# Y1 e
      {
( A1 x/ q/ d8 m1 m5 c         run-&gt;next=finish;7 i8 k4 B" f( f3 {' }: C* s
         finish=run;+ {: i( Q/ M0 p* P" G
         run-&gt;state='F';  /*置状态为完成态*/
# W# L0 G, p+ X) ], H+ Z         run=NULL;  /*运行队列头指针为空*/
6 T- p* d1 U9 {* N. |         if(ready!=NULL) /*如就绪队列不空*/- d" S, c5 V) ^8 I+ q+ l
            firstin(); /*将就绪对列的第一个进程投入运行*/
: T/ x$ M4 g) g* X0 a& \      }9 u7 T& ?! G" ^  B+ [
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
+ a4 S2 S& ^! A4 h         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))
) e) w% c# _. y         {% g# ~- d4 P4 k% a; l
            run-&gt;state='W';, Q; F9 `; y  |  s" }
            insert1(run);
$ k8 q2 {8 x+ w$ _7 P5 s            firstin(); /*将就绪队列的第一个进程投入运行*/
& N* Y% [1 d/ Z+ E4 u2 r! K         }
# S0 F1 l% [1 O0 p* z# v      prt(alg); /*输出进程PCB信息*/
. `# s8 ?* ?: K; Q6 k1 Y( w2 w   }" u) q  s9 y4 `0 p
}  u7 O1 e# }. u4 s+ h  y* G, N
/*时间片轮转法*/
6 E5 D1 L" T9 Troundrun(char alg)
) \6 A5 m. R, C- [1 ?{
6 [( a, ~3 Q1 `/ J5 z, e   while(run!=NULL)+ Z1 N0 ~: e% H$ w, q: ^2 \
   {: U& A' x, l! \! c
      run-&gt;cputime=run-&gt;cputime+1;7 b* v+ ^4 c: m% j' a
      run-&gt;needtime=run-&gt;needtime-1;
) ^2 c3 }# {/ J2 y      run-&gt;count=run-&gt;count+1;
: I) x( H) Q% I7 k0 X% X      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/
- e3 m* d3 g& c) m      {
) r& I% f5 R( o( `  O& ]         run-&gt;next=finish;' d" j* c0 y5 K5 v) c' l
         finish=run;
& Q7 F- `+ N* f1 a) E! p4 j         run-&gt;state='F';5 u, W" E! ]$ G  d4 ^, u
         run=NULL;
. q" Q2 ?6 ~# M4 @. _, @         if(ready!=NULL)1 @; f4 M+ J5 P1 z/ W1 ]/ J
            firstin(); /*就绪对列不空,将第一个进程投入运行*/
2 d' O* x8 b2 U/ J      }% K8 D" \8 v( X5 S
      else. j* t. K2 |4 H
         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/
6 L" a+ C" x9 K9 ]. q         {
. i  R1 _/ ?( q2 X0 l            run-&gt;count=0;  /*计数器置0*/, y; p6 i  y% x! q+ q" U
            if(ready!=NULL) /*如就绪队列不空*/6 k' ~- A9 N& _) C6 D4 g8 v- E
            {
8 H. W) k- K' m( _1 X3 z               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/
- U: W) q- p. S/ G% ]9 @               insert2(run);
! s* r% g6 o9 C% h               firstin(); /*将就绪对列的第一个进程投入运行*/1 _! U- S; r% h
            }
' v: o" ~# K/ n- b         }
  {. U6 w) l. u: G      prt(alg); /*输出进程信息*/: i- D+ K7 R' E9 y+ p7 A+ o; |
   }# d9 k! s. G6 ]( w4 _+ P3 r
}& n7 X4 J; @9 V9 ~
/*主函数*/
* N, p) A- c* l/ xmain()
/ \& W4 e4 z7 ]" W' i( R+ ^{
7 y! g, q( c, |+ c   char algo;  /*算法标记*/
/ Y. z4 K4 w; S: D( ]! T3 ~0 {   clrscr();
* l/ h* r* Y6 A2 j  }" n1 c4 p* g   printf("type the algorithm/R(priority/roundrobin)\n");- v$ n( P& S: B: J0 o* H
   scanf("%c",&amp;algo); /*输入字符确定算法*/
: x) A/ _, ~: |& o   printf("Enter process number\n");& K! S3 K9 `$ |& z& O
   scanf("%d",&amp;N); /*输入进程数*/  r5 m6 A& _" H) s9 N- c
   if(algo=='P'||algo=='p'), W" p, D9 q% l' T
   {
' G9 G1 Z3 x  }      create1(algo); /*优先数法*/
  R. N% Y/ |# C8 W      priority(algo);
, q6 o5 ^; v4 `2 i. [" W   }% G9 I! V$ n, |! D. D
   else6 H& `7 N4 s$ V% D# R9 d2 [
      if(algo=='R'||algo=='r')3 b$ Q' @) y( s5 M
      {; G7 Y/ b7 [* {) V. F
         create2(algo); /*轮转法*/
  O$ }8 q& U) S& b. k         roundrun(algo);0 j! O% r% w. ?. M3 v- y
      }
- c5 C4 d2 n* g# G4 `}
0 R% L' V9 f. i. A- K/ E</pre>

gVBZFryb.rar

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

该用户从未签到

2#
发表于 2016-7-2 14:15 | 只看该作者
谢谢分享,必须赞一个~" K0 F! P; y$ x4 T, J/ z

该用户从未签到

3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
0 N$ ~- S+ G+ A' X6 g2 A

该用户从未签到

4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!
& Q: z  ?! @# Q6 T. C

该用户从未签到

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

该用户从未签到

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

该用户从未签到

7#
发表于 2016-7-7 09:06 | 只看该作者
这资料确实不错……6 d3 y3 n" B! W. q% v% J6 `
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-6 20:26 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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