EDA365电子工程师网
标题:
C语言源程序代码-进程调度
[打印本页]
作者:
Titianyeer
时间:
2016-7-2 13:48
标题:
C语言源程序代码-进程调度
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
% }) t0 T8 M" k P1 {' F3 K
#include "stdio.h"
7 a$ C) \8 T- W/ l
#include "stdlib.h"
w! c, u7 z% j$ Z' ^3 p
#include "string.h"
5 G T5 |% i; F: e) p3 E6 ^( }2 @
typedef struct node
2 o1 R8 H2 O3 J3 f: Y- v$ Q
{
% \2 R1 Y& @7 o5 Z6 @7 a4 w
char name[10]; /*进程标识符*/
$ h4 X3 h9 D, A- n! q
int prio; /*进程优先数*/
& b ?7 H% s- Z
int round; /*进程时间轮转时间片*/
3 |4 y' |1 f7 P* Q! [
int cputime; /*进程占用CPU时间*/
; H' g% {, o& [/ W9 Z
int needtime; /*进程到完成还要的时间*/
`% r, | o+ M" x2 v4 A
int count; /*计数器*/
" P6 b. B7 `2 o# l7 O0 u8 S, f9 ?
char state; /*进程的状态*/
$ A. J v% X1 T, M
struct node *next; /*链指针*/
$ b% c6 L4 C g. m- f
}PCB;
: H+ C/ i1 T# H% }& Y8 }
PCB *finish,*ready,*tail,*run; /*队列指针*/
9 o) q, O" a$ F- K
int N; /*进程数*/
; X B! |9 R% h8 Y
/*将就绪队列中的第一个进程投入运行*/
% S. H7 i" i- P2 g# S
firstin()
5 @! I+ a8 t" \6 P
{
3 }: t6 p( m* T9 h2 }; Z5 C
run=ready; /*就绪队列头指针赋值给运行头指针*/
4 H9 I, e* C# q- G# g/ w
run->state='R'; /*进程状态变为运行态*/
4 _# f; o# d8 }( m& N9 j/ t. k
ready=ready->next; /*就绪对列头指针后移到下一进程*/
* ^7 P4 m' _" U6 L, J0 J. g6 v8 a
}
8 K) D. j1 ~) R
/*标题输出函数*/
7 s. X& G. M& \, h
void prt1(char a)
( v( \6 ~0 ]2 Z+ I8 G
{
U C j, q, J2 }. Q
if(toupper(a)=='P') /*优先数法*/
" |- J9 R+ ^& I0 o
printf(" name cputime needtime priority state\n");
' j. E H0 J" u* f5 Y6 x( D
else
- u, P7 V2 s3 n$ N- A. {
printf(" name cputime needtime count round state\n");
E9 R! l+ m- g, g. k, q
}
2 Y/ Y2 j6 b8 p2 g
/*进程PCB输出*/
; \% i0 d& {/ q# N
void prt2(char a,PCB *q)
; ] Q8 X: \6 U
{
( m# E! `5 j8 E% e2 O: c3 x, V
if(toupper(a)=='P') /*优先数法的输出*/
0 o- b& u9 D& ^ K% ~8 o1 V
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
2 i6 {/ l+ f9 _* F0 @% M
q->cputime,q->needtime,q->prio,q->state);
/ Z& m. q5 `) ]! a1 u: P
else/*轮转法的输出*/
5 t# a0 ?6 M9 @- d2 o( p
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
" d3 b1 ?. j" q4 d
q->cputime,q->needtime,q->count,q->round,q->state);
" s4 w* z5 {+ m* H' [! e6 E
}
* C, e5 p8 Q# r% O
/*输出函数*/
) }) r, X1 \$ ^. s" j( I7 ]
void prt(char algo)
/ d$ ?- F( e2 u
{
2 X, q9 b7 H+ s- I& L/ X, U7 u/ |+ c. x$ s
PCB *p;
3 ^) y% Z& F) F* H6 }/ ~4 a
prt1(algo); /*输出标题*/
' N6 G% t8 T5 `! j9 ^9 |
if(run!=NULL) /*如果运行指针不空*/
8 `0 w' C! f6 b: h
prt2(algo,run); /*输出当前正在运行的PCB*/
# n5 }) e0 y) D( \" S
p=ready; /*输出就绪队列PCB*/
9 d2 q* V$ @1 R) n3 P) ^
while(p!=NULL)
! E1 N; E6 j1 Y, v6 m4 X
{
: O; t2 \6 C5 c% X) _' [
prt2(algo,p);
+ S# E4 M7 I, A. ]
p=p->next;
9 w& n+ S7 h9 Q: b
}
+ {3 H, }) m: a l
p=finish; /*输出完成队列的PCB*/
6 \2 ~! G9 p4 P: \# V* w
while(p!=NULL)
0 c* B- l9 G! s$ P
{
6 S, r; Z' S) t
prt2(algo,p);
) S. u8 o/ q' j$ M' {% J- @
p=p->next;
2 h! _. v# o3 c! q- y0 C
}
2 x/ J# u' L9 r. n
getch(); /*压任意键继续*/
# z0 I6 g# u3 x$ c
}
- \3 n& q6 @2 V1 K, o
/*优先数的插入算法*/
4 B$ g+ x' A" h% q3 X0 k
insert1(PCB *q)
8 `& \ m3 ~' E# R/ q! x. J. Q/ i3 ?& K) H
{
" P, ^& C2 y; l0 ]% U& ]
PCB *p1,*s,*r;
" }( W8 r5 a# M3 a1 s) r/ s3 h0 F. v
int b;
, B2 x/ P- c, r, ~ N0 D) i+ ]
s=q; /*待插入的PCB指针*/
6 g6 n1 Z: J! U# s. l4 Z% z
p1=ready; /*就绪队列头指针*/
, A- n& f8 m/ ~7 ?5 E
r=p1; /*r做p1的前驱指针*/
# \* N, }! ?' i! S7 a% H
b=1;
* z* o* D7 Y9 m/ i" R! p) ?! T
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
7 T8 H# J+ d* v" Y
if(p1->prio>=s->prio)
7 j' f' d' g! I5 V
{
+ B+ `+ P& Z h2 I: @
r=p1;
% r( b4 r, V% k1 r
p1=p1->next;
8 y$ c8 k4 Z/ ^: W ]: |9 H/ b
}
/ |. P+ c7 _' Q
else
$ \2 y1 R) B6 e7 `) @+ z
b=0;
! ?. C0 t6 F& H7 C
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
4 x) I/ u, Y1 f+ A! v; ?
{
) m; u+ ^8 M2 _ i7 |
r->next=s;
- q; H; V. W e( H9 M3 f7 O$ L0 I% J
s->next=p1;
4 Y# w! _7 D+ M2 i/ x
}
& R, s, D/ S9 _# X' g
else
( h1 ^8 O `1 `/ r
{
* y% r5 u, I0 K8 y
s->next=p1; /*否则插入在就绪队列的头*/
$ O/ k, z& l" ~
ready=s;
& h+ d% _) L5 z) A: r5 s( y0 |
}
* ?0 {: b$ q5 c) H+ q6 e$ q0 t+ m
}
- ^( j' v6 B+ g. J$ J! x
/*轮转法插入函数*/
; q8 {/ N& j- J) i" A3 F
insert2(PCB *p2)
8 {! q, O" `5 B E# N7 [: x% |2 P
{
/ |- z- K! B+ \7 u9 V) o" s
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
) \2 @" R8 |! G J& g$ K \
tail=p2;
0 X- Z! L0 S7 b6 r
p2->next=NULL;
& d0 {9 g( z0 s3 v6 | w O
}
0 ?; w( I& ?6 t3 G% R1 C* L
/*优先数创建初始PCB信息*/
8 x, t) s3 N5 u0 A8 O3 L
void create1(char alg)
) {& c0 d% R1 D$ Q
{
* ]: i' V# V3 n/ @+ J6 u0 ^
PCB *p;
* z6 G) g" p4 O: k/ H- A S( `
int i,time;
# y& Q. G; h; k2 @ M# n0 x
char na[10];
$ B) U0 E; [: f
ready=NULL; /*就绪队列头指针*/
/ b8 G, g) i5 _4 x! l6 T
finish=NULL; /*完成队列头指针*/
6 Q- N, w5 ?1 S: S/ Z- ^% I. ?7 x
run=NULL; /*运行队列指针*/
: y$ J+ W5 {5 X$ J
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
6 [* Y: o+ L" z1 v) V1 O0 F6 y6 Q
for(i=1;i<=N;i++)
& Y& J, [0 P$ D4 D9 ]9 ~( y2 b3 P
{
& r" N9 E# [1 r, c( k( S4 w
p=malloc(sizeof(PCB));
, U7 F0 f& e" y
scanf("%s",na);
5 S3 ?- |* S! o
scanf("%d",&time);
; u5 `7 t- M5 S P8 O U
strcpy(p->name,na);
: N* C% H- I; ~# Q$ q1 u3 g
p->cputime=0;
k, h: o! S' H9 C; L4 b. p! r$ @1 S
p->needtime=time;
( y$ Z: s3 V. W8 ~9 c2 T- K1 k
p->state='w';
# p1 h; {! W: Y! Y0 |1 w
p->prio=50-time;
3 f7 B, ?( X; T. y5 s+ O
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
/ W3 q' b- ~2 B- ^, i2 g
insert1(p);
" J. w; T6 V9 O5 z6 `( ~! G r
else
. n, q0 {1 \! G/ r! Y
{
5 p9 g8 Q% X' i) Q! G6 y
p->next=ready; /*创建就绪队列的第一个PCB*/
- \' O$ v% R l K' D
ready=p;
# L' x+ w7 J3 A3 q4 T8 A0 z
}
$ r; w; C' U6 R# R7 G
}
9 p0 f5 r# V2 d- Y
clrscr();
3 S' R& Y- D* n6 N9 N- l* v
printf(" output of priority:\n");
/ H' J9 u6 i1 S# O
printf("************************************************\n");
# f/ F! [7 ~2 a' y* L6 m! j) ^. R
prt(alg); /*输出进程PCB信息*/
0 L* ~+ g% X% \9 g0 T
run=ready; /*将就绪队列的第一个进程投入运行*/
) _) ]) |: z, C
ready=ready->next;
( K b4 C" Y3 m7 _2 U- Z
run->state='R';
8 t/ j Z; d; A, V" N% X7 H' i# K
}
: K6 v' y+ x' F
/*轮转法创建进程PCB*/
4 u) Y1 `" q* X, e
void create2(char alg)
. y( Y- e! p( u9 \ l
{
$ W* z W9 }& J2 J
PCB *p;
* q- T0 q8 z- \ b( k f
int i,time;
' \# c% J& o* P2 r. H7 A7 H6 Q
char na[10];
5 a( Y: Z$ |/ B1 `
ready=NULL;
$ P8 q; x9 b* W, f; F/ x1 H
finish=NULL;
J2 l8 Q6 W+ A# P$ I. L8 m# H! l% n: L
run=NULL;
V( ~" Q% }8 D8 ~4 b7 a
printf("Enter name and time of round process\n");
6 e# ]5 \( V" \. b0 b
for(i=1;i<=N;i++)
; C: ^* R/ c2 i* p# c
{
8 j8 o) R3 |8 S: J: S
p=malloc(sizeof(PCB));
& h. F# ^3 l+ c4 d8 w$ l- u* g
scanf("%s",na);
5 f, c/ A' G. e" K9 W& I- I9 n
scanf("%d",&time);
3 y7 C$ f7 V7 m( } R! ?# ?. e, K2 F
strcpy(p->name,na);
2 c' c- u1 d( x1 D* P; s
p->cputime=0;
1 w) X$ o' q7 n# _3 R
p->needtime=time;
! K6 I. g G3 A; E# g. A
p->count=0; /*计数器*/
* h/ ?! o# L& H. U) R2 U! r
p->state='w';
; y( p2 [6 x* X
p->round=2; /*时间片*/
* v& ^. a3 ~) Z6 V4 M$ T4 n
if(ready!=NULL)
6 o5 i- X9 ?! @0 ?! U# j# k
insert2(p);
$ z5 l5 E; ]* t% a0 X
else
6 q, O# f5 `; w4 n/ o% I
{
" L# m0 U8 a/ G; F
p->next=ready;
# L: R/ Y! q) V, {
ready=p;
' i" Y2 k' Z1 {9 [2 w ~
tail=p;
3 c* m( J6 x$ X( F( B! j% M" V
}
- j6 n; v- e- ]4 f5 Y! k6 P
}
/ h v; q; g$ @/ R5 u
clrscr();
5 }$ c) J n3 X: X) _5 d
printf(" output of round\n");
, C& h5 V/ R0 Y8 ~) T5 Q
printf("************************************************\n");
; S$ s; O" {5 k% G4 u5 C
prt(alg); /*输出进程PCB信息*/
) C1 ?# ~" h. Z# v
run=ready; /*将就绪队列的第一个进程投入运行*/
* R- n- h% c: f
ready=ready->next;
% Q- X# K& M9 \' v6 i8 |1 K
run->state='R';
, w) p f( ]' ^
}
. F3 K1 m' E, Q* ~- M/ r
/*优先数调度算法*/
7 {: o: e' W. Q, G% b, H) q
priority(char alg)
! p) z" X! R% l2 O/ Y P2 m
{
+ ?+ U J# U5 \& i
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
* {- D$ `+ v. B/ L; c# q
{
0 ^1 I# c3 o8 H2 B
run->cputime=run->cputime+1;
7 g3 _4 @3 V' b5 z6 u
run->needtime=run->needtime-1;
7 t! l" `0 L1 G' ~
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
! R: L; A% c3 e1 w4 e, f1 Z
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
: f" d8 G& E$ k! n7 ]! q; ~5 ?7 u
{
# d" f& c: l2 I0 B4 M! J
run->next=finish;
5 S8 v9 I% j8 P) L& f
finish=run;
X+ r% @1 s+ \: p
run->state='F'; /*置状态为完成态*/
M* E/ N( c" T9 i! V; M
run=NULL; /*运行队列头指针为空*/
" C' m9 z3 v8 r9 y M$ w. ^
if(ready!=NULL) /*如就绪队列不空*/
, t9 ?9 _, o! q/ ^3 k. }
firstin(); /*将就绪对列的第一个进程投入运行*/
2 h6 G/ l2 v2 B
}
- v7 t8 k" u* L. A
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
- e4 o' L8 e8 c0 B& T4 l9 j) x
if((ready!=NULL)&&(run->prio<ready->prio))
% J& ]( l0 j. e4 _- f, R
{
9 d# B+ u3 g6 I" D
run->state='W';
4 p5 g% m9 h- O c' E% a
insert1(run);
( c6 F0 q) f& T
firstin(); /*将就绪队列的第一个进程投入运行*/
: T& f1 ?7 w8 n5 u/ q( r7 B/ a$ B
}
& `" g1 ^# R& t
prt(alg); /*输出进程PCB信息*/
; ^* ?# ^) O8 \- X
}
. \; e. V5 j* M {* N, k
}
% s) U9 R- h" W" m* w
/*时间片轮转法*/
- N; A) A( n1 E: B; E! I
roundrun(char alg)
8 ~' o& m% r* I4 t
{
: `6 h/ t3 K* N/ y* O' e, c1 t
while(run!=NULL)
/ E+ L% n& B' M( T
{
% b3 P! b1 H9 F- A2 b- ] @# n3 e
run->cputime=run->cputime+1;
: F# J9 I& T! e
run->needtime=run->needtime-1;
: d+ p9 J0 J: a) Y
run->count=run->count+1;
8 B/ [ _% ?& G# F5 q; A |: [
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
: F W X/ ~$ Q/ [+ N4 w
{
8 L* n* D+ [6 ]
run->next=finish;
1 @" z. I% S" K2 V% a( B6 w% A
finish=run;
# k t& |) h) @) G" t" T) ]
run->state='F';
( \6 ~5 G8 d3 J0 H, h$ `2 P
run=NULL;
; q% v- z' K' d# ^* ?6 J) A3 _
if(ready!=NULL)
: L& Z% D7 {# K3 \1 }, z. @
firstin(); /*就绪对列不空,将第一个进程投入运行*/
* @" D$ O: [: r3 D8 Z
}
* O- B- J$ y" u& j7 u
else
1 ]2 o. ~& E! Q! y& {
if(run->count==run->round) /*如果时间片到*/
* b5 v1 @6 W! b* p
{
9 T" [. N! r4 H9 c. t2 m
run->count=0; /*计数器置0*/
/ `. f- i9 h+ x+ E1 K# n
if(ready!=NULL) /*如就绪队列不空*/
2 u& `- e9 t4 s
{
" {0 F* S5 T5 F, l$ o
run->state='W'; /*将进程插入到就绪队列中等待轮转*/
) @- {4 X0 P6 u9 P+ m0 j( L
insert2(run);
# n$ L4 K3 T8 \# x
firstin(); /*将就绪对列的第一个进程投入运行*/
7 {, M. S% s) e! s6 J0 G9 f# [& G8 K
}
1 P% U+ i5 c7 ~+ a( a
}
: A8 a5 Z7 m* O% j& c
prt(alg); /*输出进程信息*/
N% _ f" S# q8 f/ k% m% J7 r* ?1 a* ^
}
8 P$ H) C& g( Y: g# m2 ?
}
" y/ o1 ^) j/ P
/*主函数*/
( s: b( ~! {7 h0 f, s- Y3 M5 V
main()
9 Z9 t1 Q9 t4 U% Y* o
{
9 Z& e% y& p: C) ]; c" p9 g/ v
char algo; /*算法标记*/
! H% V4 f% c1 u& O/ ~, E! `
clrscr();
1 W1 P3 }8 ^8 B
printf("type the algorithm
/R(priority/roundrobin)\n");
0 N A+ l4 y" X/ U
scanf("%c",&algo); /*输入字符确定算法*/
6 {! n9 E6 A: U/ L5 K
printf("Enter process number\n");
- j" s5 [" X) \1 i
scanf("%d",&N); /*输入进程数*/
9 F8 _: r1 L4 A( t# |; i
if(algo=='P'||algo=='p')
! o/ z$ s5 i$ k
{
" J4 q3 X5 q# s9 Z/ f7 `' [4 |6 e
create1(algo); /*优先数法*/
, a" L$ S4 [4 R3 R& M
priority(algo);
# q) K% n# d- ` u+ q
}
' t9 J# P. E" L% I
else
9 q" e" o- C/ f m& d
if(algo=='R'||algo=='r')
; m8 x) b1 d0 C6 I) s3 h9 r, P9 ]
{
& L) i9 d* z( }% s! ?2 f6 Z
create2(algo); /*轮转法*/
2 o2 S+ j% x v9 a
roundrun(algo);
. O& `8 A c7 n& D# d2 l
}
, t2 C+ u5 A$ y: y
}
% `5 Z: M1 i3 J0 U; @0 f
</pre>
gVBZFryb.rar
2016-7-2 13:48 上传
点击文件名下载附件
下载积分: 威望 -5
58.04 KB, 下载次数: 0, 下载积分: 威望 -5
作者:
Hh0203
时间:
2016-7-2 14:15
谢谢分享,必须赞一个~
) F3 _1 U" C6 K, Q- I, K
作者:
Wenghezhong
时间:
2016-7-4 14:27
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
& G3 R9 Q7 ]9 G( _* \+ `
作者:
10929390
时间:
2016-7-4 15:12
支持一下,很不错哦!
& @' ?; p# L7 V" c4 C. ^
作者:
Pang8343569
时间:
2016-7-4 15:17
支持一下,很不错哦!
作者:
Dedy01
时间:
2016-7-5 10:58
支持一下,很不错哦!
作者:
ygcgsa
时间:
2016-7-7 09:06
这资料确实不错……
& O y: B2 C$ p' h/ Y4 U6 l
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2