EDA365电子论坛网
标题:
C语言源程序代码-进程调度
[打印本页]
作者:
Titianyeer
时间:
2016-7-2 13:48
标题:
C语言源程序代码-进程调度
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/
+ b! o4 q; r [+ p% H7 Q4 p% |
#include "stdio.h"
' f! Z# }" g$ C; M& h" n
#include "stdlib.h"
5 v# Z% I/ l. f
#include "string.h"
4 `: r7 N( H6 A; j
typedef struct node
2 r/ F3 B3 q" Q$ z8 m; b; g
{
3 k4 s3 [9 b& u( w+ r' @# `, Z' a
char name[10]; /*进程标识符*/
! e- v9 h6 k/ |* J( V( ~. M
int prio; /*进程优先数*/
( p" Z1 H$ P. |0 @
int round; /*进程时间轮转时间片*/
! K- _3 V! s5 d. @
int cputime; /*进程占用CPU时间*/
/ i' }$ G' ]1 h
int needtime; /*进程到完成还要的时间*/
, V& U' O7 T* I0 q5 T* Z
int count; /*计数器*/
2 j# {2 {+ k' l# @ N/ S- t- |! ]
char state; /*进程的状态*/
$ e- h, ] d2 y) A4 D2 a! U
struct node *next; /*链指针*/
8 Q. E' Z4 F* ]
}PCB;
' Q! b7 r7 |0 h
PCB *finish,*ready,*tail,*run; /*队列指针*/
4 C% D' |4 E6 B3 O- S
int N; /*进程数*/
' ]# l" q4 \) h' Q# ^7 n9 t) d
/*将就绪队列中的第一个进程投入运行*/
8 \$ }. ?: w6 a& e' @
firstin()
+ c0 C* k; N" o3 R# h, q3 C
{
/ \8 Q5 S. N; M/ a' ]
run=ready; /*就绪队列头指针赋值给运行头指针*/
9 \8 ?% @: Z0 W1 g2 C
run->state='R'; /*进程状态变为运行态*/
5 X ] F! r0 ~# H( L7 N
ready=ready->next; /*就绪对列头指针后移到下一进程*/
7 S) x% t% ]4 ^* q9 ]3 Z
}
- \( P i# k1 K' p
/*标题输出函数*/
+ m4 b4 _# m% Z0 r8 N' g$ t
void prt1(char a)
! Y3 Q9 O9 I0 ?. @8 `9 b" t; G: E
{
7 ]; F$ \, r& n$ ~, J0 T7 n3 e/ y2 v
if(toupper(a)=='P') /*优先数法*/
/ K6 {- {/ O7 C
printf(" name cputime needtime priority state\n");
9 ]( ?4 @/ H' y, y9 w! a. W/ a g0 D
else
, V$ J2 @( s: E6 d
printf(" name cputime needtime count round state\n");
# P' Z0 U5 S' ?0 A2 c
}
2 m b. H8 U2 R6 U% j/ V
/*进程PCB输出*/
. r# k) A' U( {
void prt2(char a,PCB *q)
* h2 `. N3 U! T
{
( H% x% K" i' ?5 v% h. s8 x
if(toupper(a)=='P') /*优先数法的输出*/
$ E3 D3 h9 p& H0 q8 Y4 P! \+ M1 f
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
: o* O h- X+ y6 |. M, k* |! `
q->cputime,q->needtime,q->prio,q->state);
: B D/ l2 d3 ~& S4 {& x
else/*轮转法的输出*/
* Q, w* Z7 W: [5 [
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
6 `( a6 }& E3 ]2 S- d, ~
q->cputime,q->needtime,q->count,q->round,q->state);
7 B/ [7 }1 n, ~; h. \
}
; i0 S/ W+ K& X4 z1 s1 B6 g
/*输出函数*/
+ i' [7 u& x0 R1 H
void prt(char algo)
( z, m, ^9 w2 U I$ B
{
- o- B% p! B- X* I' e0 I# Q2 h
PCB *p;
, r; z! Z" c8 n; X2 M3 ]* f; o
prt1(algo); /*输出标题*/
4 g' H: y) X% ?2 x$ |3 u
if(run!=NULL) /*如果运行指针不空*/
8 E2 _' ?+ l$ t* T8 O
prt2(algo,run); /*输出当前正在运行的PCB*/
% n0 w; N1 G! X% @
p=ready; /*输出就绪队列PCB*/
9 Y3 k4 F% X1 g$ x4 y
while(p!=NULL)
1 J! N: b4 G* t+ \: m+ @
{
' O$ l5 w4 C" g, V5 j/ P) e8 l5 n
prt2(algo,p);
* n5 e9 b. R9 V' k9 S
p=p->next;
5 x. Q( i: N: |! _) ?: u
}
" d4 K5 E ]4 {8 G( Y% w) e
p=finish; /*输出完成队列的PCB*/
3 [0 o6 V% _+ ]+ ^: [- Z/ A7 a
while(p!=NULL)
% n! j) t9 y; R
{
( E! T G& G+ a: e) v
prt2(algo,p);
6 w ]2 r% W" h; q2 I+ O
p=p->next;
2 y' q- G+ a) T ~6 X* |
}
1 n/ J9 {. X( a$ H, c+ k3 b
getch(); /*压任意键继续*/
" o" y) x5 |+ L# j! v& i/ u: A
}
4 R: {! O" z4 R1 y
/*优先数的插入算法*/
; f6 v# }# n( b! E5 [
insert1(PCB *q)
$ s, U; g5 j% Y7 ]8 P
{
' i1 g+ V9 J6 S% f
PCB *p1,*s,*r;
! o0 T' U* W4 y; P
int b;
! G/ r% F& e! F# W- z
s=q; /*待插入的PCB指针*/
6 F: h) v5 s3 Z9 p' M5 B1 [4 {; y
p1=ready; /*就绪队列头指针*/
0 I( K/ f: C+ x# D7 J
r=p1; /*r做p1的前驱指针*/
2 ]- n, G9 B; b% V2 v- d/ }, z
b=1;
. A0 v! G9 h; O
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
2 M$ ^; v5 E7 L
if(p1->prio>=s->prio)
* i5 u/ V) e% c& }
{
- c, }/ N$ x" B9 q% Q
r=p1;
8 e9 U! G9 [# z, y* }( z. g
p1=p1->next;
1 `* ?9 r9 C7 d: u3 `: n
}
; N& Z2 g2 i6 N
else
4 O A4 T1 _+ `. F0 A5 B# ?% u. ^4 O3 a# x
b=0;
+ |& B" p4 W3 b% e9 y5 n
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
9 T% z2 R; ~/ H+ R: \
{
/ z3 G# G& `4 u P% ~, V( h, m) a
r->next=s;
/ w& m I5 C' ~6 X
s->next=p1;
7 P1 r- F' a& g# f
}
0 }& z8 s: w+ }( Y: g
else
5 v" |2 ~. x' l- L E" p1 \9 }2 v- ^
{
0 }3 C' Z! h# g* v2 o
s->next=p1; /*否则插入在就绪队列的头*/
1 O6 {$ l# {0 u5 d: q
ready=s;
2 T5 _- Q6 _$ ]$ x% W( f
}
" f$ t6 Z0 d( {, x* l |
}
# E$ g3 ~' y4 j
/*轮转法插入函数*/
8 B: w5 a% `0 y" c
insert2(PCB *p2)
B5 r4 `( K( D. J) {: C
{
$ L, x! p0 q" f
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
$ `9 p. M1 e5 Z* _) }( f+ l( |
tail=p2;
& b) B7 N0 w. A) ~2 p
p2->next=NULL;
0 K4 Y! s% ^+ d
}
$ x& z: [8 k' z
/*优先数创建初始PCB信息*/
( z7 `# `+ R- a, ?1 z
void create1(char alg)
# A* K* W" j, H6 F+ J+ {
{
' ?, }1 g& M9 O T9 f$ @
PCB *p;
7 t& r \1 |" I! @9 F& P5 d" i
int i,time;
2 u1 ?$ k' [: [- i: Y! o8 H
char na[10];
' {4 e* C" k! d* i2 A& R6 k
ready=NULL; /*就绪队列头指针*/
0 [: b) U" a9 O! L. Z, X" B
finish=NULL; /*完成队列头指针*/
8 o! J/ o( P( X! y, V
run=NULL; /*运行队列指针*/
0 w! v. ]1 H9 I7 x- @
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
7 I) h8 w7 }) n3 N# k
for(i=1;i<=N;i++)
' q1 t2 x- I$ E$ f
{
( j: ~! T& s: x7 ]1 o- R+ m
p=malloc(sizeof(PCB));
, M2 a. k% D7 V1 r
scanf("%s",na);
4 \% @; L& K- ^2 u8 N2 W: S
scanf("%d",&time);
6 S+ i% x2 T7 y( y+ g2 x
strcpy(p->name,na);
) y* o8 r' a! g9 m: p: e$ C
p->cputime=0;
& c7 d+ ^" `; f
p->needtime=time;
8 U; T6 m: n; Y `+ [
p->state='w';
' y5 R1 ~+ t5 o# C6 s' j1 J
p->prio=50-time;
) d2 T& d9 d, m1 `
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
. _" E8 P$ C# D( {9 B
insert1(p);
1 |$ ?; l( H: X# `4 u
else
3 K* B6 t7 U+ E/ d6 ~2 N0 g
{
* e# x3 _# Q) c- A" W* p* n! F
p->next=ready; /*创建就绪队列的第一个PCB*/
" K( D7 B D5 B8 ^* @/ V; x
ready=p;
3 b) ]( \5 J3 c* O9 J$ N
}
?0 ]; j' C. h) B9 ]( X7 k; [% w
}
) m- ^/ @8 ^/ U X1 ]$ P, S/ ~
clrscr();
D' A9 w3 _( A% s
printf(" output of priority:\n");
9 S) @* F4 j2 i# W
printf("************************************************\n");
9 d8 |$ X- l1 E1 A! B
prt(alg); /*输出进程PCB信息*/
8 N/ ?) B2 e. g# n
run=ready; /*将就绪队列的第一个进程投入运行*/
. |. p3 m) k& C
ready=ready->next;
# A9 E: d7 r; u) I$ ]6 J" V* b
run->state='R';
0 `0 l# b- ]/ `% U- V
}
5 g& O3 e5 r3 A7 k
/*轮转法创建进程PCB*/
+ @' q4 P; z; l8 C( _2 g' q
void create2(char alg)
; c4 n, \5 U0 w; ?
{
* P, x b3 b, S
PCB *p;
6 ?# i8 C# K* I5 W9 N; ]$ k2 f- d
int i,time;
4 x7 _. D. Y# U# ]* J2 q
char na[10];
$ [5 H# ^/ D# _) ?2 L/ T% {! b
ready=NULL;
# w, k* {+ Z+ S8 g- \# l9 z
finish=NULL;
% t# S2 V6 f. W! i( ]* e( o
run=NULL;
- x& W% e" N* ^% _
printf("Enter name and time of round process\n");
& n5 Y/ ]- ~ [6 z1 `
for(i=1;i<=N;i++)
4 J+ `0 N) N! j0 b
{
3 H: @ e- q9 n3 Z
p=malloc(sizeof(PCB));
9 X& `3 _% _- n* d0 _
scanf("%s",na);
* p8 w4 n" v2 j9 s
scanf("%d",&time);
. A+ e. q3 z4 k* N' M
strcpy(p->name,na);
0 f( ? l+ ~; `; F. O( k
p->cputime=0;
+ c$ l: A) O8 w' O% H, k! a
p->needtime=time;
* m J7 A7 k' g, n- H+ ]+ e3 `
p->count=0; /*计数器*/
2 [$ ?4 _- s+ @* Q1 b
p->state='w';
2 c5 |3 [3 u# [! P Y& R' k" @3 J
p->round=2; /*时间片*/
2 u8 S& i: w! k% g2 E( t/ R
if(ready!=NULL)
. j( W! b7 r% Z9 L% }; l
insert2(p);
, p+ A! @3 |4 W- l7 G6 `
else
+ u/ p0 o1 c" {3 l# d
{
8 z+ C1 B; J/ U
p->next=ready;
! k3 Q) i8 X# p8 s: R
ready=p;
, f. w7 ?. E$ G: H# ^) g5 [
tail=p;
8 \& d0 A) F& _, A
}
5 S. T3 f! Q0 J( j7 N+ K, ^& V
}
4 ?% M W; |0 O
clrscr();
% D+ e" k' v) y7 ~0 e+ L& N2 f @
printf(" output of round\n");
6 e- o8 V) U0 F; |
printf("************************************************\n");
D3 ?. g) H" j A4 @
prt(alg); /*输出进程PCB信息*/
0 r" D1 ~$ `& w) G1 @6 a" u$ W
run=ready; /*将就绪队列的第一个进程投入运行*/
! y: q; r* f2 E( z {- X
ready=ready->next;
( C0 H+ q' r1 e& k' U2 f
run->state='R';
0 h! A) W3 l& O( S9 F
}
+ H" s) W- m. g* f) M( }7 Z
/*优先数调度算法*/
( B, C* ^, }4 u# [" ^2 C) b
priority(char alg)
( ~7 s! I! m* ?6 A
{
: {5 ^4 M, F! c3 u) t4 ]
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
! y: Z6 ?9 ?" x# q; {2 M
{
3 X% h9 v7 e3 q
run->cputime=run->cputime+1;
% A5 f4 x0 T" q# M
run->needtime=run->needtime-1;
2 i3 z% n3 M& v& C3 s
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
3 ~4 o6 i. M$ p+ U3 Y
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
/ g; Y2 i% e; ~3 _ x0 Y i
{
; K; P! {/ e$ L# J0 A" s
run->next=finish;
3 j1 _6 k6 B& j: p# i$ m% v$ D
finish=run;
7 o2 }1 c+ C# W
run->state='F'; /*置状态为完成态*/
2 A7 H: k5 t* m1 I' C* x5 H
run=NULL; /*运行队列头指针为空*/
# j/ S" D" T. b, u- f$ M. n
if(ready!=NULL) /*如就绪队列不空*/
" P9 B/ R: [0 X
firstin(); /*将就绪对列的第一个进程投入运行*/
7 D' `3 `6 G9 D2 ~
}
8 P: v0 a- P2 [, `
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
( A1 S5 U+ W' [
if((ready!=NULL)&&(run->prio<ready->prio))
3 z9 H0 ?. ~0 z9 a
{
8 F, o5 {, `/ K e/ W) p1 D
run->state='W';
1 Z+ f) Z! e- P; W
insert1(run);
; a0 W, V0 Y; _1 W
firstin(); /*将就绪队列的第一个进程投入运行*/
" c# e2 i' H @6 n3 Z6 [
}
6 u& O0 |& M/ z# \' U/ p" F
prt(alg); /*输出进程PCB信息*/
3 Q8 B* S( a$ G6 G
}
5 u% E& @$ t ~
}
- D1 A1 V$ [. N5 `( J4 s( k/ t
/*时间片轮转法*/
/ U/ \( v6 a$ @# H3 O% F& _
roundrun(char alg)
4 S9 K1 l* M: u# v L8 H% K
{
( ~, ]" X; \$ e1 |2 y9 _
while(run!=NULL)
2 m! y/ `9 h0 o+ O; o# ~
{
# |8 M7 |" u# p2 t2 w. _
run->cputime=run->cputime+1;
; w0 v4 V# L# ^$ X2 F/ z8 |9 O
run->needtime=run->needtime-1;
0 s4 ]+ ~# J* o( x
run->count=run->count+1;
6 L! \5 b, H" Z" w6 ?
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
3 E9 |' R N! T# \% A' [
{
- W/ }* C4 @2 t5 M3 q7 ?! `
run->next=finish;
1 { F+ y* e& d$ ~. q+ r
finish=run;
) j4 E$ ?/ o* r4 r2 r: b# S
run->state='F';
& M& W( U$ }7 S
run=NULL;
7 E5 @/ {5 ?/ ]( M/ q3 o5 N" }
if(ready!=NULL)
8 ~$ w9 U& M9 k9 \) O3 q6 w
firstin(); /*就绪对列不空,将第一个进程投入运行*/
4 R9 ~* F7 ]; V; }; @& E3 e
}
- Y, i* C' J$ @% ?7 @& S* g7 h
else
) K/ ~; @! {- O7 E" B) E, R0 X4 ]2 |; o
if(run->count==run->round) /*如果时间片到*/
) a$ Z8 f( S b/ [. `1 i
{
# g- M0 e5 N {
run->count=0; /*计数器置0*/
6 v0 j8 e$ J! m2 ~; `: T
if(ready!=NULL) /*如就绪队列不空*/
1 n8 I* N6 t% j
{
3 A9 `; Q. x9 ` @
run->state='W'; /*将进程插入到就绪队列中等待轮转*/
6 v5 n E L6 L8 V5 L9 \. N
insert2(run);
! k4 S2 r( E& P2 V
firstin(); /*将就绪对列的第一个进程投入运行*/
# Z: V9 k3 Z- L, x
}
( S% L: Z7 K0 U7 i- `8 j( z' a8 o
}
8 ?% a! K n5 p
prt(alg); /*输出进程信息*/
1 N: ]1 f6 z: T2 d' C
}
, o& n& Q. w+ A
}
0 S( e2 r1 ^" S* u& \/ Y
/*主函数*/
7 T7 T- c. u. t f6 s1 \
main()
f; d5 v% k' A. Y- s7 _
{
; P+ e1 g+ ~; e2 W5 U o
char algo; /*算法标记*/
* f6 C/ n9 ?4 V, ?# v
clrscr();
# j. A# M/ c& y1 ]' ^
printf("type the algorithm
/R(priority/roundrobin)\n");
; D6 N/ L. w4 }7 k" _9 _: T% E" [% T
scanf("%c",&algo); /*输入字符确定算法*/
% K+ E) M4 I; S; {- h; e
printf("Enter process number\n");
/ d- H: P1 J# B" e+ X3 U# U0 C% \
scanf("%d",&N); /*输入进程数*/
/ A4 M7 O2 l' |2 r! H
if(algo=='P'||algo=='p')
! g) w) l$ f0 M( H6 M9 Z5 l
{
2 Y4 k/ z- Q c) e3 h/ X! ]
create1(algo); /*优先数法*/
) C9 d, ?1 ^2 u" E2 r+ }
priority(algo);
7 ~* ~6 j. X' w3 t! y# g9 N2 R
}
& `$ ~) t0 }+ G1 k
else
6 A0 E) v3 j# e0 E/ H8 N
if(algo=='R'||algo=='r')
* i: w* Z% `( v
{
4 M( }4 e/ S \6 i
create2(algo); /*轮转法*/
7 P E, G; p' S! r7 w; A; k; g& P
roundrun(algo);
. A$ c: f, c% H8 e3 j
}
" n) p1 p8 y* v. J0 a# s
}
0 }. y+ l6 l- Q- R) Y/ p
</pre>
gVBZFryb.rar
2016-7-2 13:48 上传
点击文件名下载附件
下载积分: 威望 -5
58.04 KB, 下载次数: 0, 下载积分: 威望 -5
作者:
Hh0203
时间:
2016-7-2 14:15
谢谢分享,必须赞一个~
1 S$ z( V, ~. K3 B4 C6 ]* r; E8 _, G
作者:
Wenghezhong
时间:
2016-7-4 14:27
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
8 T! K' L: M! j7 a' x
作者:
10929390
时间:
2016-7-4 15:12
支持一下,很不错哦!
, T/ u: O7 J" T2 M
作者:
Pang8343569
时间:
2016-7-4 15:17
支持一下,很不错哦!
作者:
Dedy01
时间:
2016-7-5 10:58
支持一下,很不错哦!
作者:
ygcgsa
时间:
2016-7-7 09:06
这资料确实不错……
4 x, n+ F; n' X4 u% R+ X6 Y0 t
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2