|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
# K9 I! e0 p! B& Z, X#include "stdio.h"0 P; ]- Q8 u1 Q4 `+ }
#include "stdlib.h"5 h# R+ m" N: g* z; K( ~
#include "string.h"
, H: j, U& Y3 e6 }0 w8 `' otypedef struct node
: l. g5 q8 U5 Q& C, j{
9 O8 w# m; h& P8 \1 M char name[10]; /*进程标识符*/8 ?. Q( W$ P! p5 K! M
int prio; /*进程优先数*/8 f& G; |) M6 b! i @4 D+ z3 S# B& O
int round; /*进程时间轮转时间片*/
$ v9 ^3 w m4 h& L0 \ int cputime; /*进程占用CPU时间*/& `# D. M( B# h) ]& r- E
int needtime; /*进程到完成还要的时间*/" _ |( l1 c% \7 p* p
int count; /*计数器*/' W3 P9 Y) R% }$ b" s+ Y: K: ^ V
char state; /*进程的状态*/
$ c5 q5 |! a9 q0 H1 ` struct node *next; /*链指针*/& s! U5 x' P: u
}PCB; l/ \* G3 y! S
PCB *finish,*ready,*tail,*run; /*队列指针*/$ c4 P# H' k# d+ b
int N; /*进程数*/2 E/ v. L& I5 W/ O7 ^& K* N1 K1 q9 E
/*将就绪队列中的第一个进程投入运行*/
, t0 N3 Q y2 r c0 N) Tfirstin()! i; q8 O2 P: x3 T1 X7 C
{. k- }* S2 B. i H7 @4 @
run=ready; /*就绪队列头指针赋值给运行头指针*/. y# u8 e! Y8 I6 {7 [
run->state='R'; /*进程状态变为运行态*/
; \3 `5 ^' y) f% E" R0 i* w0 K ready=ready->next; /*就绪对列头指针后移到下一进程*/, s- T9 |' q; J% j) s
}: y) ~0 ?6 H" [0 L2 m) a; m
/*标题输出函数*/
. F" d( ^7 ^; ?6 H! i& a W: ?, \void prt1(char a)
' K3 E& P5 p& @ e, X: M{! @1 K$ b# ]6 v' F0 S+ F# w
if(toupper(a)=='P') /*优先数法*/% a7 t# \* q' t
printf(" name cputime needtime priority state\n");$ j8 u. e U; y
else: h; y: b: d. T
printf(" name cputime needtime count round state\n");
7 P4 v3 B) Q: x( Q0 G}7 m- _8 z+ W* L6 }
/*进程PCB输出*/
6 c+ f! `9 T4 t" d4 {9 }/ q, ]- xvoid prt2(char a,PCB *q)
$ q2 g6 Q: u2 T! V1 s{
" l" j1 I9 [$ b% u5 J if(toupper(a)=='P') /*优先数法的输出*/
8 t/ {5 X- a" l( W2 I3 [ printf(" %-10s%-10d%-10d%-10d %c\n",q->name,7 ^& h! H' } F2 ~
q->cputime,q->needtime,q->prio,q->state);
8 u. F" Z& n% t6 W$ ~3 Z else/*轮转法的输出*/
( E4 `5 i. D+ k printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,$ m1 c& M; r. D
q->cputime,q->needtime,q->count,q->round,q->state);4 Z: _# A2 h1 F/ W5 O; Z' y2 z) l
}/ E9 {' c$ m2 d4 Y% b0 g2 L' F
/*输出函数*/" H" [. I6 A J0 T7 q& I
void prt(char algo)$ f* T9 i+ I4 n+ b( t" W5 ^
{9 ]: O3 d6 V- h+ \1 l
PCB *p;5 z" }/ \. u3 y0 {0 b
prt1(algo); /*输出标题*/& c2 I& D7 ?7 G
if(run!=NULL) /*如果运行指针不空*/
3 \0 l( F, ]8 N0 B prt2(algo,run); /*输出当前正在运行的PCB*/
/ `* q" m; z4 k/ k5 C% v7 O p=ready; /*输出就绪队列PCB*/' n' S% y0 {! j0 n# D
while(p!=NULL)" |% \/ @3 D; r; T9 f; G+ _0 d
{
: D( D( W% a* h9 g* C prt2(algo,p);7 _9 z( V: K5 w( ?2 d
p=p->next;. Q$ i5 ~6 c) ^: B* o
}
+ |4 Q, ~0 ^* Q: P p=finish; /*输出完成队列的PCB*/: L! s! L/ B0 t; c* J/ F* Y+ j) s1 F
while(p!=NULL)
o6 r6 ]7 K0 y8 [9 y {7 S* |7 V. U9 D- o; Y* r. w. N! f
prt2(algo,p);; ~* j/ z) ~1 ?" g/ q7 S
p=p->next;6 |' k8 ~5 H0 a$ F1 k: r8 p6 g: t L# T9 q
}/ e- V- e3 K& y# u8 ^! L
getch(); /*压任意键继续*/& l) n m9 K1 b+ J5 p
}
) z# k5 _* S9 r/ p- G2 _ A+ F/*优先数的插入算法*/1 Y! B, Z3 Z- q" `( J
insert1(PCB *q)/ f7 L( y5 f- \2 P0 V
{$ n+ m6 e) }2 c( N) a% Z2 P
PCB *p1,*s,*r;- k- m N ^4 ]) Q$ c' r& \
int b;" B: I1 P4 i3 d0 y% F6 Q
s=q; /*待插入的PCB指针*/
7 @8 v5 f( A' s; N2 F p1=ready; /*就绪队列头指针*/
2 ~& B9 z9 U } r=p1; /*r做p1的前驱指针*/! _* z) H% N3 w1 {
b=1;
: c, _; Q o( M) b6 W while((p1!=NULL)&&b) /*根据优先数确定插入位置*/3 Z# y1 Z" A8 I$ y9 F0 S7 @% y2 U
if(p1->prio>=s->prio)
7 g1 h4 N" x5 D4 x8 K% T0 W {
5 Q6 B7 }7 |& n" [* u) ~8 L r=p1;4 o) \* T1 y' f. r+ k& X& ^
p1=p1->next;
& _2 m. S5 Q) Z0 z" d1 \/ n: ? m }( j4 L# I- x6 B6 i$ R! _
else
s A" n+ n3 t8 t3 v b=0;0 N5 n" W0 o2 K! W0 J' u# R- x$ ?9 ^7 R
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
6 Q5 K- L! ^3 I: S {$ ^9 ~/ H T: R) Y
r->next=s;
2 Z3 p; P0 w- |, o6 N s->next=p1;& G C' x2 B7 @2 o9 H. I+ R0 V
}* R) |8 y- |2 W# m$ Y& I
else9 T' e- d% k% ]* e" o+ B7 Y
{
! @* B- I! `3 Q9 l% Y+ [ s->next=p1; /*否则插入在就绪队列的头*/
8 H9 u; n# h5 V; n) X. y+ p8 ` ready=s;8 L& W+ ]! y2 C8 k
}) _. `, K, K+ t% w2 e
}9 Q3 C3 T1 L; \/ U* r
/*轮转法插入函数*/
& [$ b5 t, q9 \; i- e6 f5 T/ rinsert2(PCB *p2)
6 l* D7 l% B% n: |; `8 [4 K3 G{" s$ p* W! ^8 R6 [) I
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
% n; I" o( V3 ^+ T tail=p2;0 h- ]% g" r3 J" P- h
p2->next=NULL;
" P; y$ H& ?# Z}
2 L( i j. l/ W/*优先数创建初始PCB信息*/+ t" h. `$ h2 |/ L
void create1(char alg)
: V, t R7 l0 _7 n- E* \- s" J{! C# v6 ?! j9 m: Q$ o% J
PCB *p;
; V3 ^4 v9 o( V) M8 p: t9 y int i,time;8 s5 ~* J }" S$ r( K
char na[10];0 x$ f4 B2 X: }7 F
ready=NULL; /*就绪队列头指针*/
$ L0 ^. A& ~3 D6 Q, q8 o- G& l4 W finish=NULL; /*完成队列头指针*/8 P! r5 _; y9 F) h% ^
run=NULL; /*运行队列指针*/' X+ E/ o9 b# b
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
) ^! E4 P' }$ `/ X, B& { for(i=1;i<=N;i++)
! N9 j+ D' N# n, j {
* A' h- f; S& }8 W) r1 [ p=malloc(sizeof(PCB));
+ e/ v) O/ N: _8 z0 k( } scanf("%s",na);0 c' j6 M0 n$ z7 D6 E- X6 y
scanf("%d",&time);
9 N+ U. @3 m6 _) t/ r- ^* ~1 @* } I) X strcpy(p->name,na);) C5 l0 q) {9 c3 C; Z! v- ~" l
p->cputime=0;4 H3 \& _( I5 D
p->needtime=time;
) d% D) i! h1 L+ L7 d p->state='w';
7 g, l/ C' { N+ X) y; n p->prio=50-time;
3 v/ r) K! x3 F3 U8 T* P9 [$ F if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
! t2 A; ^3 m2 v# A. U& s9 z+ L/ B insert1(p);
( v! U; i" \. J2 _ else" r& A' J2 Q: o
{
; {; [8 i% U& V: v! {' d, g9 A4 u; x& k p->next=ready; /*创建就绪队列的第一个PCB*/
2 {- [+ v; ~7 u( R b# F; b ready=p;# s! F8 g' Q9 F0 T ~) ]( s
}
t) J4 e6 A- W- ?$ I }
+ k' ^% [" S3 } clrscr();
/ N% t$ T" g9 N' J3 _* A: E printf(" output of priority:\n");6 h* e6 n' _2 k
printf("************************************************\n");
# G0 H8 p6 G8 A, V) y+ ^$ c prt(alg); /*输出进程PCB信息*/
: ?! H& n6 p X/ k- F run=ready; /*将就绪队列的第一个进程投入运行*/" B% }* R1 c) c8 p, [9 Y& F+ L
ready=ready->next;
7 G, B/ B Q5 H run->state='R';% c0 f* M6 j6 x/ [& M) {: B. F
}' s2 g. w: l, G% P4 X( c
/*轮转法创建进程PCB*/) t* p8 y$ r ?- n
void create2(char alg)6 l' Z& o& s3 Y. @9 f N5 [
{
! _: h* T T% g: T. S% `. g! K PCB *p;
) w* g3 a8 h8 }( G/ ~& F! P int i,time;
( _+ C; e( z% m char na[10];0 c$ [% |7 P& V1 V& H2 O8 w+ R
ready=NULL;* k$ X: [& W) J8 T% U
finish=NULL;
4 g2 H6 f) q: U, f( c; C g run=NULL;
/ w& o& Y1 Y0 H7 t/ r, X" _ printf("Enter name and time of round process\n");, w# Q! W6 c' G
for(i=1;i<=N;i++)
" [0 H7 j: [& g5 r0 Y# ^/ ? {
% c. O) h0 \. i- T( w p=malloc(sizeof(PCB));. }% F* y% Y; K V
scanf("%s",na);
; n( I) H' |2 R7 \* D' k+ K3 U scanf("%d",&time);1 j6 A- e* h( Z, b8 z* Z) _! w( o$ |
strcpy(p->name,na);
P& g: o6 v. V% U p->cputime=0;
3 y. @( c9 l _% ?3 o" c) G- H p->needtime=time;
9 S1 ~# @7 ^) M% r% u2 \ p->count=0; /*计数器*/3 @3 N; o, b/ P9 d A8 h( T
p->state='w';. t9 H9 U8 l: `$ D
p->round=2; /*时间片*/
1 P$ k, m2 W& D5 c1 Y0 m6 F8 p if(ready!=NULL)
$ o" \- k+ G0 T. L insert2(p);( Y i3 Q/ S$ k+ b$ X- _0 b
else
% ?. W/ x# Q O' i3 W3 y( r {
, O0 E3 u' p9 g8 r. Z% B p->next=ready;
' y; ^' y# _2 v ready=p;
. q/ c# a: b3 y) _7 [ tail=p;
- ~; g" a+ Q# [9 k. Z- {/ L$ G }; c) S) H) ~" u9 \1 H) c
}0 G/ ] M. Z8 O! _/ `. {4 y! u) V
clrscr();. ^- ]3 G+ q5 ]; f6 @! o
printf(" output of round\n");
2 G' Y1 D! e c printf("************************************************\n"); t3 u, q: J0 K4 U- r5 t4 [
prt(alg); /*输出进程PCB信息*/
x9 J6 ?$ X1 q run=ready; /*将就绪队列的第一个进程投入运行*/, e; v s) }: R* @" _
ready=ready->next;
% u. d! V5 g4 m! \4 r run->state='R';+ n6 F) y! L( N+ S) A" z/ D [% d _
}
5 `- k" Q1 K; F8 {0 U% `/*优先数调度算法*/6 r- A( \) N% v% k; e
priority(char alg)
2 O( c% j4 x# R x{
n/ C" t; V( |# R# Y" Q- o/ X while(run!=NULL) /*当运行队列不空时,有进程正在运行*/5 k- t" v b* U3 c+ r* u
{
' d+ Y- I1 @0 W7 |: C" E9 k run->cputime=run->cputime+1;; d& H5 I9 Q' F9 n
run->needtime=run->needtime-1;. Z7 [' K; O" q$ J6 S0 i
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
. b9 P+ u& F( T0 I7 t if(run->needtime==0) /*如所需时间为0将其插入完成队列*// k5 V# o, [" y* f+ Y
{
/ }: f( Y. e7 e. j7 N5 T+ R* w8 @ run->next=finish;% B* K0 `. ^; Q4 W9 x/ u
finish=run;
# ~6 t3 v/ H; s% _ run->state='F'; /*置状态为完成态*/
* [6 g1 i- p* S- f run=NULL; /*运行队列头指针为空*/
/ S$ r$ i6 C/ u. u/ C if(ready!=NULL) /*如就绪队列不空*/
; U* e4 R- ?0 ]- x! j t firstin(); /*将就绪对列的第一个进程投入运行*/- ]- q A9 u9 c8 @, h: U6 |
}
: B4 ?/ L& A. Q* g% E; } else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
% |% G {; \& }* n; f if((ready!=NULL)&&(run->prio<ready->prio))
+ R( T9 X. ^( |9 g& x% _0 \5 C {
! j9 ^0 s/ Z% p0 v j run->state='W';
8 ?" B$ F& I' Z i- l" B insert1(run);* A. M) s$ m3 z; y
firstin(); /*将就绪队列的第一个进程投入运行*/% g) i& s; w' u7 e
}8 j, ?/ W5 Z. m3 \) m7 j
prt(alg); /*输出进程PCB信息*/, \, o6 H, ?* X$ g- O: x
} {4 ~* h2 x$ Y& k9 A }6 Z! c
}3 d2 D. c" H; a% W# a1 ^- \
/*时间片轮转法*/) |' f5 ^) a/ a. P, j6 K; d1 C
roundrun(char alg)
$ x( f0 b$ n1 Y2 j! F{" z+ `9 ]; T2 h) z) N
while(run!=NULL)8 O( w1 P, F3 I( _0 {3 B. H' v; t
{
& A) z1 s: y5 g) p2 A run->cputime=run->cputime+1;/ K3 J1 V5 o- ~$ }( O! u( `; x
run->needtime=run->needtime-1;
" @3 Y% T4 o$ m5 y/ }% l U run->count=run->count+1;
9 D& J9 k" h+ T9 H9 p" n; \- L if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/% J+ _5 |7 n w* k: A% U& ?
{2 ~& v+ `: F4 ^# e/ z
run->next=finish;
' z) z( V% t6 [, z+ U, t3 W* d finish=run;8 ]$ H+ }) p/ M. h
run->state='F';( j3 _! U/ a& H% A
run=NULL;
# S7 s! S# B+ T v) m- V8 ` if(ready!=NULL)
% Y& S0 Q1 w' c8 C' c) ?: R firstin(); /*就绪对列不空,将第一个进程投入运行*/8 [% M5 ~5 H+ m8 h j+ b
}' _. V' c+ f% j* c: o
else
! A$ j" r8 F# U6 t. n( N if(run->count==run->round) /*如果时间片到*/
- q( U2 _- h( D- {9 y5 K {% a) n1 r$ K* w& }4 u: {' F ~" A
run->count=0; /*计数器置0*/. N ~+ [) |+ Q. s- N; A# _: r
if(ready!=NULL) /*如就绪队列不空*/0 t' ?$ j: a4 m0 n. D3 N; R
{
% {8 a' ~9 v* z' A; q' d: m$ l run->state='W'; /*将进程插入到就绪队列中等待轮转*/
( X' i9 D3 B: H# j insert2(run);
4 d. U- _7 Y0 z$ l firstin(); /*将就绪对列的第一个进程投入运行*// K4 q7 b' C8 |# w& C4 @
}) Q0 p, k) L/ R# j" H5 H$ p/ V
}
5 U4 o7 Y2 U; ?' t prt(alg); /*输出进程信息*/
; P) S; X5 S" _4 ?6 i" R }
/ Y! N6 z3 O9 L}- _$ t; W8 B1 v: h8 d- \; O& p
/*主函数*/
; |, ?! g4 g" n0 A* U+ Nmain()
& U2 Z8 `4 g* ^4 w' q9 p{
2 W8 I- l4 K" t( J char algo; /*算法标记*/. R4 ?# B/ I& ^1 k- V
clrscr();
' r6 `/ g' S8 N" N) Z printf("type the algorithm/R(priority/roundrobin)\n");. g" @' u8 g+ e' M" C& U! N$ _+ f
scanf("%c",&algo); /*输入字符确定算法*/
8 Z; W/ _' V! K2 Y% _ printf("Enter process number\n");: s) E- ?2 G8 L$ l1 Y& m
scanf("%d",&N); /*输入进程数*/2 h9 `, B4 U) j. v: f
if(algo=='P'||algo=='p')
) f5 v/ Z1 Q$ `, Y6 K$ s1 Z! M {
- b$ t: D/ G& l& e9 A/ l create1(algo); /*优先数法*/
! n x; ?5 K8 l# o4 w priority(algo);
$ H5 L8 |) X1 g$ t3 D* v, o }
+ h# p6 N! @% X) J& B7 o! `, @* z else; g1 w% t' z# @
if(algo=='R'||algo=='r')2 u. B; a+ V. ^1 k8 C9 u
{
/ E! U6 ~6 C f; R& S* r create2(algo); /*轮转法*/
3 E% U) T- e. ^% [ roundrun(algo);2 Y) g0 f/ I+ H8 `3 T
}% a( t+ l: S/ L; j n' [5 n0 p
}
" A9 V( d0 u1 C+ I% X! @1 L</pre> |
|