找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 100|回复: 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 源程序*/7 ?  z7 M" [) C% o. n. x( y
#include "stdio.h"  [' ]6 }# Y. L: Q2 Z* S
#include "stdlib.h"
) N  v% a( n7 C3 `4 q( k) X3 r* b#include "string.h"
; W6 v3 F9 E/ v5 N$ ]& _typedef struct node* H$ n' W6 g  w
{
9 _8 [4 x& s: D  @   char name[10];  /*进程标识符*/. c: L. a- T0 v; [& g7 T
   int prio;   /*进程优先数*/
& H2 }, |1 ]2 T; I  \& `1 H   int round;  /*进程时间轮转时间片*/
! N$ G6 r' `! J3 ]  f' M. H+ f! L* K5 S   int cputime; /*进程占用CPU时间*/
$ m. v8 o( m$ F. i   int needtime; /*进程到完成还要的时间*/
+ a% P! w; p! X# s) n& K/ E   int count;  /*计数器*/1 l1 L" p4 G( `2 ?/ b" z5 `
   char state; /*进程的状态*/) F3 ?% D% S  Y! O7 B, U" k3 x
   struct node *next; /*链指针*/
! t% Q3 Z' Y8 ]* \; o* ?. k}PCB;& @  {; y9 I* o9 I) Q
PCB *finish,*ready,*tail,*run; /*队列指针*/
! l% {7 h& u" o# yint N; /*进程数*/
+ c- ]6 C8 ?; N! C: F/*将就绪队列中的第一个进程投入运行*/9 F* z- K4 q; r( y( ~4 Z
firstin()2 M! ^& @* B: b6 v5 U
{. \1 j# b, X, E  f) }3 L6 z
   run=ready;   /*就绪队列头指针赋值给运行头指针*/
: m5 q5 L% H0 C& _# N* A8 w   run-&gt;state='R';   /*进程状态变为运行态*/' K' c& a! ]2 Q$ Q
   ready=ready-&gt;next;  /*就绪对列头指针后移到下一进程*/
& T8 p. k2 ~0 n3 L3 e5 I/ ?7 ]/ O}
! A( Q# u# u  D/*标题输出函数*/
% m  }" @! x1 V( ]8 n2 Pvoid prt1(char a)) ^; S# W' k# l2 ?, x
{; w$ K+ `  [, C8 @
   if(toupper(a)=='P') /*优先数法*/5 h1 _: `/ x; L
      printf("  name     cputime  needtime  priority  state\n");
1 e0 R- v9 ?0 G3 z/ _- E   else8 k. ^; b7 q7 x3 T& v
      printf("  name     cputime  needtime   count   round     state\n");! U% h, m9 o8 H  z0 ^
}3 R! n: A5 R0 W
/*进程PCB输出*/( C: c3 q4 q/ N; k7 R
void prt2(char a,PCB *q)  j  E4 \% @9 j5 z
{
6 A2 X5 q% \1 e, f   if(toupper(a)=='P')  /*优先数法的输出*/, M, w0 z1 R5 F' `5 z
      printf("  %-10s%-10d%-10d%-10d %c\n",q-&gt;name,
$ P$ h1 z6 O, s* H       q-&gt;cputime,q-&gt;needtime,q-&gt;prio,q-&gt;state);) S3 V" T& d7 Z& y$ j$ d8 W
   else/*轮转法的输出*/3 H; V% J8 i( H* B9 }
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q-&gt;name,
: V, R/ N! S3 k' F, x, Y! \       q-&gt;cputime,q-&gt;needtime,q-&gt;count,q-&gt;round,q-&gt;state);, r0 d' N; [& H/ s8 t" K
}
8 ]5 d: X; c( R5 L" x! a4 N/*输出函数*/* g3 P3 }+ s( W5 Q0 I8 |* z
void prt(char algo)8 r5 |' ^! b  U' L' |0 B
{
! A- m  j" C) g& r, `3 G, C   PCB *p;, w4 N( r+ h$ @  L: ~; H" `5 a5 a; [
   prt1(algo);  /*输出标题*/# j; X$ P$ d" z
   if(run!=NULL) /*如果运行指针不空*/& T- r, d$ S( w$ m! J% h
      prt2(algo,run); /*输出当前正在运行的PCB*/, m. Q! H5 K# T+ k5 m: c
   p=ready;  /*输出就绪队列PCB*/
! R+ V0 @/ z, ], ~! G3 M, z   while(p!=NULL)2 A3 r; W! ]. W% {
   {  \) {+ o- K1 s) m9 b# q4 d
      prt2(algo,p);7 y! R- |- d5 ]" g, \1 O) P2 Z
      p=p-&gt;next;/ e3 p0 v3 M7 `4 A+ y& H
   }
" Q8 K) j* W+ Z7 j% b# s. \   p=finish;  /*输出完成队列的PCB*/
& t# D1 U, _! t/ i0 T   while(p!=NULL)* N8 @& f# r! k8 r) D1 h
   {& j% A( i8 B% U- E
      prt2(algo,p);
6 ]1 s/ F, O/ P* A& e      p=p-&gt;next;
" }) B9 h8 Q! j/ S+ w! p7 Z: l# [   }8 l3 W7 j' N: a$ }# w" {
   getch();  /*压任意键继续*/4 U8 E, x2 c2 y% [- C9 @/ w: I
}; ^3 t7 w5 `( b8 D  F& y$ D
/*优先数的插入算法*/6 b' F- v9 M  n; V7 [; u
insert1(PCB *q)4 C$ ?  X3 q( x3 g
{( `! Y! g4 v+ n1 n0 ?3 o6 {
   PCB *p1,*s,*r;% N' a! b2 X+ A7 k2 t* A
   int b;1 ~6 a( h. ]4 J2 Q
   s=q;  /*待插入的PCB指针*/7 s/ D4 E- G: _2 E, H2 ?
   p1=ready; /*就绪队列头指针*/
% i! ^( G; [8 n( y+ k   r=p1; /*r做p1的前驱指针*/- \0 X# e; E7 w/ G( c) j* K( m
   b=1;( {6 F% G# z$ e( d) H, f7 `! A$ s, s
   while((p1!=NULL)&amp;&amp;b)  /*根据优先数确定插入位置*/
( U) j  j, ^/ S% c4 m      if(p1-&gt;prio&gt;=s-&gt;prio)
" q4 @& H* @" T4 @, X      {2 O) H+ z& F! z6 _
         r=p1;0 x; m3 K' Y( e. a- x1 O, I+ J& [
         p1=p1-&gt;next;% ]) V9 a) S: p4 q6 Z3 x" e' z
      }
! s5 |' ?8 Z6 W1 c! V* q( Z/ H4 y      else
# @! Q8 @4 d% p% H# ?! \4 ?         b=0;( `7 [1 J  D% `5 d+ k: x( O, R
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/* J' R: z! B/ B9 i
   {; w9 w8 B& R% d# F  X" Y2 X
      r-&gt;next=s;; M& e; k8 x) x1 f# b/ B% t  e
      s-&gt;next=p1;% c6 ~5 K  p! W% x
   }
7 q: W8 B$ J5 p) m. ~3 Z9 i   else
: r  X8 p' [2 n9 W. R, J   {
  S7 y4 w' T1 Q! f      s-&gt;next=p1;  /*否则插入在就绪队列的头*/+ d& P; ~( a- L2 m0 I2 ?
      ready=s;& W: V* [3 n/ H1 V
   }
& B- d% e- L$ F' f$ I}
) D; p; C1 C6 K4 W- x- n# H/ g/*轮转法插入函数*/2 H: V6 v* b  C; n, T+ t) s) y6 {
insert2(PCB *p2)
" k7 s- ~# N& M, I{
1 X4 {  k* Z% o. Y9 R   tail-&gt;next=p2;  /*将新的PCB插入在当前就绪队列的尾*/' u( K0 S, w! Z! p2 ]
   tail=p2;
! K# E# \. K& ^# h. e' J   p2-&gt;next=NULL;$ N# e& b! h3 D4 e! n; Z& n9 g9 ]
}) t& @& p! x0 R  v( k5 p
/*优先数创建初始PCB信息*/
: C& y8 S, R+ a% Jvoid create1(char alg)- B2 l" a) V4 v7 Q. |; i/ \/ X
{1 l+ w: B! l, A" r# T/ j# Z
   PCB *p;
6 B" ^0 x8 J7 {   int i,time;
9 }4 E6 P( ~: |" A   char na[10];
/ F% c* k6 f& s5 g8 a9 p   ready=NULL; /*就绪队列头指针*// s' z. _+ r; i/ l. F6 Z1 t4 i$ A
   finish=NULL;  /*完成队列头指针*/
( F& W2 ]5 Y, [3 D3 `3 T# u   run=NULL; /*运行队列指针*/
' O+ ]' a7 }1 p5 A0 F1 k( a   printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/1 b; m9 a9 C) {( E- V- L0 K& E  p+ ?
   for(i=1;i&lt;=N;i++)
$ P% r4 _( F) Y% n, X" h   {
+ m/ d  a' a0 ^* T      p=malloc(sizeof(PCB));
! U1 \9 A( N1 w, X      scanf("%s",na);
: k! D8 h4 i; K: n: Y3 ~! y      scanf("%d",&amp;time);4 J1 Z: M+ U# I0 ?$ _3 O0 _
      strcpy(p-&gt;name,na);8 x: d7 A; W. N- O4 |2 |7 T+ y" b
      p-&gt;cputime=0;  _. u$ _$ m0 a5 T$ H  L
      p-&gt;needtime=time;
/ W  L% z% j5 Y' t7 X1 m( @      p-&gt;state='w';9 V' m, N3 H! f4 H- ?+ s# K( i3 G
      p-&gt;prio=50-time;
8 w. e+ U* A0 q" p+ g$ [      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
2 k& t) r" h; H( o% S; r         insert1(p);3 g6 O7 A* G, I8 K7 u
      else
/ x" s$ ~/ \8 j' I      {
, C# M* K  ?  [3 x         p-&gt;next=ready; /*创建就绪队列的第一个PCB*/
6 X7 E4 M, Y3 d$ C4 d$ K         ready=p;9 O. d- }3 @$ ^* B/ o
      }' {% j: W" e* i- d: U
   }. U( O2 O1 {. r8 V
   clrscr();
; w4 X6 @  z  E   printf("          output of priority:\n");
4 N1 x" C0 @  n4 [2 t; T# W   printf("************************************************\n");3 |3 t8 `  Q2 }$ s
   prt(alg);  /*输出进程PCB信息*/
  y- y7 q* q1 R) e4 c4 ]  C4 V2 V/ I) y! }   run=ready; /*将就绪队列的第一个进程投入运行*/! a& T* J. \2 N# }% _3 v7 M
   ready=ready-&gt;next;, A  \1 O* l. Z  T# c, E
   run-&gt;state='R';
) a1 e# k% T: X}5 h9 t1 m5 i* w# e( B- g: `5 @- U
/*轮转法创建进程PCB*/0 v0 C9 `! Z4 p7 F1 I( i& h% k
void create2(char alg)8 _# e$ q8 m8 F- K. ?; c) \
{
9 W/ v# S9 o  m  ~8 v" {! W% `   PCB *p;* [, X0 Q0 d8 m; \5 e
   int i,time;) D9 N7 q4 M, y
   char na[10];4 S% D) Y4 P1 G  G' |1 [
   ready=NULL;2 w3 Q( O* K+ b# |
   finish=NULL;" n" E# i) e# `! d) d
   run=NULL;2 n' P1 ]/ N6 g+ b& E
   printf("Enter name and time of round process\n");/ ~% J0 D  n4 I6 l% H# a7 g
   for(i=1;i&lt;=N;i++)
: p, F4 U/ n/ f2 Q% m- c9 P   {4 x3 R* D) y! _
      p=malloc(sizeof(PCB));; A7 s4 [: c% J
      scanf("%s",na);
6 D* X9 J7 l: R: L/ `$ ~' ^3 E      scanf("%d",&amp;time);" ^+ Z, B/ Q* a: M# Z
      strcpy(p-&gt;name,na);
% i! ~4 x. f) k      p-&gt;cputime=0;
! C' ]/ W  j  c" ^# ^9 Y: N      p-&gt;needtime=time;
9 y# P) t1 V: g; t      p-&gt;count=0; /*计数器*// o. h* D. Z" `  I0 s' B
      p-&gt;state='w';( \6 R$ r( V' m) k$ Q2 T7 E
      p-&gt;round=2;  /*时间片*/
5 ?/ i; q  N7 a; F7 O      if(ready!=NULL)
$ n; j$ {' @. C. i- c0 |; I) I         insert2(p);
& ~3 \+ [5 X0 J- a, s% [3 w1 r% D      else
& f/ O" Q8 R/ F$ \% ^' c4 b8 {      {
8 h& E2 ^" n7 F         p-&gt;next=ready;
% S' D: q# H1 I3 a' e& S         ready=p;
- V, E8 E- s0 k' f' @# h# _# y* y         tail=p;
4 C9 i1 T1 ~( z      }
7 T2 ?! e1 o. T: \   }
9 g6 U0 i1 c0 ^3 z   clrscr();
( Q, B' S; Y+ T% Q2 r   printf("              output of round\n");+ a4 N# \5 G/ q$ P
   printf("************************************************\n");
  T$ e& e- E" S: W  x4 K- z   prt(alg);   /*输出进程PCB信息*/
3 T7 Y) Y$ K9 i+ ~& O) e   run=ready;  /*将就绪队列的第一个进程投入运行*/
4 h7 }1 V9 X$ ~, e   ready=ready-&gt;next;
2 R' \% O! q' S) D4 Z( ?) [: t   run-&gt;state='R';: F1 D% V2 T  P/ M1 m5 A" {
}9 D5 N% E% G2 ~: e
/*优先数调度算法*/
/ {! I" i9 {4 G  |. z: Xpriority(char alg)
# {% Q* a& p* ~+ X" |0 m{+ b# ?7 y( ~" a3 r% n/ }
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/
. C- Q0 j. z7 r; g$ C) s   {5 r. k4 R; _3 E- Z
      run-&gt;cputime=run-&gt;cputime+1;
4 b: C7 V2 q9 h% v; `& i+ c      run-&gt;needtime=run-&gt;needtime-1;
! b( j2 v, {9 X" y      run-&gt;prio=run-&gt;prio-3; /*每运行一次优先数降低3个单位*/
( b/ y( i! A8 [% k0 w. ^* k: x      if(run-&gt;needtime==0)  /*如所需时间为0将其插入完成队列*/" C" E2 `+ F) h
      {
8 M: {8 C4 Q3 }& T# _         run-&gt;next=finish;
6 u2 T  b  Y4 L: f/ v         finish=run;
( K9 u% W0 H$ u4 n2 S         run-&gt;state='F';  /*置状态为完成态*/
1 A5 \5 |4 @9 A4 `         run=NULL;  /*运行队列头指针为空*/  p6 Q8 S/ Z' _1 `: Q# k" `
         if(ready!=NULL) /*如就绪队列不空*/
, C! h8 [$ m) ~& r/ e            firstin(); /*将就绪对列的第一个进程投入运行*/5 s# n# i3 Q2 H1 i
      }
$ ]  o& o3 O/ _, A      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/- n6 n5 m. R) F5 \. |3 W
         if((ready!=NULL)&amp;&amp;(run-&gt;prio&lt;ready-&gt;prio))/ ?) o9 V3 \/ n9 t/ Q$ c# z* u
         {7 z9 g$ P$ o0 j6 c, T* O& `
            run-&gt;state='W';
- X9 N. N2 v' x+ Q1 m; t0 \            insert1(run);
; V& m5 d) R+ c- p! Z& `/ P! [            firstin(); /*将就绪队列的第一个进程投入运行*/. h. `! Z% J: b" i/ V( O" ]
         }
2 c1 A9 ~1 E/ I( f0 t( p" M1 j$ q      prt(alg); /*输出进程PCB信息*/
1 v# [) x. J$ [5 x   }: y, d6 H0 {$ [. I- e
}
2 s, L( |0 q4 o. z- t( v1 _  l# t/*时间片轮转法*/9 b5 ?8 @9 Q0 D5 |* G
roundrun(char alg)0 I+ O4 K! h" _+ }7 C
{
! U1 D+ ~. h. \+ u   while(run!=NULL), c& z7 Y8 `1 d& g1 }; C! C) B% B
   {. b$ [* Q- x+ u* b' p4 u
      run-&gt;cputime=run-&gt;cputime+1;
- W- J% J6 V1 s7 `1 n      run-&gt;needtime=run-&gt;needtime-1;
# Y0 G; D5 ?  f# q      run-&gt;count=run-&gt;count+1;0 K. [+ f% l% x8 X+ x# {
      if(run-&gt;needtime==0)/*运行完将其变为完成态,插入完成队列*/+ ~3 c. V  R4 {; T
      {9 y* S; u. v) U3 ^
         run-&gt;next=finish;
4 W7 |5 Q' x, V0 b9 m- W( G) E( j  i         finish=run;
& u" z, H; M: k& s) T' h. X* s         run-&gt;state='F';
1 m* X3 D; L0 b  Z         run=NULL;
. E' R& O5 |. Z" E2 @2 n, x/ _         if(ready!=NULL)
  w9 {. _: F+ h            firstin(); /*就绪对列不空,将第一个进程投入运行*/
8 v) E0 ~' q' z& s2 Q      }2 k) I' ?! J1 E# m7 x
      else
" G1 ]. ~, [. W! l         if(run-&gt;count==run-&gt;round)  /*如果时间片到*/$ Z$ ]4 d; A4 ~
         {
3 l* c3 Y. v  i            run-&gt;count=0;  /*计数器置0*/
; [$ l0 k8 I1 q: d( J) d7 E            if(ready!=NULL) /*如就绪队列不空*/
2 b1 I6 I0 z& E6 o7 Z            {
" n" i* d$ Y% C. `5 J$ ]               run-&gt;state='W'; /*将进程插入到就绪队列中等待轮转*/4 m1 M$ x* q* ?
               insert2(run);4 W; ~) s( K* a  l
               firstin(); /*将就绪对列的第一个进程投入运行*/; t% E% |$ e( e( w& |
            }
: O/ H- g4 O2 p" U% P         }+ E' ~2 W3 S& k$ q
      prt(alg); /*输出进程信息*/
# n: b6 u$ V- }# i8 m   }3 a* k: s0 @" m
}5 z+ n3 Z8 p" z# k
/*主函数*/. k1 R" D/ W( l3 ^. F
main()9 ^; M9 s+ |  i* ?1 u) w$ p+ N3 A
{
- E3 T& Y0 C" k5 I* J. z  _   char algo;  /*算法标记*/
  R/ i/ D' H3 ?: w! ?2 U   clrscr();
; p) L" K/ ?7 J  k1 A   printf("type the algorithm/R(priority/roundrobin)\n");
8 u( W) Z' _! E* p   scanf("%c",&amp;algo); /*输入字符确定算法*/  M: \- F. A9 x
   printf("Enter process number\n");
! _5 c9 P0 E0 ~' _8 z) U   scanf("%d",&amp;N); /*输入进程数*/
- ~, r! g, {* {! m! D8 F; o0 R3 M   if(algo=='P'||algo=='p')
/ b5 h  T4 R6 x7 s- }$ y   {
0 m9 M2 Q* z# q$ p$ n( c  ]      create1(algo); /*优先数法*/2 z" [) [0 b( o2 I
      priority(algo);
% Q) k8 X0 G$ x( Q   }
8 j( ?1 U! {! d6 X' P4 H4 l   else: I/ v$ B! U" a
      if(algo=='R'||algo=='r')4 m5 k9 J9 i/ c. S& k
      {  Q6 x! l4 t1 Z! _* _+ W
         create2(algo); /*轮转法*/+ M* L6 w; o* J  w. [
         roundrun(algo);
' A  |2 @9 U" e* C. }      }
. w4 R& }" R) [3 C/ B7 K; W}
+ s; _/ ?0 L6 N! l! `! r</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 | 只看该作者
谢谢分享,必须赞一个~
6 y8 [7 I: J( A# V+ `5 C/ s

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
3#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈. V  T& }6 h8 h1 ~7 ^) B6 w0 F

214

主题

642

帖子

1658

积分

四级会员(40)

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

积分
1658
4#
发表于 2016-7-4 15:12 | 只看该作者
支持一下,很不错哦!6 V# U7 _$ M$ e( r7 s: i

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 | 只看该作者
这资料确实不错……
' {- ^7 P3 \; I, @$ h7 n5 N
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:12 , Processed in 0.067312 second(s), 35 queries , Gzip On.

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

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

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