|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/6 g# }0 W4 @* h" e
#include "stdio.h"
7 W- h, G" |+ L' ~+ j# Q7 i#include "stdlib.h"
) N# ]* V% I2 k+ F# Q; J# n#include "string.h"# ~# K# C& v5 H* `6 _+ g
typedef struct node
4 U- x4 ]6 L0 s" f# D# I7 ^! z{; v/ w1 d+ r+ s& e4 v4 r! Z
char name[10]; /*进程标识符*/" G) V0 z' J: |1 l7 k+ [" Y
int prio; /*进程优先数*/. n- o1 W1 ^/ f7 } K
int round; /*进程时间轮转时间片*/
5 J* T4 E; J1 f$ f( m+ f/ W int cputime; /*进程占用CPU时间*/! A _! O! w* A/ @& s+ G
int needtime; /*进程到完成还要的时间*/
! j3 `% D6 w- }# a# H9 v2 S int count; /*计数器*/' t+ g3 M7 w+ Q. Y: D
char state; /*进程的状态*/
% q8 @: J) w ?, | struct node *next; /*链指针*/: c8 B5 h6 x& `$ ? z
}PCB;
$ ~% q9 u# |) q" L3 o/ {/ N$ @PCB *finish,*ready,*tail,*run; /*队列指针*/. Z( K# t4 f L
int N; /*进程数*/2 F8 m$ H3 S9 _, S/ `& h6 p1 ?
/*将就绪队列中的第一个进程投入运行*/
& n) h& M: c" ^' hfirstin()' Z$ G; ?* O1 q9 R( R5 O
{
# p- X+ j2 j: m5 E$ J$ f run=ready; /*就绪队列头指针赋值给运行头指针*/
; }5 K5 k; ^+ J o run->state='R'; /*进程状态变为运行态*/
# y; V/ F, _$ _: h ready=ready->next; /*就绪对列头指针后移到下一进程*/) D7 |. g# X. h, L3 g4 Z2 u5 ^
}$ W4 j5 D* Q9 a' O5 U- X3 L9 T
/*标题输出函数*/4 O+ w" w1 p8 H7 E* C# j; A# n
void prt1(char a)
% Y! ]8 O% S* l# M+ _8 F{
: S, g$ _) U2 [4 W* D' J" |7 z9 k, W8 k if(toupper(a)=='P') /*优先数法*/
7 N' r: p9 d7 ~2 X* E+ w9 t printf(" name cputime needtime priority state\n");
4 p( f; U7 f: O: v6 I else
8 R3 i% X' k6 F printf(" name cputime needtime count round state\n");0 A z" V3 r7 i6 `( M
}) |; ]$ o' m1 }
/*进程PCB输出*/% A1 C+ c7 R; D) _) [" E1 m
void prt2(char a,PCB *q)
# Z* v4 }, t* g [( Z0 Z{: a7 M7 ~6 c B! r9 h4 N
if(toupper(a)=='P') /*优先数法的输出*/
8 n* @) m1 |! Q printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
; a' V: V$ P+ _ {2 E- S) S q->cputime,q->needtime,q->prio,q->state);0 j+ a! L! u! B! O T
else/*轮转法的输出*/) ^ b) ~' A! B
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,3 g" b6 L8 B& `
q->cputime,q->needtime,q->count,q->round,q->state);9 G+ c: Q' ? w5 G& k; M; Z
}& ]- V5 ]% p8 m) n3 c
/*输出函数*/
2 Q$ k/ l" G& avoid prt(char algo)
7 s& E5 D* f/ a! o. @{
. {3 @6 S# t" x: s% Q) f PCB *p;
# ?) \) T; o0 g5 P ]8 K. C6 L" V prt1(algo); /*输出标题*/
" y! N L2 h' n4 C2 @7 H if(run!=NULL) /*如果运行指针不空*/
" T0 `; @- [- O ?. T1 S+ \+ g% {! } prt2(algo,run); /*输出当前正在运行的PCB*/" B$ C. V0 r* s" n$ S9 O+ `6 |8 O0 W
p=ready; /*输出就绪队列PCB*/
5 f3 d1 x5 S$ @9 D* _0 d2 a( H. \ while(p!=NULL)5 J0 M3 J) F6 \* B
{
, S1 z4 ~8 Q. }/ z" k$ ` g% S prt2(algo,p);
9 S b) L6 g8 k) l p=p->next;7 }, g* l) [/ L' J+ Q, N7 d! a) A
}
; t7 q. {( ^0 v/ {% l4 [# ]$ U g0 M p=finish; /*输出完成队列的PCB*/
. ]& t4 y( q5 I while(p!=NULL)' H0 i& r1 t5 X8 K
{4 Q z/ O) b) M* b% |1 Q7 ~$ s
prt2(algo,p);
& ?. S% w4 f9 S `$ e& L0 b& v p=p->next;
4 c# `) ~& Y# B- g }
. @+ `- w! T+ S. Z$ H* b W getch(); /*压任意键继续*/1 v& X, f" o$ J' E* h; W$ M
}) P) p" T) t. ^2 f
/*优先数的插入算法*/
/ _$ d; S+ I( T0 }2 M* h6 V' Ainsert1(PCB *q)
- V- U& z! |! X0 _{
- Z- q6 C {" C# ~5 E% M! `9 C PCB *p1,*s,*r;
5 L0 u6 Y9 B' j w8 c8 ~ int b;) L# j5 z$ M$ b, s4 r
s=q; /*待插入的PCB指针*/
( E! f' k5 ^8 {8 r# Z p1=ready; /*就绪队列头指针*/
( V( U& h4 `) D9 v6 b" l# g- e r=p1; /*r做p1的前驱指针*/
4 _5 n4 X8 J p b=1;: P i8 p# E( _: m1 w% j) W d
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/) X6 H. o& Z8 Q; N2 m# R
if(p1->prio>=s->prio)
4 t. F8 r, j, A& c. h, g* E {; u$ f. s. O" K5 Y; X3 j; f% {+ d
r=p1;
: ~& `1 \. q, i, z9 s* i p1=p1->next;
1 E, {% R3 y* P% I: [; K }
1 C; [/ X Z% x9 n else
. }" L* G4 _: {1 X H/ n- o b=0;, K; y( v1 v, c4 {
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/3 ^0 B# U0 @6 g3 R
{
% L* j* k: D( b4 F7 g r->next=s; t5 D& D0 F0 ~
s->next=p1;
n7 p; I6 b8 z3 ~8 W5 A. _ }7 y. H/ n4 P4 @2 [0 p5 S4 s
else
6 @8 p) A4 r% R8 F8 F8 y3 j2 N {
" H k0 g* Q$ E$ O s->next=p1; /*否则插入在就绪队列的头*/
; w* j- a3 r$ i f ready=s;( ]8 b9 n! }* E: D# Z o0 }" X2 a: Y
}* e+ n1 C) x9 B: |; `/ W- @: e
}
% M3 F) M/ k6 n/*轮转法插入函数*/
^5 o4 |; X6 c7 c3 m$ ?$ Ainsert2(PCB *p2)
! k3 g8 ^; Q0 G# Y7 B3 @3 C0 E{0 J4 F! D4 Q0 a! Z1 P
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/- m& x) w; K8 _, }+ F
tail=p2; d- O$ L4 J& D* P
p2->next=NULL;
% Z+ i9 a6 ^) {1 @, B}7 Y0 Q& q) N3 n; P' Z
/*优先数创建初始PCB信息*/% S' Q4 }! Q+ `% Z3 G4 {
void create1(char alg)
1 D4 O) _7 l9 V{
7 D" f* M3 p# |' W+ K' x) K @ PCB *p;$ f! u$ Y* D* ]
int i,time;
' g3 K# ^) ^' U; h char na[10];
( c( D7 ~9 k6 F+ p ready=NULL; /*就绪队列头指针*/
6 L( U. A2 V7 | finish=NULL; /*完成队列头指针*/
- y8 @9 j) O4 ? run=NULL; /*运行队列指针*/
$ T5 W* V7 `) L" \" x; l/ J printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/! _ u& p2 U& J+ Z0 w7 C1 W
for(i=1;i<=N;i++)
* Z9 N6 X6 o3 _' Y5 ^* G' l {
& t+ P, n4 T2 W4 Y p=malloc(sizeof(PCB));; o# H7 Q) {. K, t) N8 I% J
scanf("%s",na);: ]' [. B. Z+ P
scanf("%d",&time);4 B [( F' h& g$ j- K
strcpy(p->name,na);
4 k1 C$ L- c; H4 h7 y$ s p->cputime=0;
9 m+ }6 k6 J0 L" i p->needtime=time;$ n K2 o1 p9 Q1 d
p->state='w';9 k. r7 C+ Y# u" |; C1 }; p
p->prio=50-time;+ P% o; \* l% r6 n8 C4 v5 i+ P1 f
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
+ d6 P% } K" p7 G! \ o insert1(p);3 @' I) K5 h G0 ^% m: \
else0 A* @) v' \; L+ S
{
" H' B, j2 I8 U2 t/ f p->next=ready; /*创建就绪队列的第一个PCB*/6 w! q4 \. C6 S4 e, K% ?7 J3 I1 r
ready=p;
3 J4 R" \! z/ W |. b }
8 c8 G& V. U, F0 f( O k, \* }4 e }
- V: j5 X( I! }/ c clrscr();) n1 B" x- J2 H, x# @
printf(" output of priority:\n");. e1 T+ ^8 d9 v$ V
printf("************************************************\n");5 h4 w% f& t* L; T+ e
prt(alg); /*输出进程PCB信息*/2 O) x; ~7 s" o% e
run=ready; /*将就绪队列的第一个进程投入运行*/$ Q$ R) K2 T. P! a7 g) N2 j
ready=ready->next;) R( p: ]- q) T
run->state='R';0 W* b! O, `7 O2 Z2 x" J j; t
}
. `6 C% y0 I$ M% B/ e% Z/*轮转法创建进程PCB*/; g! _" @# \ |" ^, O1 @
void create2(char alg)
+ ?$ X4 p. O% J: `$ [/ y{% p- Q, @9 i' Z4 E( b
PCB *p;( c5 j) P3 i" l% Q' `& ~ x) A
int i,time;
. i. N% m' J1 i9 w! r( i3 t char na[10];
6 R! G4 ~3 w, [' h: i8 w, \ ready=NULL;4 O _& t! s$ \9 O5 m( t
finish=NULL;2 a ]: e- v4 W5 ]6 S1 L5 \7 J$ F, X
run=NULL;
6 F. \$ z/ p/ u3 W6 ^ printf("Enter name and time of round process\n");
! Y/ v/ {1 E" m for(i=1;i<=N;i++)
1 T; {! V' L! \' `2 W8 W {( m! w6 j% W2 M, q1 U2 T/ _: _
p=malloc(sizeof(PCB));
2 E0 t3 |* }+ o$ M$ `$ `7 G scanf("%s",na);7 E8 Q4 H! G# ]9 N7 S i" C F9 Y
scanf("%d",&time);
8 r: @) }3 x; n2 ^ strcpy(p->name,na);" { p' u6 L1 s" _$ F1 k
p->cputime=0;
4 [! O7 d# s' @% v$ h p->needtime=time;
0 `$ W# }% I5 m1 S$ Q- t6 B p->count=0; /*计数器*/: s x, ~" T" W' g" E2 h
p->state='w';
1 J# U4 z1 B2 p m) X, _ p->round=2; /*时间片*/4 K) v+ b+ P$ d! C# P# `7 I
if(ready!=NULL)
: I9 S4 V5 g; U. ]) V insert2(p);- y% V3 {" o, C/ C
else
: S- ?9 N' \ J+ M1 c; K' m, Q {) E0 L$ @4 V% H$ b# _$ Z8 Q" f' t8 E
p->next=ready;! C: V& R, r- e/ i
ready=p;
2 A6 A! |3 e4 j# s& g/ @: Y% r) g tail=p;
7 G" K$ O+ `: ?9 Q1 T' F( Z }$ F- u" U& j g- \. A' i) u9 E
}
* z. Q9 L2 d7 V! j5 T clrscr();
a" g. d6 [) n/ Q printf(" output of round\n");: U# u; |' g7 @% M: Q( G- v: E
printf("************************************************\n");
; Y6 ^5 _$ m) @, m" ]% v prt(alg); /*输出进程PCB信息*/+ u* x8 [1 v3 G. l9 @# \/ p' n
run=ready; /*将就绪队列的第一个进程投入运行*/8 E; o/ @9 ], I) H* q5 P
ready=ready->next;$ L5 |; {/ c/ v/ F
run->state='R'; ^" k+ @' _) I
}
" F8 s, ^, B5 u/*优先数调度算法*/
' x1 ?6 Z3 b% [1 O% u+ V4 Vpriority(char alg)
4 Q' ?' t& a* p5 ^{3 R* a& z& O& x3 v) |
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
0 d, c! T! E- `9 M( E+ r {
/ _0 [5 C6 n3 z* g( S8 _ run->cputime=run->cputime+1;
% | Z2 L7 {2 E0 s- ?9 ?' f, _ run->needtime=run->needtime-1;& ~8 f4 P, `7 b2 g N- O
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
5 t; I, }6 X( Z2 F2 o7 r if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
0 F) @4 w3 ~; J. c+ v {* y3 ^- h5 K* c$ m& `! l
run->next=finish;
. t3 ?. w' W) W7 B, T finish=run;
+ p& u) @7 D4 A$ _* A# v$ s6 @ run->state='F'; /*置状态为完成态*/
0 h" t3 W. y% x _% g6 w run=NULL; /*运行队列头指针为空*/& l( I3 \4 X A
if(ready!=NULL) /*如就绪队列不空*/4 x) N' ]8 ^+ F* X9 U
firstin(); /*将就绪对列的第一个进程投入运行*/, V6 C$ i! n) n' e+ p% D8 v
}2 Z" ]: _9 X4 B9 o0 \: n
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
: [% ~- x) Z2 t$ V8 @2 d if((ready!=NULL)&&(run->prio<ready->prio))
' L, Q7 U" n/ s$ |' ^, T {# K4 {: q4 k0 j0 D
run->state='W';- A: v* x$ N0 n0 Y
insert1(run);9 @5 d3 L. V8 r# n* x9 p2 [
firstin(); /*将就绪队列的第一个进程投入运行*/
" A; Q% y: s% n! E7 ^ }: H0 }4 |9 j- s0 b5 Z: m" E1 t
prt(alg); /*输出进程PCB信息*/
7 X9 C9 F, C- M3 {- ?7 ~3 B2 y }' B2 P5 n8 r0 H+ |, n+ o5 ~
}) M, D) ~" t3 R I' b
/*时间片轮转法*/
* V! P9 F' ~ L h$ N& n. _roundrun(char alg)
5 K7 J' w9 A( d5 n1 j$ R/ |{) W6 t3 ^0 E: f2 ^3 D3 g' H
while(run!=NULL)
+ {' q( |5 J+ O: D {
C1 E# f/ u& |- L% d' G( U, j run->cputime=run->cputime+1;
4 c; ?- h/ Q9 P- Y run->needtime=run->needtime-1;7 l3 c! _4 P. L0 g2 Y# V
run->count=run->count+1;
' Z s# O C) b$ R- p$ { if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
0 D3 Q- Q& ^' j, S4 g {
4 d# {0 l. n! K3 @ run->next=finish;
- R, Y) _7 ~' I8 D0 {1 ` finish=run;
( E% _2 l3 _/ Q; @8 B& ? run->state='F';8 @+ e8 M/ ]8 V' a, l
run=NULL;
$ t) U3 H& }7 d9 [, e/ u if(ready!=NULL)" K; d5 ~. U5 k" v b. V
firstin(); /*就绪对列不空,将第一个进程投入运行*/
3 {$ T; c/ Z( z4 R }- T" |7 x( M: S
else) u' C) y& b2 t5 s
if(run->count==run->round) /*如果时间片到*/* ~$ G2 Q4 w3 C7 a
{0 ~4 D5 Q$ }/ A: l. f: t
run->count=0; /*计数器置0*/
8 J y/ F J5 o. l; B& P. G if(ready!=NULL) /*如就绪队列不空*// H4 c6 k5 @+ z m7 h* I! I
{
3 p% ?# I* r9 V3 d' o run->state='W'; /*将进程插入到就绪队列中等待轮转*/: l/ P7 d7 V4 W7 V: O$ Z: L
insert2(run);+ S2 j6 [$ U& Q8 M; W) D: ]2 i% b6 S
firstin(); /*将就绪对列的第一个进程投入运行*/4 r3 T* t2 H! X4 L4 Z
}3 _& a$ i4 M) @8 X- S: C
}
& K6 |; Y3 K& ?3 ] prt(alg); /*输出进程信息*/! c7 o5 @& f4 e) Z5 f
}
9 g, Z: j# Q. o8 l( g}+ ^% u0 r* x& q6 z7 f1 d3 a, S+ s
/*主函数*/2 [0 z$ d( G7 O, Z) s) \9 x! y
main()& h7 z6 @% a) \- G9 u% B
{: Q2 H& u+ E5 A
char algo; /*算法标记*/* I! N# c9 D% P( n
clrscr();" ~( _' D) K3 k( j
printf("type the algorithm /R(priority/roundrobin)\n");
( V- x5 N: {0 a7 p5 [ scanf("%c",&algo); /*输入字符确定算法*/1 j7 S5 O: \7 |$ ]
printf("Enter process number\n");
- G( }+ {3 |2 W# E6 X; \$ q scanf("%d",&N); /*输入进程数*/
/ `! P3 v8 |4 O a8 ~ }% f if(algo=='P'||algo=='p'); P) @+ @3 G6 Z0 u7 `, @3 h) ^
{+ E: ^5 G0 t0 w
create1(algo); /*优先数法*/
+ ^% i/ X6 ]4 |; s7 } priority(algo);; X i1 P/ [. p
}0 b O% x* |' p' }$ h7 l+ E
else6 h. P9 i7 e5 z7 ]( }* c# @
if(algo=='R'||algo=='r')
: f. j* u" d$ a2 w {
( e1 v5 W( M% [* D e; D create2(algo); /*轮转法*/, c( N% J- j- L7 t: t
roundrun(algo);& r$ m# b$ s6 m- i0 }( ^
}1 s+ B A3 @8 w8 {) c
}
) b# ~ \) r# K. W" J</pre> |
|