! D$ R. a& Q& ]1 ]* ?2 }! X1 cclass SchedulingAlgorithm7 F# {. Y2 V8 |7 `! J% c9 b1 p
{8 m/ D' J5 J$ I8 V$ T; F
public:! e0 s% H% m" `% J, P: ~
1 V) Y5 U2 G$ a0 k// virtual bool initPCB(std::priority_queue<JCB, std::vector<JCB>, std::less<JCB>> * ready_queue, int process_num) = 0; * B8 F5 Y- P: s7 j- M6 @8 @! I// virtual bool processPCB(JCB & pcb) = 0;4 l0 h3 F" u; ?# D% b
}; % g' [' U0 F3 R3 d3 P 5 N2 ~- J6 X% w$ b+ {3 `// First-Come First-Served. G) v# E$ ?7 T- |& U; N P
class FCFSSchedulingAlgorithm : public SchedulingAlgorithm) U- V# d# z$ ]
{ , @+ r2 T$ S/ X w7 K# y4 mpublic:4 f* q0 X$ I3 Q! J) w8 E. K
struct PriorityCmp * h0 n4 c# f O( g' I { g6 _# t& @9 y* v4 E: z: w v
bool operator()(const JCB j1, const JCB j2) 2 e, a6 B0 X; r/ o3 Z7 B { ! N f1 p+ m+ C6 } return j1.submit_time > j2.submit_time;1 U( [! e" h$ t* Y& }! K
}1 L3 [3 a8 X! @$ z1 c- Q, ~
}; 9 q) }0 i( Z7 k2 E( m. C7 N; `$ C$ W
FCFSSchedulingAlgorithm() 8 X# a9 L; E7 k$ _( ?% B* H {} 3 R* X! ~+ f1 K/ G7 c2 i 6 d6 m" _0 v7 {& L" d- r& Rprivate:9 E" X K6 i M$ m
" f7 z1 [# y7 w: E / j. {% a& B& Y& w# t6 H}; . }: J: t% A" [) E2 F2 k9 g! u6 e, r1 k* l3 z
// Short Job First: f3 r9 i( E6 v" R0 n M
class SJFSchedulingAlgorithm : public SchedulingAlgorithm9 L1 P( R/ _! C
{ 2 G8 d5 [# G8 p) K; l7 [) k9 hpublic:# U1 J4 M0 E- N3 v) n% l! G- e" c
struct PriorityCmp3 T7 T) P4 [- Z7 F% d+ ]
{5 r/ m+ p9 Y# @# I/ b* [+ u- E
bool operator()(const JCB j1, const JCB j2) ' f0 K3 h1 o+ y: P8 e( e- a% ^. b! I {. {8 u" W9 }9 B) g7 z
return j1.required_running_time > j2.required_running_time; # A- p6 I( |- J! M+ p } ( p6 H1 J: H- o; a% U! W. E( r z };: n5 ?! I4 @/ ?0 w6 M2 l+ x
2 f) W( V( E: B" u
SJFSchedulingAlgorithm() % ~7 v, E8 p$ s+ Z* P {}! F4 `' @6 q* v0 O
, y. ~- D! N3 j8 C1 u}; * B6 @: V3 I; l* i" g- c. C: M& }3 j: K7 Q, h. G& {) {( z; t
// Highest Response Ratio Next5 ]4 J% X/ C) G3 w$ }- @+ G
class HRRNSchedulingAlgorithm : public SchedulingAlgorithm 7 O' J& J1 @! y. @8 k{. @7 v# N4 X0 u: B4 g* w) L
public: ' c" F4 r! ~6 Q, G! A struct PriorityCmp ) q+ y, ]- h" Y, U {& `/ @' U6 N8 q
double getPriority(JCB jcb) L: k0 Y0 j' S/ A {+ ~ y+ X) p5 I n3 x0 F$ `9 n
return ((cur_time - jcb.submit_time) + jcb.required_running_time) / jcb.required_running_time; $ X6 |" L# l' [$ r }0 P; R) ~2 a) I B w$ h
( w6 F" z" k" P1 ^; \ bool operator()(const JCB j1, const JCB j2)' B1 u6 O t+ L
{ 3 m' \% }9 C4 h: y2 D& x return getPriority(j1) > getPriority(j2); 2 I( @% v4 e& x! B }. Q3 I: q1 e8 s! ]( z/ }5 p8 e+ U# [
};7 f4 g6 p% a- M& U. \
0 {" m' P, X, y7 S. ]8 e0 z J$ J
HRRNSchedulingAlgorithm()/ @' W5 k N' ^8 ]% u4 p5 ]
{}$ T, T! `& R' Y' d9 t" G
}; " {5 y4 |. s0 ?6 D/ y3 f# W L S1 B, ], j1 ~( [3 u
template<typename PriorityCmp> % M |" P8 m: C4 y/ I. Aclass JobScheduling # M, h+ _* O4 H; r{ $ K J# [' Q/ n/ W0 M/ K9 Y" G+ bpublic:$ q# T: J# [- [3 u$ y
JobScheduling(int job_num)" x" d% w, L& ?! x, q: q9 m
{ 8 c+ s! h! r( i* N( H0 V6 K& { job_num_ = job_num; f6 N4 H& C1 o8 |7 g- G' \& c1 k
sa_ = new SchedulingAlgorithm(); - G; L3 ` D3 v0 w/ `' |" V wait_queue_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>();" Y6 r. {( }: Q6 n; r6 c
mock_jcbs_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>(); % S. ?5 |8 C4 C1 ?3 e2 l finish_queue_ = new std::queue<JCB>(); " I' X: G6 w5 l& G3 O) M# \3 w& H& o6 E m. H {7 f+ t. c
mockJCBs();7 R9 T0 y% t$ Z# a
} : y* R2 {( T% K ; x# h1 C0 T% x% R" j9 oprotected: - A& |! B0 L( X$ W! R/ O! ~, [ struct PriorityCmpForMock* K* H/ D K/ j1 k2 w6 `
{ 6 H2 W& K% I/ ]8 ^ bool operator()(const JCB j1, const JCB j2)) t/ t2 p' _! k( R
{ 4 x6 X, y) v* I) h, H/ V return j1.submit_time > j2.submit_time; 6 C& b# c* m, Q& F; {, G" i1 X }) A9 {( Y) p/ f! K1 f
}; / z& Y* ~5 @0 E' f+ u' ~3 F & _( l# r7 b, ]& I9 r) w bool mockJCBs()+ n% k3 E7 f- x1 w7 q
{6 _* Y$ o9 N# d
for (int i = 0; i < job_num_; ++i); i5 `; x; a& q
{ 8 N6 j; E4 o) D1 v" `5 S2 { JCBptr jcb = new JCB(); , X8 ~# z, t( T jcb->job_name = "job" + std::to_string(i); ! K' g4 i! z9 V$ z) W jcb->job_status = Wait; / O# Z, K: j" v7 V jcb->submit_time = Util::getRandom(1, 20, i);$ q1 n4 O: p8 P: @
// The minimum value is 3 so that each segment can be divided into time slice4 @$ f2 |* R9 u6 t2 z
jcb->required_running_time = Util::getRandom(3, 10, i);$ f+ a2 Q9 \ j! |
& n+ w C4 s7 B! X# _ mock_jcbs_->push(*jcb);/ Y& G6 X# E, u; B
std::cout << "[INFO] finish init " << jcb->job_name << " with "3 C. Z" P8 ^1 Y) K( E ^
<< " submit_time " << jcb->submit_time: n1 h* V+ V/ f/ H7 `
<< " required_running_time " << jcb->required_running_time << std::endl; ' a$ x, J( t+ e) o6 d) I3 A; P0 k5 h }) a1 W6 J- m% r$ U( e4 O
} ; h% a5 E- D! Q/ | $ j; g- w1 M' J8 e; Q5 O) ^# E3 @2 a void getCurrentReadyQueue() + {" M) j- @2 }$ B; d& A2 z { # u' X+ X" m4 }) ` while (!wait_queue_->empty())2 Y4 K j, M* e7 h" _5 s4 D
{ 9 Z; O2 q; T+ f! i2 Q, J JCB jcb = wait_queue_->top(); 9 c" i( z% b+ [! x/ X' G std::cout << jcb.submit_time << std::endl;0 F/ v' [1 s( ~! E! v3 w7 [
wait_queue_->pop(); . D- c5 c) Q! g) g }* ~8 S& L* V5 \5 S3 B# C
}, J0 z& F/ ]1 _, M
8 K3 Y- Y6 _- t) l& z. Z int job_num_;8 W: I- U. b$ t( N4 s
SchedulingAlgorithm* sa_; k6 N9 e# Y5 X/ q3 q% h: S
std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>* mock_jcbs_;- V( j% Y1 j7 g# M# S# [
std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>* wait_queue_;; b$ a& ^* x1 Q8 o
std::queue<JCB>* finish_queue_; r* l0 j6 }% [) g7 a: p+ V}; 9 V9 f1 ^) J/ F3 G8 i; ~# Y& g* @4 X1 m: ^
template<typename SchedulingAlgorithm, typename PriorityCmp># H1 P3 S' I/ ~7 p; k( z& U. F" b
class SimpleBatchProcessingSystemJobScheduling : JobScheduling<PriorityCmp> 2 U9 B- Q3 E+ m$ `5 u, L{+ j- y$ I4 r; E3 h8 a$ u
public:$ ^- l, x/ c6 r9 h( [
SimpleBatchProcessingSystemJobScheduling(int job_num)" M7 x- S7 Y$ w( k( d$ s0 W
: JobScheduling<PriorityCmp>(job_num)2 V3 G q) M7 g' k
{} 1 j2 `: |" Q2 P9 K) P 8 L" W5 C3 [2 f( W _ bool start() L5 P/ ?5 y0 V0 E { ' Y( W- T1 r6 Q cur_time = this->mock_jcbs_->top().submit_time;' S( V5 p m! b' p9 O: f+ A
while (!this->wait_queue_->empty() || !this->mock_jcbs_->empty()). _% B* c1 c! G% v% Q3 I/ F! P
{ ; U9 S- I/ T& y+ f1 Q. E // Simulate adding tasks dynamically 3 F# o3 Z% V2 P% j) _ if (!this->mock_jcbs_->empty() && this->mock_jcbs_->top().submit_time <= cur_time) & L' N/ j8 n9 s9 ~ { . @% c; w" @& m3 V/ t9 H JCB jcb = this->mock_jcbs_->top(); ' v8 M) _- T+ [( x3 F this->mock_jcbs_->pop();; X+ ~. \' {+ {+ a7 v8 a
* r- J# x/ j& }' z6 n* g+ @& S( s6 ? std::cout << "[INFO] add " << jcb.job_name << " to wait queue." << std::endl;6 M! Y; V" E/ K' O* \2 K) c, r
this->wait_queue_->push(jcb);! Q: l5 y( y' t' X7 T$ K$ m; P
}8 h7 _0 ~4 `5 E7 h( o8 c
( J Z% T5 ]3 K1 {# d7 e if (!this->wait_queue_->empty())( |# n: I; N/ O0 m- ~
{ 3 {! t* m# C2 J: P" ^0 j JCB jcb = this->wait_queue_->top(); # Q7 q" K) Q0 q4 X4 C' }# _ this->wait_queue_->pop(); 0 ^* }: i3 B- m4 K4 n6 F' J" w# X: b& J0 m7 k- S' ~0 P, R
std::cout << "[INFO] begin to do " << jcb.job_name << "." << std::endl;+ ]2 j E$ {. R/ M
jcb.job_status = Run;8 c5 u! q; K% l' k& j
// simulation do job/ i5 I. ]6 L3 r" X8 I6 q- S; I
sleep(1); ) g% K5 e8 S6 r8 H4 N! S, q/ ~ std::cout << "[INFO] do " << jcb.job_name << " finish." << std::endl; 5 w4 P2 M9 ~( n# x: E$ {+ K0 T4 ~8 I& o/ P6 o, M* A7 o# o
jcb.job_status = Finish; # ?! b, U9 o6 Q9 F U# d // print job Data. 6 x$ L8 g" h- b5 S. Y$ @+ | Util::printJobData(jcb); 6 }; K# G6 K7 M, o this->finish_queue_->push(jcb);: I% H* X" q# S* B- Z J
cur_time += jcb.required_running_time;( b! R0 g. c) X+ m# L6 j1 r
}/ z: U' u$ z$ F# Z5 `
else3 p6 L4 k( n. q/ a- U( m" _
{# P4 v: B2 h' N4 c$ c$ I. x
// Slowly increase time slice when there is no job + _: V: J0 o; A% Q cur_time += 1; + ]6 b, N( p4 ]4 l9 q& K } 6 ^/ _, E& n' h. } }2 w" c6 i$ Z% H* l7 Y! s% i4 ]
std::cout << "[INFO] all jobs finished." << std::endl;) U3 B2 \ Q4 t) J' j
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / this->job_num_)" T7 {8 u7 W: ]
<< " average power turnaround time " << (average_power_turnaround_time / this->job_num_) << std::endl;3 R3 J y9 M' w
}$ i0 }4 m9 u0 v p a. B$ V# k/ R
! ]* L% J$ i+ ~; Z! H
private: : n7 y( x( Q7 D7 Y9 G7 b2 A3 Q3 b- S3 u8 C" a' l1 ]9 D. M
}; 9 n, ^ w+ G1 E' v' i2 [' b" w. E. ?; L# z% V- y: k& U! {" O7 k0 W
8 O* ~: V; s5 o+ ^5 g' Xclass MultiprogrammedBatchProcessingSystemJobScheduling% H* h" x, R4 _: F# t& ^, b4 b
{2 R7 O6 F. n5 M3 F1 Z. [4 c: s
public: 8 ]4 }, {: r1 _( z6 B struct PriorityCmpForPCB $ r% T9 t6 W2 s# r( Y. H {) ?( B! A* V) U1 O8 f. y' a
bool operator()(const PCBptr p1, const PCBptr p2): @. q1 A8 c3 }7 |* d
{ 7 f, P2 _. p2 z8 A return p1->priority < p2->priority; [' R, _* _% D) R
}) H" t: b4 Q, L/ h, b5 ]7 v: v
}; + d1 d; r: O. K " D% z- N9 U4 c; X struct PriorityCmpForBack , h" |) h; F# D4 H" v4 \ { ! H8 O( ]1 s! a0 K! o7 O8 ` bool operator()(const JCBptr j1, const JCBptr j2) 8 L; _0 p+ u* M a" S {; W7 D1 P* q! _+ x6 b' K) W6 D
return j1->submit_time > j2->submit_time; 9 @) |; i. }3 Q6 M }4 p" q4 m1 O+ }" V! W
};8 h" Y z) w, i% \ V7 j
6 F0 Z9 }5 {% |0 E/ j6 ]; Y! Z
- ]0 _: x9 [9 i2 q8 r
MultiprogrammedBatchProcessingSystemJobScheduling() " K% P) H Z4 w {9 \7 m, V3 |3 u
back_queue_ = new std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>(); 3 ]) O$ F- J$ r$ M2 f- ] psa_ready_queue_ = new std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>(); " ?2 W- J- ^- v/ z7 w2 o/ K; i- ~' n. v
0 g1 F8 |* v1 d; G) @ std::cout << "input job num:" << std::endl; " O0 v2 w# j* q$ Y. \ e std::cin >> job_num_; ' S& P+ O* d6 d( {7 `) k1 W9 N, O$ o for (int i = 0; i < job_num_; i++) 7 n* b! K/ J+ m {- W, i* u9 e+ c( ]1 m. f! a
std::cout << "input job" << i << " submit_time & required_running_time & priority" << std::endl;: S+ s3 b+ @) r G* A; T$ b; [
1 ?* r8 \2 P% ]' `
JCBptr jcb = new JCB();! m' t$ U0 q5 X3 B3 h
jcb->job_name = "job" + std::to_string(i);! y, N3 S" u& C5 ~) t- u9 _$ l( o$ T
jcb->job_status = Wait;, F/ F( ~" A& y/ E% v: r
std::cin >> jcb->submit_time; # h; i' ?9 m$ j std::cin >> jcb->required_running_time;4 ]" Z' a; Q. [7 j% F% ^/ W% z" k
std::cin >> jcb->pcb->priority;1 Q/ O( W% }7 J& ~2 {# [0 v6 u
back_queue_->push(jcb);% L/ [. d! W6 B& m1 @1 l8 c
} 3 l8 j# t, ~) I5 V- ?1 M D7 n2 k* ^6 N. r /*- W) I% r; U6 h% p8 i T( n6 u; L
job_num_ = 6; ) k! o( H& ~5 W+ N: O- q; i/ x1 T' q4 h* m& ]
JCBptr jcb = new JCB();" n- _, \/ P9 |
jcb->job_name = "A"; % R) }% { Z$ o; a: y. I( C jcb->job_status = Wait; : d0 i' G' F8 C+ [! h: y& W3 ? jcb->submit_time = 0;% ? t1 p: p% t ~
jcb->required_running_time = 50; " Z( m9 T' C& r* B3 k2 K jcb->pcb->priority = 5;5 D q" e" e8 ]6 x$ l# d5 N0 U/ `2 U
back_queue_->push(jcb); ) t0 N+ g9 C6 h: T: \5 w # R. f2 Y+ d; D jcb = new JCB(); - i: b# O4 w1 \, p jcb->job_name = "B"; + G. R& m1 E! V; r' C1 Q# e/ V+ Y jcb->job_status = Wait;% S' i; B9 x' i
jcb->submit_time = 20; 0 k3 l( t0 R7 Y7 w$ [/ Q1 q jcb->required_running_time = 60; 0 G. z1 {9 f5 [2 |( Q jcb->pcb->priority = 7; 8 F; L* o4 L% W* o& @! |4 u# H back_queue_->push(jcb);! r2 n% S% U/ V; a& \& @/ O
# L3 [/ }% F' {1 v, k8 i m% Y jcb = new JCB();; _1 d, X' d, D% {' d4 }, ^
jcb->job_name = "C"; 1 u, K9 S5 O$ }# T. `+ j; U jcb->job_status = Wait; ' H( ]4 ~8 H' Q; a$ U4 ] jcb->submit_time = 50; - w, S7 y/ J7 U" R) @5 Y" K jcb->required_running_time = 40;# F$ b: g* h, ~# `- M
jcb->pcb->priority = 3;; Y# w' |; @1 B" F( @5 A
back_queue_->push(jcb);# D; V# i# Q4 ~8 N5 G
& H. x1 b' i( r2 A8 R# Q9 v' ^
jcb = new JCB(); - t9 k9 M. |) t1 }' F! | jcb->job_name = "D";/ Y& S# Q6 V# v r; z% \
jcb->job_status = Wait;- H. J* e! L7 _$ U! V( R7 ]* ~
jcb->submit_time = 80;8 `& x$ }3 k1 y4 B7 ?; I* y
jcb->required_running_time = 80; " v* Y; O5 i9 Y A% h: `' A jcb->pcb->priority = 8; 8 ^: e* F& D, W2 t6 {0 g) v back_queue_->push(jcb); 6 H! `- t! J) t& i" b& m8 }; R& Z ; ~' l+ ~9 z5 F; ` jcb = new JCB(); 7 f/ _/ K: Q1 ~' w' Y" [& Y) r# b9 i jcb->job_name = "E";9 @( h. M2 ?8 O: d
jcb->job_status = Wait; " k& D7 `& ]4 V# s! f jcb->submit_time = 100; 4 U$ N0 ^; I: Z( R* @7 u jcb->required_running_time = 30;1 A" O9 }5 J/ t6 j1 r I
jcb->pcb->priority = 6; b! V6 @0 { h
back_queue_->push(jcb); ) _* n, k. W _" [- K& q0 O2 j 9 i' Q! G$ Q& @. P& z jcb = new JCB(); * Q& f% }+ o; X% L% h. E jcb->job_name = "F"; $ r' @6 V$ [8 j$ k3 h jcb->job_status = Wait;2 m& g- k2 q+ X- r: G7 A! e
jcb->submit_time = 120; 1 ~$ X! R; n9 @5 @0 g jcb->required_running_time = 70; . v' A) ~8 {0 v! H2 g2 J# B0 } jcb->pcb->priority = 9; e( g* D, ^* Y$ T back_queue_->push(jcb); ' W: Y! k9 L d0 |5 U */ # U* ^# p& M1 B; H8 o z }+ Z' W6 I* E9 k6 N
0 p0 o! N8 w( g. e bool start()2 D' M* z" _5 s' ~
{ , u6 B6 ~+ ^, b! H cur_time = back_queue_->top()->submit_time;* u5 k1 j( s8 i
while (!back_queue_->empty() || !psa_ready_queue_->empty()) ! C0 U: y% n! M% ^& ^ { 7 }& [, h) l. I/ f" `2 x I bool increase_time = true;' h- [" O- q. ]! A
// Job FCFS- W( ^$ s: w `' @. o' r1 L" z/ ^
if(!back_queue_->empty() && psa_ready_queue_->size() < 2)0 H K$ C: U7 a0 ]# x% C
{ + k2 v' G% l1 r0 A y" ^/ F) @ JCBptr jcb = back_queue_->top();+ Z! F* U4 R. D$ }8 [/ X6 r! E
if (jcb->submit_time <= cur_time)) g( \4 j" i( G, K& Z
{( \. R% N3 ]" N. ]+ e- C4 I
back_queue_->pop(); O! g/ v% @- T: Y, W3 `& Z, q! x$ F! v8 k9 J9 ^0 v0 X5 e! e4 F9 t
// Process PSA % V3 f' m- e0 P) s if (!psa_ready_queue_->empty()): L7 L* P3 s T o4 I
{2 t1 v1 E( b a0 K7 N; B
PCBptr pcb = psa_ready_queue_->top();( i i* V/ `- a- c& E V+ |
JCBptr jcb = pcb->jcb;# T, J7 Y) v: M
8 I- h1 j9 S; W
if (jcb->already_run_time >= jcb->required_running_time)& T$ N* Z+ \8 c/ B$ ?
{' T. S3 H3 Y7 ^& Q+ y
jcb->job_status = Finish;1 @. \ T! V2 v \1 a, B
psa_ready_queue_->pop(); / ?9 ?/ d$ N0 `. ]% F //std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; & \- a+ @$ P: F$ L1 f, M0 q% Z7 v( O C* o% _
jcb->finish_time = cur_time; 0 v+ c1 z( B! C Util::printJobData(*jcb, true);6 M( I; y \$ F* F( v2 D
} 8 U& Y! G+ C$ C* h; E- \ else5 S7 Z! ]# I( H5 x9 l T
{ : @- @" P# w E, ~. n% v2 t! N0 d, c! W jcb->job_status = Wait; ) y) j& x9 i S, p pcb->status = Ready; ; b ?# w& T" d //std::cout << "[LOG]" << jcb->job_name << " Ready At " << cur_time << std::endl;( U8 }3 c. ?0 I9 T# x$ g
}8 M$ N: E. q* E" q5 }) H3 T
}/ _, [" V% @) u% v1 p( f
/ C1 ]% { m' ~$ Z1 G
psa_ready_queue_->push(jcb->pcb);2 J. F+ U, H0 [* \, `! a/ |( I
! `2 P* @+ j! f PCBptr pcb = psa_ready_queue_->top(); % }$ c& Z/ o% ]' f1 K4 o JCBptr jcb = pcb->jcb;) w1 M2 C6 I6 m. E" e
jcb->job_status = Run; & d+ \/ i' O9 P pcb->status = Running;* s [6 Z7 W0 I
" ?; q+ b/ [% O3 u3 @
//jcb->start_time = (jcb->start_time == -1) ? cur_time : jcb->start_time; ; o$ Z9 v3 [, q7 e4 S3 i! ~ //std::cout << "[LOG]" << jcb->job_name << " Begin Running At " << cur_time << std::endl;# u, P% w. ?* U" ]
2 _. Q8 r8 h! E4 N6 z increase_time = false;3 g# d* ?. X4 u* N
} ( v: Z8 ~2 e7 [ } ( V; `% j: s1 ^ else if (!psa_ready_queue_->empty())/ y* b' \. F8 M" k/ p8 |
{ 1 o, E }5 T: v% H PCBptr pcb = psa_ready_queue_->top();5 g1 k( {' w; i4 n+ u
JCBptr jcb = pcb->jcb;. D$ E5 R; i- _7 ?6 l
4 N6 \9 o2 Z }' a- a) }
if (jcb->already_run_time >= jcb->required_running_time)4 G& [8 u# D& l; j$ Z2 p6 y# V3 E- U8 ~
{ # u1 O' l0 Z7 g' Q: c% R! c jcb->job_status = Finish;% @+ b* ~/ S3 {4 F. e/ O" S# ]
psa_ready_queue_->pop();/ E9 J) u5 C' J5 c% H
//std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; & W, Q7 t1 S! z: F jcb->finish_time = cur_time; # z- D. Y2 B: Y/ h- y. g- W8 \ increase_time = false; 8 Y+ ?3 h+ \8 t& }4 {4 D, C4 i8 o . ]3 ]: |. k/ v$ F! i/ Q JCBptr jtop = psa_ready_queue_->top()->jcb;( V, P T5 M$ @2 Q$ b3 D/ v/ P1 N
//jtop->start_time = (jtop->start_time == -1) ? cur_time : jtop->start_time; 3 q# V0 N; w+ y) E8 x: _7 k Util::printJobData(*jcb, true);" b0 c& I8 h$ O4 [) b, T7 J/ F6 c$ b8 r
} 4 F3 X# T+ m' E, ~5 x# ? } . I! E. d8 y, T0 B 2 d' j8 L: t0 I( I/ c if (increase_time). t4 {/ B1 Y. {8 Z0 s8 S
{! N1 |+ }% B0 c. g6 y2 h' E
if (!psa_ready_queue_->empty()) " E$ U6 U$ ]2 P7 U6 F4 J8 p# i {0 \' g0 f6 U: j
PCBptr pcb = psa_ready_queue_->top();8 t" K) I2 I4 q
pcb->jcb->already_run_time++; 5 ]/ U2 B' O" \2 w/ f8 Q5 k }! _# z' F2 z: s9 Z7 a4 o1 ~
cur_time++;, q& z: E3 n4 T
} : q6 u2 E: E6 m& M; y6 J }8 n. x( F8 ?1 P& ^8 r
std::cout << "[INFO] all jobs finished." << std::endl;3 I1 S4 l0 r# P$ Z5 L' X
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / job_num_) 8 Q6 Q: o0 `- X9 W! w5 d << " average power turnaround time " << (average_power_turnaround_time / job_num_) << std::endl;" L1 J8 y I! S, x
}. A Q. T; l" v
) R3 J3 O" {- }7 m4 S. j8 tprivate:% ?- o) o' P4 C# ~6 j& Y" w9 B
int job_num_;; u2 S% [& j1 q; s0 s
std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>* back_queue_;: k. m5 a& c3 D/ W" _2 C: d
std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>* psa_ready_queue_; % W$ z8 i& ?1 X( g+ t2 V};$ N6 H6 E* Y( { ]% J- T/ G
, B) q- g" ~1 h+ J
/*! {% h: @6 ?5 C3 i/ {5 Y
int main() $ `, y# H# k$ A6 q1 ]" j/ }$ ~! S/ \3 a{4 |6 m& u( D% P! Q8 Y/ y1 V
SimpleBatchProcessingSystemJobScheduling<FCFSSchedulingAlgorithm> js(4);/ T8 \1 s. B. h' U a+ l
js.getCurrentReadyQueue(); : {8 n" Z/ `: K' {( y + Z! t- e7 }6 V: v+ r" K // pause to see result; l& F# j. W3 }- `( N" Y
getchar();! X; P2 h, b, E/ Z; }
return 0; ( j5 X' w0 o- A9 g0 N' m/ v}3 Z5 O( q' g0 s% d$ N6 U% d
*/ 5 n1 d8 V5 U, v" }, j7 H: G , O8 b8 }9 ^2 I* f4 E! a六、运行结果 , S% T Y: S! H+ u; z- a2 [2 t2 T6.1 单道批处理(FCFS)' E: t* m* b" W6 {