|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/4 ^, J# {! N% c6 o0 X+ E
#include "stdio.h"' q0 S; z( ?, h$ {& S; Z
#include "stdlib.h"
4 `* Y* o# E0 K1 Z#include "string.h"' ~& |9 a/ \9 j% G* o6 o
typedef struct node
# j& y" m( F% v) q" ?2 ]; `! k{! E, ^/ ?# k: q4 W z! r
char name[10]; /*进程标识符*/
- y: k L/ O! h' h int prio; /*进程优先数*/ e% W P! ?* |8 T# v
int round; /*进程时间轮转时间片*/8 P% h" {- |. K; |2 k; D
int cputime; /*进程占用CPU时间*/
: L2 G f3 Q7 M* } int needtime; /*进程到完成还要的时间*/ t+ M @+ q0 b/ N. Q# C
int count; /*计数器*/
# ~# q* L5 x: ~/ Y" }* f2 I char state; /*进程的状态*/0 |9 S- J1 H/ o
struct node *next; /*链指针*/
( b0 n/ M& ^: j5 s6 l! H}PCB;( S+ c# c8 R0 f8 q' M
PCB *finish,*ready,*tail,*run; /*队列指针*/, v7 J& G9 ~4 D/ v# f" B
int N; /*进程数*// {8 L7 q! F. J, i+ y: r5 r
/*将就绪队列中的第一个进程投入运行*/1 ~2 \& l8 I, k. T( M$ i$ y
firstin()
: Q. \- |7 J6 o) Z{6 y2 C9 _; Z# r4 d& x! k% F
run=ready; /*就绪队列头指针赋值给运行头指针*/
0 Z+ S! V- T# Z) e5 | run->state='R'; /*进程状态变为运行态*/- r. p/ g. y9 |5 o
ready=ready->next; /*就绪对列头指针后移到下一进程*/# \( a9 S' c, l- M! G! c) O
}
0 Y+ F! W+ b& x! q, [7 J3 e/*标题输出函数*/2 ?% v2 D1 A% `# o6 ]
void prt1(char a)
" S9 u& q K8 n1 P( a$ [) N{" ^0 F0 M5 o: y. p, F3 z9 W
if(toupper(a)=='P') /*优先数法*/% \0 c- P2 [; l1 k- F! e: P) {
printf(" name cputime needtime priority state\n");. A. t- }1 q* D/ J; k
else
8 c2 P( I+ ]; R printf(" name cputime needtime count round state\n");
! {& w- q* ?3 R3 w}
% [) `4 G( Y7 C* |" i1 v/*进程PCB输出*/7 P$ }8 Y. @8 A
void prt2(char a,PCB *q)
2 I3 B) o: x) s, j- c S$ G{4 C0 Z, r/ h0 D. y" |1 A
if(toupper(a)=='P') /*优先数法的输出*/* c4 d( Q2 R5 Z4 u9 a1 c/ E2 R
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
1 o% f8 ^' i3 B8 Q9 H q->cputime,q->needtime,q->prio,q->state);
+ [/ M5 Z5 j% H- \( z7 L else/*轮转法的输出*/
: @2 k y7 t' _ printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,8 K: w0 b9 p% |) @
q->cputime,q->needtime,q->count,q->round,q->state);- o J0 O9 t- Y8 ?/ L: N
}
0 K7 n2 x. v1 [( |* T/ p/*输出函数*/
; L3 S6 ~9 k9 |" Y- Z; U8 Jvoid prt(char algo)
; l1 T9 d8 z! U) m( t7 t6 {{5 Y* e- z! O/ b, P: l
PCB *p;
. t" I. E& S( ^ l: L" j% I4 W# |% a prt1(algo); /*输出标题*/
1 {0 ^4 m+ k# e+ T. q if(run!=NULL) /*如果运行指针不空*/9 N& ~- ?/ S# ?
prt2(algo,run); /*输出当前正在运行的PCB*/
% U: u d- b, Z) Q& Y6 M0 C' Z( { p=ready; /*输出就绪队列PCB*/
: p- ^4 |! W- Z7 e B8 Z- W while(p!=NULL)
& [# g( q K" J/ I$ c3 l$ J: C {
. x$ a7 s+ l0 d prt2(algo,p);
0 A$ n: Q9 J" I/ R$ u; v. y( P p=p->next;/ _" C3 B: v: x6 A3 [3 Q R
}
& |; b/ m4 ^: G1 w p=finish; /*输出完成队列的PCB*/
& \! z3 v, v q4 @" Q3 ?: Y; B while(p!=NULL)7 L/ n: ^2 z1 W4 r4 `* Z; v O
{8 `8 S" k. B, z
prt2(algo,p);4 U" Y `/ S- J) i( D5 V+ g
p=p->next;
4 X) W, R9 j% J1 r n }2 m) a# u7 X, R! k; C# ~/ f
getch(); /*压任意键继续*/& ?- A( q( ?8 K: J# L' {* a
}
3 o* q# a/ n$ m5 j2 Z/*优先数的插入算法*/: k8 c( i4 |3 E$ u' t( A0 c+ P
insert1(PCB *q)
9 N2 ^# K' D3 d( ~7 a{
1 m* t3 a! q8 y V) N4 M PCB *p1,*s,*r;
5 q! I4 J7 [' i- \/ C int b;
: `4 k8 p; v: o3 a% B" I) v6 z: Q! F s=q; /*待插入的PCB指针*/7 y" O& R2 `0 n( [1 u2 W. b+ C: J! `) p
p1=ready; /*就绪队列头指针*/% g7 O1 w2 j' V9 j" r. N, L
r=p1; /*r做p1的前驱指针*/
$ K4 ~" B: r7 P- S( m$ o b=1;8 ? X. h& g5 m3 D$ y/ l9 k9 F
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
9 K9 I! Y* S# C' Q7 G0 Y4 B if(p1->prio>=s->prio)
! X) B; s7 O) h3 B1 E1 @* D& e; g {8 e$ v+ Q8 u/ D K
r=p1;
( k# t& p: l- R5 u3 p9 P p1=p1->next;
9 ]: k7 z. g5 F5 n. ` }/ I0 n( w5 S3 p* ?. b
else: S S8 w4 q9 P% H( J. [
b=0;- R. q- l( u! L1 b8 z1 w4 l9 k
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
! l+ _1 }* U/ u$ G4 b3 H {2 L* v, e( ^# U( G
r->next=s;
4 L q4 N8 N. e" } s->next=p1;; f% N6 I% y! ~0 ~
}, i" k8 s* |% ~4 X0 U
else3 _* }: x3 t% Q* c, @$ u3 y1 z
{
) Y E0 S5 n0 b" [3 g1 F" i s->next=p1; /*否则插入在就绪队列的头*/
0 X0 a) u: e/ J/ q- L) Y ready=s;1 n: f. _! m7 h
}
7 l) w8 V9 Z L}
$ u# e& z6 p( c6 {) X% n/*轮转法插入函数*/
: C8 U9 v# F' g' Linsert2(PCB *p2)
, u$ V* M# x* {5 v3 k& ~# C{- c( \. x1 ?7 e6 u- c6 }) ~
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
2 @0 P. g9 k. x, q* { tail=p2;
) @8 |9 ^/ E* w+ Z1 X* d. o+ j p2->next=NULL;
. G' j' f+ u/ w1 p4 }}& t7 ~4 q' D8 `3 j6 p, g
/*优先数创建初始PCB信息*/, z9 }; M2 l5 L& U9 }
void create1(char alg)
6 @* @. \; [2 w! i4 @{: U, c9 m& X v% I0 ~, |& ~% W( t
PCB *p;. h2 o d; E6 ~7 H% w( q
int i,time;4 E7 ^, C# p; c2 m( V# @+ S
char na[10];
; z1 y/ S' F3 L9 c ready=NULL; /*就绪队列头指针*/
. d# w: G/ z- E7 H3 u finish=NULL; /*完成队列头指针*/, u3 [. D/ V( b5 M: u
run=NULL; /*运行队列指针*/0 A' V+ U' O$ u8 l
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/+ t" [( ]0 s; C) [; X3 ^$ Y& O
for(i=1;i<=N;i++)
) @, C6 s: U2 s {: I( t) i* U$ h: a! f$ `8 n4 L
p=malloc(sizeof(PCB));
! M# ]/ i5 y" ]' f# N scanf("%s",na);2 `) l; @. y$ }+ q1 z0 `. p
scanf("%d",&time);% e' n+ P& S9 p* v
strcpy(p->name,na);
E$ h" g+ N9 r: a( |0 u0 r p->cputime=0;
: g" u, z) j& O( N$ g6 A; ?7 f p->needtime=time;
8 u" n! [0 f, v- r6 g p->state='w';1 f8 ^; s# ]2 l) m/ S
p->prio=50-time;* k6 }& {- E1 Y6 i. G
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/; \1 g9 J: ]5 N+ D( |
insert1(p);
# _$ T. e! \/ _' ]+ A' H5 c else$ E% R9 X, P3 r- v( [' K
{5 E% ]- y) j; s7 Y, [
p->next=ready; /*创建就绪队列的第一个PCB*/
, ?: f I: |+ U1 N ready=p;2 B9 e" K! U# h0 F+ @5 G3 U
}
! H" T9 |. {) I9 Z# ~ }
/ B% P+ \; r/ r clrscr();( v4 m3 {5 l5 U# V
printf(" output of priority:\n"); _/ D- t. `9 V; L2 w
printf("************************************************\n");7 X$ o3 B7 ^& `: Z" E: B0 |7 Z
prt(alg); /*输出进程PCB信息*/
- S0 w0 L: k; `0 U$ H4 Q: V2 X run=ready; /*将就绪队列的第一个进程投入运行*/* r9 F$ u! @! ]/ ~& v Q" P7 Q
ready=ready->next;: l U; d: V; m7 b0 _' Z+ }8 `
run->state='R';3 ]6 T2 m9 R; m2 h, H- z- ^, q
}
1 e6 r3 m, m# h K5 Y/*轮转法创建进程PCB*/: T" G; J8 `9 H1 H; y$ Z9 E! F" v: e
void create2(char alg)
- k6 n8 U/ P* p# i; ^$ p8 {{/ r0 g& M, j; e/ K7 G' S+ ~# W. D
PCB *p;
5 ?2 @# v8 p7 J6 r int i,time;
9 V7 _* _1 i5 D$ X `2 _ char na[10];( d. D& o# P/ _" n; a
ready=NULL;
# \* a" s5 L9 w* m+ }7 B$ S' @ finish=NULL;
3 X- t3 \- Q* e V run=NULL;
0 m5 y0 a' u: ^$ G+ _ printf("Enter name and time of round process\n");
8 r; p( L4 v3 V% o8 U" \/ M for(i=1;i<=N;i++)
+ X$ e+ P" m' P/ K* T: O5 z3 m: q {
/ p/ Q6 W, P& @ p=malloc(sizeof(PCB));3 T# G) v! N+ X. S; b
scanf("%s",na);/ W5 z$ y; T0 @/ n- I2 J
scanf("%d",&time);" B! t, ~3 Y3 j1 B6 B/ m! D6 d- i" J0 z
strcpy(p->name,na);
* w1 n: a7 H; M$ @% V p->cputime=0;3 j/ y0 F% l" e$ n- y6 w6 d6 ? @
p->needtime=time;5 ~1 u/ o3 ~4 p) s2 _" D- O- @
p->count=0; /*计数器*/
: D8 b% i4 x: L8 t# h5 T6 l D p->state='w';
; l# C$ [. P. |# B, B p->round=2; /*时间片*/; e" E! L0 Q: a5 w- w5 L
if(ready!=NULL)
; Q. n1 e! I o6 l* m" a% d insert2(p);
/ ?: N/ z; J( G+ R+ B2 i$ ` else
9 f2 b" \6 c7 e' }% ~" U {6 B8 H2 ~$ H% \
p->next=ready;8 W: J% Z, V# ?7 K+ d
ready=p;& U2 e Y$ l; h
tail=p;
" x6 V, _0 P3 x- c4 R }
7 `* F4 R G3 b6 Q# d" Y3 z }4 Z. A l6 L! P1 U
clrscr();# F8 g! B! S; ?8 C! Y
printf(" output of round\n");6 g+ Y0 c+ Y) Q; O+ V' o
printf("************************************************\n");
0 y! T6 U( {9 l4 D prt(alg); /*输出进程PCB信息*/
- Q) q& F x7 s0 k, @ Y5 r run=ready; /*将就绪队列的第一个进程投入运行*/
+ V3 j7 _3 k3 i! | ready=ready->next;
- ~; W. z5 { }0 J4 a run->state='R';
; m2 F' q% }( y4 f3 t5 C8 G, ~3 _$ [}0 h8 ? \& q: W) _3 i
/*优先数调度算法*/+ V( V+ T) X0 O
priority(char alg)
0 r e- A/ H+ r{' d) X2 u- Z$ |; W- G
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/$ {/ T" c, E2 V! `7 c K* G7 h
{3 _" w( ?' Q, p
run->cputime=run->cputime+1;/ x+ g" N# w& @7 C+ b4 `
run->needtime=run->needtime-1;& i/ M5 {3 E. `8 F' s
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/$ |1 T0 U: W# f, v
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/5 ~' l7 [4 k) I- F
{- |1 G) w6 J; k/ c" j
run->next=finish;8 C1 p' x" x8 y( z
finish=run;6 m3 Y z# |- v
run->state='F'; /*置状态为完成态*/
9 w* G, |. |" h/ i4 n0 k+ e run=NULL; /*运行队列头指针为空*/! x& }+ p2 H: k: O
if(ready!=NULL) /*如就绪队列不空*/
4 s7 ]( f" |" H7 B4 @ firstin(); /*将就绪对列的第一个进程投入运行*/4 `6 c8 p6 a8 p1 G; @4 j% |
}2 c5 q: z* ]- L" G8 G
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/$ z0 W$ O7 _5 h2 H$ f) H0 ~
if((ready!=NULL)&&(run->prio<ready->prio)), {7 o8 v9 f e4 M8 f4 p9 q
{
3 J2 r0 v- D$ j& g run->state='W';
6 t' C+ I7 [* o" a insert1(run);* R3 ?9 m" `2 P% z) j6 R
firstin(); /*将就绪队列的第一个进程投入运行*/
& J& R- y' {" d' x/ y. j3 H; `% J }
1 L2 j. N# A) s2 C2 c prt(alg); /*输出进程PCB信息*/
0 S% n; W6 u% ?4 D; d3 G }+ M% R' K/ I# k/ C+ X! Y& t
}# _! T" X' U$ d% [4 X9 F
/*时间片轮转法*/
3 V7 S/ @# F1 ^) Z, O" R* r' froundrun(char alg)! L% K/ T% W p% K0 u# f
{
7 h' Y- `6 m3 Z* }; f9 g7 W while(run!=NULL)' L% N9 s! p* R- Q5 _: K
{- i) R! s. m( H. f7 `6 T
run->cputime=run->cputime+1;) Q, m9 `) y8 E* {2 Q
run->needtime=run->needtime-1;1 w6 U9 l. u/ P8 }/ \* i
run->count=run->count+1;
* d$ n+ g1 a* E% v k if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/; m5 G) o" F: }4 F5 h# U; ~
{
) I" d3 k. n1 | run->next=finish;' r' |0 R6 Y) t( I- \
finish=run;
' _5 V# P" H* w$ ] run->state='F';
: e% G) ]) V1 _% g* t# p run=NULL;
* y3 T) S7 `% q& G: O Q if(ready!=NULL)
9 N% \5 ?& K7 ?8 [" { firstin(); /*就绪对列不空,将第一个进程投入运行*/; v) {6 X6 L j2 F; V
}
~7 |. c9 G6 p- [( c( v$ _3 H else L c3 V; m7 m, q5 s
if(run->count==run->round) /*如果时间片到*/
6 l: C6 U) k+ A9 q! J, [/ b/ m8 { {
, G$ f, w, `$ Y run->count=0; /*计数器置0*/
: Q4 S2 W, H$ X# J$ b if(ready!=NULL) /*如就绪队列不空*/3 Q2 ~. d1 X6 v: Z" h ? }
{: V3 N" A$ ?* ^' X9 Q
run->state='W'; /*将进程插入到就绪队列中等待轮转*/( Q" c9 k% b: t# @2 s' v
insert2(run);. H* G, E/ R: \, K& p7 B% k. l
firstin(); /*将就绪对列的第一个进程投入运行*/0 ?# x6 l$ ?: e" ^6 @
}: a0 }2 p! M4 W" j
}
5 |) G0 z% [; u8 W prt(alg); /*输出进程信息*/
( j5 ^0 F9 R9 K4 I6 _5 e7 u9 U }
2 q5 U# O7 S, C& O7 h% N* s0 K}8 N0 ]- i2 J# ~" p
/*主函数*/6 F4 D' x {# X, o& W! o
main()
& X& b/ P; c, z{% ^4 U/ A7 V' V' R0 c- z
char algo; /*算法标记*/
( P+ E( K) h- O0 | clrscr();
$ \+ \* [2 f! C4 y G* w7 p. h printf("type the algorithm/R(priority/roundrobin)\n");' o* G e: l: k: t" R3 S
scanf("%c",&algo); /*输入字符确定算法*/" v% J( R( ~0 @
printf("Enter process number\n");
9 y. G: E, R% P3 ? scanf("%d",&N); /*输入进程数*/4 H: J& }$ G8 y! E+ I( C
if(algo=='P'||algo=='p')1 X; ?7 { t$ y4 R2 m
{
$ i6 W" W4 o5 c$ Y3 [- } create1(algo); /*优先数法*/
5 X& L- f# {" M& s priority(algo);: r) E3 n# S4 a6 E
}& o6 {. _+ _; }5 f Z! H! m
else! @- \7 g0 _0 v1 L9 R9 d
if(algo=='R'||algo=='r')2 p+ F# _% F6 C# |- V$ Z! A
{2 e) m: R6 o1 {/ c# j. l# G" e& m# W
create2(algo); /*轮转法*/8 e( |; k! }) h! x
roundrun(algo);# |; d& T" M- w! y9 y2 o+ m
}
5 c# w% Z% k; |; z* a# ?}) C7 } C: [; z
</pre> |
|