|
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->state='R'; /*进程状态变为运行态*/& |! p0 d* w1 X8 Z# b- L
ready=ready->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->name," Y" r: c+ U( [8 X6 ?; }* R
q->cputime,q->needtime,q->prio,q->state);$ V* d. J) z6 `4 |: r2 o8 Q3 |
else/*轮转法的输出*/* s, w2 n- U E
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name," t( {: |; j8 o9 P3 W. A% v; c
q->cputime,q->needtime,q->count,q->round,q->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->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->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)&&b) /*根据优先数确定插入位置*/
- K7 N! w3 W/ E( ^2 m! t, `6 ` if(p1->prio>=s->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->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->next=s;
) E2 O: Q8 N9 F, N, w, j: [) v s->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->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->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->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<=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",&time);
+ |4 k+ B! n, A. b strcpy(p->name,na);( u8 N) T$ V" h6 d' _9 W) i
p->cputime=0;
$ Y* t" x; Y+ F p->needtime=time;. r( `* v5 B3 a7 o
p->state='w';
D9 [$ O+ \* F4 a; F/ f% o p->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->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->next;
' ^& J( K' ^, m1 C9 d run->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<=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",&time);
/ N4 Q9 w: e4 w3 W strcpy(p->name,na);
# p0 r. y- K0 J3 G# ^% G) l2 ?1 R p->cputime=0;
" H2 Q6 i7 e9 X" e2 `3 o p->needtime=time;
9 v/ y- v$ R7 K! i% r" ~* L! \ p->count=0; /*计数器*/& G" T- k! \# ?! U1 Z& m* K
p->state='w';3 `( a/ E8 M4 q
p->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->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->next;" s) C, ]0 K* ^; p: h& X5 q
run->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->cputime=run->cputime+1;
% O. m: y) l& j. y3 ~5 d run->needtime=run->needtime-1;
' ~9 z6 N" a" @0 W n' g, o0 {4 t run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
6 A8 ^5 y' l" y8 ^+ d/ o if(run->needtime==0) /*如所需时间为0将其插入完成队列*/8 n1 u" l3 J7 R2 q# Y1 e
{
( A1 x/ q/ d8 m1 m5 c run->next=finish;7 i8 k4 B" f( f3 {' }: C* s
finish=run;+ {: i( Q/ M0 p* P" G
run->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)&&(run->prio<ready->prio))
) e) w% c# _. y {% g# ~- d4 P4 k% a; l
run->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->cputime=run->cputime+1;7 b* v+ ^4 c: m% j' a
run->needtime=run->needtime-1;
) ^2 c3 }# {/ J2 y run->count=run->count+1;
: I) x( H) Q% I7 k0 X% X if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
- e3 m* d3 g& c) m {
) r& I% f5 R( o( ` O& ] run->next=finish;' d" j* c0 y5 K5 v) c' l
finish=run;
& Q7 F- `+ N* f1 a) E! p4 j run->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->count==run->round) /*如果时间片到*/
6 L" a+ C" x9 K9 ]. q {
. i R1 _/ ?( q2 X0 l run->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->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",&algo); /*输入字符确定算法*/
: x) A/ _, ~: |& o printf("Enter process number\n");& K! S3 K9 `$ |& z& O
scanf("%d",&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> |
|