|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
<p><font face="Verdana">C语言源程序代码-进程调度</font><br/></p><pre>/*8.3.2 源程序*/7 ? z7 M" [) C% o. n. x( y
#include "stdio.h" [' ]6 }# Y. L: Q2 Z* S
#include "stdlib.h"
) N v% a( n7 C3 `4 q( k) X3 r* b#include "string.h"
; W6 v3 F9 E/ v5 N$ ]& _typedef struct node* H$ n' W6 g w
{
9 _8 [4 x& s: D @ char name[10]; /*进程标识符*/. c: L. a- T0 v; [& g7 T
int prio; /*进程优先数*/
& H2 }, |1 ]2 T; I \& `1 H int round; /*进程时间轮转时间片*/
! N$ G6 r' `! J3 ] f' M. H+ f! L* K5 S int cputime; /*进程占用CPU时间*/
$ m. v8 o( m$ F. i int needtime; /*进程到完成还要的时间*/
+ a% P! w; p! X# s) n& K/ E int count; /*计数器*/1 l1 L" p4 G( `2 ?/ b" z5 `
char state; /*进程的状态*/) F3 ?% D% S Y! O7 B, U" k3 x
struct node *next; /*链指针*/
! t% Q3 Z' Y8 ]* \; o* ?. k}PCB;& @ {; y9 I* o9 I) Q
PCB *finish,*ready,*tail,*run; /*队列指针*/
! l% {7 h& u" o# yint N; /*进程数*/
+ c- ]6 C8 ?; N! C: F/*将就绪队列中的第一个进程投入运行*/9 F* z- K4 q; r( y( ~4 Z
firstin()2 M! ^& @* B: b6 v5 U
{. \1 j# b, X, E f) }3 L6 z
run=ready; /*就绪队列头指针赋值给运行头指针*/
: m5 q5 L% H0 C& _# N* A8 w run->state='R'; /*进程状态变为运行态*/' K' c& a! ]2 Q$ Q
ready=ready->next; /*就绪对列头指针后移到下一进程*/
& T8 p. k2 ~0 n3 L3 e5 I/ ?7 ]/ O}
! A( Q# u# u D/*标题输出函数*/
% m }" @! x1 V( ]8 n2 Pvoid prt1(char a)) ^; S# W' k# l2 ?, x
{; w$ K+ ` [, C8 @
if(toupper(a)=='P') /*优先数法*/5 h1 _: `/ x; L
printf(" name cputime needtime priority state\n");
1 e0 R- v9 ?0 G3 z/ _- E else8 k. ^; b7 q7 x3 T& v
printf(" name cputime needtime count round state\n");! U% h, m9 o8 H z0 ^
}3 R! n: A5 R0 W
/*进程PCB输出*/( C: c3 q4 q/ N; k7 R
void prt2(char a,PCB *q) j E4 \% @9 j5 z
{
6 A2 X5 q% \1 e, f if(toupper(a)=='P') /*优先数法的输出*/, M, w0 z1 R5 F' `5 z
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
$ P$ h1 z6 O, s* H q->cputime,q->needtime,q->prio,q->state);) S3 V" T& d7 Z& y$ j$ d8 W
else/*轮转法的输出*/3 H; V% J8 i( H* B9 }
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
: V, R/ N! S3 k' F, x, Y! \ q->cputime,q->needtime,q->count,q->round,q->state);, r0 d' N; [& H/ s8 t" K
}
8 ]5 d: X; c( R5 L" x! a4 N/*输出函数*/* g3 P3 }+ s( W5 Q0 I8 |* z
void prt(char algo)8 r5 |' ^! b U' L' |0 B
{
! A- m j" C) g& r, `3 G, C PCB *p;, w4 N( r+ h$ @ L: ~; H" `5 a5 a; [
prt1(algo); /*输出标题*/# j; X$ P$ d" z
if(run!=NULL) /*如果运行指针不空*/& T- r, d$ S( w$ m! J% h
prt2(algo,run); /*输出当前正在运行的PCB*/, m. Q! H5 K# T+ k5 m: c
p=ready; /*输出就绪队列PCB*/
! R+ V0 @/ z, ], ~! G3 M, z while(p!=NULL)2 A3 r; W! ]. W% {
{ \) {+ o- K1 s) m9 b# q4 d
prt2(algo,p);7 y! R- |- d5 ]" g, \1 O) P2 Z
p=p->next;/ e3 p0 v3 M7 `4 A+ y& H
}
" Q8 K) j* W+ Z7 j% b# s. \ p=finish; /*输出完成队列的PCB*/
& t# D1 U, _! t/ i0 T while(p!=NULL)* N8 @& f# r! k8 r) D1 h
{& j% A( i8 B% U- E
prt2(algo,p);
6 ]1 s/ F, O/ P* A& e p=p->next;
" }) B9 h8 Q! j/ S+ w! p7 Z: l# [ }8 l3 W7 j' N: a$ }# w" {
getch(); /*压任意键继续*/4 U8 E, x2 c2 y% [- C9 @/ w: I
}; ^3 t7 w5 `( b8 D F& y$ D
/*优先数的插入算法*/6 b' F- v9 M n; V7 [; u
insert1(PCB *q)4 C$ ? X3 q( x3 g
{( `! Y! g4 v+ n1 n0 ?3 o6 {
PCB *p1,*s,*r;% N' a! b2 X+ A7 k2 t* A
int b;1 ~6 a( h. ]4 J2 Q
s=q; /*待插入的PCB指针*/7 s/ D4 E- G: _2 E, H2 ?
p1=ready; /*就绪队列头指针*/
% i! ^( G; [8 n( y+ k r=p1; /*r做p1的前驱指针*/- \0 X# e; E7 w/ G( c) j* K( m
b=1;( {6 F% G# z$ e( d) H, f7 `! A$ s, s
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
( U) j j, ^/ S% c4 m if(p1->prio>=s->prio)
" q4 @& H* @" T4 @, X {2 O) H+ z& F! z6 _
r=p1;0 x; m3 K' Y( e. a- x1 O, I+ J& [
p1=p1->next;% ]) V9 a) S: p4 q6 Z3 x" e' z
}
! s5 |' ?8 Z6 W1 c! V* q( Z/ H4 y else
# @! Q8 @4 d% p% H# ?! \4 ? b=0;( `7 [1 J D% `5 d+ k: x( O, R
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/* J' R: z! B/ B9 i
{; w9 w8 B& R% d# F X" Y2 X
r->next=s;; M& e; k8 x) x1 f# b/ B% t e
s->next=p1;% c6 ~5 K p! W% x
}
7 q: W8 B$ J5 p) m. ~3 Z9 i else
: r X8 p' [2 n9 W. R, J {
S7 y4 w' T1 Q! f s->next=p1; /*否则插入在就绪队列的头*/+ d& P; ~( a- L2 m0 I2 ?
ready=s;& W: V* [3 n/ H1 V
}
& B- d% e- L$ F' f$ I}
) D; p; C1 C6 K4 W- x- n# H/ g/*轮转法插入函数*/2 H: V6 v* b C; n, T+ t) s) y6 {
insert2(PCB *p2)
" k7 s- ~# N& M, I{
1 X4 { k* Z% o. Y9 R tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/' u( K0 S, w! Z! p2 ]
tail=p2;
! K# E# \. K& ^# h. e' J p2->next=NULL;$ N# e& b! h3 D4 e! n; Z& n9 g9 ]
}) t& @& p! x0 R v( k5 p
/*优先数创建初始PCB信息*/
: C& y8 S, R+ a% Jvoid create1(char alg)- B2 l" a) V4 v7 Q. |; i/ \/ X
{1 l+ w: B! l, A" r# T/ j# Z
PCB *p;
6 B" ^0 x8 J7 { int i,time;
9 }4 E6 P( ~: |" A char na[10];
/ F% c* k6 f& s5 g8 a9 p ready=NULL; /*就绪队列头指针*// s' z. _+ r; i/ l. F6 Z1 t4 i$ A
finish=NULL; /*完成队列头指针*/
( F& W2 ]5 Y, [3 D3 `3 T# u run=NULL; /*运行队列指针*/
' O+ ]' a7 }1 p5 A0 F1 k( a printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/1 b; m9 a9 C) {( E- V- L0 K& E p+ ?
for(i=1;i<=N;i++)
$ P% r4 _( F) Y% n, X" h {
+ m/ d a' a0 ^* T p=malloc(sizeof(PCB));
! U1 \9 A( N1 w, X scanf("%s",na);
: k! D8 h4 i; K: n: Y3 ~! y scanf("%d",&time);4 J1 Z: M+ U# I0 ?$ _3 O0 _
strcpy(p->name,na);8 x: d7 A; W. N- O4 |2 |7 T+ y" b
p->cputime=0; _. u$ _$ m0 a5 T$ H L
p->needtime=time;
/ W L% z% j5 Y' t7 X1 m( @ p->state='w';9 V' m, N3 H! f4 H- ?+ s# K( i3 G
p->prio=50-time;
8 w. e+ U* A0 q" p+ g$ [ if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
2 k& t) r" h; H( o% S; r insert1(p);3 g6 O7 A* G, I8 K7 u
else
/ x" s$ ~/ \8 j' I {
, C# M* K ? [3 x p->next=ready; /*创建就绪队列的第一个PCB*/
6 X7 E4 M, Y3 d$ C4 d$ K ready=p;9 O. d- }3 @$ ^* B/ o
}' {% j: W" e* i- d: U
}. U( O2 O1 {. r8 V
clrscr();
; w4 X6 @ z E printf(" output of priority:\n");
4 N1 x" C0 @ n4 [2 t; T# W printf("************************************************\n");3 |3 t8 ` Q2 }$ s
prt(alg); /*输出进程PCB信息*/
y- y7 q* q1 R) e4 c4 ] C4 V2 V/ I) y! } run=ready; /*将就绪队列的第一个进程投入运行*/! a& T* J. \2 N# }% _3 v7 M
ready=ready->next;, A \1 O* l. Z T# c, E
run->state='R';
) a1 e# k% T: X}5 h9 t1 m5 i* w# e( B- g: `5 @- U
/*轮转法创建进程PCB*/0 v0 C9 `! Z4 p7 F1 I( i& h% k
void create2(char alg)8 _# e$ q8 m8 F- K. ?; c) \
{
9 W/ v# S9 o m ~8 v" {! W% ` PCB *p;* [, X0 Q0 d8 m; \5 e
int i,time;) D9 N7 q4 M, y
char na[10];4 S% D) Y4 P1 G G' |1 [
ready=NULL;2 w3 Q( O* K+ b# |
finish=NULL;" n" E# i) e# `! d) d
run=NULL;2 n' P1 ]/ N6 g+ b& E
printf("Enter name and time of round process\n");/ ~% J0 D n4 I6 l% H# a7 g
for(i=1;i<=N;i++)
: p, F4 U/ n/ f2 Q% m- c9 P {4 x3 R* D) y! _
p=malloc(sizeof(PCB));; A7 s4 [: c% J
scanf("%s",na);
6 D* X9 J7 l: R: L/ `$ ~' ^3 E scanf("%d",&time);" ^+ Z, B/ Q* a: M# Z
strcpy(p->name,na);
% i! ~4 x. f) k p->cputime=0;
! C' ]/ W j c" ^# ^9 Y: N p->needtime=time;
9 y# P) t1 V: g; t p->count=0; /*计数器*// o. h* D. Z" ` I0 s' B
p->state='w';( \6 R$ r( V' m) k$ Q2 T7 E
p->round=2; /*时间片*/
5 ?/ i; q N7 a; F7 O if(ready!=NULL)
$ n; j$ {' @. C. i- c0 |; I) I insert2(p);
& ~3 \+ [5 X0 J- a, s% [3 w1 r% D else
& f/ O" Q8 R/ F$ \% ^' c4 b8 { {
8 h& E2 ^" n7 F p->next=ready;
% S' D: q# H1 I3 a' e& S ready=p;
- V, E8 E- s0 k' f' @# h# _# y* y tail=p;
4 C9 i1 T1 ~( z }
7 T2 ?! e1 o. T: \ }
9 g6 U0 i1 c0 ^3 z clrscr();
( Q, B' S; Y+ T% Q2 r printf(" output of round\n");+ a4 N# \5 G/ q$ P
printf("************************************************\n");
T$ e& e- E" S: W x4 K- z prt(alg); /*输出进程PCB信息*/
3 T7 Y) Y$ K9 i+ ~& O) e run=ready; /*将就绪队列的第一个进程投入运行*/
4 h7 }1 V9 X$ ~, e ready=ready->next;
2 R' \% O! q' S) D4 Z( ?) [: t run->state='R';: F1 D% V2 T P/ M1 m5 A" {
}9 D5 N% E% G2 ~: e
/*优先数调度算法*/
/ {! I" i9 {4 G |. z: Xpriority(char alg)
# {% Q* a& p* ~+ X" |0 m{+ b# ?7 y( ~" a3 r% n/ }
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
. C- Q0 j. z7 r; g$ C) s {5 r. k4 R; _3 E- Z
run->cputime=run->cputime+1;
4 b: C7 V2 q9 h% v; `& i+ c run->needtime=run->needtime-1;
! b( j2 v, {9 X" y run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
( b/ y( i! A8 [% k0 w. ^* k: x if(run->needtime==0) /*如所需时间为0将其插入完成队列*/" C" E2 `+ F) h
{
8 M: {8 C4 Q3 }& T# _ run->next=finish;
6 u2 T b Y4 L: f/ v finish=run;
( K9 u% W0 H$ u4 n2 S run->state='F'; /*置状态为完成态*/
1 A5 \5 |4 @9 A4 ` run=NULL; /*运行队列头指针为空*/ p6 Q8 S/ Z' _1 `: Q# k" `
if(ready!=NULL) /*如就绪队列不空*/
, C! h8 [$ m) ~& r/ e firstin(); /*将就绪对列的第一个进程投入运行*/5 s# n# i3 Q2 H1 i
}
$ ] o& o3 O/ _, A else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/- n6 n5 m. R) F5 \. |3 W
if((ready!=NULL)&&(run->prio<ready->prio))/ ?) o9 V3 \/ n9 t/ Q$ c# z* u
{7 z9 g$ P$ o0 j6 c, T* O& `
run->state='W';
- X9 N. N2 v' x+ Q1 m; t0 \ insert1(run);
; V& m5 d) R+ c- p! Z& `/ P! [ firstin(); /*将就绪队列的第一个进程投入运行*/. h. `! Z% J: b" i/ V( O" ]
}
2 c1 A9 ~1 E/ I( f0 t( p" M1 j$ q prt(alg); /*输出进程PCB信息*/
1 v# [) x. J$ [5 x }: y, d6 H0 {$ [. I- e
}
2 s, L( |0 q4 o. z- t( v1 _ l# t/*时间片轮转法*/9 b5 ?8 @9 Q0 D5 |* G
roundrun(char alg)0 I+ O4 K! h" _+ }7 C
{
! U1 D+ ~. h. \+ u while(run!=NULL), c& z7 Y8 `1 d& g1 }; C! C) B% B
{. b$ [* Q- x+ u* b' p4 u
run->cputime=run->cputime+1;
- W- J% J6 V1 s7 `1 n run->needtime=run->needtime-1;
# Y0 G; D5 ? f# q run->count=run->count+1;0 K. [+ f% l% x8 X+ x# {
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/+ ~3 c. V R4 {; T
{9 y* S; u. v) U3 ^
run->next=finish;
4 W7 |5 Q' x, V0 b9 m- W( G) E( j i finish=run;
& u" z, H; M: k& s) T' h. X* s run->state='F';
1 m* X3 D; L0 b Z run=NULL;
. E' R& O5 |. Z" E2 @2 n, x/ _ if(ready!=NULL)
w9 {. _: F+ h firstin(); /*就绪对列不空,将第一个进程投入运行*/
8 v) E0 ~' q' z& s2 Q }2 k) I' ?! J1 E# m7 x
else
" G1 ]. ~, [. W! l if(run->count==run->round) /*如果时间片到*/$ Z$ ]4 d; A4 ~
{
3 l* c3 Y. v i run->count=0; /*计数器置0*/
; [$ l0 k8 I1 q: d( J) d7 E if(ready!=NULL) /*如就绪队列不空*/
2 b1 I6 I0 z& E6 o7 Z {
" n" i* d$ Y% C. `5 J$ ] run->state='W'; /*将进程插入到就绪队列中等待轮转*/4 m1 M$ x* q* ?
insert2(run);4 W; ~) s( K* a l
firstin(); /*将就绪对列的第一个进程投入运行*/; t% E% |$ e( e( w& |
}
: O/ H- g4 O2 p" U% P }+ E' ~2 W3 S& k$ q
prt(alg); /*输出进程信息*/
# n: b6 u$ V- }# i8 m }3 a* k: s0 @" m
}5 z+ n3 Z8 p" z# k
/*主函数*/. k1 R" D/ W( l3 ^. F
main()9 ^; M9 s+ | i* ?1 u) w$ p+ N3 A
{
- E3 T& Y0 C" k5 I* J. z _ char algo; /*算法标记*/
R/ i/ D' H3 ?: w! ?2 U clrscr();
; p) L" K/ ?7 J k1 A printf("type the algorithm /R(priority/roundrobin)\n");
8 u( W) Z' _! E* p scanf("%c",&algo); /*输入字符确定算法*/ M: \- F. A9 x
printf("Enter process number\n");
! _5 c9 P0 E0 ~' _8 z) U scanf("%d",&N); /*输入进程数*/
- ~, r! g, {* {! m! D8 F; o0 R3 M if(algo=='P'||algo=='p')
/ b5 h T4 R6 x7 s- }$ y {
0 m9 M2 Q* z# q$ p$ n( c ] create1(algo); /*优先数法*/2 z" [) [0 b( o2 I
priority(algo);
% Q) k8 X0 G$ x( Q }
8 j( ?1 U! {! d6 X' P4 H4 l else: I/ v$ B! U" a
if(algo=='R'||algo=='r')4 m5 k9 J9 i/ c. S& k
{ Q6 x! l4 t1 Z! _* _+ W
create2(algo); /*轮转法*/+ M* L6 w; o* J w. [
roundrun(algo);
' A |2 @9 U" e* C. } }
. w4 R& }" R) [3 C/ B7 K; W}
+ s; _/ ?0 L6 N! l! `! r</pre> |
|