|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
' A5 [; V) B, \1 Q8 V% q O+ h#include "stdio.h"
! G; X7 p9 y2 W! G, u/ n6 F! p4 O#include "stdlib.h"2 x/ m) t% D# L
#include "string.h"# C/ j. K4 p" k, q* W* K
typedef struct node& L8 O1 a. y+ o1 X1 S& D. `, }
{* \7 `6 N: ^( [5 L) l
char name[10]; /*进程标识符*/
& a) r" q5 F9 `# r int prio; /*进程优先数*/+ g' Q% a! A2 Z" L+ k4 Q
int round; /*进程时间轮转时间片*/& m: |) S3 C- x/ x3 g0 p* O' g
int cputime; /*进程占用CPU时间*/7 @6 F9 |* m. h- I# D$ |/ E
int needtime; /*进程到完成还要的时间*/
! h+ q# }9 S8 m int count; /*计数器*/
4 G6 H7 A3 K g0 O _! r char state; /*进程的状态*/
0 `. Y8 F( A' e' r: G p$ x! x struct node *next; /*链指针*/
# l3 n' ^0 m# y4 s+ H}PCB;7 ]0 T1 a8 a( v; w( L& ?# u
PCB *finish,*ready,*tail,*run; /*队列指针*/
8 V- g" g8 a; r! O' ~5 gint N; /*进程数*/
/ \" c2 h; {' R$ g0 N1 c9 |/*将就绪队列中的第一个进程投入运行*/& q5 o4 V& u3 O& {! P
firstin()
( b0 B" u4 k, f" }# T8 K2 S o{
6 q) u' A' V( V5 z run=ready; /*就绪队列头指针赋值给运行头指针*/ a: `6 `( j+ ?6 K" [+ [6 q& [3 v3 v
run->state='R'; /*进程状态变为运行态*/
7 y& F$ K& v9 g5 y ready=ready->next; /*就绪对列头指针后移到下一进程*/4 F) A7 h. Y7 l% D& ?
}
. o( T H1 x2 b0 y* m+ V/*标题输出函数*/
@9 ?/ T& \6 Z* Qvoid prt1(char a)6 Y" }, V. _; K9 {8 m( M9 B
{- i6 a' a* E6 Q. {/ J6 ~
if(toupper(a)=='P') /*优先数法*/
8 u9 A) w0 C+ Q) N ~ printf(" name cputime needtime priority state\n");$ G' p p& R+ k" H/ K* s S
else
9 o- x% K" ~& z8 N4 |' N printf(" name cputime needtime count round state\n");/ u! |6 M9 s- W$ d2 [9 q$ `6 Y
}% k4 \1 {) _0 O. s: D
/*进程PCB输出*/
+ [, [# X- l# S) ^) Q8 _void prt2(char a,PCB *q)
8 u: H c9 @; l0 M: W! x{- s9 n K7 A) O9 k2 Z
if(toupper(a)=='P') /*优先数法的输出*/
' J4 J3 x/ ]. R& e5 ? printf(" %-10s%-10d%-10d%-10d %c\n",q->name,) a) f7 ] i+ A+ T# k0 j% a
q->cputime,q->needtime,q->prio,q->state);
" m9 j- w7 f% \" w. h1 b* Z( n else/*轮转法的输出*/- Q( j" M% u1 n% O! ?
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name, Y4 j+ b) g- D0 [. y' w s% j
q->cputime,q->needtime,q->count,q->round,q->state);; u% R' W+ b2 n" S
}
[# q/ G2 n3 E7 `/*输出函数*/
3 |: h8 G" ?4 o& e# Cvoid prt(char algo)+ _8 b( A7 k5 S8 S& X4 K
{
/ q- z/ i9 |0 C' u. K9 V0 ?* O PCB *p;6 n G% p: ?; V9 j$ [: u8 r) p
prt1(algo); /*输出标题*/; R8 Q1 B" _' Q
if(run!=NULL) /*如果运行指针不空*/
2 b/ E; V- g _' o& u9 h! _ prt2(algo,run); /*输出当前正在运行的PCB*/& ~4 J0 _! `& B6 j& {) Y9 N' p
p=ready; /*输出就绪队列PCB*/
- i4 I1 i. L) C ~ y while(p!=NULL). d5 @& ~! b( m' [% D! t2 V h
{
( e( x0 Z; p, s0 c8 l prt2(algo,p);
8 s9 K: s, E; F& p" F p=p->next;3 B% W" `: ~$ |) s: \, i1 |2 y! a
}' i# I& A! {3 ~* t+ `- \. c/ c3 Y2 L
p=finish; /*输出完成队列的PCB*/# m2 R6 ?8 p9 J. i1 U* C( U
while(p!=NULL)
; D9 d+ ?, R) b$ Z6 e) z! a( o {$ ?. c" ^' e% A+ _4 L" r% n, s
prt2(algo,p);, Z0 y6 q1 `3 ]$ d
p=p->next;
% `+ r4 _0 g7 \& Y6 ~% ?7 y: e }
, F& {: n/ S8 {$ d getch(); /*压任意键继续*/6 i" r* g8 Q& W: r: I
}
4 J% @& e6 J8 h, x- C4 p/*优先数的插入算法*/
& q4 S. F0 Q2 Ninsert1(PCB *q)
: {* t, ?! f" g) f{+ H& `) t7 P; c0 K4 ]* r$ t( A8 ]
PCB *p1,*s,*r;. S& @1 \* @9 A. V$ H0 [& X
int b;
- d: M% [: a1 c7 g# q6 A9 q) Y s=q; /*待插入的PCB指针*/1 Q) z. D M+ w6 N8 x3 `
p1=ready; /*就绪队列头指针*/
/ O/ y: H! N/ p+ T( o r=p1; /*r做p1的前驱指针*/2 I5 `1 h/ D4 o
b=1;1 {5 S2 H7 T# D+ g
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
$ `/ J0 v) Q$ `: b8 _ if(p1->prio>=s->prio)
# P- J) f, W( o- X5 P0 e {
2 X$ I. r) o3 V$ s7 e$ ]$ b8 d; i. M r=p1;% l3 ~4 ~7 m8 v, E5 y- f- |
p1=p1->next; o3 m3 l/ t/ e% g9 j
}4 O" }, S8 D: L! C( s' O; L( l
else! {/ H' `/ {! K5 {+ x9 s3 N$ [
b=0;
$ X; L5 V& t( h/ ?5 w if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
! b1 p, J, N) @- ]+ O# {* I {, i1 R8 t/ ^; n* z) V0 B% m
r->next=s;
: p- C& Z9 O3 w* s s->next=p1;. G/ G7 `$ a. G8 u
}
$ @6 X, _: G9 T0 A else7 C. t) E" Y- M/ V3 }9 c& I- z0 H
{4 g7 Z2 w. j# o) i% e
s->next=p1; /*否则插入在就绪队列的头*/8 _& p" u- P1 d8 `) {2 S
ready=s;
; |4 V2 l8 j8 [/ X0 N }
1 [( U4 w" G$ y' F. V0 a' `}
* [7 y5 D& ^7 y- c* L+ d% q/*轮转法插入函数*/; X' B+ t, y% ]. X
insert2(PCB *p2)8 @7 w7 G5 |( d0 t+ S& k
{1 u" {- n1 M* E! m4 q1 K, o$ Q
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
- q1 q0 F/ ^ L5 A3 G tail=p2;
0 |6 f1 p% l0 q8 z p2->next=NULL;
& `# T+ A! K, q3 S! z2 |/ A}
- I! k9 J" y @6 ]/*优先数创建初始PCB信息*/& o/ @' G& D( W' e: {0 ]1 D
void create1(char alg)9 J7 G' b) ^' p* S3 M& N3 I
{
0 y6 ~7 H+ |' e8 }" k PCB *p;
% t0 p4 J9 b) [# \& v int i,time;
1 T$ g7 m1 V5 z7 b$ v char na[10];
: l$ g/ G2 Y3 |& i7 X! P e ready=NULL; /*就绪队列头指针*/
9 T% W- i" ~+ T" G s finish=NULL; /*完成队列头指针*/
; M7 q! z0 H7 c( P& @- \( A/ P run=NULL; /*运行队列指针*/: ]7 ~! _7 q! Y& e7 p' S
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/, e' |2 H$ t8 s8 U/ {* d/ y
for(i=1;i<=N;i++)
# e$ n# j6 }/ Z- a8 @% \# O {
8 D4 O" Z3 o6 I( |. E2 \1 _ M p=malloc(sizeof(PCB));; D1 [# T1 s7 h, X
scanf("%s",na);
$ U( k! z" N3 D! l. C4 d4 B scanf("%d",&time);
' }% c/ Y" r7 s6 J strcpy(p->name,na);- k; S: v3 y) w4 N8 a
p->cputime=0;
- j) [, |1 S5 d& R p->needtime=time;4 M( ^! K" E* B' A
p->state='w';
, _6 Y' f5 f D8 J- \0 @ p->prio=50-time;
% F7 t! n. c8 b# |) w% b if(ready!=NULL) /*就绪队列不空调用插入函数插入*/: K/ {9 | x( |9 v$ P6 U. {
insert1(p);. t4 W, r5 H' M' f4 {* I
else) L2 D. z9 l: }, K" X& h
{
4 G- F: s1 Q0 P p->next=ready; /*创建就绪队列的第一个PCB*/" ^$ G1 D/ k5 u0 B8 s
ready=p;
, ^8 c% U* T3 b9 F4 h0 q% r }
5 n" p( B5 _/ W3 N2 G }
3 x7 a, c, y; y clrscr();
1 d7 g5 G0 w8 L7 C printf(" output of priority:\n");
% [8 Q+ l5 W# n8 F6 ^; S$ i, s( V printf("************************************************\n");% r+ Q9 h9 z! L$ G6 I: s2 Q
prt(alg); /*输出进程PCB信息*/
8 V, `. | W/ U1 f, a/ A run=ready; /*将就绪队列的第一个进程投入运行*/ u5 Z; T/ O1 R& o% r/ y1 b" i
ready=ready->next;
% F3 T" Q0 P; I( f/ Y6 N run->state='R';
8 B9 J* T Q- @. M}
, F0 N: u& `9 C/*轮转法创建进程PCB*/
% k' u9 L8 b2 r! Y# h+ @void create2(char alg): G- k7 i$ `* V7 w+ q$ y5 C
{
8 k# ]* e5 N) v! p& L( t PCB *p;
6 ]4 w8 H) C% P5 p6 I int i,time;
# Q# N1 ?) c% B% L- z: G char na[10];
\" g5 q R" J0 ~8 @) w# e+ n9 \ ready=NULL;8 s, V7 q' O d; K
finish=NULL;
6 O+ m" P: i& A! i' z/ s run=NULL;
$ v8 ~/ j) ~: f$ {' N& O printf("Enter name and time of round process\n");# m4 V0 \$ P, B1 N( j+ u+ |
for(i=1;i<=N;i++)
?7 [1 F9 \) k; T0 w) a( V" O {
! A6 B1 P* y& o+ `& Z: T' f p=malloc(sizeof(PCB));" ]2 Y* j% d* c$ z
scanf("%s",na);6 F/ O+ n& ^9 y/ i# C
scanf("%d",&time);
, C5 h8 V4 X' K, p } strcpy(p->name,na);6 y$ Y# k/ d; \5 k; w7 R
p->cputime=0;3 u) g) k4 S9 B% a- [
p->needtime=time;
) u. i$ v" L6 n* I2 S p->count=0; /*计数器*/
, o* C5 x2 E0 ]" H' D6 G p->state='w';) P0 M, \$ V9 @* o8 K6 A4 U
p->round=2; /*时间片*/; G0 f+ ] H1 u9 L' {) d- A
if(ready!=NULL)
$ x1 K/ _% W7 R" Z insert2(p);/ b+ r, R& Y) y
else
. s ]. ^& M' _: M$ G* S {' L+ W4 X# @0 S) @' K
p->next=ready;
2 _& ~' \- J- x, l2 g! i: V* O& @ ready=p;' p% W( q& i$ p& G0 C
tail=p;( x/ v+ {5 Y0 W5 i5 V+ q
}' Q3 n2 B5 ], {
}3 U6 w+ l/ A- ]) u- \7 f. j, Z
clrscr();
, A( e7 U* n5 Z V, f) Z' W printf(" output of round\n");
& R; |4 G+ ^# X2 ^# B printf("************************************************\n");; ~+ A% ~4 |# z' a' X& B
prt(alg); /*输出进程PCB信息*/
3 Q$ w; D* |$ O" K- t run=ready; /*将就绪队列的第一个进程投入运行*/
% {# |0 G1 j/ A6 o/ L ready=ready->next;+ P7 y3 V8 a- Q
run->state='R';
# j1 M3 D+ ~3 m3 d1 p* e}
5 E; Q" Y/ t8 K1 k+ a; J! R/*优先数调度算法*/0 l8 I* \0 i- e, i- _! ~
priority(char alg)
0 [+ N* ~6 l" s3 y- J{" \+ Q! r* A$ c- R
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
- o" z$ v( B& \0 P. P9 ]+ i0 U {
) C0 }& F/ \3 t1 W) r: E run->cputime=run->cputime+1;
; v/ G! ^1 w$ @3 Z run->needtime=run->needtime-1; h2 c2 W6 @4 @$ v, N) T$ j y7 k. O
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
9 n, Y; ~$ u, e/ ~. M+ U0 C; r9 l if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
1 u7 P. A$ y% j2 L/ v3 G! L3 t {5 Y* n, `- X* Y- Z) r* u0 R
run->next=finish;( _( b2 G3 ?) B
finish=run;, o q/ B$ M# E9 _3 f& p
run->state='F'; /*置状态为完成态*/$ x6 Q6 h, h) L7 e7 B) T( z6 H2 [7 z% C
run=NULL; /*运行队列头指针为空*/0 L" e, {/ g& F0 D6 H! T
if(ready!=NULL) /*如就绪队列不空*/" k1 d, V5 h+ \
firstin(); /*将就绪对列的第一个进程投入运行*/0 B2 i5 B+ U- ]0 ^* A
}/ F) I2 d, k3 T. d
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
) [- F" y* h j0 G- `# Q; U! T if((ready!=NULL)&&(run->prio<ready->prio))- a& {3 Z* o+ G5 y: ]) E$ h* D
{1 X2 _( C, \. Z
run->state='W';
7 y. O& j; C8 w2 C insert1(run);
2 Y+ { G1 w9 ]; E+ Y9 \, x firstin(); /*将就绪队列的第一个进程投入运行*/
5 f- v: i' O" X" e4 q; j; ~3 } U* c }
/ F8 n. [, H) ^+ e/ ~ prt(alg); /*输出进程PCB信息*/
n5 _, [, ]0 f, j9 Y% K; A }. G4 v1 O1 q) q6 E- z2 m: l
}
5 s9 J. c# @5 _0 ]5 v a/*时间片轮转法*/
) U: ^* o3 j- u" f% T3 j; Croundrun(char alg)0 ~5 S: v# Q/ j. x# r. \5 P
{
9 s4 g+ s+ c' l& ]9 n% @/ L while(run!=NULL)+ D' ]6 F: I0 d
{
# H) W. _* \0 y! G T run->cputime=run->cputime+1;5 Z* c# \" s! L5 _% G
run->needtime=run->needtime-1;. u9 c4 j2 g5 m+ x6 `
run->count=run->count+1;, e: F. r1 n/ b# P; b0 g$ s
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
4 Z% l1 S' v$ H {
$ K/ c+ A& @6 n- ~0 i/ {; ? run->next=finish;
2 R9 ]# I9 N5 M3 I& z- R9 o finish=run;9 I" g w9 L# K- a' J& d
run->state='F';: U+ O1 N4 M8 w! _3 c- T
run=NULL;: e, s2 l: O @3 M6 Y) @8 E
if(ready!=NULL)! u2 K, F7 x& S* b
firstin(); /*就绪对列不空,将第一个进程投入运行*/! [- l3 U6 |0 [5 _
}
8 X( p. @6 T, l/ e else! y( a+ Y2 q9 i9 x
if(run->count==run->round) /*如果时间片到*/6 Z. [2 K2 y0 L+ K6 U. x
{
! r: U8 V* s6 t, }9 h run->count=0; /*计数器置0*/
; a. O0 [' Q; I2 s if(ready!=NULL) /*如就绪队列不空*/+ y" }5 `! d" Q0 I# F8 J
{
7 J! O7 F+ ?$ Q+ x' Q: [9 Q run->state='W'; /*将进程插入到就绪队列中等待轮转*/
9 w3 Z2 {2 |% Y. ?( ` I3 x5 c insert2(run);# m# x7 M0 i4 ^# b9 G d( @) d
firstin(); /*将就绪对列的第一个进程投入运行*/
1 W! m; W P" Y3 q* ? }: Y" R2 G% l0 c
}
( W1 n* Y0 ]3 `* G$ d$ m+ d" N$ G- G, I prt(alg); /*输出进程信息*/1 h" L: N! `1 P' P
}0 V1 P* ]5 ]# P
}/ [" L4 _& |6 ]/ L+ s1 M
/*主函数*/3 I2 L: Z$ T& r, A. E$ x- D
main()
1 x/ Z8 A5 f! [3 A) N( N1 m0 `{
+ p! r6 C4 u: y2 c5 r8 |/ |! Z char algo; /*算法标记*/
' `/ \- A# Y% ?; y- ~ clrscr();1 v3 x- N3 }* _! R/ j
printf("type the algorithm/R(priority/roundrobin)\n");7 Y' p, c/ |/ Z) O
scanf("%c",&algo); /*输入字符确定算法*/( i% t; i* a8 Z3 W8 j' E
printf("Enter process number\n");
Z0 F3 ~, `6 [/ x' i) i+ } scanf("%d",&N); /*输入进程数*/
7 U3 w8 N4 f2 v2 u% u- i) U' S if(algo=='P'||algo=='p')( d. Q, C* e8 z1 b
{ y$ y* _: |# D5 A
create1(algo); /*优先数法*/
, v+ d1 d4 S, j1 V$ I D1 P priority(algo);7 o- x+ z0 {3 m1 _% I1 e
}
6 N7 m" Q' {1 R" g else
, ^- ~+ R2 \0 B+ V: c t% V; g if(algo=='R'||algo=='r')
9 X. w" Z& w2 T: w) L( u {
: X0 R2 u7 |4 [ create2(algo); /*轮转法*/
. ]( a- V* B* y9 p5 J6 D7 G$ m( ]3 r# l6 P roundrun(algo);
; H5 l" A. g- m2 T7 g C. e2 e }
( m% ]6 D$ x& x" n}8 w) L% i# Z4 W. d; v
</pre> |
|