数学建模社区-数学中国
标题: 经典任务调度算法的模拟程序 [打印本页]
作者: 杨利霞 时间: 2021-4-9 15:15
标题: 经典任务调度算法的模拟程序
' P3 [" D5 Q. w( s5 l经典任务调度算法的模拟程序' m; I; T+ r) ]6 o8 ?' J# L2 f
本科毕业设计写了一个经典任务调度算法的模拟仿真程序,测试了五种调度算法的运行性能。在程序中虚拟了任务的进程,按照不同调度算法策略从进程池中选取任务执行,在任务执行过程中,保存相关的统计参数,最后对这些参数进行处理,反映各个调度算法的实际运行性能,程序中可以通过修改任务的相关参数改变任务特点,测试不同任务环境情况下,调度算法的性能适应性。程序是通过C语言编写的,为了对运行结果图像化,采用了EasyX的图形库。由于计算机中实的任务调度过程比较复杂,在实验中为了简化程序的实现,在某些方面进行了特殊处理。
, n( \, r4 Z7 U
, ?% D* ? k$ Z2 P: j& }, [' H编程平台:VC6.0+EasyX图形库环境。
* S; T" \3 F1 U$ Y7 a; X, a. s
! D7 M9 H5 o- n1 ]2 O8 ]以下截取部分程序运行图::0 |" m9 x8 k) k$ H" t* w' x
3 O7 E6 r6 l M( V6 u源代码:
# [4 |1 N' A/ z0 a
" y8 g5 s0 m* H) D1 j- U7 V#include<stdio.h>
: C$ }" d& F2 `/ J#include<stdlib.h>/ z, Q' ?( {0 z) _6 E8 N, D7 b+ g
#include<easyx.h>
+ _, R! l- C! B6 c8 I% G4 W#include<time.h>
0 }/ Q1 P# I$ D3 f#include<conio.h>3 m9 b5 G2 s/ p5 S4 q: D
#include<graphics.h>
8 g' L% R4 p$ |8 m: W. N* O9 W#define initProcessNum 10
. e. C* C# z% P+ ]* G#define initProcessID 10003 _: B, Y) F; N+ _, ]5 A2 w9 F2 _
#define MAXProcessRunTime 100002 }+ \; A8 j. W, {" ], y% |& p
#define MAX_MEMORY 4000
$ }7 D1 p+ q. D1 k#define exchange_IO_Compute 10
1 Y* {% P, \5 u- e% l7 s2 Q! |#define exchange_process 25
- D# e" T3 L; _+ |3 |4 d% w% {#define task_completed 1
; M; b2 Y, ~4 b6 N( z6 g0 K g#define task_not_completed 0' ]6 }: |. P1 b1 X( v
#define initclocknum 1004 k- Y0 V" m( S5 y6 Y# S7 M
enum condition
' R" ^6 y# j4 J{: |0 t' j+ w) Z% l) Q- P
dead,computing,IO_waiting,ready3 Q4 F/ U7 Z3 _
};& {' g! [ X' |& k% {9 n
struct process
1 V7 s% q" }( F) C. Y2 s8 q0 h* P{
t7 F9 p; K5 q5 `# w4 K4 ]int processID;$ X! n* s7 d- H3 j$ w" R( r
int comeingTime;3 [" m0 X9 c' x' ]6 e" v
int ioNum;# Q: N: C. N8 [* a
int computeNum;
& [# u6 Q, }2 Yint * ioClock;1 E( Y9 E$ q" n9 v( A4 q
int * computeClock;
" j- x" n5 |" `( b6 X, `) \+ ^int ioTime;+ Y, ?; b6 [' M- Z0 s
int computeTime;
0 ~# M0 @0 p. f% nint askMemory;( L1 x }5 v2 V X
condition flag;, }% B: ^* h& J% H
int produceTime; //生成时间,以下三个数据成员用以计算相关性能, Y& K" }9 E d+ J- S
int runningTime; //第一次占用CPU的时间
' g' n0 N' b# e5 a1 N: H/ gint completedTime; //进程完成时的时间
4 `7 ~& ]; @. R) X: e! e. e};- {7 h% U; ]- m9 `, |
typedef struct processCmpletedInfo //保存完成一个作业的相关信息8 S3 \- H$ y1 a. v% }; R1 u
{
' C% s' T2 d" K; R( v2 o3 Iint processID,comeingTime,askMemory;# Q$ k- D3 m/ i9 ?+ B
int compute,waitio,exchange,completedTime,runningTime;
& F" D* w4 c3 lprocessCmpletedInfo * next;
1 l2 k- ~ I9 L/ G" R}PCI;
2 Q" x$ v/ n: Z6 j. @. pstruct processPool
; W+ V( w6 B! ^* j{
+ s2 g4 j: p' t- ~ d- _1 C" x+ e8 d; rprocess * p;& ?# o& P3 s# g) `5 N! x5 l! X
int proNum;' P: ^% e f1 b. [
};3 J h, M* [6 H7 L3 B
int MAX_COMING_TIME=0,ID_FIFO=0,systemClock=0,FLAG_FIFO=0,FLAG_TT=0,FLAG_PF=0,FLAG_SJF=0,FLAG_HR=0,FLAG_show=1;8 d( M8 f1 z. Q0 S1 U
int InitPool(processPool * p);
/ {9 V" _ y! t! r5 o; w8 h' bint produce_one_task(processPool * p,int i,int id);
! H& L( N7 }* u) }int FIFO(processPool *storage,processPool* memory,int * spareMemory,PCI ** save,int draw);' U/ p# h) c' K
int TimeTurning(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw);4 P0 R0 }6 ]8 u; @( ~" s0 h9 }
int TimeTurining_storage_to_memory(processPool *storage,processPool* memory,int *spareMemory,int pos);
* Y3 E7 ~3 y" S5 t! h) O5 }) f1 Tint FIFO_storage_to_memory(processPool *storage,processPool* memory,int *spareMemory);3 ?; f! G& p. R4 H. U
int ShortJobFirst(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw);+ w, G( U* r- O9 H2 D3 M- w
int SJF_storage_to_memory(processPool *storage,processPool* memory,int *spareMemory);6 {. g4 G3 V$ r9 k1 |" ?+ e
int PriorityDispatch(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw);
( c3 h7 K' ~/ pint Priority_storage_to_memory(processPool *storage,processPool* memory,int *spareMemory);& n0 p$ Z* ~. {5 O
int High_response_ratio_s_to_m(processPool *storage,processPool* memory,int *spareMemory,int flag,int disatch);- F4 A6 e6 W3 L
int High_response_ratio_dispatch(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw);( H; ]& i* W4 \2 B
% x1 t3 ^5 R; e; x) T
% `* r4 `+ n1 Q2 k: ?# d# T
int sort_by_comingtime(processPool * p,int pos);1 d. |* v4 w) h5 G4 u- E0 z
int showProcessInf(processPool p);. c- r. w+ h0 J: h7 c
int drawPerformance_FIFO(int x,int y,int memorry);! H6 l) Q$ r1 x
int drawPerformance_HR(int x,int y,int memorry);/ Y/ o/ S+ E& [1 z8 b
int drawPerformance_PF(int x,int y,int memorry);* ` y6 Q4 Z5 X5 r3 E, ?
int drawPerformance_TT(int x,int y,int memorry);
5 F4 O% X: {: d* q& Zint drawPerformance_SJF(int x,int y,int memorry);
# u6 r$ q* }5 V. S5 v" lint MouseListening();
1 X/ k* z: _( q( Sint MouseListening2(int *flagShow,int * showTime);/ ^8 v7 C9 B. [4 L) X
int showRunningResult(PCI* FIFO,PCI * timet,PCI * SJF,PCI* PR,PCI* HR);
% C8 Y* \* B/ Z6 t! A
, B B- i9 [! y: G+ J! U
8 M: h, e X$ k9 L5 wvoid main()' f7 M7 I* r% ^' ?
{7 d) b: z; j7 v' p q; ^
PCI* FIFO_save_head=NULL,** FIFO_pri=NULL,* Timet_save_head=NULL,** Timet_pri=NULL,* SJF_save_head=NULL,** SJF_pri=NULL,7 S4 l! C0 m8 x) }/ F* n$ Z
*Priority_save_head=NULL,** Priority_pri=NULL,*HR_save_head=NULL,** HR_pri=NULL,* p;
" c' u' f) i) \7 @- P/ t6 hint i=0,FIFO_memory=MAX_MEMORY,count=0,Timet_memory=MAX_MEMORY,SJF_memory=MAX_MEMORY,Priority_memory=MAX_MEMORY,HR_memory=MAX_MEMORY,, M' `8 [' ~' B! x2 y$ u0 k
flagDraw=0,showTime=100000;# k1 S5 }% C5 i& ^/ U/ P
processPool FIFO_p, FIFO_mmy,Timeturn_p,Timeturn_mmy,SJF_p,SJF_mmy,Priority_p,Priority_mmy,HR_p,HR_mmy;
% A) d, V4 {' aFILE *fp=NULL;
, O# ?$ C2 m% a0 S) B//processPool HR_p,HR_mmy;
2 r+ @* p6 C5 ^5 [+ M% X4 x9 S, P1 T/ [7 m( x; O' t4 a
# A* D4 V' v& O( Xsrand((unsigned)time(0));" W( Z* O( U# J5 L) K
systemClock=0;
5 t, k0 O( u% \! g" p5 ~$ `9 ninitgraph( 1200,650,SHOWCONSOLE );
% f$ E' c/ z6 U6 U8 ]settextcolor(GREEN);
! _/ f& X& C: d& \1 Q8 a7 Wsetlinecolor(GREEN);
' E. h) N0 m4 O0 c# g; Ssetfillcolor(GREEN);3 w8 d9 h" W. f7 y5 \
InitPool(&FIFO_p);
U B4 I7 _0 f( }/ vsort_by_comingtime(&FIFO_p,-1);$ \3 X% Z) Q2 d/ ? }1 O9 A7 l
InitPool(&Timeturn_p);- \0 g) a7 [7 K* f1 V
InitPool(&SJF_p);& H) e! z% Q, m. y
InitPool(&Priority_p);
4 a- v! ` p5 N0 r5 \; HInitPool(&HR_p);, m& L: {1 r/ e! j4 O) s- I0 O
//showRunningResult(FIFO_save_head,Timet_save_head,SJF_save_head,Priority_save_head,HR_save_head);7 G5 o, ^* r- D8 R" g5 [
//Sleep(10000);- L, \4 J( o$ F0 P7 j r- G$ z
: @9 ~6 Q4 j4 z5 c/ H% V* C- y8 F6 |% ^6 A) y
Timeturn_mmy.p = (process*)malloc(initProcessNum*sizeof(process));1 S8 l; E$ Q$ c
SJF_mmy.p = (process*)malloc(initProcessNum*sizeof(process));
* Z( ?; o: ^: x7 O4 @4 ZPriority_mmy.p = (process*)malloc(initProcessNum*sizeof(process));: T, \: u/ \9 k
HR_mmy.p = (process*)malloc(initProcessNum*sizeof(process));1 H( ?: V2 o* S
for(i=0; i<initProcessNum ;i++)
3 r6 t7 O ]3 Z" z9 u- y$ n X{$ k+ L: G5 t9 m- u6 N% d7 Y
Timeturn_mmy.p.ioClock= (int*)malloc(initclocknum*sizeof(int));
" K$ E1 ^. f/ w7 Q# NTimeturn_mmy.p.computeClock= (int*)malloc(initclocknum*sizeof(int));- m( [- m$ _4 Q; c
SJF_mmy.p.ioClock= (int*)malloc(initclocknum*sizeof(int));
7 H- Z" ~5 f) f$ D& _; i+ LSJF_mmy.p.computeClock= (int*)malloc(initclocknum*sizeof(int));+ q* z3 [; v, J8 v& P5 t3 \" Q" N
Priority_mmy.p.ioClock= (int*)malloc(initclocknum*sizeof(int));
/ x5 W3 c3 ~. z2 \/ Y' U0 }Priority_mmy.p.computeClock= (int*)malloc(initclocknum*sizeof(int));
8 P% Z$ m2 ?4 N8 j0 d7 ], xHR_mmy.p.ioClock= (int*)malloc(initclocknum*sizeof(int));
- p* Q: {9 [: |- m- \* pHR_mmy.p.computeClock= (int*)malloc(initclocknum*sizeof(int));5 G, p. s3 f4 I. V7 G
}
9 [9 x& f4 L7 uTimeturn_mmy.proNum = 0;! O1 k, v8 Q: }$ |5 E
TimeTurining_storage_to_memory(&Timeturn_p,&Timeturn_mmy,&Timet_memory,-1);
; R! ?! u9 T0 e M& N* |. aSJF_storage_to_memory(&SJF_p,&SJF_mmy,&SJF_memory);
" v. T% G; ?6 E3 B( T) e( u) tPriority_storage_to_memory(&Priority_p,&Priority_mmy,&Priority_memory);, {" z% }8 N" X. X
High_response_ratio_s_to_m(&HR_p,&HR_mmy,&HR_memory,0,1);& v5 c9 l8 t* @1 m
//showProcessInf(Timeturn_mmy);
( x8 g% q& j" f8 uFIFO_pri = &FIFO_save_head;
' R. p3 {+ D1 D9 k: K$ aTimet_pri = &Timet_save_head;
m, \$ O. m- A) \+ A* e9 zSJF_pri = &SJF_save_head;
8 C- p- K% K+ H' {5 Z yPriority_pri = &Priority_save_head;
: o' v6 r+ F0 c* A% K# m& ?2 L n HR_pri = &HR_save_head;: {& n, q9 P6 N: D
setbkcolor(WHITE);) \7 H$ w! z$ v* L
while(1)6 e. t8 `, K5 A V8 A5 d
{
: T; i$ T* E" @; z" u" Mif(MouseListening()==1)
/ u6 F$ X4 p* z: c5 jflagDraw=1;
# |' p( {$ U# x# [if(count==100)- T0 ~9 O* u1 N5 m/ J. Q% T
{
; R w. a. D Z( qif(FIFO(&FIFO_p,&FIFO_mmy,&FIFO_memory,FIFO_pri,1)==task_completed)
! H4 W% B9 k* N% u{5 K# y2 U- f9 k. D" f
FIFO_pri = &((*FIFO_pri)->next);
: h) i- f5 b) M- T9 A+ n4 l3 b2 z$ ]8 q2 T
//printf("hello");5 ?9 ~) U; ] [
}" O- ]+ g5 f2 C( {# W! A
if(TimeTurning(&Timeturn_p,&Timeturn_mmy,&Timet_memory,Timet_pri,1)==task_completed)0 Q" e% ^. Z- @2 j- D; U1 n2 |; R
{2 v5 e' K b8 W1 ~3 ?
Timet_pri = &((*Timet_pri)->next);" o$ c1 _5 _$ |/ f# p
//printf("hello");
) j+ N8 p6 I+ V3 P}
6 o# E' i* a) x3 C1 y0 jif(ShortJobFirst(&SJF_p,&SJF_mmy,&SJF_memory,SJF_pri,1)==task_completed)4 R% |$ g" [, O1 q
{, _, C( x3 }- u; I
SJF_pri = &((*SJF_pri)->next);
. [9 ~) I2 k E4 T: L2 N//printf("hello\n");9 w# U$ o" R9 U# k- |0 l7 U) S4 b g& l
}- f4 R# P# _" o4 U0 L
if(PriorityDispatch(&Priority_p,&Priority_mmy,&Priority_memory,Priority_pri,1)==task_completed)
9 T6 v* D' e" Z! e{
# B! e0 J! i' |# A( V6 oPriority_pri = &((*Priority_pri)->next);0 _, Y7 A5 c8 u6 o1 W
//printf("hello\n");
; T9 A1 { d8 O. N}
: H, K1 E* ?9 C( u' ~# a/ `' }if(High_response_ratio_dispatch(&HR_p,&HR_mmy,&HR_memory,HR_pri,1)==task_completed)! Y% I( |+ h" m7 `$ V$ z8 r6 w
{0 d0 W- R8 M* N/ q5 Y# U. @0 X
HR_pri = &((*HR_pri)->next);
- L7 m/ N0 H5 _, z% {//printf("hello");% n2 ^+ X" f- \. j3 m/ b
}& q+ G- O" @5 D+ `* F, y2 }
count=0;2 ~! G2 d2 X1 r& N
}
; c" `( c% v- celse
% f. }, G& X; d" Q{! q( i7 p3 J$ M% I
if(FIFO(&FIFO_p,&FIFO_mmy,&FIFO_memory,FIFO_pri,0)==task_completed)4 i Q$ v' U) R
{( J( L* K' d- u* ]7 w
FIFO_pri = &((*FIFO_pri)->next);) O. L _: U" f; l. _% R
// printf("hello");$ F0 b% l1 @4 m
}
8 l& Y4 c& V7 }8 n4 z* k* Jif(TimeTurning(&Timeturn_p,&Timeturn_mmy,&Timet_memory,Timet_pri,0)==task_completed)1 T& r. b+ A8 E& z* J
{% ?, @6 f7 s$ P) s
Timet_pri = &((*Timet_pri)->next);
4 Z+ H8 b2 j* l5 t// printf("hello");1 V3 K, C$ ~7 [* t
}
- c, s- M4 r. a3 i( o% i mif(ShortJobFirst(&SJF_p,&SJF_mmy,&SJF_memory,SJF_pri,0)==task_completed)
0 ~4 ^* ]* _+ s# Z* L3 Y f1 p+ w{
! V: p" o) V$ {0 o- K8 l0 f( f SJF_pri = &((*SJF_pri)->next);! U( h3 z7 J- \% H: Y: y
// printf("hello\n"); p8 g1 T: |3 y1 D, l0 {
}
4 J$ G" K, S0 Z+ Uif(PriorityDispatch(&Priority_p,&Priority_mmy,&Priority_memory,Priority_pri,0)==task_completed)( w' l6 h8 |' S
{# a/ w& l) o' j4 J4 T& D
Priority_pri = &((*Priority_pri)->next);
( r3 \7 D) v8 _2 Y1 h# F0 s//printf("hello\n");
; y- P. Y4 }2 Q) T}, K3 h; I% `0 n
if(High_response_ratio_dispatch(&HR_p,&HR_mmy,&HR_memory,HR_pri,0)==task_completed)) u+ l3 y3 k8 G% z. Z9 Z9 `
{4 b8 a; G: M1 g' `9 L
HR_pri = &((*HR_pri)->next);0 J0 j: @9 F. [0 _( S9 q
//printf("hello");7 g; K: a) n# \: ]5 a$ z$ U4 v
//Sleep(1000);
1 Q/ r( K' W% V1 q}
7 Z: f" R5 j' U6 H* E. f! m/ N* xcount++;
7 C2 h" D' z7 E/ b9 c6 H}
& c2 G+ [/ x+ ?% D# T& v, Sif(systemClock==showTime)
' W8 E1 P1 E: Y2 o5 l% ^; X{
3 E. F a7 f& _6 y/*PCI * p=FIFO_save_head;
( n, T) f. u! e* Lint i=0;; @! i& ?* e: r- [, h7 o
for( ;p!=NULL;p=p->next)
5 c8 S% A. r; G( o1 \3 V{# L. v, Y, E( B4 Q' |
printf("Id %d\n",p->processID);! m" T$ v3 b+ a0 j5 S s3 n
printf("comeingtime %d\n",p->comeingTime);
! m: B/ z" `% F+ j& d ]printf("runningtime %d\n",p->runningTime);
$ I. [+ }3 G2 R& A) }1 _: @+ qprintf("asdmemory %d\n",p->askMemory);" [* X6 A1 p7 U! V0 v3 O
printf("completedtime %d\n",p->completedTime);* @' h- ?6 @/ r7 s/ d7 ]1 B9 s
printf("compute %d\n",p->compute);2 J9 Q/ a1 ? n1 i/ `9 S. L+ ]4 S1 w
printf("exchange %d\n",p->exchange);
. K( T' M7 t( c9 L5 Xprintf("waitio %d\n",p->waitio);
$ K! c5 J; p! w' D+ li++;
* n I' c, g t7 f: R4 A
7 R) `. ]* y9 ?, u: Y$ n0 _! L' N: d9 m ~% _
}
" v8 b3 d8 M8 m! N" F8 V- d& d Cprintf("%d\n",i);*/. p! g% ^9 j/ ~" C, Q
if( (fp = fopen( "data.txt", "a" )) == NULL )
" g! ^9 I3 t. F' }- ~/ K{
9 p( e1 r% G- ]( S+ m1 G* hprintf( "The file 'data.txt' was not opened\n" );
: X0 b b0 m. }' u7 b//return 1;
) M: V' y: G% h% a' [}
% E, P7 `8 _2 Jelse
. Z5 J6 u0 ?- H& o7 ]; z{* N( O! y6 q3 V5 z4 g: s" `; g
fprintf(fp,"FCFS \n");
+ z$ {, W. a# X# `! gfor(p=FIFO_save_head;p!=NULL;p=p->next)
: h1 w/ t( @: |fprintf(fp,"%d %d %d %d %d %d %d %d\n",p->processID,p->askMemory,p->comeingTime,p->completedTime,p->compute,/ P" E, o2 I( F+ P4 a$ E" W
p->exchange,p->waitio,p->runningTime);
/ y+ j3 Q# @; f0 d( dfprintf(fp,"\nTime turn \n");4 M7 b, q x6 @5 ^2 F& ]8 x
for(p=Timet_save_head;p!=NULL;p=p->next)7 H3 }6 }8 M' X; L5 D2 |9 }/ H
fprintf(fp,"%d %d %d %d %d %d %d %d\n",p->processID,p->askMemory,p->comeingTime,p->completedTime,p->compute,, Q+ }. c+ V, w# g8 T
p->exchange,p->waitio,p->runningTime);
1 o1 Z2 h3 ?0 |" Z# pfprintf(fp,"\nShort Job First \n"); ?3 z G: x) h
for(p=SJF_save_head;p!=NULL;p=p->next)6 k7 {) t, u: A- Y' M# o# b3 S
fprintf(fp,"%d %d %d %d %d %d %d %d\n",p->processID,p->askMemory,p->comeingTime,p->completedTime,p->compute,; j0 v7 r3 ~: Q9 s2 p' n4 H
p->exchange,p->waitio,p->runningTime);+ A% n v8 n# z! Y$ u8 n
fprintf(fp,"\nPriority \n");
$ G' Q* i% ^( H5 Ofor(p=Priority_save_head;p!=NULL;p=p->next)
- d A9 F1 E. `& Yfprintf(fp,"%d %d %d %d %d %d %d %d\n",p->processID,p->askMemory,p->comeingTime,p->completedTime,p->compute,
1 j, ~6 l6 r1 B1 ^; b* z/ I8 Lp->exchange,p->waitio,p->runningTime);- M0 Q D2 \0 b: }% j. \
fprintf(fp,"\nHigh response \n");7 c0 b3 A% A5 ~
for(p=HR_save_head;p!=NULL;p=p->next)
3 y0 c7 s* P6 b! O; S- _fprintf(fp,"%d %d %d %d %d %d %d %d\n",p->processID,p->askMemory,p->comeingTime,p->completedTime,p->compute," s8 L6 Z. [7 l" [: g/ r& M
p->exchange,p->waitio,p->runningTime);
* d9 H& i6 q0 s- ifclose(fp);( c6 ]) n( E; h# d! Q3 }! |
}6 y- z! V. R) ]0 @
showRunningResult(FIFO_save_head,Timet_save_head,SJF_save_head,Priority_save_head,HR_save_head);
% t* y/ |( M/ D% U7 |MouseListening2(&flagDraw,&showTime);
$ v6 b7 u3 \8 B& n2 }}4 V9 {' Q% o# g" h
systemClock++;
$ h b- b' V/ J6 H% N) qif(flagDraw==0)* M$ I1 n* ]& f& _
Sleep(10);
, u2 d9 o1 n+ f$ |$ q; k9 Z* [- ^6 l}# p1 v- F. P A8 g
% C# d Y! a+ i( V' K! e
6 J2 C7 `9 ], L% U}% X4 X# f: h4 f
int showRunningResult(PCI* FIFO,PCI * timet,PCI * SJF,PCI* PR,PCI* HR)
; J8 N2 v F- x3 |0 P$ x( r! F{& l- s% j( D3 X% n$ O: n4 x
PCI * p=NULL,* name[5];
8 K) ~$ M' K: f- U& oint count=0,i=0;
- g9 V$ r' [8 Zchar ch[5][10]={"FCFS","timet","SJF","PR","HR"};
1 r3 ~" x2 S& _ ^: hdouble turnover=0,wait=0,c=0,w=0,change=0,pos[4]={0,0,0,0};4 G. Z5 y3 U ^# Z& H ]0 D" j
struct info% t% J5 q1 }. k- f: s
{3 ]1 C* K, r9 B6 Q
char name[10];
# Q( ~* {: p/ |# Q4 gdouble throughput,turnover,wait,CPU_rate;
& K# ?; o5 }( |) D}inf[5];# T; b# l6 G+ m5 s. o- L
name[0]=FIFO,name[1]=timet,name[2]=SJF,name[3]=PR,name[4]=HR;/ x2 h' T9 M8 d6 _ y, c
printf("调度算法..........A\n");
& l( u: F4 q4 }) o* ^1 \: Gprintf("吞吐量............B\n");
' V8 G& a' F( i& aprintf("平均周转时间......C\n");
d5 l: s6 Y' O7 ]/ X8 cprintf("等待时间..........D\n");4 N5 j0 c& A3 v! N$ a
printf("CPU利用率.........E\n");" W* G+ B+ A1 z. T: {; w; x- u
printf("A\tB\tC\t\tD\t\tE\n");
+ q/ O5 ^9 r0 Gfor(i=0;i<5;i++)
6 m2 o& ~" h: |9 F3 i1 o0 q9 i# R" d8 `{
+ B) b: b Q9 `* }count=0,turnover=0,wait=0,c=0,w=0,change=0;
* g' \0 g7 k5 ?5 G& m5 I q" Ifor(p=name; p!=NULL; p=p->next)
& f& C( `# A9 D" d{
% b' `+ s. I/ t* {3 r6 ]- R3 q+ wcount++;# [* D0 }" V' Z _
turnover += p->completedTime - p->comeingTime;0 ~! @/ a3 J9 s8 N" j
wait += p->runningTime - p->comeingTime;) |; X* [5 o+ ] u6 j1 i3 V4 s1 ^/ N
c += p->compute;
/ i) F; h. h5 P) Yw += p->waitio;
" H( |4 A ^; E$ o" Schange += p->exchange;
: b: Z: w9 u/ T5 O5 _}
& _8 U$ H4 x3 Q* aturnover = turnover/count;
# B$ j$ y5 x9 A* U9 Nprintf("%s\t%d\t%.2f\t\t%.2f\t\t%.2f\n",ch,count,turnover,wait,c/(c+w+change));
# J5 @; u- Z# r% g, X- O+ ~" hstrcpy(inf.name,ch);
# C# F% S6 q4 h% binf.throughput=count;- R( }7 c- K- {- w' C
inf.turnover=turnover;
; x7 d- i2 a! E$ q" @inf.wait=wait; ]; ]1 W w; G' R. u
inf.CPU_rate=c/(c+w+change); O, k2 }- n) g, z
}
. {% T/ a: W9 ^1 I( a! g* s' \3 f//画图
, r+ J2 ]$ g3 Y3 I//cleardevice();
" d. z( {- I, Uline(0,600,1200,600);
9 u/ D) ]( [" V& z8 K5 z7 Wline(10,600,10,200);& g1 C; \, v- ~4 S0 E M+ |* l
line(10,200,5,205);
" x& @( ^6 X& i2 z- l- a' q Fline(10,200,15,205);
0 T) e7 Y- G) C' g kline(310,600,310,200);
! i8 D9 m/ |/ \, G/ cline(310,200,305,205);3 r, @4 C) ]4 S3 H1 i. s6 W% m6 a* U
line(310,200,315,205);5 ]2 V9 x6 G7 u+ v5 v& k4 P% ~
line(610,600,610,200);
( W7 ]0 ]5 a9 z& sline(610,200,605,205);4 ?/ j1 u! x5 O* h/ J. ]( Q
line(610,200,615,205);
( ]- P% j) v4 s6 ~) jline(910,600,910,200);: {, M) I5 ]6 _- C) U" T( g
line(910,200,905,205);) ?$ r" ?- L. _$ _% J
line(910,200,915,205);//最高的长度400,宽度均为40% g' [) g5 ?. h3 r
for(i=0;i<5;i++)
7 ]6 j/ t! k7 I/ ^% S{. H9 x0 ~3 A, ~0 k
if(inf.throughput>pos[0])
. e8 _) y" c/ Z5 \6 l% y! }* ypos[0]=inf.throughput;
+ H5 p+ D( p- U+ e/ C |1 t% Bif(inf.turnover>pos[1])
7 B" W$ Y- t% C6 M9 I9 G1 Wpos[1]=inf.turnover;5 q7 [9 ?' s; a2 Z$ G/ E7 D. G3 q! T
if(inf.wait>pos[2])
M( C( I1 c8 c- Q$ rpos[2]=inf.wait;
! T/ u) j- N+ v) I1 d: R# d1 eif(inf.CPU_rate>pos[3])
3 Y, Q" N) ^# a% h3 vpos[3]=inf.CPU_rate;8 X( F+ y# q3 C
}+ E1 e) X8 l0 P: f7 X, @3 J
settextstyle(30, 15, _T("楷体"));3 E1 Q" {7 F' \2 r. M2 E5 G! i+ f1 j
for(i=0;i<5;i++)2 I% r* [3 |9 P
{
. y8 ~: L* q* N2 C! I' f0 k, J9 oswitch (i)
; b9 x; y0 s% n6 g( b( F{
* A+ E8 G" X0 d8 n. [& n7 hcase 0:
- z0 j" r4 e+ e: o' asetfillcolor(BLUE);
7 V+ Q8 i8 b$ H8 s6 m% }) z5 Q" Yfillrectangle(100,50,150,100);
" M2 c- c$ ^' V6 r8 _outtextxy(160,50,"FCFS");! E, K; Z) A' ^9 [
break;
4 N& g! h. s9 {) Ecase 1:* H5 n" @9 t! q1 C }( w% W
setfillcolor(RED);2 R. q1 J8 U' Z9 I9 E
fillrectangle(250,50,300,100);4 q- @9 w' c" i5 _
outtextxy(310,50,"timeTurn");, o) k) ^3 B, Q+ C* V
break;
8 V t( V& p: g& m1 E+ m8 ^' Ncase 2:2 `3 {& p ? j! X, p7 x
setfillcolor(YELLOW);+ r! L' K1 _& G7 c0 P
fillrectangle(450,50,500,100);
$ A- `% a9 A. D& t# Douttextxy(510,50,"SJf");
! k; I, {- O4 d/ Tbreak;
& N+ T. e+ V# Rcase 3:6 F7 v) ]+ o: @" e$ o: ?5 j
setfillcolor(BROWN);1 d# {3 y- @: L
fillrectangle(580,50,630,100);3 C$ i! [( F+ _1 o' j
outtextxy(640,50,"PR");& |- `( F; q% t+ ]& L9 C
break;# b/ P) L3 m. ?6 q
case 4:* e6 y1 B8 ~5 Y- o- w
setfillcolor(GREEN);
0 c0 r$ [7 ?: }; A4 zfillrectangle(690,50,740,100);6 k6 o. @+ g; ~/ p9 t6 |* R
outtextxy(750,50,"HR");9 S) Z/ q; V, s/ ~
break;
* W& W+ T7 L/ m}
z# B* M" B. H0 D+ A, I/ j& afillrectangle(50+i*40,600-(int)(inf.throughput*400/pos[0]),90+i*40,600);
M4 y2 F4 b3 Efillrectangle(350+i*40,600-(int)(inf.turnover*400/pos[1]),390+i*40,600);
6 l. T8 J* @! x; l3 tfillrectangle(650+i*40,600-(int)(inf.wait*400/pos[2]),690+i*40,600);2 }7 p3 _3 R% I! Z
fillrectangle(950+i*40,600-(int)(inf.CPU_rate*400/pos[3]),990+i*40,600);7 a7 K% c0 `/ D4 D1 O; t. d1 w
2 M- J6 C) w* ~! |0 K# Y+ j; a4 [' K& Y6 X
}3 a! ?) G! k: M' f2 i
outtextxy(100,150,"吞吐量");, J. `+ Q, f9 ~0 h( @1 f6 ^1 |6 ?
outtextxy(350,150,"平均周转时间");
% m( s& v5 z' @ \! ^) }0 u5 Vouttextxy(650,150,"平均等待时间");. j& K' e6 `+ L. c: y* a( x
outtextxy(950,150,"CPU利用率");, F* j- b# P T
return 0;
7 C2 U" h7 r! @$ A' H1 g}! B' P& E: _( q: ], x
int MouseListening()8 e: K$ W1 u; q1 ~* a8 {
{
8 N% \. z' r* }. G9 r+ I4 F4 bMOUSEMSG p;0 G2 l, r, ], B9 s" v
if(MouseHit())
- {6 I( `8 v: m5 o; ~# @$ H{" A$ B+ J% |5 K o) ]2 _
p=GetMouseMsg();0 \6 Z4 `$ }6 _: A! w1 p
if(p.mkLButton==true)
, x1 o+ |' U' H{
) W. l( a& F# D% \) hif(p.x>0 && p.y>0 && p.x<400 && p.y<325 && (FLAG_HR + FLAG_SJF +FLAG_PF + FLAG_TT + FLAG_FIFO) == 0)0 V3 w0 D. L3 K& u8 P
FLAG_FIFO = 1;' ^' Q$ d& C! Q8 b. s1 @
else if(p.x>400 && p.y>0 && p.x<800 && p.y<325 && (FLAG_HR + FLAG_SJF +FLAG_PF + FLAG_TT + FLAG_FIFO) == 0)7 b/ [. t" Z0 c- J/ D$ B0 ^, E
FLAG_TT = 1;) ?" f1 l* F6 Q3 U
else if(p.x>800 && p.y>0 && p.x<1200 && p.y<325 && (FLAG_HR + FLAG_SJF +FLAG_PF + FLAG_TT + FLAG_FIFO) == 0)" [/ l2 Z$ L8 B8 H& a0 p
FLAG_PF = 1;
0 d! _. T& {; R! n% x! i, o. }+ melse if(p.x>0 && p.y>325 && p.x<400 && p.y<650 && (FLAG_HR + FLAG_SJF +FLAG_PF + FLAG_TT + FLAG_FIFO) == 0)+ t! K3 k* I# \6 @8 d6 j- S
FLAG_SJF = 1;
, ~* { C8 }# e* d1 o( X' Pelse if(p.x>400 && p.y>325 && p.x<800 && p.y<650 && (FLAG_HR + FLAG_SJF +FLAG_PF + FLAG_TT + FLAG_FIFO) == 0)
, a$ O0 `$ m* SFLAG_HR=1;
0 ~3 k7 H' F Z1 z, Y! ^& ]4 U1 celse if(FLAG_HR + FLAG_SJF +FLAG_PF + FLAG_TT + FLAG_FIFO >0)4 t9 k$ A3 Z& W
{4 S* p+ C- U+ `/ O' G
FLAG_HR=FLAG_SJF=FLAG_PF=FLAG_TT=FLAG_FIFO=0;
v: D" |* f1 ?) J6 {clearrectangle(800,325,1200,650);
- b2 C8 h! L$ l' k5 M, Z2 m}
: Q: g+ a8 Q! l7 A; o, Aelse if((FLAG_HR + FLAG_SJF +FLAG_PF + FLAG_TT + FLAG_FIFO) == 0 && p.x>890 && p.y>455 && p.x<1110 && p.y<510 )
" ?! p2 ~; x5 [, I& j{1 y6 P& N- ?1 Z% v
FLAG_show=0;
+ Q. m$ P7 m4 S: B- N2 C) }cleardevice();' m& c' N6 o& w1 T- X- i. K
return 1;+ `0 h4 i+ n- [$ V" @
}
7 g9 Q7 |9 E5 G! o# C}
( |# y; N0 {" o7 K, E9 }4 d}
, _: g' w( Y- n$ N, greturn 0;0 ?" T1 u- R+ R% j2 U* L
}
: B, n: G' P7 n- e8 W* d2 Q; X7 A6 \int MouseListening2(int *flagShow,int * showTime)) t* i1 y' B. }' f5 ?
{* u# M$ [! C4 V- U
MOUSEMSG p;
% d( F' i# V& u. E. L" v; r/ |; Z/ Y( urectangle(1150,0,1200,50);
- C' q) ?; p# F. s/ V' Y7 Z0 wouttextxy(1160,10,"X");
3 ~9 S+ _1 R; v8 ]9 ?& x5 Z, g3 ywhile(1)# ~- {, A( S% k6 A9 N ^1 {: y3 n* [
{. x5 }, G3 t v. {2 ~
if(MouseHit())
e; g# G* h- e# ?+ e{
5 }2 P0 f; ?$ F$ H' E, L9 Ip=GetMouseMsg();
4 r1 r& V ?& ?2 {9 g0 B* Yif(p.mkLButton==true)/ T! K! m5 C ~* b$ ~5 x4 p6 ~( d
{
( s! r% G4 N& D& e* {3 g/ F+ Q- \if(p.x>1150 && p.y>0 && p.x<1200 && p.y<50 )
% `) {- m! M; ~3 \' l! l2 ^{
* ]/ V6 l7 ~) T, l1 s1 m$ u. n(*flagShow) = 0;
$ M% e) q; o$ Y* u% M8 C4 P(*showTime) += (*showTime);
' E$ P% N' d4 p6 E8 EFLAG_show=1;
& k2 b. [; b" n/ `8 O1 Z5 `$ O; Zbreak;6 ?% _& u1 w. r' j/ y8 D
}
! K" p b& X. H: q8 i% f, \1 g: N+ a3 o; i" I
}" S" m- U9 V- m0 I' K2 P8 T
}0 T0 H1 [& D* @& k8 n
Sleep(20);
2 I O0 E) `! X}" p% K7 g, Z% s' A% i) E4 r
cleardevice();
7 D6 ?6 x+ m9 Lreturn 0;
1 }3 t1 E# ^, m4 x8 b* L}7 ~8 w( w- ?2 }+ U4 }9 M
int drawPerformance_FIFO(int x,int y,int memorry,int com,int wai,int cha)' F4 j- p2 w6 k8 |6 F2 Y9 P) Y
{9 P4 o+ a; b( B6 V9 z# F9 U y
static int info[11][3],num=0;
2 d: y' p# T0 g! G" K1 z7 fint i=0,j=0,pos[10][3][2];$ v1 n4 s# e8 {& h% @; Y
float temp,t;8 X. |$ v+ \& P. z/ n' D7 ^4 }2 r
//画按钮,不属于FIFO图的范围3 I) e+ w; }/ D! O! \; g) E
if(FLAG_FIFO+FLAG_HR+FLAG_SJF+FLAG_PF+FLAG_TT==0 && FLAG_show==1)
# E2 @" U3 ?% q# H K4 D) Y8 w{
. V) h1 n9 n5 b3 p5 U6 u! ^settextstyle(30, 15, _T("楷体"));9 g# B% I+ W) B+ y$ W( g! p
rectangle(890,455,1110,510);0 H) }* D9 O1 ?0 L; o& }5 `
rectangle(900,465,1100,500);* m& @1 d1 D0 m, c0 J9 @3 c9 r5 {
outtextxy(910,468,"查看运行结果");& G0 Q' R6 A; X$ z- F! T, F9 o
}# n3 H# Z) Z8 `5 B$ J
//结束画按钮
7 J3 N! Z6 X6 h B7 linfo[num][0] = com;$ v; ^) C7 ^7 ]. `, @: C
info[num][1] = wai;( N. }7 l# B& X9 t! W2 A
info[num++][2] = cha;" {# \% R4 J7 M6 h7 Z
if(num>10) //存储10个点
' ^* K) U! Y* H6 b; D{
8 F9 F0 Q& \; Efor(i=0 ;i<10;i++)
7 C, ^/ \* R( d2 q9 b( a9 E{
; e: E* _' J" f+ [+ T& ginfo[0] = info[i+1][0];
2 \9 c2 m p' `* G1 C3 y, zinfo[1] = info[i+1][1];
{5 |% }! Q5 r+ c4 `info[2] = info[i+1][2];* e3 N8 T: r( d
}0 b! a5 u, R9 Z
num--;
* k; U( n1 g/ ]. n0 ]9 o7 X}; W- ^: n. s2 U E% i6 G* ]
if(FLAG_show==0)
/ G" U6 `* Z6 Z( J: s/ Jreturn 0;" d6 m4 D. W0 d/ ]( u+ N
for(i=0; i<num; i++)
' X7 ^- A; G1 W6 ]0 Y{# t v2 a( u, t1 b: [
t = (float)info[0];
: h. ~% k3 J! s1 \& Gtemp = (t/101)*90;4 b. `0 V, [+ H# A. P( J6 J
pos[0][0] = (10-num+i)*25+x+100;
6 i6 P( F5 [( t8 Lpos[0][1] = y+110-(int)temp;
1 N0 u4 U, t* N2 b0 h4 Nt = (float)info[1];
, Z/ O2 O0 T" E# Y. f! Btemp = (t/101)*90;3 U* ], M. P( d$ w: G, }* c0 `: C) \4 @
pos[1][0] = (10-num+i)*25+x+100;% |, z8 g- f* f! p: z7 }
pos[1][1] = y+210-(int)temp;
2 i( p, W2 U# Yt = (float)info[2];
8 }0 s0 M2 c: t7 `temp = (t/101)*90;
9 v+ E2 X% U7 o8 ^4 tpos[2][0] = (10-num+i)*25+x+100;
& y0 u5 C3 i: fpos[2][1] = y+310-(int)temp;$ I4 N7 E$ r% E, g! J: P2 V4 F+ @9 i
}
1 E# m* A3 w4 c$ g$ f6 ~% \if(FLAG_FIFO+FLAG_HR+FLAG_SJF+FLAG_PF+FLAG_TT==0)
( w4 _; l5 @& Q& a) A$ d7 G: Z{. j6 S# _& \+ T3 L2 d7 @0 b
clearrectangle(x,y,x+400,y+315);
$ k2 ?* f8 u8 v; A4 ?7 Xsettextstyle(20, 10, _T("楷体"));
K( ~- F ^% h( B/ Q7 s+ ^& erectangle(x,y,x+400,y+325);( A' T! ?( P& f; e& i' K
outtextxy(x+40,y+10,"CPU"); //画柱状图! n8 E+ {3 G2 H2 z9 Z9 d7 w6 Y* l8 @
outtextxy(x+45,y+10+100,"IO");
& [8 a9 e0 ^" A2 c- B/ _outtextxy(x+40-15,y+10+200,"change");# G5 b8 `: j' `$ J# @! q
rectangle(x+35,y+30,x+75,y+110);2 h3 a) }$ T/ J
rectangle(x+35,y+130,x+75,y+210);
0 {0 ~! Q) F: T, y" T4 H, Q' p) |% prectangle(x+35,y+230,x+75,y+310);9 N: S# k, v6 a* w+ I& b! Y% {3 O
outtextxy(x+180,y+310,"FCFS");! W! z- T: i5 J3 |
t = (float)com;# E, X# Q/ I/ B; T( |
temp=(t/101)*80;: q9 I& W- |9 m
fillrectangle(x+35,y+110-(int)temp,x+75,y+110);" Q) h8 y% M' H ]; L3 q4 y2 R
t = (float)wai;7 r/ u. \- D; W* r2 Z, n9 k1 r
temp=(t/101)*80;
; [; b2 p1 \- a Cfillrectangle(x+35,y+210-(int)temp,x+75,y+210);
; W# x8 D8 y1 ]# S% gt = (float)cha;
" f$ e& @9 p* b! J! P' T7 H, |, Etemp=(t/101)*80;% x! Y U$ n! s% A& N
fillrectangle(x+35,y+310-(int)temp,x+75,y+310);: \1 o. v6 _3 K# c6 p
for(i=0; i<3; i++) //画坐标 high=90,length=250
& S { ]3 S( P1 L{
0 _& k5 C6 Y! @( R2 oline(x+100,y+110+100*i,x+350,y+110+100*i);
* D& f% f; a3 H) ~ oline(x+350,y+110+100*i,x+350-5,y+110-5+100*i);# G( r) P3 j$ s9 Y
line(x+350,y+110+100*i,x+350-5,y+110+5+100*i);
N- j7 z, x( W
: U& G5 r# u; Hline(x+100,y+110+100*i,x+100,y+20+100*i);
9 ]' d5 i; q; E$ g' w8 k: {/ I2 ~* lline(x+100,y+20+100*i,x+100-5,y+20+5+100*i);; I% _1 _; B- _ _
line(x+100,y+20+100*i,x+100+5,y+20+5+100*i);
) L6 i% t1 p3 d" T* H: `- kfor(j=0;j<num-1;j++)
7 V6 b/ H' l- M L/ y. o- m{
8 V4 c" s/ }/ K( b6 cline(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);
5 q/ Y4 S# m) R5 tline(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);
~$ v* g0 }& oline(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]);
7 M7 W N3 G% u1 r}
# t( I- T6 g/ d) D}
3 D$ A2 h3 A8 _; g/ ]% n F8 J}" o4 p, s! O9 X* H4 X
else if(FLAG_FIFO==1)
0 m0 j( K% }9 L{, r8 w5 t+ R) X5 g3 W/ T
x=0,y=0;' G( {% o) C( k4 D' V
for(i=0; i<num; i++)
) v2 [' x/ L, k3 f# Z{
+ R2 N9 _. i" z" ~# C5 @( X& }t = (float)info[0];6 d8 o; l( E, z
temp = (t/101)*180;$ A& C4 U. A5 h7 c
pos[0][0] = (10-num+i)*50+x+650;
: `3 w$ D4 B3 X% g* m$ B2 Apos[0][1] = y+210-(int)temp;4 g x) {: b9 f7 L7 A, r
t = (float)info[1]; P4 N% T4 F& h) B
temp = (t/101)*180;
7 H4 o+ B# B z8 h8 m9 i# |pos[1][0] = (10-num+i)*50+x+650;
5 w8 q" u; t7 G$ ]- t1 z1 _pos[1][1] = y+420-(int)temp;
' O; k: z# c' A$ _' y; I/ Ut = (float)info[2];
! p7 d) w7 x4 J* d8 i7 x6 S* stemp = (float)(t/101)*180;1 r, I9 y+ E& V/ l% O: h$ {
pos[2][0] = (10-num+i)*50+x+650;
1 I4 f+ i W. X1 i, spos[2][1] = y+630-(int)temp;( y: I7 u( I$ i: k$ N( u8 I
}+ e! N% d6 j; w4 _3 P
clearrectangle(x,y,x+1200,y+650);% M# s: S' N3 f7 e' E, x
settextstyle(40, 20, _T("楷体"));
" d4 _1 ~. v+ o6 j8 Z* A0 xouttextxy(x+50,y+50,"FCFS");: `3 b/ Y- M! K& X
outtextxy(x+280,y+20,"CPU"); //画柱状图5 e* f. {1 e7 L9 }2 F& `
outtextxy(x+285,y+20+200,"IO");
1 Z6 ^* y" |7 W3 m/ o9 ^0 J3 Z% |6 [outtextxy(x+250,y+20+400,"change");( h4 T0 r- ?( ~* b
rectangle(x+270,y+65,x+330,y+215);
" S$ W0 |5 G7 x/ zrectangle(x+270,y+265,x+330,y+415);' Q& L4 M1 w+ ]
rectangle(x+270,y+465,x+330,y+615);6 T# U! E7 w# c4 t4 U5 ]
outtextxy(x+290,y+620,"TT");4 h( e" f% O5 h' G) T- }
t = (float)com;
0 F6 o3 |1 s5 k0 q0 {' L6 Ytemp=(t/101)*150;5 J5 L; L5 a% }0 s% `
fillrectangle(x+270,y+215-(int)temp,x+330,y+215);3 p& }" w2 ^$ s
t = (float)wai;
" e: t! `+ {" B+ ytemp=(t/101)*150;
7 d/ F6 G2 M7 h; ?0 A( |fillrectangle(x+270,y+415-(int)temp,x+330,y+415);
- K: p4 v7 h( i9 ` G$ @t = (float)cha;
0 H4 q K& E/ utemp=(t/101)*150;
4 Z) g( f+ O& T5 |/ ]2 b( A: Z7 p2 G3 Vfillrectangle(x+270,y+615-(int)temp,x+330,y+615);
% p7 l7 |. j/ d# X$ w% pfor(i=0; i<3; i++) //画坐标 high=90,length=250
L" T! [# Y* y9 e( E+ t{
5 \7 h4 J* x8 t* m9 [: {# w, jline(x+650,y+210+210*i,x+1150,y+210+210*i);2 p& m! Z1 o8 c" R7 ^# i- K
line(x+1150,y+210+210*i,x+1150-10,y+210-10+210*i);
$ L b0 a; W0 L9 G2 Xline(x+1150,y+210+210*i,x+1150-10,y+210+10+210*i);5 `1 {& h9 ]: i! I! z/ `
' ]5 V6 R" S. ]4 ~0 L0 i7 ~! N; gline(x+650,y+210+210*i,x+650,y+20+210*i);
5 v+ e0 i% O4 ~+ w; d/ C% }( B+ z5 Q5 q5 xline(x+650,y+20+210*i,x+650-10,y+20+10+210*i);7 f4 j! \# ?/ s2 G
line(x+650,y+20+210*i,x+650+10,y+20+10+210*i);
2 x6 J3 @ ` Yfor(j=0;j<num-1;j++)
( s& N! L% F; \& A: M& J" p/ a{# |: x1 E( k4 o1 F9 h; G
line(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);/ `/ k, `4 x6 }* X, P
line(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);
8 x2 J' c; l% Z" S, t' i* v8 b2 jline(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]); & `) I0 G1 f% h: P- Z# S! T
}0 _7 |3 d" A$ D6 Y- W+ L( y
}' K Z9 e* i/ W. w0 l
}
, p/ K! M: w% i1 E& V8 h
2 Q& c' S! R1 e0 h, [
) E5 z5 z' s' }/ M# b( F, Jreturn 0;( l+ \+ X m( A1 x9 ~0 G& a* [3 i( A
}" c/ S2 o2 z E* X
int drawPerformance_HR(int x,int y,int memorry,int com,int wai,int cha)- J1 I! ~- {2 U7 d7 @# E. [( H
{0 f* K6 A5 K8 F) N2 h4 Q6 f
static int info[11][3],num=0;+ f0 R+ i" J" a
int i=0,j=0,pos[10][3][2];
/ m. |4 ^' s/ ?. |2 d$ h; N" [float temp,t;
( e( ~, B Z0 }. M9 _8 |info[num][0] = com;
9 E; c" C/ F4 J$ ^( _info[num][1] = wai;
2 G0 o* `! ~- F' y2 sinfo[num++][2] = cha; m. Y5 R% p7 Z1 Q: a* G
if(num>10) //存储10个点( y. q. X: I# | |! ?5 I3 m/ ^
{
1 s4 R) D0 J1 tfor(i=0 ;i<10;i++)1 Y {" z$ m& D- ^' t
{3 M) P' {; O" m
info[0] = info[i+1][0];
, x, l5 Z, A+ t5 @9 t, P( Jinfo[1] = info[i+1][1];
0 p/ t/ T+ n3 K1 ~3 minfo[2] = info[i+1][2];/ R0 `. v1 S5 p1 Q. ~9 J
}/ J+ P& k* g! B0 h: o9 j
num--;
# l) N$ N/ w, f$ m6 Y8 w}& o) j; b$ j. l g
if(FLAG_show==0)1 M. e! b) N7 m$ p
return 0;
9 j* U7 f9 t5 r( K+ Z( ofor(i=0; i<num; i++)& o. P* \2 J. f, t1 m3 `& f$ v& f
{1 |) S3 j* Z+ d, l
t = (float)info[0];
4 W& ^' Y% Y! n9 E2 h, t% [temp = (t/101)*90;
% t+ B5 g( M' j5 m U: Ppos[0][0] = (10-num+i)*25+x+100;
. x8 ]: S9 Y. ]( jpos[0][1] = y+110-(int)temp;3 _; Y u" e% J& f
t = (float)info[1];
6 H* s. h7 Y6 _$ \$ Ktemp = (t/101)*90;8 m: P# z% j6 q$ T; T
pos[1][0] = (10-num+i)*25+x+100;) a# J) Q& O: }
pos[1][1] = y+210-(int)temp;
; Q J5 g! {' [t = (float)info[2];) N1 l v& y* X! G6 R1 g* U7 X9 P
temp = (float)(t/101)*90;* Y/ j+ K. g$ _) z% l: G
pos[2][0] = (10-num+i)*25+x+100;! u3 t) {9 k) U" p9 m4 q
pos[2][1] = y+310-(int)temp;
- s0 ^7 Y h; D! n& j- D% N}$ X* M+ h. d; Q5 L+ Q2 o; D3 K
if(FLAG_FIFO+FLAG_HR+FLAG_SJF+FLAG_PF+FLAG_TT==0); a/ P" Z1 ?! u( C, f' `5 h
{
8 ?7 Q( p3 V5 l Z hclearrectangle(x,y,x+400,y+315);
% U1 D% `/ m- u/ O7 E& Asettextstyle(20, 10, _T("楷体"));
1 ^% R" r- T4 K2 G+ q7 Orectangle(x,y,x+400,y+325);
% L5 `0 D, g H5 p, w5 C/ @9 [outtextxy(x+40,y+10,"CPU"); //画柱状图
9 Z( ~4 I, o7 |4 I+ S9 P/ w3 Y7 y+ louttextxy(x+45,y+10+100,"IO");
0 c9 I) F k3 u' ]1 W0 Q" A3 `outtextxy(x+40-15,y+10+200,"change");8 C- L; j- B( `/ @9 o" s3 w
rectangle(x+35,y+30,x+75,y+110);
; ]$ t& p& x4 grectangle(x+35,y+130,x+75,y+210);+ y! R0 G: ~/ C3 z) y% q
rectangle(x+35,y+230,x+75,y+310);
' a$ a, B9 U" c( w% j6 a$ zouttextxy(x+180,y+310,"HR");
! R) O) y( w0 z! j8 r- G- A/ A! G; X- Ft = (float)com;
' g# ^! Q9 O- i# Vtemp=(t/101)*80;. D$ I* U# g! ^
fillrectangle(x+35,y+110-(int)temp,x+75,y+110);
* f0 v6 @1 l2 K1 i# }4 Kt = (float)wai;* \: E# m3 r2 Q3 h9 f* [
temp=(t/101)*80;
% ^5 W% m. l1 y4 S6 rfillrectangle(x+35,y+210-(int)temp,x+75,y+210);; P. {% F/ L9 C! r" i5 W
t = (float)cha;
2 F; Z1 b% \; n' h4 a" gtemp=(t/101)*80;" t8 N: U+ V+ j
fillrectangle(x+35,y+310-(int)temp,x+75,y+310);
' o: k$ E/ E1 I( Pfor(i=0; i<3; i++) //画坐标 high=90,length=250
" L3 G, n$ t+ Q- f( C' F{9 J2 V* Z" w+ d4 s+ y0 n
line(x+100,y+110+100*i,x+350,y+110+100*i);
& L* b1 `( v/ l, w: gline(x+350,y+110+100*i,x+350-5,y+110-5+100*i);
" |+ t7 e) m' V5 y. A, e/ gline(x+350,y+110+100*i,x+350-5,y+110+5+100*i);/ i$ f$ k+ d- L; X9 J0 ~
1 m3 _8 g! k. c! Z/ p, _+ C7 |
line(x+100,y+110+100*i,x+100,y+20+100*i);
: g T) [$ E+ Z5 K4 z! }line(x+100,y+20+100*i,x+100-5,y+20+5+100*i);
( @, @) G+ m* Dline(x+100,y+20+100*i,x+100+5,y+20+5+100*i);8 K* N. X _) O' Y0 w
for(j=0;j<num-1;j++)
- p$ c! _2 b& e5 ^{ P9 c' M' n+ d/ x
line(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);9 v y! q. y- A% |& m) [! T/ C
line(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);
) K& J" Y; k+ C# s' f" `$ Hline(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]); $ n: Z8 `6 y% a; |3 i
}
* s$ v, Z! g: f, J' f# O}7 n" [, q, y0 ^; m# R
}
! m) `* R! I! f) Yelse if(FLAG_HR==1) Z5 L. z- a8 i$ P' U* D$ t. T! G: ?
{
) N$ C1 ^- {4 c# jx=0,y=0;
/ `- t: s* q8 g$ k# K* {+ Cfor(i=0; i<num; i++)
0 A8 ]$ C; Y' r% c1 y0 p{+ K1 i7 K' i1 U( b4 R
t = (float)info[0];! K, X6 w7 @9 V" B9 ~
temp = (t/101)*180;4 M0 t7 W: F; Z) x
pos[0][0] = (10-num+i)*50+x+650;3 a. h2 ]! _2 j! w; A8 j9 @
pos[0][1] = y+210-(int)temp;
( N7 M& O- P; wt = (float)info[1];9 J- l" U- Q/ C7 q- ^7 S4 g8 J
temp = (t/101)*180;
2 {8 F y6 l- L0 c3 xpos[1][0] = (10-num+i)*50+x+650;
2 ?8 G$ L, \9 hpos[1][1] = y+420-(int)temp;
7 W5 G @% Q+ G8 u9 ct = (float)info[2];- _% j, E: X- Q. l. ?
temp = (float)(t/101)*180;) {0 I3 i% s$ V* |1 K
pos[2][0] = (10-num+i)*50+x+650;' T5 Z) J+ r2 M4 d+ @6 G
pos[2][1] = y+630-(int)temp;2 p" b; m) K8 [( i3 Y) x. \3 `5 w+ b; `
}/ F# R9 n" F% X8 }) o; y+ q5 {3 ?9 m
clearrectangle(x,y,x+1200,y+650);
{% L: U X( i- ]+ y1 |settextstyle(40, 20, _T("楷体"));+ t# k ]: l# Q0 Z7 Z) ^3 c8 M9 {
outtextxy(x+50,y+50,"HR");
; b% C4 I( X @6 uouttextxy(x+280,y+20,"CPU"); //画柱状图
, n9 F6 S* L0 r5 y3 Nouttextxy(x+285,y+20+200,"IO");0 ]$ B6 g. a$ M0 C+ f- ]7 `4 Z
outtextxy(x+250,y+20+400,"change");9 {% `8 F; s& ]$ z* O( d7 M" V( ^
rectangle(x+270,y+65,x+330,y+215);
% g6 P( D0 l- S6 \' G7 H9 \$ ^rectangle(x+270,y+265,x+330,y+415);$ z6 a2 }+ }" T: e! o4 X. f0 S
rectangle(x+270,y+465,x+330,y+615);
# o7 M. ^& K! f) uouttextxy(x+290,y+620,"TT");
3 x7 E. E& u o3 k3 V. Xt = (float)com;1 g9 o0 \& q: E
temp=(t/101)*150;# |' n( ^* u9 A7 C
fillrectangle(x+270,y+215-(int)temp,x+330,y+215);
; e5 V1 m y; D: A# k+ Wt = (float)wai;' b1 R" U5 C2 H) J6 n
temp=(t/101)*150;2 } n" m9 l! O+ L. U* o0 M" {
fillrectangle(x+270,y+415-(int)temp,x+330,y+415);
0 l& k: ~3 c' ^8 O6 ot = (float)cha;
* ~9 s( m: f/ Itemp=(t/101)*150;
2 B8 i5 W+ J$ W( ^0 P1 Dfillrectangle(x+270,y+615-(int)temp,x+330,y+615);
# h' l& t0 Q5 M% T% Q% Tfor(i=0; i<3; i++) //画坐标 high=90,length=250
1 R9 O2 L" _% o, ~; h& n{
5 U0 l! w* f' d+ z, Gline(x+650,y+210+210*i,x+1150,y+210+210*i);# U# d. \8 m7 F0 C
line(x+1150,y+210+210*i,x+1150-10,y+210-10+210*i);
" e( B/ T' q# R, @line(x+1150,y+210+210*i,x+1150-10,y+210+10+210*i);, f+ Q- j; I& i
5 w- j* ?' i( Y* c% R+ \% E
line(x+650,y+210+210*i,x+650,y+20+210*i);4 X$ p/ F* `8 G
line(x+650,y+20+210*i,x+650-10,y+20+10+210*i);; Z* L- E+ P- ]( }6 ^+ u
line(x+650,y+20+210*i,x+650+10,y+20+10+210*i);
; H; O& y1 b/ F* N% |: K6 ^' B3 sfor(j=0;j<num-1;j++)) F# S/ o, O, X e( @$ r% I# a
{
. J! ~6 @% f1 m; L& t6 D6 r Iline(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);
- A7 H3 V* I2 Z3 U) |$ l* gline(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);
( t! `: s0 V' ~" v5 Rline(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]);
" g/ V; I) u2 @6 B! J5 e: a}
! {6 I. J) k2 D, Q/ [# u/ O& y- D5 n+ O}
# d( |: b2 E" x1 M, N2 B}
, R( l; t' k% `0 S' l
% a+ E4 E9 m9 l
! F0 ?: K b5 [6 [return 0;& }" a$ i% `4 \1 n+ z4 p/ G
}
5 t% L& F- o6 {" b2 r# x9 L7 mint drawPerformance_TT(int x,int y,int memorry,int com,int wai,int cha)
9 w0 o' R& n/ ~1 ]# ]$ E{. I! d" t, D& `; [; |0 U
static int info[11][3],num=0;5 G9 _7 O4 Q. Y
int i=0,j=0,pos[10][3][2];
}) o# `4 P8 G- f# j5 F0 I' @float temp,t;
* y# o b! J9 ainfo[num][0] = com;1 D, @. a4 w' ?& d0 c
info[num][1] = wai;" y* _) q( E& B
info[num++][2] = cha;
# K7 c3 ` w% \4 B+ d3 e. zif(num>10) //存储10个点
t" P/ v, m4 U3 ^1 }4 I' ?; q{% @4 @9 i7 {: c+ u, a8 o- J
for(i=0 ;i<10;i++)
- S$ F3 h8 V. ~9 u$ `. `8 E{' J" L' e9 S& |
info[0] = info[i+1][0];
9 P! s" r" l" h1 S1 E( Iinfo[1] = info[i+1][1];
8 N$ s! M }' T1 Ninfo[2] = info[i+1][2];% s; L" C# Y: `" }
}6 N) |9 ]) s) F! I( }
num--;% u+ V0 q3 M! b. q& r: Z
}% f8 Z3 n; W( ]& Q! N
if(FLAG_show==0)" |# Q) p; j1 H( Z2 r5 a
return 0;$ \3 E2 l$ v# Z6 ~" X1 l
for(i=0; i<num; i++)
8 a/ U* r, ~6 G{8 Y2 V) N1 s* y& c
t = (float)info[0];
R" y9 \# i3 Htemp = (t/101)*90;9 u5 E$ q- b, T% D& w, z+ t1 l
pos[0][0] = (10-num+i)*25+x+100;3 d Z8 R/ A: f( z
pos[0][1] = y+110-(int)temp;
: }4 j- B" }* z# d, X# W9 G: D5 ot = (float)info[1];
" o( v L3 Z- F) r) S2 B5 ttemp = (t/101)*90;+ J& X$ B3 |. o) r L% x, @
pos[1][0] = (10-num+i)*25+x+100;
* ^( N5 J( ?+ `! s* I( Rpos[1][1] = y+210-(int)temp;
: ^0 c9 U/ F, Jt = (float)info[2];
( s w* L4 u# v% N Ntemp = (float)(t/101)*90;, O6 h0 @" O3 ~3 p- @ q. x
pos[2][0] = (10-num+i)*25+x+100;3 r9 l7 W+ k r6 p
pos[2][1] = y+310-(int)temp;
) l7 O. k! D8 m( W! c% s; B# R! L}
8 R9 ]/ y5 q6 j* Q. S: D8 @/ m* mif(FLAG_FIFO+FLAG_HR+FLAG_SJF+FLAG_PF+FLAG_TT==0)+ t/ L3 a0 a, ]& w+ [+ r
{
1 ~. W$ m7 [# I2 Mclearrectangle(x,y,x+400,y+315);( ]9 S; q& T t
settextstyle(20, 10, _T("楷体"));
! @$ q% \$ x% P2 j/ grectangle(x,y,x+400,y+325);
8 P3 V) y" L X" ~2 {- [4 F) q& wouttextxy(x+40,y+10,"CPU"); //画柱状图
& Z4 T: S4 }( z& |! r3 Aouttextxy(x+45,y+10+100,"IO");3 R" W( u# |2 q. y
outtextxy(x+40-15,y+10+200,"change");
, O0 U9 w6 G/ L) }7 ?7 R e. I8 |rectangle(x+35,y+30,x+75,y+110);
& Z% v" q' T3 t4 p1 y1 a; srectangle(x+35,y+130,x+75,y+210);
: ^0 W3 K. N$ R# brectangle(x+35,y+230,x+75,y+310);
4 v" g( C. g. w: l0 Qouttextxy(x+180,y+310,"TT");& j/ h8 d! J: I+ H! A
t = (float)com;/ ^% u% u' A: U
temp=(t/101)*80;
4 r' L4 e/ T; `% O0 _1 f- efillrectangle(x+35,y+110-(int)temp,x+75,y+110);
( d2 [2 p- J/ i2 _% v% At = (float)wai;( l7 ^( d: |" N
temp=(t/101)*80;; x9 d0 {6 F6 I: S( p
fillrectangle(x+35,y+210-(int)temp,x+75,y+210);# T' Y y& Q) r
t = (float)cha;
! V/ X+ O$ |7 t& m+ ?, Ctemp=(t/101)*80;
3 r' ?' L& b1 z* C8 F$ g7 C# P) zfillrectangle(x+35,y+310-(int)temp,x+75,y+310);6 {" ]/ ?/ K. M S2 Z
for(i=0; i<3; i++) //画坐标 high=90,length=250 j9 B5 ^/ D. |+ I. \2 t6 ~
{: | h- M) J$ f5 d. s1 R
line(x+100,y+110+100*i,x+350,y+110+100*i);
) g& ?; Z q0 R9 Q- sline(x+350,y+110+100*i,x+350-5,y+110-5+100*i);
# I; m4 y0 r4 O+ Jline(x+350,y+110+100*i,x+350-5,y+110+5+100*i);' M$ @) O7 P- n$ S
# d, a* v& C7 xline(x+100,y+110+100*i,x+100,y+20+100*i);- D* h" u+ p- Z/ y7 x
line(x+100,y+20+100*i,x+100-5,y+20+5+100*i);
& s% r# V# }4 ?4 @4 w0 |. D6 z$ aline(x+100,y+20+100*i,x+100+5,y+20+5+100*i);$ h# @) I* a$ w+ | }
for(j=0;j<num-1;j++)
* Z4 r1 a/ L" S: y' @{# U J/ j2 h9 S
line(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);
0 @) X: G" Y$ r# Gline(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);5 z* M" P4 m; S+ C6 f0 j
line(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]); * J$ p# c8 L- e5 w* F
}) J8 l$ V! G) Z# g k
}$ T( g$ a/ @3 s+ a O" |
}: b8 g. D2 @' U& L0 O
else if(FLAG_TT==1)2 \7 u" o2 N3 P4 Q
{' E4 H9 \* ~; B F& S3 X
x=0,y=0;
8 q/ ~5 N$ P/ x; z* |! T* w' C2 tfor(i=0; i<num; i++)
, F- W2 N) I% X4 {( }{( B5 i$ ~& O s
t = (float)info[0];
( V6 E" \! g9 Q( i: ]3 Ftemp = (t/101)*180;
w; I3 f% r5 f2 H, ^. }pos[0][0] = (10-num+i)*50+x+650;
, \2 z, d% ?; v; Ypos[0][1] = y+210-(int)temp;
0 P- ]* G4 ]* x1 Bt = (float)info[1];1 V r0 ~% o# q' F1 h
temp = (t/101)*180;
C3 \) {: ^! m4 p0 s* Fpos[1][0] = (10-num+i)*50+x+650;5 d/ \; c* g/ D+ U9 L3 s
pos[1][1] = y+420-(int)temp;4 M7 W/ r: D: G: e2 i
t = (float)info[2];
4 c; v' F; V8 ]7 O% d1 V1 J* ntemp = (float)(t/101)*180;* Y0 [- a! E; ^- X4 t- H
pos[2][0] = (10-num+i)*50+x+650;
+ G! K; O! c/ u1 R1 w- B Ipos[2][1] = y+630-(int)temp;' P# k7 w- X; [
}
, F1 i, |- c2 Xclearrectangle(x,y,x+1200,y+650);" M. J* k/ ^- n7 A X' t3 Y2 @- v- V
settextstyle(40, 20, _T("楷体"));
. b! d- R# J& n( S# Louttextxy(x+50,y+50,"TT");, g. z0 _+ A- U
outtextxy(x+280,y+20,"CPU"); //画柱状图
2 C! \0 _* T, R8 O! Z( |2 vouttextxy(x+285,y+20+200,"IO");1 H8 W6 g) q0 U0 x
outtextxy(x+250,y+20+400,"change");7 |" e$ G* j3 R9 p8 d) W
rectangle(x+270,y+65,x+330,y+215);+ D, q8 @: c2 A( ?3 c6 v5 @
rectangle(x+270,y+265,x+330,y+415);
5 t+ F' k+ g n' h" k5 Orectangle(x+270,y+465,x+330,y+615);
3 ~) o3 i T5 F- V6 c" Eouttextxy(x+290,y+620,"TT");; L, O2 i) z* O. L- l
t = (float)com;
# B; l* r$ _. V/ s1 itemp=(t/101)*150; H; Q, X- F5 O! S" R8 Z1 F
fillrectangle(x+270,y+215-(int)temp,x+330,y+215);
4 F3 q* C9 @" d( Zt = (float)wai;& w3 q0 G. [% K; d+ \
temp=(t/101)*150;+ t, ^% a7 W/ ^1 w) x1 C8 F$ a
fillrectangle(x+270,y+415-(int)temp,x+330,y+415);* h% E4 `1 m4 O. s5 L8 e
t = (float)cha;
6 a8 q! f) X0 N1 a# [; Utemp=(t/101)*150;! }2 X' q" E4 @4 b
fillrectangle(x+270,y+615-(int)temp,x+330,y+615);
" @9 v& y% N: ?- y0 \, x* a" Xfor(i=0; i<3; i++) //画坐标 high=90,length=250 V7 f6 o( K4 H( X1 W
{7 C \ N' r3 a& s0 F
line(x+650,y+210+210*i,x+1150,y+210+210*i);1 @' p& a: a- H! r Y2 K2 l8 r
line(x+1150,y+210+210*i,x+1150-10,y+210-10+210*i);% ~, z& { I: j, f' q$ }* N1 K& m
line(x+1150,y+210+210*i,x+1150-10,y+210+10+210*i);
; H" r' X6 b9 L! ?% y) Y
' \5 ~: X3 g) X4 Xline(x+650,y+210+210*i,x+650,y+20+210*i);. `8 ^* j; Y! t( [" }9 W
line(x+650,y+20+210*i,x+650-10,y+20+10+210*i);1 Y4 e% }7 c' |; @6 F
line(x+650,y+20+210*i,x+650+10,y+20+10+210*i);
4 }9 R0 d* w3 |+ p3 }, Nfor(j=0;j<num-1;j++) D" L: e2 D* a$ V4 _
{
! A( u1 |/ u) o: N+ ]line(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);
$ V+ i7 w i9 rline(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);& r4 }* L) N6 O; ~
line(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]); . Y+ X f$ m* h: c) G/ I
}
# z6 y5 z$ b+ D1 [}% h0 H; x" t6 }0 W9 \' j# `
}
1 _$ l# |! y- s; s+ G9 r' _7 _+ U7 @3 K3 S# K6 B0 G" N
5 o7 y8 T' d; D! B( Greturn 0;/ y" g0 p) K5 p/ T) ^
}
% a1 {" ^% B: N, |* h8 T6 @int drawPerformance_PF(int x,int y,int memorry,int com,int wai,int cha)" u' o- O7 }$ i$ {% r' {
{
& a9 F9 l. c& Q& F4 W$ f" F% }+ qstatic int info[11][3],num=0;
& H- u# N1 X8 y4 sint i=0,j=0,pos[10][3][2];. Z8 N& c, B2 S) ?" i' S
float temp,t;
- C! f$ Z- T( d% y7 P# Hinfo[num][0] = com;
% Y7 c# |! p) f" y" D& xinfo[num][1] = wai;; o3 |) _3 C/ m
info[num++][2] = cha;; g! w0 N! L6 B" v" V5 |
if(num>10) //存储10个点/ |6 {" ]) O% [5 S6 N8 X) R x
{% H# t9 C7 Y! ?# P$ U; z0 N
for(i=0 ;i<10;i++)1 k4 A* E; ], C* f1 z
{
0 B( v" Y& ^+ z5 q* Tinfo[0] = info[i+1][0];
8 Q5 L- a% x2 w, k1 t7 einfo[1] = info[i+1][1];3 |6 W7 T. O G0 a9 F
info[2] = info[i+1][2];
; X9 A. y9 N2 s}
) ]; w& `* ] d% J( W/ Vnum--;
- J8 z& u/ ]& i( z4 C6 z( ^}! l. C0 ^! Q4 g. u
if(FLAG_show==0)9 v. c; G4 L" g" E) b8 A2 Z
return 0;
+ X4 [/ q+ z$ k% ^- y$ i6 ]for(i=0; i<num; i++)
. p x6 [. I$ \. b{; L5 b: Q5 ]! H) B0 u; U
t = (float)info[0];
) _+ T9 E/ n4 Htemp = (t/101)*90;
g; x5 P. V$ |7 P4 v* ]pos[0][0] = (10-num+i)*25+x+100;4 ?0 E: D. V$ e# V
pos[0][1] = y+110-(int)temp;
; t7 Z7 G0 g, ?5 T, dt = (float)info[1];3 h, t( n, f# ?7 I( B
temp = (t/101)*90;
t5 r2 j9 g* _pos[1][0] = (10-num+i)*25+x+100;* ~# l' V) _3 o
pos[1][1] = y+210-(int)temp;
( ? d) h$ [1 w9 G" i# it = (float)info[2];
9 a) U3 w0 k9 ]$ Xtemp = (float)(t/101)*90;
# E3 V- m% d5 [! G) e2 Upos[2][0] = (10-num+i)*25+x+100;- O9 h( V! p' ~1 R- K
pos[2][1] = y+310-(int)temp;
# F3 @# O( o/ N! x: ]4 w8 I}
; `4 U* }; B' C3 Z7 |if(FLAG_FIFO+FLAG_HR+FLAG_SJF+FLAG_PF+FLAG_TT==0)
1 I: O4 [- w# v4 J& w{7 z6 V: J8 x% a. t& G5 Z2 b, z, I5 d
clearrectangle(x,y,x+400,y+315);3 u' B: Q0 [: \7 F! b( Y, _9 i: r
settextstyle(20, 10, _T("楷体"));2 z$ A- K. T0 T8 z. ?7 E
rectangle(x,y,x+400,y+325);4 f8 k& b x4 s
outtextxy(x+40,y+10,"CPU"); //画柱状图6 ~( V4 a+ Q0 b u
outtextxy(x+45,y+10+100,"IO");# L5 j3 _, ~$ i+ p; C5 M/ D* h
outtextxy(x+40-15,y+10+200,"change");& W8 R; U; Y+ X1 K( r/ n
rectangle(x+35,y+30,x+75,y+110);. I3 S2 x: T2 r. k3 b% z8 _( z3 B
rectangle(x+35,y+130,x+75,y+210);
2 n2 O7 ]8 p1 K) G. ]" Nrectangle(x+35,y+230,x+75,y+310);2 M. ?! {9 S: B3 m9 m3 \0 }
outtextxy(x+180,y+310,"PF");( J- g F# b- @ i2 t! J
t = (float)com;( U5 }, j Z( @5 o
temp=(t/101)*80;, S' [! k# ^- u% t
fillrectangle(x+35,y+110-(int)temp,x+75,y+110);1 F6 A* ^/ M: G+ Z
t = (float)wai;; @3 b1 V# Y K' ]& M, O1 m* d
temp=(t/101)*80;2 t4 A# O+ {* i1 m8 J" f% y
fillrectangle(x+35,y+210-(int)temp,x+75,y+210);9 ?1 p6 D5 |9 k- ^9 V& o
t = (float)cha;
( j% |* l* W+ T, S; `# p9 ytemp=(t/101)*80;
8 X0 d" X% w# ^1 {2 r. wfillrectangle(x+35,y+310-(int)temp,x+75,y+310);3 E: H) B& `% |# j* i6 I g! n
for(i=0; i<3; i++) //画坐标 high=90,length=250 Y5 g- c) h! t- O
{
; Z& c7 ]8 E# |# h, Wline(x+100,y+110+100*i,x+350,y+110+100*i);
: _8 C0 P0 S( \$ q$ y' Iline(x+350,y+110+100*i,x+350-5,y+110-5+100*i);
1 y5 G' G# r5 b! C1 b$ Aline(x+350,y+110+100*i,x+350-5,y+110+5+100*i);" B0 _3 l5 {* r; b( O! ?( a
a0 j1 s6 s* n" n7 ?9 i
line(x+100,y+110+100*i,x+100,y+20+100*i);
: A# t' \9 {6 F4 i6 Pline(x+100,y+20+100*i,x+100-5,y+20+5+100*i);
* V) P! O* S% T* ]line(x+100,y+20+100*i,x+100+5,y+20+5+100*i);
: ?* p2 c- y2 Z; T/ m* tfor(j=0;j<num-1;j++)
4 a, h& o) T! X; J* R/ O# M{0 L2 V8 `; a. B3 S5 V
line(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);
$ c/ e, z1 i |& i% uline(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);
8 C, q1 C% I2 } L0 G. j/ vline(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]);
' X7 N' Y; o1 @8 n" X! y}
+ ~/ Y' q& C6 |( }8 m. b# n; ^}( T# U$ N: n: P, | |. i/ q
}3 }$ K" d; S! V& S7 h) I
else if(FLAG_PF==1)
5 j8 {& t S1 H2 A) n0 P{* s( ]- a" v9 z* l
x=0,y=0;8 Q* A( M3 i, ]* `$ ~+ ]- U0 l, Q( }
for(i=0; i<num; i++)
; A! o' q4 f, k) C; S# [2 k3 i8 H{5 _2 J" x ]5 z) \$ Z
t = (float)info[0];9 ] h, D' L2 i( q* y
temp = (t/101)*180;2 p" D# r( f; }
pos[0][0] = (10-num+i)*50+x+650;6 Q8 T8 j# V# l- M2 b
pos[0][1] = y+210-(int)temp;
( y+ g$ b% o, s& }: H- Rt = (float)info[1];' O6 d& i6 u. k" g! ~
temp = (t/101)*180;9 U: E! j( C; w5 F1 _3 X
pos[1][0] = (10-num+i)*50+x+650;
. v0 V5 V4 P& G6 c: Lpos[1][1] = y+420-(int)temp; d1 z$ S+ ^' w7 I0 B8 r
t = (float)info[2];
- M* F* l8 Y9 O. r+ i) N. ~4 htemp = (float)(t/101)*180;; |! ~- Z3 G' K7 b% J
pos[2][0] = (10-num+i)*50+x+650;
) v+ i$ o4 u1 O2 k: x; P. lpos[2][1] = y+630-(int)temp;
& @1 ^: }3 N" L& K! ^}2 T2 m. y8 g+ R
clearrectangle(x,y,x+1200,y+650);+ d% b$ I' U C- p6 {, o4 U8 q
settextstyle(40, 20, _T("楷体"));
6 u- \+ E$ ]! F* }7 J+ @- n6 `/ G+ D5 o! ~) aouttextxy(x+50,y+50,"PF");
$ m) k/ B! `7 B R: K1 Couttextxy(x+280,y+20,"CPU"); //画柱状图
( A4 j- @& b. I5 C# E9 iouttextxy(x+285,y+20+200,"IO");
$ S' |8 ` u: w) H; n0 louttextxy(x+250,y+20+400,"change");) |4 v" Z* n' u5 M
rectangle(x+270,y+65,x+330,y+215);
5 y: H( c- j+ Crectangle(x+270,y+265,x+330,y+415);
" n) N0 \) z) c4 rrectangle(x+270,y+465,x+330,y+615);( v% [* w3 a* [, K8 h
outtextxy(x+290,y+620,"TT");! z, V9 w1 [+ p8 g; ^8 v# ^) O
t = (float)com;
! f- [7 `# {( jtemp=(t/101)*150;
9 L/ {6 e& b0 ?fillrectangle(x+270,y+215-(int)temp,x+330,y+215);
: U2 {0 M1 O- u( {1 zt = (float)wai;/ _2 y! ~1 i% x
temp=(t/101)*150;$ j/ \$ E/ }3 g4 S4 G
fillrectangle(x+270,y+415-(int)temp,x+330,y+415);
* F" ~9 e( v) G8 d) G) ?# y6 b) ]t = (float)cha;, J' j; N% L( k. U$ [- v
temp=(t/101)*150;
- ?, n+ _& C% D7 m* o" [/ Afillrectangle(x+270,y+615-(int)temp,x+330,y+615);
3 w j0 p5 X6 f$ y! j; Z& S; G, g8 Pfor(i=0; i<3; i++) //画坐标 high=90,length=250
! w, S/ w6 \8 P+ w- x2 h5 O2 ~{) f5 g' {+ Y+ R) |( A @
line(x+650,y+210+210*i,x+1150,y+210+210*i);0 J3 T( [$ ^0 R/ G; v( G
line(x+1150,y+210+210*i,x+1150-10,y+210-10+210*i); h4 J( v: x' P4 C# x D, A
line(x+1150,y+210+210*i,x+1150-10,y+210+10+210*i);1 S C \+ n2 M2 @+ ?# a0 C
/ s# m+ d; }* Q+ ^8 i
line(x+650,y+210+210*i,x+650,y+20+210*i);
# b, _9 q Z7 L8 }; Wline(x+650,y+20+210*i,x+650-10,y+20+10+210*i);
; @. c, w8 ~; y& b) {line(x+650,y+20+210*i,x+650+10,y+20+10+210*i);
, d8 w) ? h# b" sfor(j=0;j<num-1;j++)
- t( |7 I! K, |2 }& h8 C, F" D{1 H5 y9 H4 y4 ~* @; V
line(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);
3 P: l) i" y9 J! T/ F& jline(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);
% E: e* v2 s3 u+ Mline(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]);
2 c8 I* k0 d i- I: I+ z+ o}' }+ T+ X' ], F! P; `
}6 {1 |( c4 }& `$ @/ o7 R
}
; u5 ]5 G0 s# O9 o6 [( kreturn 0;
2 H; M2 I! h/ r9 |( i5 C! {}0 l9 n7 {3 Y6 _2 I* u7 A
int drawPerformance_SJF(int x,int y,int memorry,int com,int wai,int cha)
& _% K- e6 O, t3 r& G+ S; e! v{
K$ c! R x# \$ Zstatic int info[11][3],num=0;
2 i2 X$ w0 s, g% fint i=0,j=0,pos[10][3][2];" {" b% W4 N7 g, w4 h: p& S9 r0 O( {
float temp,t;
% j3 V' a# F) h) s8 r) Yinfo[num][0] = com;' A5 o# ~% x0 p n$ C% w
info[num][1] = wai;, K( K* k- q/ N$ X I# |
info[num++][2] = cha;
! u8 v4 |2 ?8 X% b6 _: z Kif(num>10) //存储10个点- k0 z+ W. e4 l4 _ V. ?- F
{4 C, Y6 Z% {" H$ J
for(i=0 ;i<10;i++)# J+ V% C- G, ` ^" ?
{
1 T) Y( ]8 @9 E9 j$ [% D; _: ?info[0] = info[i+1][0];! k2 Q$ v# e# L
info[1] = info[i+1][1];6 v9 z/ B: S0 c/ N1 a- ~
info[2] = info[i+1][2];1 w6 N/ ~& y( E4 f. j7 k3 B0 f/ O" B
}
% J% i, J% v5 G* g8 xnum--;; [$ H0 r4 |$ g4 w* M6 u: h3 F; B
}
$ \& i- C1 q( Eif(FLAG_show==0)/ Z* m) W# _/ y$ Z
return 0;; E! [ Z+ E- I! m, L0 `; I0 Q6 G
for(i=0; i<num; i++)
$ D/ V& D. W8 R0 g{
3 \8 e4 k# P* g' P$ s3 V3 Qt = (float)info[0];8 ? |8 d6 y9 \4 ?5 p! {
temp = (t/101)*90;
2 A9 I) v: R5 Z) E1 G! {' U# w7 Z+ X& ?pos[0][0] = (10-num+i)*25+x+100;
0 Y& X0 N! \1 n/ ]pos[0][1] = y+110-(int)temp;7 c+ P5 x! n1 ^0 q( |5 ^
t = (float)info[1];
9 P6 ^2 ]' c' ^6 |8 W2 R$ u+ ~temp = (t/101)*90;/ N8 ^6 ?5 y1 e6 w$ q1 F5 c
pos[1][0] = (10-num+i)*25+x+100;8 {' q4 j1 i6 N
pos[1][1] = y+210-(int)temp;
( `2 u/ f/ ]1 B* C- e* x: }! Zt = (float)info[2];
' t4 V6 R8 F8 i. \6 V7 e) {0 F& mtemp = (float)(t/101)*90;9 t" ~ ~* G6 t; {0 c
pos[2][0] = (10-num+i)*25+x+100;
! {. P3 w% f: V+ m/ c7 Epos[2][1] = y+310-(int)temp;1 N. g& ]$ [$ P s( _
}
: Z5 a( l+ ^. D* Q5 P- ~7 {if(FLAG_FIFO+FLAG_HR+FLAG_SJF+FLAG_PF+FLAG_TT==0)8 t R# t b& l& a
{ ! ?! Z! J' D2 w) M2 E
clearrectangle(x,y,x+400,y+315);
8 Y4 m% U. `, N3 K7 y/ ]0 Ysettextstyle(20, 10, _T("楷体"));4 Q6 Y" Y; n" X- c- G
rectangle(x,y,x+400,y+325);
1 X. r3 I& C4 qouttextxy(x+40,y+10,"CPU"); //画柱状图
6 w, k/ l2 T6 d7 o# }# n6 N5 nouttextxy(x+45,y+10+100,"IO");2 X& Y5 u: ^' s
outtextxy(x+40-15,y+10+200,"change");' n! }0 A# p8 t* n; {/ V3 G: l
rectangle(x+35,y+30,x+75,y+110);$ O3 x0 p9 a7 U! ]& h
rectangle(x+35,y+130,x+75,y+210);
; Z8 s: c. W5 h5 hrectangle(x+35,y+230,x+75,y+310);
( _! t* a# ~# ^+ }9 J, Qouttextxy(x+180,y+310,"SJF");
# ^5 j7 i) Z& ^5 ~/ |6 qt = (float)com;
, i7 ^* Q. ^, V9 v( E$ Ptemp=(t/101)*80;- H" J; ~- ]9 s6 O9 Q
fillrectangle(x+35,y+110-(int)temp,x+75,y+110);
4 C/ e& e5 e& J, a8 ht = (float)wai;
6 H' u" d @* w& A; ntemp=(t/101)*80;
8 B& F8 r7 K& [! a Kfillrectangle(x+35,y+210-(int)temp,x+75,y+210);
& ~6 o8 O- R% L9 V; k$ P- J( Kt = (float)cha;% k9 _+ F) c4 K0 Z- E/ F/ q
temp=(t/101)*80;% T0 a$ B P' P& E3 J
fillrectangle(x+35,y+310-(int)temp,x+75,y+310);
( ]; m6 H; b2 f) {for(i=0; i<3; i++) //画坐标 high=90,length=250
5 C$ ?0 g6 A' Z7 e3 l+ i4 Y{( J( |9 C: j) p
line(x+100,y+110+100*i,x+350,y+110+100*i);
" j; X; L; ~0 e& ]4 u! N+ Tline(x+350,y+110+100*i,x+350-5,y+110-5+100*i);& b) K) ?) L0 p& E, D+ ~6 [
line(x+350,y+110+100*i,x+350-5,y+110+5+100*i);3 e/ ~8 p8 X: p% |9 e. K+ p4 _& `
; C ]6 R; u, Y( j( ^& N* b0 I
line(x+100,y+110+100*i,x+100,y+20+100*i);" a( m) a6 j( c, o
line(x+100,y+20+100*i,x+100-5,y+20+5+100*i);5 E! Q6 B+ S; t6 a! P( @9 a1 H
line(x+100,y+20+100*i,x+100+5,y+20+5+100*i);1 G* D. O7 v; q4 N, {
for(j=0;j<num-1;j++)
% n, ]1 G' V/ |7 f; s% N{
1 W% y8 |1 Y* K9 H$ K( gline(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);0 w' Q2 p+ R! T# R8 P5 g# ^. V' Z
line(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);
. \* F4 e) v* Tline(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]); * q, s9 u! F, H) z
}
Y$ Y, L7 h2 v) ^: }+ f* Z}- D1 O+ g$ w- B% d6 |1 B
}; T" h* Z9 K/ i7 _2 ]
else if(FLAG_SJF==1)
+ P% w$ R% \ C+ A8 U" S{
, }* r) v" h" s& d _* nx=0,y=0;- Q- X* T3 Q5 I1 M
for(i=0; i<num; i++) M E: _; J4 k9 w
{. _7 w$ k) ^4 U3 w. C
t = (float)info[0];6 D6 P7 U' {, T' _0 s
temp = (t/101)*180;) n3 U! R+ z5 T7 l) h- J
pos[0][0] = (10-num+i)*50+x+650;9 U8 y4 r5 ] o& R) k2 x; Q& K
pos[0][1] = y+210-(int)temp;
4 e% @1 }0 @" ]: ~" ut = (float)info[1];
2 `/ \. e8 Z& U5 Btemp = (t/101)*180;- O! K' r4 W! S- ]
pos[1][0] = (10-num+i)*50+x+650;
1 R8 d5 L7 ?# O5 C- N8 y1 dpos[1][1] = y+420-(int)temp;. \2 @5 O+ K0 u0 q% I) ]' ?" Z
t = (float)info[2];+ _( G9 Z0 j! R( d" v, Z
temp = (float)(t/101)*180;3 Q* H( q' y* ]$ N) p0 H5 s
pos[2][0] = (10-num+i)*50+x+650;: s/ x. P7 {* y6 m# R& p
pos[2][1] = y+630-(int)temp;. c: `8 S* r5 G" I
}
6 S4 L1 `, d6 x: w6 [/ i" _2 jclearrectangle(x,y,x+1200,y+650);
- S$ z/ `- C# }6 G, V* usettextstyle(40, 20, _T("楷体"));
9 s5 i: v. D5 H' {. r7 routtextxy(x+50,y+50,"SJF");
, X3 m4 c4 E3 B0 E: Z+ Xouttextxy(x+280,y+20,"CPU"); //画柱状图; s& ]& L3 H; L. S3 R
outtextxy(x+285,y+20+200,"IO");
; [/ X3 E7 D. n' Souttextxy(x+250,y+20+400,"change");
) c5 [! ~ g$ mrectangle(x+270,y+65,x+330,y+215);. ~1 a3 _5 `9 ]2 F4 s1 u2 y& \4 R
rectangle(x+270,y+265,x+330,y+415);
A# C `: {; x, w6 \; h! a8 @rectangle(x+270,y+465,x+330,y+615);0 y V$ k# `" v* ~8 ~ s
outtextxy(x+290,y+620,"TT");1 P% v) T# {3 S& f' ?/ V
t = (float)com;2 A! d6 T. W, u. }9 k( K2 W
temp=(t/101)*150;
& [7 [. {. c8 r* R7 m2 N( Hfillrectangle(x+270,y+215-(int)temp,x+330,y+215);
1 D* x$ W2 f3 ?; ?" j1 J, Et = (float)wai;1 u/ q; P1 I5 {
temp=(t/101)*150;6 N3 t9 w# f# I. l. c1 x
fillrectangle(x+270,y+415-(int)temp,x+330,y+415);
) \- v. W1 d9 [$ Et = (float)cha;0 G5 p; t S- u% D2 C T" c2 G
temp=(t/101)*150;
* z" X* ]; l; e. Zfillrectangle(x+270,y+615-(int)temp,x+330,y+615);
& }& ~5 ?& b g7 m0 i; tfor(i=0; i<3; i++) //画坐标 high=90,length=2509 K' l. N n; N* s$ v" O5 x
{
% O0 E% k; V% W- F- G5 Q# F& V! N$ u7 g0 cline(x+650,y+210+210*i,x+1150,y+210+210*i);
; W z2 h; u/ y+ S4 e# ?' Wline(x+1150,y+210+210*i,x+1150-10,y+210-10+210*i);7 F# N) ?; O, e0 @
line(x+1150,y+210+210*i,x+1150-10,y+210+10+210*i);
, k; q) Y/ M3 _6 G& z
& r4 U: o$ F: eline(x+650,y+210+210*i,x+650,y+20+210*i);; {' V3 ~; W1 c, c1 W: V4 Q: t0 u( I
line(x+650,y+20+210*i,x+650-10,y+20+10+210*i);
7 q4 L" S) U3 F! S4 c* F; T+ wline(x+650,y+20+210*i,x+650+10,y+20+10+210*i);- @1 {3 b6 B/ X4 R$ z1 V
for(j=0;j<num-1;j++)
- O' p5 _) \& a4 ]: _ I4 d{6 K4 ]* b$ `0 j$ W. m
line(pos[j][0][0],pos[j][0][1],pos[j+1][0][0],pos[j+1][0][1]);
4 P9 X& y3 G+ z( H" b9 n% Jline(pos[j][1][0],pos[j][1][1],pos[j+1][1][0],pos[j+1][1][1]);/ W6 _+ T2 Y( Z# p- }3 }+ E
line(pos[j][2][0],pos[j][2][1],pos[j+1][2][0],pos[j+1][2][1]); ' P% ^' i6 a) F# ?: u5 q7 U
}
, l+ o! q P% {% u} m8 s* \2 v v, D6 C; ]
}# A$ m( T3 b- d9 z1 Y
return 0;
& l) ^. [* K3 A% p}
# J* T+ N4 O$ v3 J3 Nint High_response_ratio_dispatch(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw)/ t* j2 E; P3 i& d
{
8 d0 a" p$ {2 z9 lstatic int compute=0,waitio=0,change=0;
1 J+ w$ R; G8 X: [* Qstatic int computeLast=0,waitioLast=0,changeLast=0;
6 D5 b( b1 I$ Y7 K: _8 g Rint i=0;
# s' f/ K# D' `" A Wif(draw==1)
8 ^- ~( n9 B2 U9 Q+ D" Y. ]{
0 L8 _/ z# k0 x: P//printf("%d %d %d\n",compute-computeLast,waitio-waitioLast,change-changeLast);
4 B, r6 ^3 m: @5 R) t xdrawPerformance_HR(400,325,MAX_MEMORY-(*spareMemory),compute-computeLast,waitio-waitioLast,change-changeLast);5 F7 l- Y% X5 [
computeLast=compute;1 K# g, h% z3 b; C
waitioLast=waitio;3 A% ]) m% Q! I( j5 o
changeLast=change;" ]9 w* O7 x9 p1 D" V. Y& i
}$ t$ l5 c1 W- v
if((* memory).p[0].flag==ready)
6 C! F' B0 N" g(* memory).p[0].flag=computing;9 }$ j& L6 U7 @0 _! a0 L" V
if((* memory).p[0].computeNum>0&&(* memory).p[0].flag==computing)3 ~) ? N! @0 J$ l, _/ F! N
{( h5 x4 a$ G5 |. b& j4 r7 M
i=(*memory).p[0].computeNum;- I6 s: e, J; @
if(--((*memory).p[0].computeClock[i-1])<=0)// one compute tase is completed
" B/ O6 b7 J+ V{
. T( |* j; A0 ^' X( \(*memory).p[0].flag=IO_waiting;# ~& d! d7 \2 B8 \, ~$ S
(*memory).p[0].computeNum--;
$ C1 Z0 x6 s# E. s" [* V- q- D+ T! Gchange += exchange_IO_Compute;
# s8 U/ r% `7 N+ z! rcompute++;
2 o8 d( A, e5 u P ~3 m}0 T: P" l }$ w- `7 h
else
4 q* E/ E8 X) c5 ]6 W9 m: w{
; N3 S4 A! {; M# q2 rcompute++;: Y2 x- [4 R& q: U
}/ o' o6 X4 x# I% o
}: L& O+ k `, L9 h
else if((* memory).p[0].ioNum>0&&(* memory).p[0].flag==IO_waiting)
8 C+ n' k2 q& R9 K G! Q! j5 m{
( w; f( v( J( j2 r, B
& o/ i2 `* L0 I7 Q1 m) g( f7 Ci=(*memory).p[0].ioNum;7 e c O% E" t0 ^0 {
if(--((*memory).p[0].ioClock[i-1])<=0)// one io tase is completed) h" n* V4 Z; n* X6 |
{
, @, p9 j! n- z(*memory).p[0].flag=computing;" u N5 s* q! P* [& X2 @
(*memory).p[0].ioNum--;
2 @$ u6 b2 W0 S" C3 F( ]change += exchange_IO_Compute;
, i" f) S+ X7 {& S" `) H0 i* ]waitio++;
& v& [% z) x2 `; B2 G1 R}7 K) B) O& u7 X
else; X7 R! M. e- J" k
{' |% f. \8 }% B1 r6 D: f5 ?! F p
waitio++;
2 q; L6 n- ?* s) C- ?1 |5 S( l" m4 q}
# A/ e3 w# n7 ~7 o$ \- R4 s}
4 F9 l! r6 s5 c" Welse if((* memory).p[0].ioNum>0&&(* memory).p[0].flag==computing)
1 X3 f9 r, l, n7 y9 q{
C& T* G( m4 D' p8 m$ C& |(* memory).p[0].flag=IO_waiting;1 Y" w* \, {$ D" |" j
change += exchange_IO_Compute;. E. |* T% V) g) J2 l& f. g3 u
}. U4 U3 X8 m7 c% T# X
else if((* memory).p[0].computeNum>0&&(* memory).p[0].flag==IO_waiting)$ O) V* ]& u5 B3 k
{
8 H) P9 |% T& `; R7 |/ m(* memory).p[0].flag=computing;4 q3 q7 e# R4 V
change += exchange_IO_Compute;
# ] F% ?1 @; f) n' ^8 {) \}
) l. D$ C' c2 l; C$ W- a Bif((* memory).p[0].computeNum<=0&&(* memory).p[0].ioNum<=0) //一个作业已经完成
- S& t: ~2 ~7 f# l6 t, t{
. A6 f6 U& x d(*save) = (PCI*)malloc(sizeof(PCI));
/ w7 D$ U% d# A; C8 o1 w+ H(*save)->next = NULL;
& N3 ?: k9 V$ Q* L: j p3 i(*save)->processID = (*memory).p[0].processID;3 l* C, S, `( X" Y" g# `
(*save)->comeingTime = (*memory).p[0].produceTime;" f3 t' Z# W1 H# X; t: b2 s
(*save)->askMemory = (*memory).p[0].askMemory;
8 f3 Z" f, g! j0 t6 I, o(*save)->compute = compute;9 w, _' {- B( i! r7 \( y
(*save)->waitio = waitio;
# U' p1 c, c6 h o9 }(*save)->exchange = change;0 g6 t" Y! E& r& ~" I+ }, `1 c
(*save)->completedTime = systemClock;
1 ]5 C. ]7 M: r; b% K, w(*save)->runningTime = (*memory).p[0].runningTime;2 u( ~0 d# ~# r# G2 c" p+ W4 L4 J
*spareMemory = MAX_MEMORY; //*spareMemory + (*memory).p[0].askMemory;4 O1 Y: w1 g5 K0 i5 |7 H
compute=waitio=change=0;
, l1 Y4 O! P4 p. i$ D, AcomputeLast=waitioLast=changeLast=0;
9 }$ n' ^. X, H* D7 Z! V- vHigh_response_ratio_s_to_m(&(*storage),&(* memory),&(*spareMemory),1,1);
* z# L- P( Y8 j4 cchange += exchange_process;* y* @; I/ b# W4 W
return task_completed;3 P' E& y' @5 k
}
/ w. q1 C% c" [4 helse
9 [4 x+ S2 ], lreturn task_not_completed;1 X3 `, c7 q7 v, n
}# T4 l: a# {# o7 t: O+ V
int High_response_ratio_s_to_m(processPool *storage,processPool* memory,int *spareMemory,int flag,int dispatch) q% z$ [8 Q+ \. w- ?: k9 S
{, @7 `' h5 F" W2 @
static int waitTime[initProcessNum],i=0,j=0;2 t. A2 k) H/ |( G/ I" z
static double HR_ratio[initProcessNum];
0 M. }; t, k7 P( b) Qif(flag==0) //初始化数组
5 j1 w/ c- k6 \1 m9 M: }- {{, d& [% ?8 [8 o# B
for(i=0; i<initProcessNum; i++)
* I3 G' t( I2 |, [" O# c{. J" N( W7 G- J* h: U6 h6 c' O
waitTime=0;
# I+ P) u8 @. v3 X9 e0 ~HR_ratio=1;
9 @5 j( s) R q' ]1 D7 ]. x8 j, k}
% v, f m( X4 q& {}% j" h) Z% Z/ {$ X" C: r' M
for(i=0; i<(*storage).proNum; i++) //等待时间增加,重置响应比
# j% [1 Y6 ]9 ~7 |- W{0 c: S( x& c" `2 A/ g! y
waitTime++;
! u* c( l! m: L7 I( F; DHR_ratio = (waitTime+(*storage).p.computeTime+(*storage).p.ioTime)/((*storage).p.computeTime+(*storage).p.ioTime);! k) [' }% @: G" A. J+ t) o8 H
if(HR_ratio > HR_ratio[j]): T, O1 Z7 K/ V0 ] ` [
j = i;
) `6 \" ^* i6 M/ F) c}
3 k$ |9 }$ Z; N) }( N& H% fif(dispatch==1) //需要调度一个进程到内存中执行
3 r$ `) }1 e$ v5 S{$ m9 Y) c' s, s- D( b1 Y$ \4 J
if((*storage).p[j].askMemory < *spareMemory)( H4 J; l, w5 `1 D/ b
{
6 d* n' L6 ~( D(*memory).p[0].askMemory = (*storage).p[j].askMemory;+ r5 C* t- Y3 X3 p9 x9 H, R k" R2 M
(*memory).p[0].comeingTime = (*storage).p[j].comeingTime;
2 ~/ Q7 T7 B' N) i3 P o6 R(*memory).p[0].computeNum = (*storage).p[j].computeNum;
. m6 P; V h8 y/ s: B2 n(*memory).p[0].ioNum = (*storage).p[j].ioNum;
. A2 N% b% @3 b8 V$ V* d0 T(*memory).p[0].processID = (*storage).p[j].processID;
" \0 R1 Q; y- r* s7 ^7 T0 ^7 Y# u(*memory).p[0].flag = (*storage).p[j].flag;
% a2 E6 x/ w% ^* R: F; A0 L' Z(*memory).p[0].ioTime = (*storage).p[j].ioTime;
* Z& q. q% ~7 w) q$ o(*memory).p[0].computeTime = (*storage).p[j].computeTime;5 a7 L7 l% h& R, l9 e; ?
(*memory).p[0].runningTime = systemClock;
O. N) z3 ^! N( ]- _6 R+ |" h(*memory).p[0].produceTime = (*storage).p[j].produceTime;
) }" k( b0 B) K. hfor(i=0; i<(*memory).p[0].ioNum; i++)" v) m& H4 g* R% Y. @& |" ?
(*memory).p[0].ioClock = (*storage).p[j].ioClock;
f, v) z+ U! f* ifor(i=0; i<(*memory).p[0].computeNum; i++)
( y9 Y% k' q* M5 |9 T( t6 M(*memory).p[0].computeClock = (*storage).p[j].computeClock;
w* a( i+ Q' \4 H. m, W3 u) }' m(*memory).proNum=1;
/ u2 P( I; N7 ~! q*spareMemory = *spareMemory - (*memory).p[j].askMemory;
4 l: {5 v3 W! j, \' e. Yproduce_one_task(&(*storage),j,ID_FIFO++); //调入一个进程后,再在进程池中新生成一个进程% L8 \: u0 j! r, b8 v+ J
(*storage).p[j].produceTime = systemClock;8 e& H3 d/ A! l7 {2 e. w+ c: R
MAX_COMING_TIME = (*storage).p[j].comeingTime;+ t+ G! n" \4 Q
waitTime[j] = 0;+ c. }( G/ x" m7 L" u3 P) N, |/ J
HR_ratio[j] = 1;3 x0 Z- z/ S- e Q- ?
}
( A( t1 o- Z2 zelse2 m8 a4 e! N) r( u. n
{& }5 q, W7 H _) P. |% u$ }
printf("A process ask for a memory overed the system capacity\n ");; ^+ h" W; w: ^6 z3 Z. N4 v0 M
exit(1);. i3 ^% p$ g( C& g! v, v! s
}
. Q/ e$ J/ P) [; f}
& X* a B# R# P! R; g! dreturn 0;$ c" J: _" }% K- s6 W6 t" \1 C3 c
}4 B. x9 u0 B6 b* c2 B" J
int PriorityDispatch(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw)# _" M9 I0 q9 y* [
{1 a( L2 x9 l7 V- i [* P/ T
static int compute=0,waitio=0,change=0;9 A/ G7 H4 l. ?0 A" C" b7 Q
static int computeLast=0,waitioLast=0,changeLast=0;
) e& H5 ?4 p F5 {int i=0;6 v# b4 [! u+ {$ G: j: V0 _
if(draw==1)
5 S8 B9 g- @0 r. R& b ^; g; L{0 C8 c' U- X3 P5 _ V
//printf("%d %d %d\n",compute-computeLast,waitio-waitioLast,change-changeLast);5 q8 `/ D. s$ r; {, i
drawPerformance_PF(800,0,MAX_MEMORY-(*spareMemory),compute-computeLast,waitio-waitioLast,change-changeLast);
0 l( r$ ~/ _$ B5 `* e" W3 N' J7 N( W' e
( t' |8 M1 _7 N7 w% T2 m( kcomputeLast=compute;7 R/ T2 V0 K' l
waitioLast=waitio;
3 ^; A( i( @# Q1 }2 h, P1 k6 vchangeLast=change;
: a- z0 Y. T9 u* Q# D} h: U6 ]) M3 {, d
if((* memory).p[0].flag==ready)7 I9 Y/ r) s G
(* memory).p[0].flag=computing;2 Q) ?) }( M$ G+ A& O( k0 t
if((* memory).p[0].computeNum>0&&(* memory).p[0].flag==computing)
( g5 o9 S! H& I% I- c5 y- W0 r{
) I+ }6 X7 l0 C8 _% F; j9 f9 v* x6 Mi=(*memory).p[0].computeNum;
' [. F/ L" p8 w( `if(--((*memory).p[0].computeClock[i-1])<=0)// one compute tase is completed
& A) `9 q: }" h; x* V; D. N{* u9 L. L) s+ `( C
(*memory).p[0].flag=IO_waiting;
. m: x4 e) B; a: D+ w: W2 l" p(*memory).p[0].computeNum--;
2 a$ s) |6 A$ D9 [+ \change += exchange_IO_Compute;
) e! ~4 }2 u- ncompute++;! u( x: T0 ~- F6 n( y# e
}% n% {9 i. S' W" @! G4 @
else A4 C8 X. A6 K3 f/ n
{
/ T" H, M4 Y: H% A- T! k& hcompute++;
, U8 W( W* U& t1 \; W}
/ n" A# X7 ?7 c% G: s9 z! p; N}
. S+ W* }6 S; D' |else if((* memory).p[0].ioNum>0&&(* memory).p[0].flag==IO_waiting)" f4 ?6 M1 C' k v3 m
{- V: |1 [1 F, u% b
6 t, G( B( N9 }* X" h" xi=(*memory).p[0].ioNum;
+ H" t. h) a s: \if(--((*memory).p[0].ioClock[i-1])<=0)// one io tase is completed* Y' r8 k- h5 W. G% O" [
{: h7 _; `/ P6 A. X
(*memory).p[0].flag=computing;4 e6 d8 q; ~5 N* A" F' K
(*memory).p[0].ioNum--;
' I/ Y1 S, h* p( P+ Xchange += exchange_IO_Compute;
/ d4 Q4 u5 c6 T3 gwaitio++;/ U+ A2 F; }1 `3 e( U
} V T" p6 s, Y7 c' a
else
. a, H y! U! p{
5 j) J# h6 p' f1 {) M* pwaitio++;' i$ E6 |2 I" m/ k8 T% P0 ~& s5 R3 P
}
* t# z2 c3 k; h" L8 ^}* }) x$ |4 p, b/ V' P2 x9 ]5 o
else if((* memory).p[0].ioNum>0&&(* memory).p[0].flag==computing)4 E- B: u- S# J d: n
{6 W, U& u" d9 u6 G
(* memory).p[0].flag=IO_waiting;
& o! ^$ _$ ~4 q7 Lchange += exchange_IO_Compute;% G+ J' {7 j. s! z5 c t
}
8 K2 |/ T8 I0 o: O. q/ Kelse if((* memory).p[0].computeNum>0&&(* memory).p[0].flag==IO_waiting): R! v' S0 Z6 [9 d- D
{
- l. `" J1 b: x w(* memory).p[0].flag=computing;
3 o9 D# }( X2 ?: p% {change += exchange_IO_Compute;
% u8 ^' z$ A# \}+ A. r" D+ D1 ]. ?7 B3 E
if((* memory).p[0].computeNum<=0&&(* memory).p[0].ioNum<=0) //一个作业已经完成6 w; D h' u, B1 B- t7 A9 ` P
{
7 e" X* f) w. D! k. K# ]( O% w(*save) = (PCI*)malloc(sizeof(PCI));# V* }' x& B9 r! q$ Q
(*save)->next = NULL;) v% Q/ A: f5 t# B6 }* D, m
(*save)->processID = (*memory).p[0].processID;
j& [# C. h& T5 t3 E. U9 \3 ^; Z2 w(*save)->comeingTime = (*memory).p[0].produceTime;5 l8 `2 l. P' y! t
(*save)->askMemory = (*memory).p[0].askMemory;
+ T# j" ^& p; \(*save)->compute = compute;1 \* r! R% T4 B* s* E- t
(*save)->waitio = waitio;
4 @# \3 @. c; @+ e! K3 ^: d9 g(*save)->exchange = change;1 S. u# c! w; E6 L* u
(*save)->completedTime = systemClock;8 {# }) W/ ` ^. p {2 C, a/ d. P
(*save)->runningTime = (*memory).p[0].runningTime;
5 ^/ J1 o! R4 r& k$ ^*spareMemory = MAX_MEMORY; //*spareMemory + (*memory).p[0].askMemory;6 a9 f# K: k1 W. C* y+ v P- k5 e
compute=waitio=change=0;( ^& b; y+ u& A) T6 A
computeLast=waitioLast=changeLast=0;1 K1 s" J' Y2 o# A' d, Z
Priority_storage_to_memory(&(*storage),&(* memory),&(*spareMemory));! t2 v$ L4 v4 Q# V9 h
change += exchange_process;& F( k) h, m9 ~' g
return task_completed;0 L9 v6 x( x$ Z7 U) e
}
/ u5 f8 C9 D/ z' V4 eelse, _. Y! n F- Y7 U% U6 R
return task_not_completed;
9 }& Z+ h1 Z. \" Y7 A. C}, i6 I. a0 @6 Z& B; f& p1 @
int Priority_storage_to_memory(processPool *storage,processPool* memory,int *spareMemory). a8 l6 Y+ @7 H% Z
{$ i* F' }5 f, Z3 p. M7 q
int priorityNum[initProcessNum],i=0,j=0;
( a' t# A0 }5 L# X; g% cdouble temp=0;6 p) [1 L, Y! Z7 @7 A- G0 q9 ^+ k
for(i=0; i<(*storage).proNum; i++) // setting priority to each process# h9 o' W7 `/ I
{$ F" {$ t" b! H$ @0 u* i" _
temp = (*storage).p.computeTime/(*storage).p.ioTime;
% x! F: ]: z% S+ T6 _if(temp > 0.8)6 n U8 W7 N9 x: y9 Y1 q
priorityNum = 6;
; j& U" d: e; v4 Melse if(temp > 0.7)
! ]+ T9 Q+ R5 f9 OpriorityNum = 5;8 h; u, I; H$ a
else if(temp > 0.6)! g; ~9 S1 v# y0 [/ E( o
priorityNum = 4;. B1 F, q1 i; z* ]! e
else if(temp > 0.5)
" s. i! G# p9 [' ?* X3 lpriorityNum = 3;: H2 }2 b) h6 U+ y
else if(temp > 0.4)
) @3 L: L1 x( Z) ~priorityNum = 2;9 m0 m* O6 Y$ K8 H
else
5 Y8 K4 d4 x) f/ R K$ m5 S4 R! _priorityNum = 1;# g- v! X" ~9 d5 k) f
if(priorityNum[j] < priorityNum)- }+ S/ W+ { `5 x% _
j = i;; ^! ]6 H9 I) S& ~
}
6 u2 N3 ^& ]3 N, J9 P5 }4 z$ X2 tif((*storage).p[j].askMemory < *spareMemory)) _, S) ~3 q; d
{
! j4 M: h9 w" @: m9 m- H0 K(*memory).p[0].askMemory = (*storage).p[j].askMemory;% m0 f' D5 b/ A3 i' L
(*memory).p[0].comeingTime = (*storage).p[j].comeingTime;4 n/ E! @! f% o
(*memory).p[0].computeNum = (*storage).p[j].computeNum;
2 B- J8 X/ i: @(*memory).p[0].ioNum = (*storage).p[j].ioNum;
5 s+ {8 l$ o; y0 t2 g(*memory).p[0].processID = (*storage).p[j].processID;
! p3 D m5 S0 m(*memory).p[0].flag = (*storage).p[j].flag;
, ^. C3 z& R- ^. I( t f& ]! p+ I(*memory).p[0].ioTime = (*storage).p[j].ioTime;% O$ [3 g% Q/ d. n
(*memory).p[0].computeTime = (*storage).p[j].computeTime;
7 z: e( _, I; ?6 l- d) ?+ N" v* C(*memory).p[0].runningTime = systemClock;9 S( {6 b5 Z W) n1 L. ]7 B
(*memory).p[0].produceTime = (*storage).p[j].produceTime;
6 e9 _5 I3 C7 G* {: Efor(i=0; i<(*memory).p[0].ioNum; i++)
1 M8 _8 V! y/ h( t(*memory).p[0].ioClock = (*storage).p[j].ioClock;
# m3 g, T4 j: f9 R& w4 C0 ifor(i=0; i<(*memory).p[0].computeNum; i++)! Y9 t7 t' F8 K* F% F
(*memory).p[0].computeClock = (*storage).p[j].computeClock;
6 q4 }1 ?/ N5 _% M) e2 t9 o(*memory).proNum=1;
* O2 ?5 Y4 p; M9 \$ J; I7 _2 b9 m*spareMemory = *spareMemory - (*memory).p[j].askMemory;$ Q. U1 p( j) ?$ T2 R
produce_one_task(&(*storage),j,ID_FIFO++); //调入一个进程后,再在进程池中新生成一个进程
$ z1 {" h) @5 h& s) n0 OMAX_COMING_TIME = (*storage).p[j].comeingTime;! d# @) ]; Q. J1 {% z% Z9 U
}
' {6 w: F& T6 W9 c: {) J, h! zelse/ y/ b3 ~% I* A8 ^9 f8 L+ q/ [; R+ N
{4 }4 w' k' b* C+ q
printf("A process ask for a memory overed the system capacity\n ");
: v" u1 m5 \8 Gexit(1);' p: @0 s h9 c. r
}9 C3 D2 N: }2 k- F
return 0;' }9 G) p. z* h6 }
}
- k% @ t7 F/ t) K q3 f5 V7 [# ?2 Qint ShortJobFirst(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw)
4 m! L* ~. }5 c9 y3 {6 \( o" i{/ C" J9 C$ a+ P) {
static int compute=0,waitio=0,change=0;
8 i1 H' ?8 V) b9 t5 vstatic int computeLast=0,waitioLast=0,changeLast=0;. @+ f( f5 `) z, ~+ x
int i=0;, g6 `/ ]% o4 a& ]7 i* }
if(draw==1)% r. z: d A% S2 ]& f2 K
{; B1 O3 C, N0 D: s: z9 ^, x5 D& F* t
//printf("%d %d %d\n",compute-computeLast,waitio-waitioLast,change-changeLast);8 T- V' k- U! \2 f
drawPerformance_SJF(0,325,MAX_MEMORY-(*spareMemory),compute-computeLast,waitio-waitioLast,change-changeLast);
0 |7 R$ t+ b. Z. u/ H$ x, \
$ |: H$ s* N6 T- |, B# Y( K
" U% a# o5 u8 {+ scomputeLast=compute;
+ @: A/ W0 ]8 gwaitioLast=waitio;
# F/ o U# @' q0 HchangeLast=change;* i8 t1 H- }) p \
}
+ Q# A4 Y; Q. A% r" E3 Q0 e2 Bif((* memory).p[0].flag==ready)$ c. s2 M& {& R) g
(* memory).p[0].flag=computing;
9 n5 J4 B- ]% a$ \) L" tif((* memory).p[0].computeNum>0&&(* memory).p[0].flag==computing)2 I# F5 Z0 M) Q( s' u; H
{
1 p0 e# u8 Y. e% k3 R4 f+ Z* |7 Xi=(*memory).p[0].computeNum;
. \* j3 @7 _2 z5 Jif(--((*memory).p[0].computeClock[i-1])<=0)// one compute tase is completed4 D! `2 D% ?& K: z) `
{" {" }6 E: H$ E: B7 X0 x: Q
(*memory).p[0].flag=IO_waiting;6 I! d; u* ]( q9 n6 c# l+ m
(*memory).p[0].computeNum--;
* I" F, o( Y# C/ vchange += exchange_IO_Compute;
! q+ {1 b6 j9 U4 a& s. {( y# a1 X4 Tcompute++;
% a) B S1 O% W9 k+ }' m* D: [1 j. k" T}
" }* f3 \# ~8 U0 c$ v @, r9 z, Lelse
4 O6 r+ R8 K7 i3 M( I4 L{! z- l& q; c; o- @
compute++;! K# t7 [, i+ A* v* S
}
3 @$ G/ H* p2 \$ v1 a}
% I; C& L$ w8 I9 E5 R3 celse if((* memory).p[0].ioNum>0&&(* memory).p[0].flag==IO_waiting)
$ e1 {9 v9 {6 ~7 p* |, ^{
9 a9 {; A( a6 y" ], R; x/ b: y0 y9 I. {$ V
i=(*memory).p[0].ioNum;: w9 @# [! o! v: b3 z* t3 B5 L
if(--((*memory).p[0].ioClock[i-1])<=0)// one io tase is completed
% g/ K, X% \ w7 Q- Y{0 z f H3 z R( B
(*memory).p[0].flag=computing;
. |. x& f2 D" S2 f8 W5 ~% N) e(*memory).p[0].ioNum--;
2 E) H. p7 b9 ]5 f3 ?6 {change += exchange_IO_Compute;
! Q: R2 ?4 Z% Wwaitio++;
5 l; l5 g( b( N! K, D: f8 o}
! j) _! [, Q/ R2 h: i$ [: B5 ~& Velse
* K6 Q9 a8 t3 g. ?{
Z0 D) j& D& X0 u, U& Bwaitio++;
& ^2 y& ~7 U3 W0 }2 h0 ^; ]}
' b b$ W4 [% z8 F}! w# ~. k; U! ~$ ^4 k. Q
else if((* memory).p[0].ioNum>0&&(* memory).p[0].flag==computing)8 Z+ G" z1 A! G _' s
{& t6 N2 [" Z, n% R3 v
(* memory).p[0].flag=IO_waiting;- X! U$ ~3 x; r7 X% W
change += exchange_IO_Compute;+ v6 a6 x6 }9 ?2 T7 m6 i/ u8 F4 Z
}( ]5 @' s2 f3 y4 M& q' ^5 ~8 t
else if((* memory).p[0].computeNum>0&&(* memory).p[0].flag==IO_waiting)
9 y: L4 Y+ q0 V ^{
( V: e# w. }+ E7 G+ Q(* memory).p[0].flag=computing;5 ~3 {/ d8 F& _/ Q
change += exchange_IO_Compute;
& Y/ ^7 o0 d* z}+ w! ^: Q" k. L- \- @
if((* memory).p[0].computeNum<=0&&(* memory).p[0].ioNum<=0) //一个作业已经完成
~0 }" Q8 n7 i8 B9 Z0 n$ r{ m5 Z' k% j: f/ K2 ?$ b# R
(*save) = (PCI*)malloc(sizeof(PCI));
% I( [, V- ~: @7 h(*save)->next = NULL;! L. ?. k# [. {6 t- k# B' l
(*save)->processID = (*memory).p[0].processID;) R# M, P0 L/ L' y2 }
(*save)->comeingTime = (*memory).p[0].produceTime;1 K2 H o5 c. I! m# i1 A4 u6 w" w
(*save)->askMemory = (*memory).p[0].askMemory;
- V( ]5 _5 g- k7 W4 N0 i(*save)->compute = compute;6 s4 }3 Q/ b: R/ A( ]
(*save)->waitio = waitio;
6 r: K! C% i) F$ E' Z3 p- F(*save)->exchange = change;
) o5 a! j' q3 M. H: ]$ [9 F(*save)->completedTime = systemClock;0 O& p/ @7 B7 D; _
(*save)->runningTime = (*memory).p[0].runningTime;! b' k6 w/ M3 o1 [) s4 f
*spareMemory = MAX_MEMORY;//*spareMemory + (*memory).p[0].askMemory;( U) d6 V, E% W$ @8 o& ~
compute=waitio=change=0; d" v# P3 g# J- S3 B
computeLast=waitioLast=changeLast=0;& |. w/ {: V5 U* @ O2 F3 Q3 O5 @
SJF_storage_to_memory(&(*storage),&(* memory),&(*spareMemory));4 v% w) p$ T, X; }: I" X
change += exchange_process;- g) l, h" f) B- [) }
return task_completed;
7 N+ S* M5 m4 u) r1 Q1 d% Z! G7 N}
# W1 r+ t! E: g) P9 N: Gelse
# v# y3 v6 F, j" S1 t4 Z: zreturn task_not_completed;
7 ]3 @5 n/ x' N# l; z+ A} l4 ?' G1 ^4 T+ `3 s
int SJF_storage_to_memory(processPool *storage,processPool* memory,int *spareMemory)
) l [' b' m/ R0 n{
% v W+ |2 L" i2 `5 e% V0 }! J0 [int i=0,j=0;' ?7 M5 i5 C) Y4 ~( T
for(i=1; i<(*storage).proNum; i++)
+ f' `; n) c6 z! ]{2 I' s+ V7 t" W1 ~7 d* O2 u, ?
if(((*storage).p.computeTime+(*storage).p.ioTime)<((*storage).p[j].computeTime+(*storage).p[j].ioTime))7 |0 M! }8 G2 w9 I3 a
j=i;; I% N: c& g8 S% O5 A
}$ J6 a4 U1 L& q6 }! p$ I
if((*storage).p[j].askMemory > *spareMemory)
/ M1 \, W( f7 t( ]1 O5 @/ k{
" b# _& \$ v& {2 @5 R' oprintf("The memory asked is overflowed than the system memory.\n");5 z$ \9 V7 v, J
exit(0);
& S0 G( S; Q+ z}4 K8 [3 H: v) l! A# `) M5 r
else- t" c" n/ y. w5 G; `
{
# ]% `0 G; Y3 D1 j+ h0 s v0 w(*memory).p[0].askMemory = (*storage).p[j].askMemory;
+ V" \; p9 z3 g(*memory).p[0].comeingTime = (*storage).p[j].comeingTime;; _" }) @4 ^6 F2 o+ X& P# ~( Q7 q
(*memory).p[0].computeNum = (*storage).p[j].computeNum;
- ^3 w/ y- H5 r7 j' N(*memory).p[0].ioNum = (*storage).p[j].ioNum;
; l) ?8 [$ r' d" W) F(*memory).p[0].processID = (*storage).p[j].processID;
$ }0 {% s3 m* e. ?% _5 k' ^9 s(*memory).p[0].flag = (*storage).p[j].flag;
5 V) O) t8 C$ {(*memory).p[0].ioTime = (*storage).p[j].ioTime;; c1 z4 b/ |( j5 K) p
(*memory).p[0].computeTime = (*storage).p[j].computeTime;2 R3 `9 X& |$ S% `, i7 _$ j5 K1 ]
(*memory).p[0].runningTime = systemClock;
8 |# ?8 x" E' k2 L# y! ?! C- b' s(*memory).p[0].produceTime = (*storage).p[j].produceTime;: x2 R' t8 g0 u+ t3 I) H: n- k( U6 J
for(i=0; i<(*memory).p[0].ioNum; i++) _) S6 K2 ^8 B, Q. B
(*memory).p[0].ioClock = (*storage).p[j].ioClock;
. ?3 m. [/ a+ O1 ?/ C* ?# I; {; [4 l, hfor(i=0; i<(*memory).p[0].computeNum; i++)
7 T. k/ s4 H* s( J& C3 v(*memory).p[0].computeClock = (*storage).p[j].computeClock;
+ d- L- H0 C0 y" @8 ~4 H# v( a(*memory).proNum=1;
3 e1 P n0 N) u: n3 ~# p5 o*spareMemory = *spareMemory - (*memory).p[j].askMemory;3 S5 O+ u5 b0 a; D, A1 H4 R' B5 q! j
produce_one_task(&(*storage),j,ID_FIFO++); //调入一个进程后,再在进程池中新生成一个进程 d; w1 o" t! @
MAX_COMING_TIME = (*storage).p[j].comeingTime;5 D5 `. L5 r( M' o# H
}6 j9 ^# {# v6 R" [& Q6 V* W# k
return 0;) U1 ~ d8 e: ^% U/ G+ r: l
}" N) v: |5 w" Z( y0 E H
int TimeTurning(processPool *storage,processPool* memory,int *spareMemory,PCI ** save,int draw)8 ~" s0 x- @$ _2 f/ J
{$ H/ o& H( L5 c, @
static int compute=0,waitio=0,change=0,clockSegment=100,poi=0;
( j" W# c1 s9 E; |static int computeLast=0,waitioLast=0,changeLast=0;0 }8 K! [+ C) }2 R J- b
int i=0,j=0,k=0;: j. ?* `9 n% ^( c) Y- P) }
if((*memory).proNum<=0)9 E- i; { y: W2 Q. \. X
TimeTurining_storage_to_memory(&(*storage),&(*memory),&(*spareMemory),-1);2 N1 o1 X! G; i* {# Y
if(draw==1)
7 B) b3 A7 s! }" J% _{
' `# A$ {/ d' o2 h//printf("%d %d %d\n",compute-computeLast,waitio-waitioLast,change-changeLast);
_' U0 a# |$ x+ m8 `) XdrawPerformance_TT(400,0,MAX_MEMORY-(*spareMemory),compute-computeLast,waitio-waitioLast,change-changeLast);# G. y# ]6 Z, b% D3 X" P
- M; i% J5 d& ?# q) l; u f
5 A0 f2 ^7 w2 d5 @2 S- v3 \- S7 N
computeLast=compute;: Z6 T7 i5 d. r! y3 V$ j9 l
waitioLast=waitio;
! b% L7 G% @ J' Y, OchangeLast=change;5 J/ p, u i+ O% T* T- f- l# q9 @9 [
}
# e4 A3 c& A: {1 D$ Kif(poi>=(* memory).proNum)+ @4 ^" K; n: j
poi = 0;
4 J7 D# x' g! v: Mif((* memory).p[poi].flag==ready)
9 |6 g* ^1 O! @- ~(* memory).p[poi].flag=computing;9 X3 M* ?5 O7 W) w" T6 G' Y
if((* memory).p[poi].computeNum>0&&(* memory).p[poi].flag==computing)
$ G! C1 ~/ j! g% O{ r+ F1 I- g& G% v- K# V6 h
i=(*memory).p[poi].computeNum;* _7 {- `' M( @6 x- C3 g7 ~
if(--((*memory).p[poi].computeClock[i-1])<=0)// one compute tase is completed
2 j$ K' X2 `" Y: U z" ~{2 R: Q% Z7 d4 u0 P! e0 Q/ h
(*memory).p[poi].flag=IO_waiting;. v. J) Z! T- r4 |& g1 A- b6 ^
(*memory).p[poi].computeNum--;- c( `! ~7 B" c4 f; I( U! k' Q- K
change += exchange_IO_Compute;+ K" E8 ?5 I8 j# x" E# C( l, d
compute++;* j J* D+ `2 L# ]
}4 o* w, \# x1 i* Q6 S! V
else4 s, H+ i% _, c8 F- `8 n2 P
{
! R+ a# y% {5 R- A3 qcompute++;1 C6 ^, `' I# U8 U' e; k
}
) ], {1 z7 F4 g; q% [# Y}
1 E" w. l" c6 e! ?' c4 j6 M9 V7 telse if((* memory).p[poi].ioNum>0&&(* memory).p[poi].flag==IO_waiting)( p) X! g& F/ @; ^; Q
{
4 j$ A. W9 X6 e7 ^3 H$ E; |# ~' ]' @. R! m( R4 f3 w
i=(*memory).p[poi].ioNum;1 E$ |( I' X) b% ^/ N; h' o
if(--((*memory).p[poi].ioClock[i-1])<=0)// one io tase is completed
" S! F& L0 l. S$ k- h: F{% Y0 }& r, A1 \1 }$ b% A k2 g \! ~
(*memory).p[poi].flag=computing;
; J& x/ ^( L- |. { B1 M/ B(*memory).p[poi].ioNum--;& E, v- B {: c2 Q0 E/ j% F
change += exchange_IO_Compute;
[3 }) o- l& t. C. W4 dwaitio++;! T& |; N& Q8 h9 ?6 k
}$ {/ @- O1 o4 M+ |; i5 l' h
else
4 k( s3 H7 p+ C4 K3 i! t{
& `; }' T3 t! |1 b" ~: `7 G$ ?$ M6 owaitio++;2 d; D8 {( P( v0 W9 L
}9 B# J8 F$ F0 M1 J
}
6 L1 @/ x# C. K9 B% G% \5 lelse if((* memory).p[poi].ioNum>0&&(* memory).p[poi].flag==computing)
7 h/ w6 K% y! r6 L{
$ ]6 r# y: [1 J/ A0 \(* memory).p[poi].flag=IO_waiting;
+ h$ y. @- e- l6 H$ Ichange += exchange_IO_Compute;
, N0 Z% I% v I}
, i. F$ c$ Y0 o) A' c# Telse if((* memory).p[poi].computeNum>0&&(* memory).p[poi].flag==IO_waiting). z0 L- }+ t' `/ o- y5 N
{
6 R t' ]6 @1 O3 K$ P" L# K6 z) Y: E(* memory).p[poi].flag=computing;
4 D3 @# m6 q" |6 E" ochange += exchange_IO_Compute;
$ j" g, V. `3 l, `: |) T}
. X' a& S: Z6 ]/ Jfor(i=0; i<(*memory).proNum; i++) //其他等待io的进程可以并行推进
1 r9 w7 E/ y/ ]' p+ I/ g/ D{
4 X: C1 Q; v1 o5 Xif(i!=poi && (*memory).p.flag==IO_waiting)
1 G% m0 ^2 n- X2 }5 d9 ]{
) s. ~: J+ f( p3 n" d( u5 fj=(*memory).p.ioNum;7 a# S0 U0 V' |* I F _: _
if(j>0)
/ X$ I, D# u' r9 q6 Y! I% f{
- h+ C& X, ]. ~7 `2 Z d8 T& Aif(--((*memory).p.computeClock[j-1])<=0)// one compute tase is completed
6 c! F! @1 M7 F0 |{
+ A3 a$ l. p9 g$ V5 k8 X" \6 v: a(*memory).p.flag=computing;
/ Q9 B' J; K" ^! H(*memory).p.ioNum--;
1 k6 h1 @+ n/ G# m& tchange += exchange_IO_Compute;
* ]3 b& H; E1 S+ a5 A& P}4 E" c) T" A' y* O9 b! e+ `
}+ U& T+ j4 u, u6 S% h7 c) w' \- \
}9 f' ]0 y$ ^9 y& z! \
}
( j6 Y1 ^3 L0 ?! s2 J) A Ifor(i=0; i<(*memory).proNum; i++) //处理已经运行完毕的进程
. L; q+ H* A. n: J{
+ e& N! w4 I7 A. Rif((*memory).p.ioNum <= 0 && (*memory).p.computeNum <= 0) // a task is completed* L) \: B% G6 w% Y5 o! \/ K
{
* I% d/ R- f2 A" U6 |(*save) = (PCI*)malloc(sizeof(PCI));' s- @! k+ z; ^, `1 m. ]
(*save)->next = NULL;
5 S \, f' B) v4 ]7 U! O7 x6 w (*save)->processID = (*memory).p.processID;# H/ ]: b: s, {9 a+ ^4 s
(*save)->comeingTime = (*memory).p.produceTime;
u* H4 n) Z7 f u: O# [; i8 t9 e(*save)->askMemory = (*memory).p.askMemory;
' C" F m. b0 n) ^6 k0 b(*save)->compute = compute;5 B! i) B9 y8 k) c! A
(*save)->waitio = waitio;- [5 L+ h) u @4 W: c: q) {! h/ G
(*save)->exchange = change;
5 ?* L* o, V, v1 F: c5 a: j1 R5 H(*save)->completedTime = systemClock-(*save)->comeingTime;
9 {2 t+ v0 N4 ^: S! b M A(*save)->runningTime = (*memory).p.runningTime;) r- j9 N( ^* ^- L! {* D+ E$ ?' n. p8 A
(*save)->completedTime = systemClock;
2 s6 I; ?! \) W*spareMemory = *spareMemory + (*memory).p.askMemory;: |3 f% \' x4 o2 i) n
compute=waitio=change=0;/ J; v* P# Y) ~. A0 ^
computeLast=waitioLast=changeLast=0;3 h. X" I. a3 `3 \ f) q
if(TimeTurining_storage_to_memory(&(*storage),&(*memory),&(*spareMemory),i)==1) // 调入一个新进程进入
: \1 E+ V, Y: {) a ] ?{' g$ P/ p$ P7 U& E
if(i==poi) //占用CPU的进程已经运行完,将时间片分给其他进程6 W9 U5 t. s$ R; Q s: k+ P* y
{
& s' G3 u% W# {8 v) V! upoi++; v' y, o0 A7 g5 b2 \- m
clockSegment=2000;
" v" u- H$ j; m}! P8 t9 N7 _" M5 t% s- h z
}
( q p+ L: l0 L+ F' U3 telse //没有足够内存调入新进程5 G2 v3 F k$ Z; B( j
{
- o! R6 j$ d% n2 I8 G# Bif(i < (*memory).proNum-1)7 @* v. E% [& {! e/ }$ Z4 c- W
{$ V K T% J" ]
for(j=i; j+1<(*memory).proNum; j++)
- W- \* `* |/ z) p$ ]{) h) h7 m, ~: `. A
(*memory).p[j].askMemory = (*memory).p[j+1].askMemory;
$ ~3 {) g0 }3 Z8 ], k5 d5 g(*memory).p[j].comeingTime = (*memory).p[j+1].comeingTime;1 W+ k. K$ ]8 E2 a; o4 `2 ] @
(*memory).p[j].computeNum = (*memory).p[j+1].computeNum;2 W T5 F8 u, ^5 [3 X9 F
(*memory).p[j].ioNum = (*memory).p[j+1].ioNum;3 u+ |! o) U9 Y3 g: S; _! U, y
(*memory).p[j].processID = (*memory).p[j+1].processID;, N ^2 Z- ]; h8 r8 T; d i" \; _
(*memory).p[j].flag = (*memory).p[j+1].flag;' V( h) N' }' | _7 y
(*memory).p[j].ioTime = (*memory).p[j+1].ioTime;
' Z- A5 k+ g! F& b0 j4 Q(*memory).p[j].computeTime = (*memory).p[j+1].computeTime;' x1 _" J: V4 j4 A8 v; K$ Z5 c c
(*memory).p[j].runningTime = (*memory).p[j+1].runningTime;
6 G0 V: u: }5 V' ~: r5 ?(*memory).p[j].produceTime = (*memory).p[j+1].produceTime;: X" N+ Z# O2 h5 y& R% o
(*memory).p[j].completedTime = (*memory).p[j+1].completedTime;
9 @; Z8 v0 _$ _5 rfor(k=0; k<(*memory).p[j].computeNum; k++)7 r4 @! b# d) z" w9 F" d/ q# K! M
(*memory).p[j].computeClock[k] = (*memory).p[j+1].computeClock[k];5 i+ A4 ?$ C* a1 t% Y
for(k=0; k<(*memory).p[j].ioNum; k++)5 g% h- D- L6 M _
(*memory).p[j].ioClock[k] = (*memory).p[j+1].ioClock[k];
# F' v }2 _, g! T/ T}
% T s, b7 @6 h" f. {if(i<poi)
1 D `% L5 m* A( w! G5 p* Q6 Tpoi--;
. F6 T. x+ U0 Relse if(i==poi)
" e+ O$ C! \% xclockSegment=2000;
% K6 n3 M# l( }: }0 L}
0 ^( Y8 Y! {+ @- Pi--;/ }+ q# b1 R. }# ]
(*memory).proNum--;# u, s- M6 P; Q! n" {3 k7 o# u
}1 Y- B; {8 [0 _" Z5 v
return task_completed;3 o5 j6 e! ?1 H' T
}
, n' c' @5 W6 H+ W4 |0 T# f}. L! T+ o8 k- @. }) ~
--clockSegment;
$ J# m2 r3 [3 X6 @, uif(clockSegment<=0)
- p+ g# B0 a( ]! v K: G- A4 c{$ k3 O3 r3 Q) T! o* e, }( k: B0 O6 d
poi=poi+1;
7 j5 T' z4 W) K# Bif(poi>=(*memory).proNum)
" Q! H/ Y3 s# t# \; Xpoi=0;5 s7 a: o( N3 f/ B+ B
clockSegment=100;1 {# L+ X" t% [ E5 e: ]
}
# }9 M' O, f# g; Ureturn task_not_completed;
6 l1 R3 S9 l0 Q5 U- Z}
) F5 } e/ h9 l& Lint TimeTurining_storage_to_memory(processPool *storage,processPool* memory,int *spareMemory,int pos)
. ^/ n6 ~: S9 }5 F. C! y{
+ |- I' D$ \" o8 X% Uint i=0,j=0,k=0,flag=0,translation=0;
S. C/ h- p" _* `% N( O U* bfor(i=0; i<(*storage).proNum; i++)
8 d. n% n4 M& w6 V! |; S{
: O9 z1 i5 F9 j5 wif((*storage).p.comeingTime>MAX_COMING_TIME)" J" S0 W e; @3 S- k) B
MAX_COMING_TIME = (*storage).p.comeingTime;0 G* s2 v+ W: G8 ^& v
}
7 R8 G5 C4 w2 G" o+ W9 b9 V8 rif(pos>=0)
1 D; k& C! g% p{8 P' U3 j/ s( K* y( f E/ u
for(i=0; i<(*storage).proNum; i++)
7 V% R9 R) n. M2 C" N4 d+ Q- C{
! p# d: q, l6 E# i- _) }if((*storage).p.askMemory <= *spareMemory)9 [& z! H2 D/ T; ~2 u) H5 a2 C
{
+ t8 F% [* \8 i. b' o/ kj=pos;) B/ @* }% o4 |' M, _
(*memory).p[j].askMemory = (*storage).p.askMemory;
/ x N |- a5 R(*memory).p[j].comeingTime = (*storage).p.comeingTime;
" }) H% O2 S( K7 U9 }(*memory).p[j].computeNum = (*storage).p.computeNum;- Y# i! w5 D$ Q+ x6 ^, J
(*memory).p[j].ioNum = (*storage).p.ioNum;
3 k% ]7 ?8 G4 z6 d2 k5 I(*memory).p[j].processID = (*storage).p.processID;* N" Y* V4 g/ o! s* l- K
(*memory).p[j].flag = (*storage).p.flag;
, w6 b/ {; K% f' N* y- r) ](*memory).p[j].ioTime = (*storage).p.ioTime;
" g& B7 p6 m1 K5 {+ K(*memory).p[j].computeTime = (*storage).p.computeTime;
. I) M/ p6 n+ U, I0 b& x(*memory).p[j].runningTime = systemClock;' G: l% l% x, [6 P( n
(*memory).p[j].produceTime = (*storage).p.produceTime;
; m5 A( M/ V l$ Dfor(k=0; k<(*memory).p[j].ioNum; k++)
& N6 B9 M# L! F* V( p+ t6 W* F(*memory).p[j].ioClock[k] = (*storage).p.ioClock[k];2 K" q- t# v$ ]( r# a' g. w: K
for(k=0; k<(*memory).p[j].computeNum; k++)
6 j3 [5 L7 D# Q(*memory).p[j].computeClock[k] = (*storage).p.computeClock[k];
" C6 p v4 D- a*spareMemory = *spareMemory - (*memory).p[j].askMemory;+ u6 L3 f" u+ j* T2 Z
produce_one_task(storage,i,ID_FIFO++); //调入一个进程后,再在进程池中新生成一个进程! K% D4 @3 Z8 I3 ]& t! m# K6 h
MAX_COMING_TIME = (*storage).p.comeingTime;
; J! U( K. E( l, btranslation=1;
( ~( T4 \% ?( R9 H& a9 ?; V; W$ \break;" ^3 e# I. j; i2 b# J, Q
}
5 T( t0 Q6 P2 z1 \! C( t4 ]' J}/ T, V! ~* r9 y" Z; i) X
}
( L) p! @- B' i( H5 kelse
/ g- H4 D/ d+ M; V{
( W; R) \+ ~- y; p( I4 Gwhile(1)
3 i0 o! F2 T+ x8 \& D$ t3 G{
' h: I1 Y! ~2 {/ Eflag=0;
2 W, s! C4 n: z$ J0 _" ?for(i=0; i<(*storage).proNum; i++)
5 d6 Y6 s- T5 y4 K2 R{% B0 s' R# o- Q2 M* j: Q
if((*storage).p.askMemory <= *spareMemory)2 Y# D( C. R- e
{: v2 @$ y1 s# ~
j=(*memory).proNum;3 L+ o! m; ^+ q# T
(*memory).p[j].askMemory = (*storage).p.askMemory;
- f: z: j, O) Y" C$ u! @! d(*memory).p[j].comeingTime = (*storage).p.comeingTime;
/ {& x* | D, Q( q(*memory).p[j].computeNum = (*storage).p.computeNum;
2 W; h# F4 r; E3 W6 u(*memory).p[j].ioNum = (*storage).p.ioNum;
& a$ f7 w4 G2 L: x& Q5 L& t; ^6 D1 Q(*memory).p[j].processID = (*storage).p.processID;
C. n" G! S" O(*memory).p[j].flag = (*storage).p.flag;
* U$ X* g* ^ g) u: [(*memory).p[j].ioTime = (*storage).p.ioTime;
0 X& |$ _ _: @( }- @(*memory).p[j].computeTime = (*storage).p.computeTime;
) j% ]' i, D$ s4 O$ d(*memory).p[j].runningTime = systemClock;- K( H( u* A9 T$ O( t
(*memory).p[j].produceTime = (*storage).p.produceTime;
3 E6 I6 X& n- `" f6 Tfor(k=0; k<(*memory).p[j].ioNum; k++)+ J% B5 N k0 ~9 t" D
(*memory).p[j].ioClock[k] = (*storage).p.ioClock[k];5 a# Y- h- P. n6 d
for(k=0; k<(*memory).p[j].computeNum; k++)1 I! _0 T: Y( N4 x
(*memory).p[j].computeClock[k] = (*storage).p.computeClock[k];4 p/ y% ?6 X) N) w w7 _
(*memory).proNum++;. d1 A. X) K% U: u& s
*spareMemory = *spareMemory - (*memory).p[j].askMemory;
- y# a) H! D, F( a8 `. v9 iproduce_one_task(&(*storage),i,ID_FIFO++); //调入一个进程后,再在进程池中新生成一个进程 s; U9 O1 ^/ t i
MAX_COMING_TIME = (*storage).p.comeingTime;
' T s: o- k% A5 mflag=1;% J2 y2 S1 A D! j1 h) p: h* V* c
translation=1;
5 m( J+ e7 ~1 u1 X1 ^}' Q* m% G5 T1 Y6 E% s( d& H
}
- ~5 A I6 b4 x! p% Y& K5 g4 lif(flag == 0)+ p6 o0 g( t' N( S
break;) w7 y$ a6 [( i" l+ U
}
. L: X, U/ _! O7 C}! A! V7 h* q& m, _7 F
return translation;
y: X8 }+ B3 }% Q. c0 g}
6 w/ R! i! Q ~0 r1 ?int FIFO(processPool *storage,processPool* memory,int * spareMemory,PCI ** save,int draw): v) E5 q7 q8 n1 Q- ~' [* n
{
& H: ~& V" @2 I3 astatic int compute=0,waitio=0,change=0,flag=0,flagiocpt=0;
& J% D: G" ^, F- Istatic int computeLast=0,waitioLast=0,changeLast=0;- U3 P+ o7 j* X# d4 d' y2 N# F5 N+ e
int i=0;
1 y) F8 n2 b. o0 F3 W4 Nif(draw==1). S- e* }8 A- L( F
{
$ e, _7 m2 \- |//printf("%d %d %d\n",compute-computeLast,waitio-waitioLast,change-changeLast);) c! @( R" h: f
drawPerformance_FIFO(0,0,MAX_MEMORY-(*spareMemory),compute-computeLast,waitio-waitioLast,change-changeLast);
: m6 l( S5 n! E# q& O
) ~6 v' L; d4 \/ a4 C
. d+ ]) \5 B! P& @6 @. k" v- {computeLast=compute;/ @) D# [6 N9 ~+ }* Q+ z
waitioLast=waitio;
( ~ M2 X% H. t ]8 `changeLast=change;% A' H- i& x+ {2 d; Z0 _! D
}" F$ w9 D6 _& ~
if(flag==1)
' h" T; ]! @5 g* K$ M* o{
& b ^2 X/ |2 z4 H, fif((*memory).p[0].ioNum>0||(*memory).p[0].computeNum>0) //task is not completed r/ i- ?5 f, e4 ^ ~- B
{
& X: N% P0 k$ A7 \3 Z8 Rif(flagiocpt==0) // implement compute3 C j# U8 r6 i7 f' X7 o5 q: _0 v
{
: j' A4 Z; s& Q: u% i; r$ d9 Ei=(*memory).p[0].computeNum;
, Y2 B* D2 z# wif(i>0 && (*memory).p[0].computeClock[i-1]>0)$ H! e, H9 z" w' o
{
% v4 H2 {( j3 R" e; Y" |) }if(--((*memory).p[0].computeClock[i-1])<=0)// ome compute tase is completed$ u9 r7 C% h$ K9 a0 t2 O9 p- V
{ Z1 ]3 b; B; X6 {8 @4 M
flagiocpt = 1;
- E- H- X2 }& I/ p$ N(*memory).p[0].computeNum--;8 v' A& k% f; m4 \
change += exchange_IO_Compute;$ L/ ~) v, B9 r. S
compute++;
( i6 F+ u! o9 H6 a/ q}
* J; T! V6 s/ z0 H! L8 o% celse5 d$ m0 N/ b& p& J. b
compute++;. w: A4 x) S9 u, m& d/ ] s
4 c; @, ~! P9 ~+ d' P: @& r' n8 V
}
* D7 G& J! R1 uelse
* E4 H, ?. L5 i( k/ pflagiocpt = 1;; u# Q; t3 e' A V5 V
}8 _+ B1 W7 D* Y5 U" q
else //wait io
* b6 x2 L. {9 I3 T* z/ p. y{" G3 s9 [( S' E0 \
i=(*memory).p[0].ioNum;
! g3 J2 }/ c6 w. |if(i>0 && (*memory).p[0].ioClock[i-1]>0)+ A5 i! `+ L4 K" R# Y
{
, C8 p* |% E% Yif(--((*memory).p[0].ioClock[i-1])<=0)// one io tase is completed
4 O( z* T" t% W; N! [{7 T- L# Y5 J. U# q- j, E
flagiocpt = 0;
$ l6 n4 X8 v ~8 M(*memory).p[0].ioNum--;- l+ ]% T% l2 q+ s+ z% g
change += exchange_IO_Compute;
4 D0 z! [! X7 Y7 rwaitio++;
7 d- m5 ~1 L3 f}2 j$ k9 D- C: \* B
else
+ D4 K8 F% n( n9 K+ @$ X. ~waitio++;$ a) _0 t- `( w$ ^! @* O8 H
/ r8 M9 m. l& m% v
}; Z! b; F+ z! [* z
else
: T1 b- ]9 f, {4 eflagiocpt = 0;+ \7 U7 x$ N& w% N" l
}$ \ \/ I( q. M/ M t$ ^
}
8 p; e% c2 b1 L7 Selse //task is completed
2 S5 F. b) ?# z7 S* L{
* Q9 ]8 J" v! `+ i(*save) = (PCI*)malloc(sizeof(PCI));
b) u3 e: M( V3 N4 c(*save)->next = NULL;3 c, u6 F/ j/ S5 W, q
(*save)->processID = (*memory).p[0].processID;
. ^6 C* V k6 L5 `$ A9 W(*save)->comeingTime = (*memory).p[0].produceTime;
. O' a- P* e \/ Z(*save)->askMemory = (*memory).p[0].askMemory;" A0 K. I W6 s% D6 d
(*save)->compute = compute;8 I6 ?% e8 S8 d W) G
(*save)->waitio = waitio;
# K" u4 {3 G! F _1 h( b(*save)->exchange = change;) Z" B w2 U1 |
(*save)->completedTime = systemClock-(*save)->comeingTime;
: u- e* ]2 F a6 z" d8 G. F' A(*save)->runningTime = (*memory).p[0].runningTime;
. ]* B2 }2 w& c* m. d(*save)->completedTime = systemClock;8 e+ C8 |* Y8 p3 w
//*spareMemory = MAX_MEMORY;
$ b! I3 W6 h6 E! Y: r3 w' p1 Afree((*memory).p[0].ioClock);0 @; a9 o/ J( a( T. o$ i5 k8 c$ b
free((*memory).p[0].computeClock);
0 l" k1 S1 k9 O; L9 Ufree((*memory).p);: q1 w0 O! t6 c* h
flag=0;
% d$ T7 C5 _- Tcompute=waitio=change=0;
& ^9 ^ g$ y4 M: o; m) E7 F2 E; vcomputeLast=waitioLast=changeLast=0;- S1 j, {! D4 E D8 V( |0 w, s
return task_completed;8 F& f7 Y6 S% O, j/ E1 j$ w H0 H
}
' j5 t6 H: e5 E! |+ a1 _}, G2 K1 ~$ |, t9 S
else
8 u9 a+ n/ k, C9 ^{
" K# n2 h: _5 W; x% k7 dFIFO_storage_to_memory(&(*storage),&(*memory),&(*spareMemory));, Z0 q2 e9 `! x8 Q. Y3 [/ g( M
change += exchange_process;( r, G# k" d4 b: S. q
//*spareMemory -= (*memory).p[0].askMemory;- j! K! t& |0 n8 F1 H
flag=1;+ v! M5 O8 |" u1 F9 ]: `" k
//showProcessInf(*memory);; c: k& F: p) I8 J) t
return task_not_completed;
. _" R: d5 _% U5 |) f}
+ V5 ?, N8 |9 ?+ E/ f+ k5 Y9 i6 nreturn task_not_completed;6 m* u1 U' R5 t
}
: N, r6 L, v Dint FIFO_storage_to_memory(processPool *storage,processPool* memory,int * spareMemory): ^& [; n7 K! \9 l
{4 h- J- Y+ u0 U' r/ K/ \
int i=0,j=0,k=0;
7 O9 L: a- x3 C+ x; h, YMAX_COMING_TIME = (*storage).p[initProcessNum-1].comeingTime;
1 s6 [; p& C0 z& q(*memory).p = (process*)malloc(initProcessNum*sizeof(process));
! U" T+ X% i6 L/ ^' K! x& fmemory->proNum = 1;$ W" g+ A4 `8 L! ?
for(i=0; i<initProcessNum; i++)! B3 ?4 g, o5 Z' J( Q+ r
{
8 C+ O$ J7 v8 ?) e1 {7 F" Vif((*storage).p.askMemory <= *spareMemory)
8 f9 d, X" @+ l+ X5 ~2 c. g; N; f{
* L( G: ^, A% A7 B! e(*memory).p[0].askMemory = (*storage).p.askMemory;% E! i0 h; u& G; G5 s( T, o
(*memory).p[0].comeingTime = (*storage).p.comeingTime;
( L$ p9 Q; X( o& W+ ]& S(*memory).p[0].computeNum = (*storage).p.computeNum;
1 q( L* @/ z0 |) W, V(*memory).p[0].ioNum = (*storage).p.ioNum;. i3 f4 h' ~7 \; r; _# M- u( D; o
(*memory).p[0].processID = (*storage).p.processID;! Z/ e7 @+ w% p9 d3 F: n
(*memory).p[0].flag = (*storage).p.flag;) s& U* p2 u! q R7 w3 U: f+ B
(*memory).p[0].ioTime = (*storage).p.ioTime;
/ |, O: n: t% t1 v* _# z(*memory).p[0].computeTime = (*storage).p.computeTime;! ^, W, D* {" M& W- e
(*memory).p[0].produceTime = (*storage).p.produceTime;
7 w, `) w4 Q) Y. P' ~. L(*memory).p[0].runningTime = systemClock;
) Z3 m# k2 B+ D. A; P# ^, l(*memory).p[0].computeClock = (int*)malloc((*memory).p[0].computeNum*sizeof(int));3 h% {: [: `3 F/ {3 y; A6 R% X
(*memory).p[0].ioClock = (int*)malloc((*memory).p[0].ioNum*sizeof(int));
4 t' A: u0 S1 t5 ?for(k=0; k<(*memory).p[0].ioNum; k++)' m: h4 R0 y4 Q9 v
(*memory).p[0].ioClock[k] = (*storage).p.ioClock[k];
" X, ~* B1 r3 u6 ~/ ^for(k=0; k<(*memory).p[0].computeNum; k++)
( w$ M. X' f% J! _& Z* a(*memory).p[0].computeClock[k] = (*storage).p.computeClock[k];
7 u3 K7 V0 S( @! A- R) b' v- Sbreak;
% ?+ ^2 |* K; n+ X' b}
1 x; M! Z5 Q. b7 V, Y6 K0 _}
# X7 r2 R' T7 _2 a; zif(i<initProcessNum) //调用一个作业进入内存后,并再生成一个作业等待调入
, @0 ?& j) e4 L{
: V0 L A/ h# t" z* [0 bproduce_one_task(storage,i,ID_FIFO++);& X/ }, R7 ~& I* U: @% L1 p
MAX_COMING_TIME = (*storage).p.comeingTime;
* ?, t3 ]2 r. m/ m" ], K. p9 bsort_by_comingtime(storage,i);, b# a1 A3 c/ _( B1 a; I0 ?
}
* b) I R1 r x" ]' Z) k9 }) ~' Kreturn 0;
B; f$ @, Z; M* y7 g2 V}
; W* C+ q5 y! G0 oint sort_by_comingtime(processPool * p,int pos)/ w# U0 U0 j; R
{" P- F" D/ x9 t. |/ G3 b
int i=0,j=0;
* b0 Q7 |# L, J5 ~% }! [process temp;2 z1 _0 D) A3 ]3 \2 G
if(pos<0)
9 `! M, E8 a! _9 V{% X! `3 P5 ]$ I9 Z6 A$ V2 w E
for(i=0; i<initProcessNum; i++)
/ T8 c4 P4 @! c; [for(j=0; j+1<initProcessNum-i; j++)
' m& S0 j. ]( o4 c{6 v# F- P. X5 \6 v" e
if((*p).p[j].comeingTime>(*p).p[j+1].comeingTime)' E. k- i; y1 Q6 e
{+ X! Z5 @4 w8 d* X- |
temp = (*p).p[j];) Z4 h( v- {" g0 B' B/ G8 o- n
(*p).p[j] = (*p).p[j+1];
, _! ]( r; h! E" D& v(*p).p[j+1] = temp;
0 X& J" E) j2 h3 ?8 E8 s+ ]}
, y V& m, Z9 H, {0 M C; b3 I}' H+ G4 L( H" p
}- J- T. M7 B4 V* Q. x% S
else if(pos<initProcessNum)
7 v* @1 _$ j' n0 R' B; w: h6 j) J2 d{
: F) d, z Z* lfor(i=pos-1; i>=0 && (*p).p.comeingTime > (*p).p[i+1].comeingTime; i--)
% o' O2 @# X$ @) A9 I{
* O% e0 \3 V" Dtemp = (*p).p;6 \5 z+ p8 G, T, v) N, o
(*p).p = (*p).p[i+1];- H0 ` R& _# x" W; c2 ^( x
(*p).p[i+1] = temp;( l: h% R% ~/ I& A9 u
}/ w; _7 Y# k2 l; R, C
for(i=pos+1; i<initProcessNum && (*p).p[i-1].comeingTime > (*p).p.comeingTime; i++)* Z" y* U; I" a, m: L
{
6 j# E( D6 L. t% ]temp = (*p).p[i-1];
! z4 Y/ L- N1 U# l(*p).p[i-1] = (*p).p; {6 \5 {; c2 i+ C" t1 V! a
(*p).p = temp;1 ~# c. _, E3 X$ ~- d( g6 e ~$ a
}
! ^: m9 G8 }# u, d& V$ _3 a ^}
! b! C. ]: y# O. ^; o- Celse- G8 p1 V. G- M7 J' X8 d3 x- [% w
printf("position eror\n");
4 Z* k4 O# I/ k% |) freturn 0;
: g l3 ?/ I5 E8 f* _& l2 V8 p}
. g1 w+ v, [$ O7 c$ y6 Oint InitPool(processPool * p)
# {" d S1 g* A{4 J1 T" J: S4 O8 h( O* c+ m
int i=0;
) W& j! A% u, {! i! e0 R8 ^(*p).proNum = initProcessNum;/ c; i' r& ~" C" w6 X, _
(*p).p = (process*)malloc(initProcessNum*sizeof(process));; A7 Y# e4 ^3 ]. h8 R
for(i=0; i<initProcessNum; i++) //init process information) Y/ V( \: T o% l( t
{
. d2 Q( T8 c z2 f6 x; m1 c p(*p).p.computeClock = (int*)malloc(initclocknum*sizeof(int));2 o6 |+ f: q f5 }- S
(*p).p.ioClock = (int*)malloc(initclocknum*sizeof(int));
E0 {, s* r! _produce_one_task(&(*p),i,ID_FIFO++);
0 ], V0 _ U) N: m* ]}- U9 R4 o$ o3 A" M$ R2 c6 d i
return 0;
. C; c+ @* }, o}" S) P. y q! p L2 W- @, a
int produce_one_task(processPool * p,int i,int id)$ k3 g/ t. d) K: s9 S2 h
{0 q/ n3 Q& [0 Z/ i$ R0 H
int time=MAX_COMING_TIME,j=0,totallTime=0;
1 T9 e; H) f* C I. T(*p).p.processID = initProcessID+id; ' \- ?' z5 k9 E; G' _0 I! Z
(*p).p.comeingTime = time+rand()%(MAXProcessRunTime/5);
% U$ y* V9 O. h/ D4 q k6 {- b1 |(*p).p.produceTime = systemClock;
! a9 J2 E; W) T- A* s' u# W(*p).p.ioNum = rand()%4+20; //IO number setting to 2--5;
/ Z, {8 k- J7 b" ]7 }(*p).p.computeNum = rand()%4+30; //computNum setting to 3--6;
5 i/ y1 y E: H5 KtotallTime = (*p).p.computeNum + (*p).p.ioNum;) `3 O3 f5 M8 t! s% O4 I: b3 ^
(*p).p.computeTime=0;
( G' G' p% e2 a6 A2 E: |for(j=0; j<(*p).p.computeNum; j++); h+ T) b# V) x7 r# H& g
{: B3 J' y9 F# t9 j) ]1 |6 ?. T
(*p).p.computeClock[j]=rand()%(MAXProcessRunTime/totallTime)+1;
# _3 A! w0 k! j! c, A& G# r) C(*p).p.computeTime += (*p).p.computeClock[j];
B7 N- D/ g; ?( g, M( s* K0 N}, A/ ?+ y1 R$ Z$ F8 g
(*p).p.ioTime=0;
+ V' L/ m, L1 p3 `; Sfor(j=0; j<(*p).p.ioNum; j++)
9 A5 g2 G }, S( a{
2 O, K8 n, r. l5 n5 R(*p).p.ioClock[j]=rand()%(MAXProcessRunTime/totallTime)+1;" I& \" m* {$ \7 e* B ?
(*p).p.ioTime += (*p).p.ioClock[j];
2 q8 m: N7 _9 |}
! t& o& C) A: X+ A(*p).p.askMemory = rand()%(MAX_MEMORY/4);% z) x, i) R8 d; @/ E: K' |
(*p).p.flag = ready;
; K [1 n% h0 Z& J( X* Hreturn 0;) {$ O. x4 D8 m! g* J L
}
. I( W* E) D/ b8 xint showProcessInf(processPool p)/ }0 {: b) l+ ~, W* H' c# U! J2 N9 U
{
& t4 X% P% N( X3 Zint i=0,j=0;$ z9 b/ r5 v! i- l
for(i=0;i<p.proNum;i++)
; Q6 A: \5 B8 g! e0 `) H( ~{
$ L" j+ C9 k8 ]8 E1 C0 Mprintf("ID:%d,%d,%d,%d,%d,%d,%d\n",p.p.processID,p.p.comeingTime,p.p.ioNum,p.p.computeNum,p.p.ioTime,p.p.computeTime
; h0 O P/ C" K6 p/ j Y,p.p.askMemory);
1 V7 v$ x: E* r9 @/ z( p% U% afor(j=0;j<p.p.ioNum;j++)
: m3 v4 L( q3 Z' ]& |& F{7 j7 Y. q& z, l* o3 r! U. Z% @
printf("%d ",p.p.ioClock[j]);