1 h* ^7 z$ R c9 S* Y& \class SchedulingAlgorithm ; d2 X7 X, Q. U. a7 s' u{ ) _8 q% Y1 U- t2 S8 ^3 Gpublic: 0 v( L; |4 d/ r C F3 f! s: r) l( t$ {// virtual bool initPCB(std::priority_queue<JCB, std::vector<JCB>, std::less<JCB>> * ready_queue, int process_num) = 0; : r6 q- f3 ^3 g$ s/ v6 H( Q6 e" S// virtual bool processPCB(JCB & pcb) = 0; , k& ^: R Y6 q1 v( n, t};6 p' m4 L! D5 `7 a2 K4 o
" |7 I- Y/ x7 r" L+ H. h
// First-Come First-Served % @' ?! k# E* p5 t' Nclass FCFSSchedulingAlgorithm : public SchedulingAlgorithm1 q1 L8 { e3 |7 G
{: [# L4 g1 y+ I+ r$ k5 i, u0 S0 s
public:3 A: O2 G6 F% I8 \! ]) F+ i
struct PriorityCmp $ O# b E6 F- b* n' @9 Q8 C" t { ' D( m2 h9 @3 h% a) r. t bool operator()(const JCB j1, const JCB j2) 8 \ h+ e8 r! V {3 b3 e& i$ ^% W% @
return j1.submit_time > j2.submit_time;6 s8 B3 Z5 |4 ~8 u+ F c) p
} % h% \ g/ ` x' ^; x0 r- h };: x* ~: t5 w* ^& Z" K
) c! _! a! o* H
FCFSSchedulingAlgorithm()" C/ {1 S% ]" w5 {
{} - j1 v" }2 P: Q [; Z2 f1 \& v' F( |7 l5 C( r
private:* A6 Q" w6 o7 M# h0 }+ P6 k
( K: ~! M" W; [4 Z \4 `4 _ X# t4 u8 G7 [% a6 u" A
}; 0 o- l. s6 c' U/ z0 g 9 a7 ?: Q, R! }// Short Job First & v* L0 ^9 v( P+ |; Qclass SJFSchedulingAlgorithm : public SchedulingAlgorithm - S: J/ N' _# F; k{ 0 ~- \; a0 G7 L1 k Ypublic:# H7 h3 H3 [0 Q! ~+ I/ T
struct PriorityCmp. B) P8 n5 q& S. v& F0 F8 j: h: ~6 r
{) D5 o! U$ @7 E+ x& }# K5 ~
bool operator()(const JCB j1, const JCB j2)( h6 m$ w3 c2 v7 R4 q# S
{$ I# ]+ }1 P4 f$ o6 M
return j1.required_running_time > j2.required_running_time;, _1 K! `/ B8 t4 m* `3 Q% X$ ]. D
} " J3 b6 l! l7 @ }; 2 l) ~! e" ~1 |( c$ i: C) `: H! k8 S2 B" o, C* b
SJFSchedulingAlgorithm() & r0 _, V$ S3 Y- G {}& @3 g1 p' t' b1 ?
$ t5 [' y6 }2 m4 l( ~& B}; 0 K4 e; S6 S! j+ G2 y' |2 p5 ~3 q3 u! o! S' Y8 G- Q2 R- r
// Highest Response Ratio Next $ W& f: Z' m/ T0 ?0 Zclass HRRNSchedulingAlgorithm : public SchedulingAlgorithm 3 T) X8 Z/ {1 b. T5 T{7 v- d( V* \, ?& m+ Q
public:6 e& ?; B# G1 {% n# E3 p1 `
struct PriorityCmp9 X- p' X/ [. K. P& r E( t9 P
{ 9 |5 k: _7 D K- F9 C2 W9 R4 H" w3 m double getPriority(JCB jcb)! n7 P" K& ?' j* G6 G
{7 F2 n, P T- u. f- b6 p
return ((cur_time - jcb.submit_time) + jcb.required_running_time) / jcb.required_running_time; / c0 B1 j+ r9 S/ Y) N6 K }9 [! ^- k# O+ q2 [( e
; w- t' a5 E0 o0 b
bool operator()(const JCB j1, const JCB j2)! g) G/ y3 c( q7 v, J
{2 t" G6 E. r* V: B. F3 q: J9 @
return getPriority(j1) > getPriority(j2);- ~" u5 p: }/ u( X4 R j4 h
}8 e% l; d! i% F% K2 H7 g
}; 0 k5 E0 i. ]) I0 k- V; G3 p+ G$ Y/ l3 \, Z
HRRNSchedulingAlgorithm()$ v) N& \ _$ ~( x% D2 G2 k9 s* d; o
{}9 H* X, ~. _5 z+ ?) _, d# F* G
};6 O+ x6 {) ]( i9 W- o
) @3 {* n, d# n- Stemplate<typename PriorityCmp>. c7 w' N6 ^) Y M. W* [
class JobScheduling a! E, Y4 |/ F' `( T& J
{ 0 }2 Q& c! P$ z s' P6 gpublic:4 k0 R7 ~( V" z0 H, N4 |
JobScheduling(int job_num); ^$ v. }& C7 s
{ w9 z7 {6 ~( U8 d- u job_num_ = job_num; % a3 s8 R# R: T- t5 e- S: R sa_ = new SchedulingAlgorithm();8 t l0 F- v( e
wait_queue_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>();( B* }& D" v- e
mock_jcbs_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>();: c+ ~: Y+ V, X
finish_queue_ = new std::queue<JCB>(); ; q" K/ I4 u6 D. U% C6 ?% g* y( u( y5 P2 `! \" t7 l7 q# U
mockJCBs(); - h! D1 F- M' n }; C& K- f; |& g, l# L, V
# z1 b' ~6 Y7 C9 z6 a3 `2 C* ?
protected: ' p! B P& Z- [/ p4 h" Q$ k. P struct PriorityCmpForMock + n' x, f0 |/ f4 {5 T6 u2 T' I {! W: I8 M/ A) w; F3 c& y1 ~. l) w( ~
bool operator()(const JCB j1, const JCB j2)" g: q1 c; m4 |6 p" {+ Q! @
{- o; y7 \5 ~( j* I, F2 l
return j1.submit_time > j2.submit_time; 9 j9 R4 i( H$ C, U7 w1 I } 5 L. T! }0 R! r5 r }; $ G* q0 \+ z) B1 @4 _5 A . N2 l" ?, |+ A+ | E- j$ ` bool mockJCBs()9 u s6 s9 M9 u6 d6 n0 S9 r4 [
{ % Y# E* v8 }4 C& d3 G for (int i = 0; i < job_num_; ++i) + q. g2 T9 p4 M) K" x; x; {) G# ]4 u {. t' A/ A- D8 Z1 b% o, f
JCBptr jcb = new JCB();* t* F' V$ G: i
jcb->job_name = "job" + std::to_string(i);0 `9 N: n0 U, {
jcb->job_status = Wait; ! S0 l$ c; I) Y: {( M/ o jcb->submit_time = Util::getRandom(1, 20, i); & C! b+ u' z/ X, N3 J% t; L/ f; a // The minimum value is 3 so that each segment can be divided into time slice & i- z9 }( s' A* Q; q9 s jcb->required_running_time = Util::getRandom(3, 10, i);0 t# ~% ^8 K5 n, x0 e& U# K
- t8 H- p/ u7 X) q# h, R" J
mock_jcbs_->push(*jcb);7 Q5 [' s, `. h; @% B! y
std::cout << "[INFO] finish init " << jcb->job_name << " with "0 O3 z8 M7 U' K+ K2 n# I0 Z
<< " submit_time " << jcb->submit_time9 \$ W( \' H: i
<< " required_running_time " << jcb->required_running_time << std::endl; ' i+ c* h2 g/ q! Q2 q% `" N! _. Z } - f* O: G8 q2 @, y! g9 | }6 A5 d, {3 i* t. G3 Z5 f
; V( g/ E; y- e) d$ g
void getCurrentReadyQueue()6 V8 h0 u2 S/ T5 c9 l* t
{* M0 L# F" v5 Z& O
while (!wait_queue_->empty()) 3 e; `) d# {+ i& J, v { 4 M0 Z9 {& J% ]" h) x JCB jcb = wait_queue_->top();8 g0 d/ `5 I9 Q9 K+ [+ R8 z3 O
std::cout << jcb.submit_time << std::endl;# t9 {& r; f+ N( M3 e
wait_queue_->pop();, S/ V# M* d2 h0 O
} 6 X' p! E* [% ?$ c' N* f6 n* t }; H" G3 ^; {: |+ r& C* d+ @
3 k) J% C1 L4 V' ^
int job_num_;* x$ g( ]* x0 l( B h% W" L4 w
SchedulingAlgorithm* sa_;6 J) ?; x s& X6 ?) t
std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>* mock_jcbs_; 2 P) n2 j& E3 [) N0 D6 O9 l1 P5 b; d std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>* wait_queue_; # h- w' c4 m/ b" e" w# Z std::queue<JCB>* finish_queue_;9 o' {- [" R" g3 d4 U8 ?
}; / j. g% p7 Q" w4 `2 R 8 r% ?8 z+ ~( x. I5 @ D- Htemplate<typename SchedulingAlgorithm, typename PriorityCmp>8 o- M. K" k/ }% w8 R0 k) d
class SimpleBatchProcessingSystemJobScheduling : JobScheduling<PriorityCmp> 7 R4 n! u8 t- E+ S( G( |" k{7 M; D0 x8 i8 B/ W0 A
public:4 ?# p9 y; S: X4 B, _0 p
SimpleBatchProcessingSystemJobScheduling(int job_num) ! c- @: r' ?0 l, w1 M$ T% S : JobScheduling<PriorityCmp>(job_num) : v6 {$ g8 D1 K& z {} # ^9 ]/ N6 v1 p& ~5 K. \" Q% L& R8 P6 k' n9 S0 Y2 p1 T# X' ]) a
bool start()1 e* ~4 ^% \( I! R& n4 [6 i& X' q! A
{9 `( ]) L" h# ]7 }% y) `
cur_time = this->mock_jcbs_->top().submit_time;+ g+ R9 t4 ^3 s) q6 ^/ r4 X$ L* s$ Y
while (!this->wait_queue_->empty() || !this->mock_jcbs_->empty()) , o$ F# o7 `- O+ H! a' G# D {$ a0 |- P6 P5 K2 {. ]% X
// Simulate adding tasks dynamically + O* U; W: ^& J C& w if (!this->mock_jcbs_->empty() && this->mock_jcbs_->top().submit_time <= cur_time) ! n7 b4 L6 V4 z' a3 H% a/ D {8 g* E! a* T# q
JCB jcb = this->mock_jcbs_->top();5 P5 O: w( s: D: d
this->mock_jcbs_->pop(); . s% M6 A3 d, b2 p) L. r" L' ^. z( ^9 ^4 w
std::cout << "[INFO] add " << jcb.job_name << " to wait queue." << std::endl;' H( I; e. f% e1 q8 A; ]2 ^0 B
this->wait_queue_->push(jcb);# W6 ^' Z- ]' S5 R A
}/ }5 t- Y+ r# I- y; ]- Q
$ Q$ N7 Z. O5 R' E6 x+ p
if (!this->wait_queue_->empty()) 6 U% O, X9 @& h { # Q" `8 B) i0 D* s' d- d JCB jcb = this->wait_queue_->top(); + d! _: x* E2 x o0 i C, e this->wait_queue_->pop();# ^$ O% x$ ], Y, N0 u/ i! G
3 J2 H c- `" o& p
std::cout << "[INFO] begin to do " << jcb.job_name << "." << std::endl;1 F% ~; {3 u" z3 y$ \) c" r
jcb.job_status = Run;6 Q& l2 w+ z0 W- I% i# M+ d
// simulation do job * G7 ` s8 f# U sleep(1); & E. h& b0 g* ~; U, Y std::cout << "[INFO] do " << jcb.job_name << " finish." << std::endl; 3 _, B+ A0 O- G- a1 ^0 G: Q( \8 Q% O8 k) A0 ?
jcb.job_status = Finish;% L/ y7 h W1 G# P+ D+ h' y
// print job Data.' t& a/ V m n& ?: F' n1 M
Util::printJobData(jcb);& Q: ?7 M+ {5 J
this->finish_queue_->push(jcb); " T( _/ {% |8 k cur_time += jcb.required_running_time; , _+ k8 z* B4 H3 X } ' E' h6 T. G$ n$ _9 {+ \ else 4 Z: | o* i! ~) {* `) j {/ @8 X, }: U( C& @5 H
// Slowly increase time slice when there is no job 8 l- [ b5 n# l9 I" o cur_time += 1; 3 z8 g- Y4 U1 l) Q. O3 u" B }" u3 `5 [' z/ P% H
}& S" _; m/ F3 c6 D' B4 _6 h
std::cout << "[INFO] all jobs finished." << std::endl;2 k6 R1 W1 C$ }2 b* i7 D/ ~0 n
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / this->job_num_) ! L6 s, Z* e$ n' z; v9 a5 } M << " average power turnaround time " << (average_power_turnaround_time / this->job_num_) << std::endl; 4 M( H" D2 h, V0 W' Z2 s } 2 l: E) F7 W# `" W* @' o ' X) g( Q W; p, eprivate:$ T7 ]( W4 C4 w' d* l* v7 d
, o/ Y: p$ ^% B# r7 {};( x7 w2 c3 S$ ?: |; M
6 B* G# D9 @& y E& k* b, L4 s; [7 ^$ _6 X
class MultiprogrammedBatchProcessingSystemJobScheduling. y" }6 D& g5 v9 b3 x
{ z$ y% L, w7 V5 h, _
public:: x [2 e9 y4 Z: r
struct PriorityCmpForPCB 0 ^- E. L5 \7 Z, N/ N1 N3 V, Q {7 A- h- [, j4 x) @$ g, l d
bool operator()(const PCBptr p1, const PCBptr p2) ; W, ^1 D# p& F. i- T8 C+ ^4 ^ {7 `* X* J4 z5 S8 q
return p1->priority < p2->priority; ) t% O. z/ v% C! Y' e, q }; ?; G) P/ l( L, u% e
}; G; X) U- k0 ~ 3 }6 w6 `( A' x+ C struct PriorityCmpForBack* F2 J/ D# [; N, }2 g
{# { F4 E. L% u% Q$ m$ @
bool operator()(const JCBptr j1, const JCBptr j2)" U/ H A: d/ j, f S7 ]
{! G; ]5 q$ S8 O. }- J) E( }
return j1->submit_time > j2->submit_time; - ~! T& j+ p5 b% |3 d5 l } x& B- O/ c5 K
}; 1 f5 M; Z* D, q. v, I1 s- l( p6 C! M; i: `2 v* n
8 T j% x F4 |* O6 ^2 j MultiprogrammedBatchProcessingSystemJobScheduling()& r/ B" ^) d; Y7 V9 k2 @" L
{. H/ G" B% W# ^9 l( l- n" `3 [. }
back_queue_ = new std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>();7 m( | t/ j) C
psa_ready_queue_ = new std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>();% I) R" a$ {% n5 U( ^" K/ h
% Q i. w/ _. F$ n! L4 B5 U
. I- t' q8 b+ N: X std::cout << "input job num:" << std::endl;$ P/ Y; }2 {7 {+ J2 `3 X
std::cin >> job_num_;6 \2 K6 v Z, ]& W! e
for (int i = 0; i < job_num_; i++) " b: ]6 |- M2 a { ( i% L* J# }6 C6 E& v3 f' T std::cout << "input job" << i << " submit_time & required_running_time & priority" << std::endl;$ p; D2 z% O# r! k* T
- u( u6 K& K$ i; m% u, c Z9 e% D
JCBptr jcb = new JCB(); / }7 \8 f4 S# \4 G% l' O jcb->job_name = "job" + std::to_string(i); / W I, O9 x1 y/ w jcb->job_status = Wait;1 s) p& v0 {* h
std::cin >> jcb->submit_time;# y# l; ~/ b- k1 \/ n& F
std::cin >> jcb->required_running_time;+ N9 w9 _8 W' G5 N# K4 H# q
std::cin >> jcb->pcb->priority;3 f D& {9 j7 L" w$ E5 f
back_queue_->push(jcb);9 l$ _. U% k" D3 h
}! R4 Z. F+ ?4 l, u
3 G9 f' \! S9 M X& y' E
/* . V3 ]! z, [( }( t9 d( [ job_num_ = 6; % B" u* o$ s4 _$ H0 a4 R3 i H1 Q. R) U
JCBptr jcb = new JCB();/ e# ]) s* j+ p3 p M( i: X
jcb->job_name = "A";( `! j$ i% _( f, }* e
jcb->job_status = Wait; : q8 ~/ Z% u; B8 ^$ C jcb->submit_time = 0;6 \8 X$ E! ^* c. x& t+ f+ {/ h
jcb->required_running_time = 50;! Q& H7 }( p! Q, f x
jcb->pcb->priority = 5; 4 t8 ?, _+ |+ I9 J back_queue_->push(jcb); & d) _5 K9 E# Y7 q7 p# K - l5 k7 a! p9 [ jcb = new JCB(); - s q' r7 G7 \: I5 ^* L T% \ jcb->job_name = "B";) z0 ? @/ s6 z9 H
jcb->job_status = Wait;5 u) ^7 v$ o) ?6 h( A
jcb->submit_time = 20; / e& x1 U3 i$ p) D* Q4 O jcb->required_running_time = 60; ; l/ g+ ]6 T* l( i jcb->pcb->priority = 7; P8 j( H7 ?8 Q& R9 w
back_queue_->push(jcb); l1 b2 G+ k+ f( e4 M2 m) B$ ^' w' t f" L. A$ }
jcb = new JCB(); 4 a5 x& G; E( p jcb->job_name = "C"; O) u8 I. n! q9 @8 S2 F+ y" b+ i
jcb->job_status = Wait; : y! b$ L* h/ ^6 v9 y jcb->submit_time = 50; ; I7 }* G5 v* F, N# t jcb->required_running_time = 40;7 H: }3 f/ E4 I
jcb->pcb->priority = 3;, j0 m5 |/ H1 b+ S+ m, z
back_queue_->push(jcb);; H1 U, `* |' Y+ a0 U6 _/ E
: i Z# L! Y- e1 h; e0 H
jcb = new JCB();- u8 Y( H& C3 ]% t h
jcb->job_name = "D";; v5 V0 b% z: _$ g5 S7 F0 [5 c
jcb->job_status = Wait;7 H% F0 b4 ^4 ~8 ^
jcb->submit_time = 80; * v# E3 T# N. k. O- c: n) Q3 E' n jcb->required_running_time = 80;0 K4 ?' v0 b& ~1 A
jcb->pcb->priority = 8; & i. P E5 E$ \- {9 Z* m back_queue_->push(jcb); 6 K }4 o/ _( d6 t0 m3 e2 e' \0 Y) O! s! r1 T) h. L
jcb = new JCB(); # \# V( \1 ~4 |7 V6 u& V, @ jcb->job_name = "E";) v& ] x$ E; h, q/ t( t: g& J) p
jcb->job_status = Wait; - @6 P! I1 H- E$ N# }% I/ k jcb->submit_time = 100;( b! g4 v8 q' q% `0 {; Z
jcb->required_running_time = 30; / A, B7 A! o+ s: W; q; p jcb->pcb->priority = 6;% Z0 c; b( h9 r
back_queue_->push(jcb); 8 \6 j% G8 j4 X9 \; Z3 N7 j ) Q9 M w' d9 p9 q jcb = new JCB();' V6 j9 b5 ^7 `) x& c r5 G7 [" H
jcb->job_name = "F";" [. ?& V) C4 G" W2 l5 S
jcb->job_status = Wait; & h1 Y- N* k; Y% ]1 \5 s jcb->submit_time = 120;; u6 {6 n2 ~- c; \$ E) q
jcb->required_running_time = 70; % S, C0 n) R5 ] jcb->pcb->priority = 9;6 d6 A& \4 u. Y/ D/ h
back_queue_->push(jcb); 5 K: Z1 w. S" J4 u! ^2 g */ 0 U. x7 S$ U1 a }; J y( ^* B# g; n* ~, g/ N4 z- y
. T# K3 b! E2 q4 F) r
bool start() , R: W; W# T$ R { - D" i' u# q. l' b4 B cur_time = back_queue_->top()->submit_time; " ~1 D5 Z9 X5 h8 X while (!back_queue_->empty() || !psa_ready_queue_->empty())) M, T, U$ |# B7 E& L# R
{ - U/ }: I% {+ p! B% {, N h( d bool increase_time = true;- l; U0 P0 b* s" A
// Job FCFS 0 \9 q+ Q' M( { `/ p* S if(!back_queue_->empty() && psa_ready_queue_->size() < 2) f( X2 E5 O X! v, c) ]' \ { ^9 z$ ^- ^2 |/ ^' O. Y
JCBptr jcb = back_queue_->top(); , j, ?! `, I# W. }4 k" D if (jcb->submit_time <= cur_time)0 Q9 G% d) [' A* K# {
{8 U1 H( B0 O6 n( s8 m. J
back_queue_->pop();9 N5 {9 A, x0 f9 p' t2 c
* W1 Y0 l) H+ f // Process PSA / I; a, p$ t" o& z* k if (!psa_ready_queue_->empty())) I# P, S2 n. e: \8 l6 @& p S
{" _1 L5 |0 n2 \2 @% Y q$ V
PCBptr pcb = psa_ready_queue_->top();8 I5 u3 F* c' c0 S! `+ ~
JCBptr jcb = pcb->jcb;- I3 [& y- P. C1 u+ U; p
: i4 ?- y" G4 C/ A. m' m
if (jcb->already_run_time >= jcb->required_running_time) k Q$ p) r8 z" c, \/ X
{ * P) h$ Q$ d# ]' Q' ] jcb->job_status = Finish; 5 ]. }# K/ f. r8 e! \, m8 K* K) ~- j psa_ready_queue_->pop();" O" y2 P# v0 S ~- r6 Q4 _- v) T
//std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl;* x+ l/ M! D& C" o( o& O( t& j
+ D( M9 y" N' X: ?- K' t jcb->finish_time = cur_time; 4 }# ]7 k4 ]5 a8 Z Util::printJobData(*jcb, true);& d2 T" D0 i! {* q# w Y
} . H0 M# H( Y% A else 9 ~1 i. e; K# ~- i# H* M" B5 O { " b4 W1 }* D, P9 D ?1 C6 E( n jcb->job_status = Wait; : x' F) W! ^* M( `2 V1 M' F pcb->status = Ready; 9 G4 N T% m4 W3 S# U2 E //std::cout << "[LOG]" << jcb->job_name << " Ready At " << cur_time << std::endl; ! C# L0 O3 S9 m } . Z e3 s' b7 ? } & f; i) \, x0 ~; P: z, S 5 S+ n4 G5 e6 h& p psa_ready_queue_->push(jcb->pcb); # v2 Y9 [8 l' ^ 0 L& p5 a' ^# X6 x3 E1 P PCBptr pcb = psa_ready_queue_->top();2 p; A; b' a9 [* I" h, I9 \* z, ~+ r" p
JCBptr jcb = pcb->jcb; $ m6 b1 F% r' v% q/ U$ b1 \$ z jcb->job_status = Run; 7 J9 ?/ b) J+ G: ]4 y& a$ `& ?4 m pcb->status = Running; ) S @1 S5 O2 I& Q7 {* Q- o+ j+ H7 K: A% a' |
//jcb->start_time = (jcb->start_time == -1) ? cur_time : jcb->start_time;! n" r3 v' P# H3 q) v
//std::cout << "[LOG]" << jcb->job_name << " Begin Running At " << cur_time << std::endl; 0 h" A# r, z; C% A# t 6 Z0 g) V& E' o/ v/ a0 n% t A' r increase_time = false; 6 `1 f E% f d5 a6 Q }1 n# Z- X# F3 X* D5 H) }$ R
} 6 H) }! o. g, ]) u2 ? else if (!psa_ready_queue_->empty())/ t' `: U& o8 ~
{/ k' i( }/ G! ^) q. C7 m) O1 Z
PCBptr pcb = psa_ready_queue_->top();' F9 ?. A4 {) d2 R
JCBptr jcb = pcb->jcb; + J$ v& g% t" g7 I: |; g* H* A" i * D' t$ N) v. n+ s3 F if (jcb->already_run_time >= jcb->required_running_time) B+ N, d: G4 C" y5 l$ ~9 b {. ]! m2 E1 F1 M7 M- [: f
jcb->job_status = Finish;& [5 {7 p3 l- g! T( \; F
psa_ready_queue_->pop();# y0 X- B0 O) |+ g# r- X/ F
//std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; . `( C5 u2 h ?9 ^$ a( Q- Q jcb->finish_time = cur_time; w7 ?- S2 H3 }- ~) O0 Q' p increase_time = false; % B: o) f' [) v( x- w9 B& C: C2 ^% m
JCBptr jtop = psa_ready_queue_->top()->jcb; ; |, m: q O. V+ \9 `* N8 K //jtop->start_time = (jtop->start_time == -1) ? cur_time : jtop->start_time;% L7 u& O7 Q: _& Z; ], [ }
Util::printJobData(*jcb, true);$ b& w2 x0 l' ~+ i+ z8 B1 T4 a
} : A( s! {5 ?! N/ g7 K) @, j# S( g }6 W3 e$ d" f t4 d7 Z( V
, }. j8 j! k0 ^& p3 v if (increase_time)4 `% r# j9 Z/ x0 Y# D" ~" s# b) ]
{0 e/ F: C2 ^# \
if (!psa_ready_queue_->empty()), T7 x4 v3 R% G# H
{ : w7 C! k7 |6 J! K9 I& w0 @ PCBptr pcb = psa_ready_queue_->top();$ w9 U) ?3 G% s# x) H
pcb->jcb->already_run_time++;5 U3 M8 S( u \1 m
} ; q V$ ^* y+ m cur_time++;/ }6 l& U- U5 K' H3 E7 f
}0 K! l8 Z) R; K, d
} & h4 s: [5 h8 u: y* G9 L std::cout << "[INFO] all jobs finished." << std::endl; ) B( m A: r1 y std::cout << "[LOG] average turnaround time " << (average_turnaround_time / job_num_) " }! o; w7 ?" S: g5 d3 S$ e << " average power turnaround time " << (average_power_turnaround_time / job_num_) << std::endl;, @" `5 g9 V# g4 D g7 v
} 7 C/ L' [ p# U# i) g: _+ u9 q9 \- a
private:6 D$ {% M: `+ ~" O
int job_num_;5 V; O+ k. ^ A7 ]8 ^* a
std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>* back_queue_; 8 Y2 G5 K. {1 Y; n* D4 ^ std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>* psa_ready_queue_; ) v9 A7 I9 t' t8 L4 D2 M; I};# o7 S+ h" c1 R# z* z
" t3 M) m5 z5 ]% m/* * A. P9 k4 ?8 v5 rint main()+ P& N \" ^( Z# t1 C8 h
{ 0 E- m( v7 Y, t; _1 R SimpleBatchProcessingSystemJobScheduling<FCFSSchedulingAlgorithm> js(4);. L4 W7 t; O; j! r8 c
js.getCurrentReadyQueue();. C" V( z. p8 m5 X2 h& }* p7 v
: w6 T" e o r8 q, v, J# p, M // pause to see result. j s! z9 L4 C9 W6 u2 {8 H, V' s& O
getchar();, c. s$ F/ D+ k" K* |& X' [
return 0;* p. q5 U) x# g% _) y2 X7 n
} - B- D" u2 P7 @' G/ L1 ]: \1 T# q*/ % l7 i: X6 U" p1 O) | " u8 w# A$ z9 S9 U9 D' V" v1 c六、运行结果 $ a) H4 a8 N& c6.1 单道批处理(FCFS)( [$ |( [" q" `: f$ [5 u: b
) t5 M3 {9 d `$ j2 D ]8 U
1 d0 F) }" T: B- X6.2 单道批处理(SJF) ) C4 [) ^: g7 ]) \0 A+ S1 W$ v: I2 U' J; w6 j/ v7 j
3 t0 m6 I, ?$ C
6.3 单道批处理(HRRN)4 E" I) U8 ^! k m n6 l
5 u$ E& t y# T2 w4 J! A ; C8 J# r3 e$ y9 ^; |3 Z- N6.4 多道批处理(FCFS + PSA) / A6 `- ?* f. U6 Y; A+ Q* k+ y5 ]. ]7 y4 q
( F. n; U2 x! \3 V7 [2 c" S2 _; U- B
七、结尾 * _: U) P% _& a7 S% z 如果本文描述的内容或使用的代码存在任何问题,请及时联系我或在本篇文章的下面进行评论,我会本着对每一位学技术同学的负责态度立即修改。在后续还会有三篇计算机操作系统的算法 C++ 复现博文,如果感兴趣可以关注我。1 n8 {7 o) E3 a' m, r" t7 k) u3 O2 {
———————————————— & l b4 ], Z X/ I! k版权声明:本文为CSDN博主「杨小帆_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 % W0 C2 T# G6 R; {0 u+ n原文链接:https://blog.csdn.net/qq_40697071/article/details/106698130 " G5 o, A' s' P* @/ Q# r( w 1 q0 ]; ?8 b; l2 h/ L * l; r* ?; b; }/ ]" y! w4 X0 W; Q