; z4 s* a+ b4 W% x% f& \. O% ?. O/ d SJFSchedulingAlgorithm() " L/ I4 C; T( E. e5 k4 V {} A& R. I1 L6 j% F1 E- \" U ' G! {# m( p3 m! d I) W1 n}; : d; f5 T" h6 K5 [1 B; U5 E3 K- L) a " Y; c1 a# W# D9 `7 t5 g1 Z S# Y// Highest Response Ratio Next# U: s; ?9 y0 C9 v
class HRRNSchedulingAlgorithm : public SchedulingAlgorithm# E' f4 F5 z5 S+ n3 [ S9 u
{ |3 W- S; a. o. b% H9 z2 x- Y- P5 ] ~public:9 Q& s3 n3 g, Z, n- a. E
struct PriorityCmp3 b9 X& Q% E4 a9 J0 O+ W! B. g4 q" s
{ ' H" b# |, N0 A/ N/ ` double getPriority(JCB jcb) $ h5 N# }2 @9 P, J) Q {& w4 E4 Z$ x0 L2 S& l/ Y( F
return ((cur_time - jcb.submit_time) + jcb.required_running_time) / jcb.required_running_time; 6 B# }/ k5 ~' u% r ~0 F7 ~ }& n% `7 d% k4 M" d
6 O/ H# t/ y) N5 J$ z3 ]3 \1 ] bool operator()(const JCB j1, const JCB j2) ! F8 b @! A6 ]! w' i s {" v0 I0 r# H+ P& E
return getPriority(j1) > getPriority(j2);3 @2 B% c- r9 y7 P8 X( b! u7 G
} w0 P" D6 h1 x$ w# b2 g }; 9 `8 v: N( R( b & t. q9 e3 o# k, c# _ HRRNSchedulingAlgorithm() 4 [) Y# z* z9 N" Y( [" q. g6 A {}- K; I9 V$ p O* G
};# ]& p: h6 h6 y2 t' U6 X
- p& C3 o, a2 H7 m5 O0 w# Ttemplate<typename PriorityCmp>, f" k$ a i% S! Z3 W
class JobScheduling; x( `, v! Y! y; B* T6 F7 e; Q
{; L0 B3 T* ~8 Z% }2 X% G
public:4 S( b, i- w7 @* t* H; H- G* @
JobScheduling(int job_num) - @# |+ u6 _0 \5 y5 O3 C8 N8 I { ) r0 D& P( `0 q5 g9 N job_num_ = job_num; & v k9 \8 O# c7 W! J% ?: P2 h. X sa_ = new SchedulingAlgorithm(); ( z3 i6 a! f6 V% X# ? wait_queue_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>();2 ? ?- L- E, W% Z: v# p6 ^
mock_jcbs_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>();0 _8 J' H9 `" t. Q/ Q
finish_queue_ = new std::queue<JCB>();) z: y! K1 H% K
) S( b1 k. G1 s7 O mockJCBs();' t( |! o6 Y% Q! j4 z! S
}; U" f- }5 Z) q I! z
# s9 |- m( V# r
protected:+ i6 q# u2 _4 f
struct PriorityCmpForMock. o: {, @6 g8 c" k
{ 2 D0 r; o0 P" I5 A bool operator()(const JCB j1, const JCB j2)% U) Z# ?# C& C7 ]' m( @, I
{ 6 i9 }( B6 _4 b return j1.submit_time > j2.submit_time;* X2 j: R9 Y5 X& E b
}- r/ g W) _) g2 D
};5 `; n# E! R2 L
2 {1 k. [5 a4 A/ ]1 d4 [1 P bool mockJCBs()7 G/ q' @# v9 |/ h8 v
{ {4 |. `. v! Q+ t+ Z2 g for (int i = 0; i < job_num_; ++i)) I& @+ [4 b, j& Y. f2 u
{7 w3 a! m1 h% q+ {" q
JCBptr jcb = new JCB();! L) D9 a3 X+ ~1 h0 P
jcb->job_name = "job" + std::to_string(i);+ d* A4 o0 v" |& c# n
jcb->job_status = Wait; 2 y$ e: b/ y2 Y m/ D3 B) j, G9 S* A jcb->submit_time = Util::getRandom(1, 20, i); 5 u: P) T3 U8 k" k // The minimum value is 3 so that each segment can be divided into time slice' X$ v y1 h, k# z3 t5 B( _
jcb->required_running_time = Util::getRandom(3, 10, i);; i+ l& J6 V k+ v3 ^% Q6 l
# |% e: h# Z1 @2 h mock_jcbs_->push(*jcb); 6 J- G7 g$ W; y2 D' ?$ t( L std::cout << "[INFO] finish init " << jcb->job_name << " with "% [3 P4 Z$ X9 v" z+ o( v" m7 ~6 g1 J
<< " submit_time " << jcb->submit_time0 N a! c( L8 i! F# V
<< " required_running_time " << jcb->required_running_time << std::endl; ; ~2 B5 X8 t2 z% M% R; U# ~1 F/ ? }6 W$ b4 U4 ~8 d% Y
} 0 f# z) R; \7 P) x |: L& L. ^8 Y+ C& v; y) c
void getCurrentReadyQueue()9 q/ R8 t* s3 Y: ?
{2 H( F5 Q( Y) l/ s7 i8 C' u
while (!wait_queue_->empty()) 7 a/ B, O8 x+ Y! A4 F {! p2 Y1 [4 U5 K/ H9 Z3 G. B
JCB jcb = wait_queue_->top();* @( B+ Y- }+ ~# o
std::cout << jcb.submit_time << std::endl;/ y: J& B9 t9 M, c- @! a: E
wait_queue_->pop(); $ A% S, ^! Z6 J3 L } ; Q( I9 M! a8 E& I$ o8 s }/ f+ d& L! M8 ?: u4 Z6 P
, O8 P0 s. B/ s: ~$ m6 c2 H9 U
int job_num_; * y( Z0 K7 g: x# O; M* U1 v SchedulingAlgorithm* sa_; . P+ b4 `1 L0 k) h4 w% e! l std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>* mock_jcbs_; - X+ Q$ Q5 a$ i. @; b std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>* wait_queue_;" n& f& n% r+ A1 j& n6 H
std::queue<JCB>* finish_queue_; + \6 ]: `" g: T* l# ?' l};# j7 r" A7 |. R
N$ n! C* P/ w1 p$ Y3 atemplate<typename SchedulingAlgorithm, typename PriorityCmp>6 G) @: L& V$ I
class SimpleBatchProcessingSystemJobScheduling : JobScheduling<PriorityCmp>! F8 D: A6 K# ~
{6 M) w/ w- M( f3 G( b1 `/ _
public: z$ O- o# M9 P) d% m
SimpleBatchProcessingSystemJobScheduling(int job_num); W1 o$ C) v4 i. ` U/ g
: JobScheduling<PriorityCmp>(job_num) - x w& q. Q# m& U* L3 [7 ^4 [6 G- I {}0 W1 v [; o' g7 g6 h& ~
! U4 c4 o. X* S. F# M# c( w
bool start()3 z+ N& t Q+ S0 Z& X2 {! v
{; @& U+ h" I; l/ n3 _$ G) I, q
cur_time = this->mock_jcbs_->top().submit_time;* m. s$ L- f% g5 d
while (!this->wait_queue_->empty() || !this->mock_jcbs_->empty())7 c, ]3 b: s* b1 c; Z2 l
{ 9 @ T' ^' d8 K* P // Simulate adding tasks dynamically 0 V: l3 P$ m$ N6 n if (!this->mock_jcbs_->empty() && this->mock_jcbs_->top().submit_time <= cur_time) ! I7 \: W0 J( U2 A$ c { ! L+ n$ \- [9 P6 u) I# G- r8 o JCB jcb = this->mock_jcbs_->top();( [# V& Q2 G! ~3 v6 O, k8 G6 `
this->mock_jcbs_->pop(); + T4 z( V. r6 v % o( V6 E. P1 @# ~% F( f- g2 L$ h std::cout << "[INFO] add " << jcb.job_name << " to wait queue." << std::endl;0 E) b; h0 }$ ]5 _
this->wait_queue_->push(jcb);4 C) L7 i% v# [% Z+ ~/ E. ~, S
} 0 X$ i; s( m& D# S3 {* @* k O# q* y4 l$ U @ u+ J5 b if (!this->wait_queue_->empty()). H5 P" ?/ V: O" E8 w
{! c: {) T' g$ j
JCB jcb = this->wait_queue_->top();$ W8 Q6 p/ S; I. o6 K
this->wait_queue_->pop();& N) `! \2 T5 h- q" r5 a+ Q) v
3 R' W" t. q& u7 P
std::cout << "[INFO] begin to do " << jcb.job_name << "." << std::endl;. C' I1 p% p7 }' q6 r2 @
jcb.job_status = Run;& Q( o# J2 [$ w/ t
// simulation do job 6 p/ E4 r9 i& ?8 r6 E q7 }4 G sleep(1); ' V& T9 I" y; p/ I. s& {0 ?/ U std::cout << "[INFO] do " << jcb.job_name << " finish." << std::endl; & j/ ~0 Z$ T( w* L `2 b; o2 k( L; Y* w2 q$ o. ~
jcb.job_status = Finish;' S( ^1 Q3 v% N- Z
// print job Data.1 [; X+ ~. z4 u- ], l {3 M# m
Util::printJobData(jcb); , ?2 b9 \8 J8 [2 ]. D this->finish_queue_->push(jcb); : i( o4 J3 l3 i+ j% v+ M cur_time += jcb.required_running_time;/ a, E2 m6 V5 T' d- K
} 3 {9 b0 A. b# `5 w( f: W else: ?2 S5 n& @5 I
{3 X( Z; [+ C n$ F2 K
// Slowly increase time slice when there is no job. u1 f5 |1 e: ?. o8 ?- g
cur_time += 1; k6 j* r( x0 U5 {9 x } 3 [5 k8 k0 K* G } + o0 Z1 D% c) N+ T+ j& F std::cout << "[INFO] all jobs finished." << std::endl;4 i+ n2 ^8 g$ K& x- M
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / this->job_num_)6 [' q6 o G2 w
<< " average power turnaround time " << (average_power_turnaround_time / this->job_num_) << std::endl;9 q6 u! X, r9 V D |8 |# `! k
}& Q: ? X5 c2 Z8 T! n( p- u
$ N* X* f8 Z! a" c2 m2 B
private:' I+ w* C. P1 _$ f, d0 k
7 ]: |, A: T4 F& p$ O
}; ' c9 d4 X' V* G; X& |+ ]' W4 K0 D1 f- l4 Q! O' i( m$ p
* @7 d: t% ]! Y2 M
class MultiprogrammedBatchProcessingSystemJobScheduling Z% I4 J- S2 s; R' O
{) v' s( ^$ m0 W/ b2 O3 q6 j& Z
public:+ y; m8 X9 [8 x- u
struct PriorityCmpForPCB$ D1 [( b5 H- b% i% o
{5 X% {( r2 K: m& J/ {# t
bool operator()(const PCBptr p1, const PCBptr p2)/ I$ G P/ w. H* L) I$ f+ F
{" u. l% D6 `1 P7 t c- I; T% h
return p1->priority < p2->priority;) p" D) P. Y/ o. k7 Z
}) n" q3 t4 ] C/ }. l
};8 _5 O" q2 q/ i9 h4 p7 r
' M, g1 r5 l- r( M) n
struct PriorityCmpForBack9 a6 ^6 n( ]' O6 T
{) r2 Q x5 O) x' s6 \5 B! D0 Z2 r
bool operator()(const JCBptr j1, const JCBptr j2)8 i" P! i! c( r* c$ t
{) h: f5 l( C% ~2 ^$ D& r# E+ X
return j1->submit_time > j2->submit_time;* X5 n( W' ~2 }* G9 l
}) Y! M& t6 n$ ?0 F2 e* N" J! t& q
}; 4 X4 b% W4 \# j- |6 S: z . h! K9 G8 u9 u) m' y# \ 4 p$ S4 _! @9 p# a% f MultiprogrammedBatchProcessingSystemJobScheduling() 1 Y, T8 K! c% k2 _# L {. |) L4 Y& y( \0 b" R3 U6 t; I
back_queue_ = new std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>();4 |8 Z( l. l( _3 i, q3 F+ L' X8 q
psa_ready_queue_ = new std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>();! R/ U2 f D$ F/ S$ r( L0 `3 B
% j, J4 ~, t5 M% r* U 7 p7 |8 R9 d2 n. J( c; R2 u std::cout << "input job num:" << std::endl;6 O" B$ y O( o5 Y! G5 B: E# C3 I
std::cin >> job_num_;% x5 A. ~& w% R5 i K! }
for (int i = 0; i < job_num_; i++)$ v9 b" z. B2 D5 D/ {3 X" M
{ 0 a- G* l# l, \6 o: K3 e1 B std::cout << "input job" << i << " submit_time & required_running_time & priority" << std::endl; . g4 Q& W8 c. E' ^6 s 7 C$ ~. {3 J4 O! @6 y
JCBptr jcb = new JCB(); . H6 o1 J8 q$ x3 E: R jcb->job_name = "job" + std::to_string(i); ' y: V2 X- G, q a6 @ jcb->job_status = Wait;8 c& P* C1 y) }/ B4 Y. ?9 |
std::cin >> jcb->submit_time; 6 v8 z- C+ d. m1 f/ l std::cin >> jcb->required_running_time; ! \1 J; T) P$ K! f( ^ std::cin >> jcb->pcb->priority; : }4 M8 V% n3 O back_queue_->push(jcb); * b0 s+ h6 @7 p- r* b) ? } `) W' h: S, X$ t `0 i7 P: A! r
/* & k, r; f" ?0 a' D& p+ w4 z. g job_num_ = 6; $ e% w% F0 E3 \* M9 V2 w0 g! a, }$ @* g/ ^6 P1 w
JCBptr jcb = new JCB();7 Y. I8 |* L- }! l
jcb->job_name = "A";% x, i6 ^9 k- A- h# n
jcb->job_status = Wait; - u4 ~1 b$ m3 I6 }. @ jcb->submit_time = 0; . t1 i V. H4 H) B jcb->required_running_time = 50;* L; X% P+ K1 V' F0 O. x
jcb->pcb->priority = 5; * H4 d. u9 n- K7 a: p back_queue_->push(jcb); 0 J5 _# M2 B W0 W7 L3 F2 ]5 P5 j0 `
jcb = new JCB();& ?( F) }2 ?7 C& }9 N
jcb->job_name = "B";% r& U0 f; C/ {- h7 R
jcb->job_status = Wait;8 t- e J/ |5 @+ ]
jcb->submit_time = 20; 6 {+ V: z9 U9 C' h& p jcb->required_running_time = 60; 2 Y/ ^; s+ u4 S- ?$ a! D jcb->pcb->priority = 7;/ T- V8 C! l6 s* F# \
back_queue_->push(jcb); 3 z9 K/ ~" u* d . ^- A" P' G( P' t: N- y jcb = new JCB(); 0 d0 I& E6 K4 B3 { jcb->job_name = "C"; # y/ S) ?( X/ k3 D/ i! b jcb->job_status = Wait; . O" r7 J! k1 f( k9 { jcb->submit_time = 50; , V9 }, M9 V0 k$ R6 Q jcb->required_running_time = 40;. [, H5 _9 S6 l
jcb->pcb->priority = 3;4 O' N' g7 d# Z0 M, }
back_queue_->push(jcb); % g! V, u% D9 O) U& B9 \" n' r# W3 `% S
jcb = new JCB();9 s% n/ a# s- D [! p
jcb->job_name = "D"; * O$ z; q- x3 |$ m) Y/ n jcb->job_status = Wait; 3 ]; ~* I. {+ r3 d6 I; z jcb->submit_time = 80;& T" G. t4 D) t6 L3 s. e; A' m; s
jcb->required_running_time = 80;6 v' g& J6 E5 L
jcb->pcb->priority = 8; , q' q; p# l+ B% w) j# U back_queue_->push(jcb); 7 B) c. o; @6 `" I/ U3 U# o3 L$ e" r" A* I# t: \' t: K
jcb = new JCB();) o6 j/ A- V3 h) J! L
jcb->job_name = "E";+ f# t8 r. ~; R" S$ q
jcb->job_status = Wait; 8 c/ C3 q# [+ N9 X jcb->submit_time = 100;/ p+ @* Q8 I& M2 L4 b6 ^
jcb->required_running_time = 30;2 [: Q, C+ W4 q% j1 u
jcb->pcb->priority = 6;+ I6 f+ [9 Y/ s( B* w
back_queue_->push(jcb); * A9 k! u" @- X d* m, g, g8 H
jcb = new JCB(); / A( w" @3 c4 z jcb->job_name = "F";4 E% ?' v8 Y' y
jcb->job_status = Wait;5 _" T/ Q/ J% u7 u
jcb->submit_time = 120; ( K( n- @: X4 h. q; `, e jcb->required_running_time = 70; 6 @$ e# ]- n5 k jcb->pcb->priority = 9;1 \! h9 u' j7 O7 ]8 D" R8 y
back_queue_->push(jcb); 7 [, A% g) n) F X1 x! W$ M2 R/ Y */ 3 D" r0 n& u7 e. T, c1 W, J }. }* ` _! e7 y5 {