|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/' C" Y; R6 g! B6 p5 F: i ^
#include "stdio.h"7 J% P6 Z" W- E2 ^' h! }' K
#include "stdlib.h"2 d V3 r. X2 d1 ~' K$ f
#include "string.h"
6 z/ ]8 H5 S' s1 Etypedef struct node
) p6 w) L; y/ Q: J2 @{+ X- I; }9 e5 |
char name[10]; /*进程标识符*/7 T8 k5 @4 |* g2 p( X8 e6 `
int prio; /*进程优先数*/0 _4 v( L0 e! H( E' K% I5 t- |5 D
int round; /*进程时间轮转时间片*/: l8 P+ R. ?* P! m+ d# \$ F. C8 b
int cputime; /*进程占用CPU时间*/
5 g4 G" g3 ]& R- Y9 T. q' L0 [ int needtime; /*进程到完成还要的时间*/7 s/ x t) k" F( C
int count; /*计数器*/
, b3 g( i5 s* z% s A char state; /*进程的状态*/" [8 D: k8 h0 }9 z" c, ^
struct node *next; /*链指针*/
- V; Q2 H* @5 F+ [}PCB;
/ o" x/ S5 h' IPCB *finish,*ready,*tail,*run; /*队列指针*// J) W, H6 H5 d1 [, |3 S
int N; /*进程数*/
1 K+ `2 g( ^( m0 M5 n/*将就绪队列中的第一个进程投入运行*/) Y7 E; C# x5 v& H% k, j7 x! _( L
firstin()% d# m6 u4 \1 X/ E" |: C4 E
{
% Q1 X% E- e, s, P( j* L+ V: n; q run=ready; /*就绪队列头指针赋值给运行头指针*/4 j# o/ \, D) o" {: X
run->state='R'; /*进程状态变为运行态*/, [% B' i; p% O, x, y9 }
ready=ready->next; /*就绪对列头指针后移到下一进程*/
! J) \5 P9 k" J5 I8 X}
( l5 F8 _2 j0 _1 a7 f/*标题输出函数*/
9 w7 ~7 z. ]) evoid prt1(char a)
) w6 r2 V& x% j* p: f{2 c |( X1 b/ S) D6 i; @6 m1 ^* v3 ?$ X- W
if(toupper(a)=='P') /*优先数法*/
; L$ {/ v' F* e: `" P printf(" name cputime needtime priority state\n");
3 ~( h4 a. e2 N5 J6 |1 C# S else1 {4 @. _$ q# k# D4 V# {
printf(" name cputime needtime count round state\n");# c$ X7 ?: s! S( h2 B
}
- z" ~. y# i- I- T4 n/*进程PCB输出*/
t# {9 V& Q0 {5 a( wvoid prt2(char a,PCB *q)
1 ?+ X* v( ?' j0 G0 M{
5 N3 q2 Z9 X( W2 Q& C T& R if(toupper(a)=='P') /*优先数法的输出*/0 {; ~# X9 n I' d
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
+ T+ H; O( ]* @; V q->cputime,q->needtime,q->prio,q->state);
1 q" j; ~4 h% g. g; J' z. S else/*轮转法的输出*/5 f# j4 j& T ^0 @; ?/ `4 D
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
3 w8 P4 S) l, ]0 { q->cputime,q->needtime,q->count,q->round,q->state);& G x, ?2 k- w0 P6 R' S
}1 _; m, D( _9 s; o. t" d
/*输出函数*/# v- b* e# @* B2 S3 H0 p- _4 ?2 h! k
void prt(char algo)( ^) y& S2 o9 Y, S: G6 w. F
{" w/ o' N0 U N9 v
PCB *p;
8 X* L- @6 m3 Y6 ?; p* i prt1(algo); /*输出标题*/
& D) F6 c- U5 K( p6 S6 u6 [ if(run!=NULL) /*如果运行指针不空*/$ d# J0 f1 x9 n
prt2(algo,run); /*输出当前正在运行的PCB*/8 Z# K- h9 u8 y+ K9 Q3 t' E
p=ready; /*输出就绪队列PCB*/1 M+ k: r3 T! j; J0 @
while(p!=NULL)4 a* `3 f7 E$ ~- O8 J- `3 H B
{
, \5 f% X( {& _- q4 T$ s prt2(algo,p);8 p6 J* G. [% I4 q$ R9 j
p=p->next;5 k' @% J* _+ k5 n o* y
}+ z, X; q! }( a
p=finish; /*输出完成队列的PCB*/
) Q7 D( ~3 ~! [; Y& n: A, { while(p!=NULL)
; x& s7 J+ g4 D- K! ~; H {# @7 b2 O: Z- d& T% A$ O/ f
prt2(algo,p);
- c/ G. b" {$ @. d p=p->next;
& {% U5 v: A- n3 ~1 Q4 | }$ A( s9 K2 M1 E, H% [! u; K
getch(); /*压任意键继续*// S7 M9 P3 i; n n& P( A
}
* C$ k! J, f/ @7 `3 P/*优先数的插入算法*/
* N8 `/ @, K6 [, i# g$ linsert1(PCB *q)4 I! K" _8 p1 U. Q
{
3 `7 o; U( h, ?- `: M, q PCB *p1,*s,*r;# D, V. E$ l) w3 c& }# L" q
int b;
& G3 U( k4 w2 w1 i! @) b s=q; /*待插入的PCB指针*/
# [9 J$ A7 w5 L4 ` p1=ready; /*就绪队列头指针*/, d3 [1 h" ?( V% d# Q
r=p1; /*r做p1的前驱指针*/
6 |* k* v* M8 d$ Q( r6 |$ |6 I b=1;
. M8 I( X* A3 n# P K/ } t while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
& s2 R/ d+ V! R! j* J; m+ h if(p1->prio>=s->prio)$ Z* @4 ~$ I/ P, q9 g
{1 _: ?7 t3 n- k" v6 L1 o& R0 @
r=p1;5 E0 g, W0 t# V/ G
p1=p1->next;9 h: [3 O) m h
}
( } S y4 p9 R. G4 } else, F) A" H2 Y2 O* o# [; M
b=0;
/ M. }6 r# y+ B1 K* B9 G& g if(r!=p1) /*如果条件成立说明插入在r与p1之间*/, p2 a# h2 Q( J
{1 A& v/ d4 E7 N. `
r->next=s;* T: v$ v2 `5 Y8 U/ T3 l+ m
s->next=p1;1 u: Y& L! n2 w
}
: m2 S3 \# q+ G( N+ n else2 ~# a3 E4 Q/ Y; J' v, M
{
$ \) h: M$ |( @+ g7 [- N s->next=p1; /*否则插入在就绪队列的头*/8 I: `% B# B$ h1 D; l
ready=s;! z) \3 Y6 y$ n h# V
}
4 m9 x, a' a) z: h v) l}; U" P1 [% Q& Z' [. k
/*轮转法插入函数*/: j8 b8 o9 o0 B: [
insert2(PCB *p2)& G* L) Z8 A- e) A
{, F2 Y2 Y$ R4 c; I6 S2 B
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
K) d( C0 A) C6 j! Q tail=p2;; a S! E5 z" e6 N. ` n5 c* W3 E
p2->next=NULL;! `% n+ |3 G R( [0 v* m( I
}
1 w7 A2 q& X% z) q9 ^/*优先数创建初始PCB信息*/
* q. t$ R: w/ T X6 @. D, R i. ^9 dvoid create1(char alg)
, m, r; ~( G' M1 z. ~6 s{
5 S O9 B' W) }+ X3 Y PCB *p;: { @- ~. _& w0 t& e% c
int i,time;. Z- o# O7 O$ ~* Z ]" i
char na[10];
s4 B! T! r$ n9 G% }- Z9 e ready=NULL; /*就绪队列头指针*/% m- t x9 r* Z+ L
finish=NULL; /*完成队列头指针*/; W0 ], C; A4 R' s2 g/ O9 J: \ z
run=NULL; /*运行队列指针*/6 x& f4 y7 `* D+ E9 c. Y0 z
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
& N1 H6 e7 @* M0 A* k# ^! { for(i=1;i<=N;i++)
! B7 m4 O! g! c4 {9 D {
* e5 s+ m& e. A# l g; W p=malloc(sizeof(PCB));9 B9 `, M; B5 q
scanf("%s",na);) F# ?, v7 f( V3 d. ]
scanf("%d",&time);3 B" c0 J0 F4 t( ^. B' F& g$ `
strcpy(p->name,na);
6 K4 G7 O, p! Q& x p->cputime=0;
4 s2 }* D( H0 I8 e p->needtime=time;
0 A. O. J* t& Q9 K! j p->state='w';! k* N: m' P' y3 d& L
p->prio=50-time;
8 V6 R' H4 ~% F9 A# [: A, ` if(ready!=NULL) /*就绪队列不空调用插入函数插入*/" _9 K: A3 A( @
insert1(p);% v# E- w' g) M: q+ l7 s+ w
else7 b( b: O: h- H) T1 T5 E
{
, [- U- V& v9 I0 z+ F- z p->next=ready; /*创建就绪队列的第一个PCB*/
W. j4 g6 I6 C( n- e ready=p;
" S+ X D- I; @. p% D }& M3 H% S0 Z6 b: w) @+ }$ e, u
}
8 k4 ]! ]0 l# T2 K clrscr();
# [# j% k- G* o( X$ \9 |5 E printf(" output of priority:\n");- ]" h# @& Q/ g/ O! r1 `9 @
printf("************************************************\n");5 T3 ?# z' Z8 M/ U: m5 E, l2 j8 A8 ~
prt(alg); /*输出进程PCB信息*/
* I* f) ~: h' s6 Q run=ready; /*将就绪队列的第一个进程投入运行*/7 f S. P# B) p1 R/ K6 r7 }
ready=ready->next;4 S9 O) @% a4 L3 a/ e8 i0 f
run->state='R';
) I I* |& t2 i; ^* d8 \}
2 F+ `/ U" E- T/ y/ b- C; Y/*轮转法创建进程PCB*/: ?2 |+ l! G: g. {' I; l
void create2(char alg)
, e9 {2 |! U* \$ M% z; ?{9 d; W5 h, A( l. G( k# i1 g
PCB *p;9 I( _9 ?+ {$ p+ S
int i,time;2 f+ b" i0 e# B6 d9 c, o- L
char na[10];
% Q: F8 u: m- ~ ready=NULL;( A K4 H, z) \+ b# C
finish=NULL;
: |3 r5 l% G' c run=NULL;" Q6 s' j& _0 u8 L3 M
printf("Enter name and time of round process\n");
6 q9 p* `! q& P* l, S for(i=1;i<=N;i++)
h ?9 i( l6 V& u( f+ X; k" T, T {
V& e. p* N2 U; P, z p=malloc(sizeof(PCB));
1 }0 Z7 F) |4 Q, |, [* v scanf("%s",na);! } I3 P3 T7 V4 Y, B& n/ \
scanf("%d",&time);
6 t( T8 A2 p8 y- }6 P7 M6 x strcpy(p->name,na);
. V+ x, N% B. D; F) K Y p->cputime=0;' a* |0 u5 C, J
p->needtime=time;4 |8 y O) X2 M: G: x0 H
p->count=0; /*计数器*/# j$ v2 g! T$ S5 d$ y6 d8 u$ e
p->state='w';
1 t9 w! r' ]2 J2 t. R4 G# b, { p->round=2; /*时间片*/" P5 e1 v: ] p/ i% M# w
if(ready!=NULL)
7 m1 N* c# f; | insert2(p);
3 j) h7 x3 z( ~' R7 W4 H- e! Y else
: o8 `: Q1 W% m/ p( X6 Q6 B. a! B {7 M' A* z- o r: F$ l
p->next=ready;/ n; _5 Y/ ?) e, C) u' H
ready=p;! P( \3 e9 i, V' v
tail=p;- f2 D: y% R" l+ t7 @& v ^
}
4 h! [9 g* T" h1 q2 A- q; r8 J }8 s# G# T$ i7 R* ~
clrscr();
7 I/ }+ o* c1 W d' d7 m, b; J printf(" output of round\n");& j5 { ]' F/ _2 P
printf("************************************************\n");
- ^; d* [' E* [: o prt(alg); /*输出进程PCB信息*/1 g! o m4 o2 R( L' @
run=ready; /*将就绪队列的第一个进程投入运行*/( T" D: b" \+ K; d2 ?' z3 m L" N# E
ready=ready->next;7 d; A( t0 H; \5 S# J" j/ a
run->state='R';
2 k# o6 n3 f9 S% T}8 D7 Y+ ^1 q1 k r1 F9 ?
/*优先数调度算法*/
! Y2 u5 V/ y/ J+ hpriority(char alg)
6 {$ }, ?0 ? Y! Q( e/ I) R{7 V1 }6 j7 x# U8 o. g- W( n6 c: X
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/' {2 u; M) V) K# O! U4 j
{( r0 B; n5 N5 C H5 b& ^! J
run->cputime=run->cputime+1;# _7 f% C9 C8 P; w8 z; n3 Q7 @" u5 [
run->needtime=run->needtime-1;
- B/ a/ o4 @6 j& C Y9 ~+ K run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/# @+ Q- x4 a' a
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/" E0 c2 Y* [$ S& L8 I8 k5 M8 ?4 e
{
* @, i2 a+ V% x2 V9 H$ \ run->next=finish;
- \2 c# C9 C( _; I finish=run;
" h. d' ~3 x1 l: f+ ^7 E5 t run->state='F'; /*置状态为完成态*/# ^( W% |% {; G# e' V2 T
run=NULL; /*运行队列头指针为空*/
8 `% Q; E8 c, a$ W) k9 c if(ready!=NULL) /*如就绪队列不空*/* N0 D9 S3 W _- `; _& M! B/ s, }
firstin(); /*将就绪对列的第一个进程投入运行*/
) K) w0 K, \- } Q }
, x3 k& A8 p' a4 K( s; T else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
) r" b) q! f+ B9 Q7 P$ Q) t if((ready!=NULL)&&(run->prio<ready->prio))
# a+ S+ r3 F/ c# F/ B6 W; F6 ^" G {) E, Y3 e. {: z; h: n
run->state='W';
+ ~- P" F+ q6 t insert1(run);
) I; I5 F D. N firstin(); /*将就绪队列的第一个进程投入运行*/
3 E9 {# u; Y+ P% h }
; c- X/ q* _& ?* _) j" I prt(alg); /*输出进程PCB信息*/4 f8 i1 ]4 }2 P: g0 @/ V% _3 P
}
! Q( G" j/ C& |5 b( V k3 ?}
9 E( o; o! `: z* E/*时间片轮转法*/8 l# a' f/ O6 N( N
roundrun(char alg)
! J+ o j1 q: Z- ^{
. h3 c, \ q1 O while(run!=NULL)
/ L# S, z/ Y" Q8 ~/ ` {
E1 P/ G! q; {4 ^! A. M6 [! x! i run->cputime=run->cputime+1;- `6 n% j8 R! U3 q" \1 l* J: `/ m
run->needtime=run->needtime-1;( L0 v% C& \1 t( x7 I( O! v
run->count=run->count+1;4 K& {# J0 i5 R
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
\7 Z E6 d. o {7 K2 G) q t! _: E2 _& T
run->next=finish;
, y9 q8 C4 s# W6 q' H finish=run;
; |2 J6 n/ k+ A' k6 w run->state='F';- @3 a9 D% ^% Q. Y* U
run=NULL;
% L+ W& D7 N8 M1 O' S O if(ready!=NULL)
5 j+ ^- ^0 Y$ Y) ]9 M firstin(); /*就绪对列不空,将第一个进程投入运行*/
; ]# R/ a6 { T Z' d) h }
6 L& y: ?9 v2 Z& E" w1 R else: [) D7 G& {9 g' j% }7 N
if(run->count==run->round) /*如果时间片到*/1 X. j* j' j: c; M5 O
{
1 F2 M% \7 Z9 @/ u1 F4 Q run->count=0; /*计数器置0*/
: \( j8 D0 s$ ?7 P/ `. U if(ready!=NULL) /*如就绪队列不空*/
: m( t$ D0 I+ K2 u+ h' v+ ~/ A" ?, H( u {
( J' f/ X& r* S. W run->state='W'; /*将进程插入到就绪队列中等待轮转*/
+ G% v; a5 l V% a! Y, i/ L7 V: L insert2(run);
$ ^2 w+ M1 l4 M* R1 v firstin(); /*将就绪对列的第一个进程投入运行*/
8 o% u, s$ F- S3 G* K S- l, M, q: u }
# w9 Z3 a6 o) c }
; P0 A1 y6 |0 {" `& L8 n U8 D prt(alg); /*输出进程信息*/
! M1 `2 _( ^% C+ M, q( v# ^# |$ l! f }) [6 e) n& P8 j) I
}
4 D' B K3 w& A# p" Q5 j' i/*主函数*/1 d2 F+ @3 u% E
main()+ A0 Z; x' H5 {- C
{# t1 `8 @/ ~( ^1 D+ C
char algo; /*算法标记*/5 `8 {8 H* O' P7 @& n: R$ x
clrscr();
2 ]$ `# o6 _, Q8 k% F printf("type the algorithm /R(priority/roundrobin)\n");
( Y6 K/ X0 i4 L scanf("%c",&algo); /*输入字符确定算法*/
7 K- \& d( U6 L6 \& g) | printf("Enter process number\n");, m& e4 `' v8 h% m6 P) o
scanf("%d",&N); /*输入进程数*/
, h' u9 g' \4 W1 X; f; j if(algo=='P'||algo=='p')
! ?- \" b8 q; ?) h3 n8 T: }1 q) N {$ i' l6 ^- w C. I
create1(algo); /*优先数法*/
! {8 _! ^: W# j9 j* ] priority(algo);
0 r. U. m$ P5 m8 t+ g3 s }
, V8 Q6 q3 A* W3 D9 m# T. {- ~ else m' `% I. x" u0 n* @
if(algo=='R'||algo=='r')
/ u$ O; @+ N" k6 y {+ o9 F9 A. @& o8 U: x
create2(algo); /*轮转法*/
- C. d+ D1 z# x roundrun(algo); \0 F5 `; Q3 F, i" j1 n j% c1 ?
}: h5 S) D! G" U: v' Y8 E
}, H4 c( r. o; |4 s; Z& g6 l
</pre> |
|