|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*// s3 B0 Y- n5 d* v9 i* n# E( U
#include "stdio.h"
" u9 i- K* D0 b: ?+ {4 U5 y% h#include "stdlib.h"+ T3 z' V4 D" S7 G$ G9 [ }
#include "string.h"! ^ {2 ~; l5 w9 f' J
typedef struct node% d3 h/ ]( b7 P% B# }3 A
{
) ~# a5 d2 i2 a' P char name[10]; /*进程标识符*/% f4 u9 |7 P" ?& J& [% H
int prio; /*进程优先数*/
- H) J K7 P0 T; U8 X, I int round; /*进程时间轮转时间片*/# W: X6 I) p/ F7 [
int cputime; /*进程占用CPU时间*/, q& `6 c4 d, F( p
int needtime; /*进程到完成还要的时间*/
5 X( j% j- B1 Y int count; /*计数器*/) u1 J; g6 e# B' s2 n
char state; /*进程的状态*/ M. E* u: B/ s
struct node *next; /*链指针*/& a" h# O( J0 B- E! s. h5 x
}PCB;
. J% s0 ~0 U5 JPCB *finish,*ready,*tail,*run; /*队列指针*/
2 { Z8 B+ p2 h5 V) nint N; /*进程数*/3 p% p, k$ w. C6 z
/*将就绪队列中的第一个进程投入运行*/
& _6 b& b) `0 @& @+ ^firstin()( Z: O# b5 ]/ o" K: N2 y
{4 A7 Q' Y4 e( e! z, x2 j
run=ready; /*就绪队列头指针赋值给运行头指针*/
* z4 B y$ o4 x* K- ^1 H& V$ g, T/ Z run->state='R'; /*进程状态变为运行态*/$ c+ g- t5 `6 }% B: {6 I9 [2 i
ready=ready->next; /*就绪对列头指针后移到下一进程*/3 j. ^1 c$ N2 S' G
}) `, W8 p3 h/ X( @" {! o
/*标题输出函数*/+ A7 d! Y0 U8 {% E5 b
void prt1(char a)
* L) `( v' Q$ S+ T{6 T- _3 j. x3 c7 N: u8 o# E, I
if(toupper(a)=='P') /*优先数法*/
E4 N a: a5 C# ~5 T- G printf(" name cputime needtime priority state\n");: B$ U( z) O- Q+ _& D( Q2 M( D3 }. h
else
% Z+ H! ~! ]7 n4 M! A printf(" name cputime needtime count round state\n");/ I9 R S$ a7 X& p( Z$ I: y
}& t( s4 c" N* x# |; K
/*进程PCB输出*/) O" W+ s- p! N) s
void prt2(char a,PCB *q)( b$ L. P1 Y, t+ {7 Z
{- {( h) P9 W z, k1 l
if(toupper(a)=='P') /*优先数法的输出*/, t9 B0 _$ H& A$ G
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
4 z: ]* o1 R0 G# K q->cputime,q->needtime,q->prio,q->state);) ]2 u8 E. h8 Q
else/*轮转法的输出*/3 Z1 v* @( G K5 v/ y/ |
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,% w ~- i% y% J! s2 W
q->cputime,q->needtime,q->count,q->round,q->state);' c1 u9 X- O J; @
}
9 V. i( _1 `! e& s \) }/*输出函数*/9 d/ Z4 u* A8 A% i( \4 D, H: s
void prt(char algo)
& u& {. X; k& ^& b0 ~3 t# ]{+ m4 p. S& P3 ]% G1 d
PCB *p;( V( W1 T2 A, {. L- n- Q# ^
prt1(algo); /*输出标题*/
! n( d$ v! Y \. w& t if(run!=NULL) /*如果运行指针不空*/
& | B$ U4 y3 ]+ B prt2(algo,run); /*输出当前正在运行的PCB*/6 M1 A7 e# r1 T" ^3 t! p6 T0 k; k7 A
p=ready; /*输出就绪队列PCB*/1 p. l& L9 b R7 H
while(p!=NULL)
* _: N% f% O7 z- J% v* D$ P {
9 m1 J" E# E% t* @ prt2(algo,p);
; n% G9 n# V3 u* ` p=p->next;7 N' m* V1 q. ~6 G0 A p& b
}
# [# |1 [6 g7 t. S7 k p=finish; /*输出完成队列的PCB*/
, U' I$ h) R1 S) l while(p!=NULL)
0 ?: Q$ r" J- ` {: G& ^" S7 C8 M7 a! t9 k8 }7 {
prt2(algo,p);
2 ^7 x- m- l" A: x& p( P$ e5 l p=p->next;$ j( U4 I* a, x8 E$ K
}
4 Q1 Z( z5 x. C1 e getch(); /*压任意键继续*/
9 W, w4 r7 l7 F( y) R% P8 N}8 c" k% S. A- F5 y
/*优先数的插入算法*/
. c4 ^- }7 ^7 R0 l- winsert1(PCB *q)5 s g. ]9 R) e
{! f1 C% L8 E; F' W" ~7 a
PCB *p1,*s,*r;( v% Z, ~6 p' ^/ x
int b;
0 _' N( ?: t& A7 M. k& ?: B s=q; /*待插入的PCB指针*/
1 R% A) h4 `) [) v+ S p1=ready; /*就绪队列头指针*/- N$ i( {: f6 t
r=p1; /*r做p1的前驱指针*/6 q+ o' j* a, u5 T+ e0 H; ?" i5 Q
b=1;: r- U4 G' y* O
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/' T n3 C' _: V y
if(p1->prio>=s->prio)' \. ]; M/ X u+ ~. g3 C% u
{, Q, ]6 |% p# U+ F
r=p1;0 }1 @! S8 y* \' y# o; Y
p1=p1->next;
; j+ P4 v% s3 w% E2 A" k3 ?' k }
5 H; n1 O$ a1 P else( R5 f' n! D' S/ ~; g
b=0;$ E( K) b. w" N3 a1 m% e
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/7 h" R; m' h. B1 ?
{
% d- M' n0 k8 [5 Z) r8 Q r->next=s;& o% Z C d a8 Q2 @ ]- ^. c
s->next=p1;+ _, l2 I9 [) r& p0 Q6 z
}
- V3 X; Y! r/ _ else* H4 V! \- ]7 s& w0 I0 \
{
0 d R6 y* N3 H( ]7 Q; _ s->next=p1; /*否则插入在就绪队列的头*/
& g. \. t0 I" o; l9 b4 W ready=s;
4 `9 i, E! M- T( o1 O8 h: Y# l }* t# n' Q3 R. ?7 m8 V
}
6 h& g/ o/ z h! a0 P/*轮转法插入函数*/
6 m" l% D0 J3 U2 winsert2(PCB *p2)
& e! u4 ^+ I; n( j* D1 d6 x! o{
8 E0 ]: c+ c" b1 e tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
" j# t, j' L7 S8 J2 B! Z. Y/ j! i tail=p2;# D. Z2 E1 T n! b/ y. p$ S/ a, d
p2->next=NULL;5 p8 N# k) W, x [0 ^
}2 r% |2 F" a s# s* v3 a6 \3 U
/*优先数创建初始PCB信息*/) \. W: V8 L0 n' Y, u. Y
void create1(char alg)) M: `5 e6 F3 s$ F) I6 }1 D
{
, @3 \% \1 a( h$ F- ]# ^. g PCB *p;
1 K1 N5 G1 b7 E8 O3 M& A, h int i,time;% u5 u2 S% I* T
char na[10];
+ R2 h4 [5 w B. y8 i( X) f+ j ready=NULL; /*就绪队列头指针*/
- K/ y( V3 v, J' I6 p' y finish=NULL; /*完成队列头指针*/
! k% t6 S' N0 v& E7 r P, F2 D run=NULL; /*运行队列指针*/
8 Y$ S' {5 w: Y* N- q% j printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
% } M* D2 c& g. l4 T% ~ for(i=1;i<=N;i++)
) F( d: P& ^$ H {
6 T* _5 |+ K' |( R9 s p=malloc(sizeof(PCB));
3 _/ v5 M& F$ Z9 S scanf("%s",na);6 b( i7 z8 Z7 ]0 Q) `
scanf("%d",&time);
& V2 t/ [0 S @; u) | strcpy(p->name,na);
1 k4 U- M1 L8 O0 \8 H4 s3 {, w p->cputime=0;. X! Z, D5 L7 M& N' Q
p->needtime=time;
4 s0 U; j: q$ ]( I/ U( u6 o p->state='w';
4 T7 o" v" J, @3 }8 [2 a6 D p->prio=50-time;' o- X ]- E4 y+ U. d8 k F$ S% B
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
8 S+ e/ n! Z4 @ ~4 Z insert1(p);" @& `, p& U g) q( G! W0 ~+ e
else
* u8 ]) w( K" f- J: V {3 A! A6 o# C# z+ }, A& k, G: H
p->next=ready; /*创建就绪队列的第一个PCB*/
% U) s! o, d3 O" ? ready=p;0 f: k$ ~# v; v: u: M4 Y+ N
}
+ c9 b3 w/ a, [5 n7 h' h. L }
. N) [+ |) ~) x# j# ]- n# y3 \ clrscr();
# W' c9 u z2 C printf(" output of priority:\n");- w0 v; o" ^2 L: _% x
printf("************************************************\n");
1 E# o9 v" U5 J: ^ prt(alg); /*输出进程PCB信息*/
. i/ ^. U3 k' N k run=ready; /*将就绪队列的第一个进程投入运行*/" B1 M5 C; b5 R8 _% U, G
ready=ready->next;
) F& S R: \3 `. { run->state='R';
]) {& k5 f3 g' O9 E}. J: V* ?1 q ~5 V3 d5 b9 I" h' B
/*轮转法创建进程PCB*/
?( ]( G! W+ x# S! }% F. Hvoid create2(char alg)1 k+ T$ U+ Y0 e! a. v b: c
{! K- X5 b$ d9 p" o8 k
PCB *p;! t, Y) z' S G4 h; n( h
int i,time;8 j& a! c a/ b+ T( i3 l! T
char na[10];- J F; N# A$ Q& a- g }
ready=NULL;/ ~7 q: w( r8 U! m3 W3 j, A
finish=NULL;
( d3 m' X7 R! l9 u- } run=NULL;! z' p) j7 [, p4 A9 S
printf("Enter name and time of round process\n");( R" q5 L7 s2 n) `2 x6 g3 _- t' D
for(i=1;i<=N;i++)
4 W3 L3 D5 A( e- N* k {+ l6 q5 ~) K; B4 ~ ?
p=malloc(sizeof(PCB));
3 k# Q8 F4 L; W0 p4 E3 k; L scanf("%s",na);5 q) N2 ~' J4 J' K
scanf("%d",&time);( _; K; ? u1 }
strcpy(p->name,na);
5 @. A' r6 G$ Z' Q: s$ h8 W p->cputime=0;
; r+ b: X! }1 Z4 e7 A p->needtime=time;
8 j+ @9 t& \+ p) o% } p->count=0; /*计数器*/6 Q9 x1 V; w3 A/ y; G
p->state='w';# X3 p8 S: t4 i! F$ Z4 g
p->round=2; /*时间片*/
, g) w& U9 M; g7 O. y* N if(ready!=NULL)
8 B$ L' R- ]/ G& E insert2(p);
/ Z5 n! K' I. k9 e! ]. C3 t& t else- l: ]5 g6 Z- q- g Y
{- ?$ d1 A+ M+ j+ D6 m
p->next=ready;$ H! \) ]2 s8 B, Q+ e, z
ready=p;
4 v$ @) r {2 W tail=p;: @6 |- {: q( D: X+ I
}
* s$ n; o( d7 H5 x }
, [5 n8 x1 ^2 b% B, A clrscr();+ F! B5 y% _; Y3 y( s: u
printf(" output of round\n");8 T2 s- }8 B5 R; R7 L
printf("************************************************\n");
+ b4 b6 f/ }' r5 i prt(alg); /*输出进程PCB信息*/
1 q6 h) ^+ z* B run=ready; /*将就绪队列的第一个进程投入运行*/& A7 ], ~2 a3 N! V1 w) R0 @
ready=ready->next;0 j5 D& m/ ~2 a9 l
run->state='R';" T6 M: M* }3 S! n4 I- m6 L
}% d6 E8 v9 q. g, H
/*优先数调度算法*/
/ B a3 r3 E. n& X+ ppriority(char alg)
+ O, R# d, T/ p5 M7 {; J! w; [4 C{, E( m, c6 s2 z6 ]1 N0 H- h
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/; a7 F i% w& O, b# U( `, H% _! t
{
2 ~8 |& \$ a0 d, l run->cputime=run->cputime+1;8 b+ a0 b; x' _7 d
run->needtime=run->needtime-1;% b0 x5 T; |# G& u, s3 N1 x( N
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/- M7 y) [0 J a" Y& r. `8 \6 [
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
- D4 |3 ?0 R3 o' {- ^ {! L% f! C/ E5 D/ \
run->next=finish;
0 N& n6 r# }8 g4 K! ^2 ]( t. b! r finish=run;6 f& Y" d( N# K# Y* B
run->state='F'; /*置状态为完成态*/3 l( F: }8 q% i5 D& b7 B
run=NULL; /*运行队列头指针为空*/6 X Q, k5 J+ n' p" S, J
if(ready!=NULL) /*如就绪队列不空*/
& r5 H( S G" @: a, s firstin(); /*将就绪对列的第一个进程投入运行*/
* q1 c3 g# E. O7 c; Q4 u }
9 G7 ^0 ^, g4 M else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
, Z. w y7 W+ |, y4 l1 A if((ready!=NULL)&&(run->prio<ready->prio))3 b, l& D- q. h; W0 `7 I g
{
( o4 k3 `7 v/ t( T# N4 { run->state='W';
( l. K6 N/ K+ @: z4 J insert1(run);
& \/ ^- }- N! |% D+ m firstin(); /*将就绪队列的第一个进程投入运行*/! z) Z0 U# ]8 ]& g8 x0 O
}; i5 R8 c# o3 w# f) w
prt(alg); /*输出进程PCB信息*/1 J2 W* z/ u8 p6 _0 N6 M4 a
}
' X& o: s2 @% V$ Y}
/ X, c" ` w o' Q/*时间片轮转法*/
6 f% M$ ~- s8 J/ h H; Proundrun(char alg)9 `% g" k. s/ Q, l" }4 i
{$ k8 V$ U( ]4 v/ l) C; J6 t" q
while(run!=NULL), O/ m& Z B2 w2 M/ G
{" o1 w7 i0 ~6 U: [$ ~
run->cputime=run->cputime+1;6 @) F* j* K( V7 q" j
run->needtime=run->needtime-1;
& d' O( X, o% n9 h* z run->count=run->count+1;
4 W' m6 M! U5 C! f/ d if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
3 @! W) Y& M8 O0 @& M. A {
6 u" }( r* Z$ V4 g/ F run->next=finish;% A6 i4 o# m% p' E f0 F' h
finish=run;0 T0 R, ?: R! \' `
run->state='F';+ c% V) N. V; A; k7 \( K
run=NULL;6 r7 u8 l1 K! q7 @; j
if(ready!=NULL) [9 n3 n$ L$ ?2 n: \
firstin(); /*就绪对列不空,将第一个进程投入运行*/
+ T1 K- J5 }* e& f `! g$ y$ Z/ K }
# q7 f2 f6 z4 `0 l else
. ~' z; c: G. j! O$ A( q' W if(run->count==run->round) /*如果时间片到*/- N, b0 t1 j1 Z% W: ?( n# f8 \2 j
{; z9 w7 z; s1 T) {8 z! w& |' b3 w
run->count=0; /*计数器置0*/% c- w% K3 ]% q1 z) m7 X
if(ready!=NULL) /*如就绪队列不空*/; J* I1 n$ C# _. s u4 I, U
{
! y+ w8 O3 D W0 [3 g6 B run->state='W'; /*将进程插入到就绪队列中等待轮转*/
& W7 H3 t+ z; B0 r; t/ M insert2(run);
% U( G( }* b6 Y8 \5 z J* O$ j$ G firstin(); /*将就绪对列的第一个进程投入运行*/
4 n- u/ }% l; B0 q- ] }$ C3 R v3 v8 Y1 P
}
* n2 X; Q, j; O5 ]6 z prt(alg); /*输出进程信息*/7 F, F: R3 K N; B3 j& H
}2 U/ S3 P" L1 }, _1 }! U+ i
}
* e( x) p r2 u1 ]/*主函数*/
& n- v; q9 y2 v: o1 Emain()% L8 r; N- V, a1 N8 ~% S4 [: T
{
( c/ G( q- q0 O; S! @7 K char algo; /*算法标记*/# V Z, ` [! |
clrscr();* U/ ?# U; m0 [' c7 F) a: e
printf("type the algorithm/R(priority/roundrobin)\n");$ S: s" z% p. f, g" I; t3 \2 u
scanf("%c",&algo); /*输入字符确定算法*/ E5 n# g1 P# u) I% K& O9 D
printf("Enter process number\n");
4 t) c, O6 x. G/ Z8 [6 @% V( X scanf("%d",&N); /*输入进程数*/0 O9 n4 ~( C& ]9 C: U) x
if(algo=='P'||algo=='p')% N9 v" r( O H3 F6 F
{8 [' H: M6 [9 K1 Z0 H
create1(algo); /*优先数法*/- G4 b R' s. @ s, [4 P
priority(algo);
4 z B- ?# u. R6 m: U; l& f }
0 y D% y$ Z+ s- m else
% u6 V1 ]) E! B: C6 \$ w4 i if(algo=='R'||algo=='r')7 ~0 O& E% O" o' h
{
8 {/ H8 s5 a+ `+ y l create2(algo); /*轮转法*/
- ?5 H6 @4 {6 r# C0 m% |& m2 F! H roundrun(algo);: v& d0 m' I% T$ z8 ~; b
}% T4 C9 t; [. u+ }
}5 y$ j$ V) r" d, k) [
</pre> |
|