$ g4 \2 A4 ~8 @3 K' t5 Y8 C8 S average_turnaround_time += turnaround_time; ( n* e5 Q, s6 \" R; y- P7 j: [ average_power_turnaround_time += power_turnaround_time;9 k6 N" J: R7 V( C7 \. o/ D
4 ?5 ~2 ~3 r E# `* a: H' D5 h& B, r. q2 J
return true;. ~; c/ p/ [ r: P) d: Y$ v7 O/ S
} * X) }) V6 B" y: [7 Q y# \# z' h};6 t2 }7 I! S" c- R, m
( R- L3 u1 Z& q/ O& g4 l& R/ G: t
class SchedulingAlgorithm + t% e- a+ y. a$ w* n$ \7 l{' I1 k/ O* d0 [. ]( ?* l
public: % \2 o7 K* W( D2 P 0 H# q) ^/ }7 e6 }1 g// virtual bool initPCB(std::priority_queue<JCB, std::vector<JCB>, std::less<JCB>> * ready_queue, int process_num) = 0;6 W3 H) s1 `' d: ^# b; }7 \% M9 ]" D
// virtual bool processPCB(JCB & pcb) = 0; $ F9 |& Y" V, C# e}; & |3 q; B& I A 5 H) q$ k3 y' s4 S: j. R# i" N# u// First-Come First-Served 0 G8 r h/ a5 p5 q' oclass FCFSSchedulingAlgorithm : public SchedulingAlgorithm! G. _3 z- g7 ^ a
{* q! \5 _; ]; l" v6 U
public:; ]9 K1 Q. ^4 Q, S; ~, O2 f0 X
struct PriorityCmp4 W7 { j1 }% o
{ . C. H- ] G" G0 i& m bool operator()(const JCB j1, const JCB j2)' e$ F7 @* S' q$ W3 d: l& @$ q, n5 Z
{& H& v7 L# Q2 b* @6 o' w
return j1.submit_time > j2.submit_time;+ @& W% j& K8 x
} 2 W4 a! E$ e) p$ L! d: C6 H }; / H0 z/ T" W8 H! M. c % F9 }) s! O# a' ^3 H FCFSSchedulingAlgorithm()/ m( P4 @- ~0 l" `/ d. y
{} $ j" x6 V) \, q ?! H! K/ l, z0 F: T. }+ G, d
private: / ?5 a# [4 l7 @% {1 Y- s% _, u. Q, Q0 N$ o
; |7 y& i$ x4 Y1 s6 r- p5 C}; 8 a" |6 |% H8 d' M9 A+ H ; E5 [9 A" P5 Q& L& n// Short Job First + M3 A* a6 T& t# ^3 `. s Fclass SJFSchedulingAlgorithm : public SchedulingAlgorithm $ _6 J4 w5 N P! e2 Q$ d{" |' }7 [4 `9 J* g& P* E5 Z- g# `# q
public: - O( ]: {1 l, g& Q* X7 ~2 q struct PriorityCmp$ D$ C0 B6 C3 D: {3 Z6 z
{7 z3 Q; a+ K$ N* f
bool operator()(const JCB j1, const JCB j2)0 b) w5 l" F$ c' U
{; d* w N" d" ^% U+ k, d
return j1.required_running_time > j2.required_running_time; & o* o. z t, \+ Z$ B1 ]6 r } , O" O: O) Y% U0 C) \$ x }; ' D) _+ A0 I/ [* I 5 `# S' a! b8 t/ l6 X, r$ e2 f9 ~ SJFSchedulingAlgorithm() , U; Y- t: Y! C3 c {} - l( @6 C5 {' F; n5 s* x2 c5 I7 [) q) n( T0 r: ^6 c
}; & C, L4 Q; E* r' A& ~3 y7 c6 P P0 ~$ Z4 X! V: u
// Highest Response Ratio Next ) V: C9 i7 @5 l. vclass HRRNSchedulingAlgorithm : public SchedulingAlgorithm T* [, v. x1 u h{ . W- b& e! u# `9 R. `& p6 G) G" _' [public:) S7 o2 p& I5 c, c
struct PriorityCmp8 p0 j0 G! h1 S- D6 i4 o# f
{ 3 \% L D, B' R) m+ }( d double getPriority(JCB jcb) & A7 S! I2 f% x7 {+ {0 W( Q- ~# D { " F8 `7 v% @$ A( \. t; p' P return ((cur_time - jcb.submit_time) + jcb.required_running_time) / jcb.required_running_time;$ W4 A& g, E( y& ~& P6 v
}3 B0 f0 ^* `4 v4 D& N+ o, D: ]% q1 A
% e8 P' \$ d* f& Q& Z& j" S: R
bool operator()(const JCB j1, const JCB j2) ; i5 D2 U$ j; d {# s0 j. N" ?, ?8 B7 z
return getPriority(j1) > getPriority(j2);7 I$ o* m: b$ W* y, B1 M% j& u. R
} 3 S% h1 N# ]/ E- e. R4 y- G0 u0 ] };8 |% g2 w3 v# w9 y5 ?
1 s, p5 u& }, Z/ _: u% x1 O& ^ HRRNSchedulingAlgorithm() 4 a$ v/ E7 v m* J, B {}" b! a+ \/ L% g
};, t4 b7 [* H5 K8 \
4 Q8 S) o# m5 D/ _+ \
template<typename PriorityCmp># d' w. D- n8 I" b
class JobScheduling' d4 g, V1 X: |- P: u; P
{ 4 H" S% q$ ^" y x1 p/ Opublic: - v* C5 b# X, {0 M! k JobScheduling(int job_num) 5 K( E6 v9 a" O { 9 H- B. d$ }6 u/ k) o job_num_ = job_num; $ H5 }' o& S6 Y) {/ s* N sa_ = new SchedulingAlgorithm(); : Y8 W j1 D! `, R% F2 h# b wait_queue_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>();" I+ c# J! ?8 \- A) {" x
mock_jcbs_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>(); - c$ @1 I ^5 w8 {' y+ w# Q& T# V finish_queue_ = new std::queue<JCB>(); * Y* _9 O& f" q8 j# |: q' a5 x6 ~8 t6 O2 |% M) Z. o
mockJCBs();2 a7 ^# o/ f" Z4 |: k3 Y& s
}, F- A% H- z: a
5 S% O+ w! J6 r! N. ]9 E
protected: 3 Z" A' K4 z8 l) E% j3 D: ` struct PriorityCmpForMock: [7 m! N3 h6 g
{5 Z C6 F5 \" J. _
bool operator()(const JCB j1, const JCB j2)% f- D! e# s% Z$ B% r% ^3 S
{ 8 m) J' z- O1 ?4 o; J9 t. I return j1.submit_time > j2.submit_time; - W O# R- y: O! l } + t9 Q G+ | s" A }; - }- U# Z" ^7 k! C 8 m& U$ r! k) F# J bool mockJCBs() 8 ~, y$ f' h% d& H { $ g& [3 Z( Y3 t" c" c" Y for (int i = 0; i < job_num_; ++i), ~# O- `0 [& h/ Q0 b7 a
{ ) M& |* C D+ A JCBptr jcb = new JCB(); + g4 w8 c6 S) \& t' A; H jcb->job_name = "job" + std::to_string(i); $ }7 ]& p$ |' c/ O2 ~6 g- M! D jcb->job_status = Wait;+ c0 C0 M2 B1 ]! T! v
jcb->submit_time = Util::getRandom(1, 20, i);) {/ F! D; y+ @# K( Q
// The minimum value is 3 so that each segment can be divided into time slice 0 f3 l/ w" O" j5 J9 M jcb->required_running_time = Util::getRandom(3, 10, i); % a3 I# |1 }+ H, x 4 [2 S. k: ~$ W% s mock_jcbs_->push(*jcb);# q3 x; O1 z, N
std::cout << "[INFO] finish init " << jcb->job_name << " with " 3 x, ] A3 J) _! V << " submit_time " << jcb->submit_time2 q/ H/ d0 g) O }+ p8 y
<< " required_running_time " << jcb->required_running_time << std::endl; " H5 T2 x, h6 I3 o9 c1 s } & {3 i' P, c& |, N) _" n } ! g" i0 a4 V& G: Q) H, A" B$ D8 F( R1 D* K
void getCurrentReadyQueue(). j) X" ^* b7 _
{ 5 b Y0 f' {- H, }; Q while (!wait_queue_->empty()) : ~; e6 B' U) U1 Z0 O! k { # U4 F& g: O0 }; N/ |( g1 M JCB jcb = wait_queue_->top(); 4 J N: y6 A9 w) M+ i" q: b9 \5 o6 v4 R std::cout << jcb.submit_time << std::endl;4 Q% u' p) z. _
wait_queue_->pop();6 a8 _5 L8 h( @8 `- C
}$ A4 M9 C: r+ I7 j& V, I
}/ b3 z- n$ k5 Q/ l( O
6 [9 H) G6 @" k% t9 s, y3 J int job_num_; ) @+ j/ `6 L3 h5 f9 ~5 d SchedulingAlgorithm* sa_; 7 y4 W- c2 [2 V4 { std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>* mock_jcbs_;1 y2 ]0 ?9 @" k/ C) T2 z
std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>* wait_queue_;1 P9 C' E, t/ T3 t8 A P/ a
std::queue<JCB>* finish_queue_; 6 j e2 M8 Q( P' [9 l}; 8 f$ d0 M k# w1 j" k( w1 o ; ?, N. Q: z* i1 o! H( S7 {1 [, {template<typename SchedulingAlgorithm, typename PriorityCmp>( J" R0 f$ t f0 u
class SimpleBatchProcessingSystemJobScheduling : JobScheduling<PriorityCmp>" ]7 ?( [/ @% `- I- g( J; v8 Q
{ ! W1 I: \9 P( B- c2 O+ Lpublic: 5 d( q% J4 G. t SimpleBatchProcessingSystemJobScheduling(int job_num)+ N8 _( }8 ~: c3 W( {+ l& h8 a) I
: JobScheduling<PriorityCmp>(job_num) 6 {! q. \0 _+ E; n+ u {}" ^6 ~) R7 K/ ^7 j7 T6 v
- S a$ v, @8 z/ ~' K' f* _
bool start()* _) Y+ }8 l6 \8 ^2 R2 k1 m5 _
{ ; ]4 _3 Q( n4 W& @ cur_time = this->mock_jcbs_->top().submit_time; 0 J1 u" h2 ^# A. g while (!this->wait_queue_->empty() || !this->mock_jcbs_->empty())3 s/ _$ C+ F2 Y* r6 w3 j! X6 k3 e s. d) \
{0 F$ q* Q! A5 A% x
// Simulate adding tasks dynamically % P6 x9 [1 b9 ^4 {) q; F6 l if (!this->mock_jcbs_->empty() && this->mock_jcbs_->top().submit_time <= cur_time)6 y* B. m2 K$ n S1 ?
{ / u: l. [6 c+ h7 U JCB jcb = this->mock_jcbs_->top();0 x7 T, T( @, j' y0 L. y/ \
this->mock_jcbs_->pop();' i( L* `' q8 R" M, q
( [$ Y$ b- a4 j8 s- w
std::cout << "[INFO] add " << jcb.job_name << " to wait queue." << std::endl; 6 c9 e1 C! ]% q4 i% v1 }: R) R7 A s this->wait_queue_->push(jcb);' ]* N D7 j+ {* q$ P' @
} 4 ?) V& G! G3 [$ O6 l! Z6 N3 Q8 h ~& F ~. g! r- n
if (!this->wait_queue_->empty()) - ~2 o% N+ @' E+ | { ! ]! Q3 K1 v. Q1 N2 _ JCB jcb = this->wait_queue_->top(); / }4 l- f: s4 m7 F: h! I this->wait_queue_->pop();9 Y: x4 ^# Q) O5 O3 M
* d0 x. G" | v% Z% Q& n std::cout << "[INFO] begin to do " << jcb.job_name << "." << std::endl; # j* z7 U5 ?4 J% D jcb.job_status = Run; 0 g! m. y: T2 i // simulation do job1 T* c2 \. ]2 V2 @+ b$ A% y
sleep(1); 6 z1 ^8 H; Q5 V7 b- S- _" b. {+ L std::cout << "[INFO] do " << jcb.job_name << " finish." << std::endl;0 E8 ?2 o+ \& ]) z6 O0 w2 U+ C) ]1 z
$ @6 ^3 p7 m! I! k3 g& p4 h% J
jcb.job_status = Finish; * K) t A+ K+ K" R! Q6 u // print job Data. 4 z( A/ L3 m5 s* \, c2 W Util::printJobData(jcb);7 G5 M3 h1 P# }( F
this->finish_queue_->push(jcb); ( x) d6 p# {. z cur_time += jcb.required_running_time;# L) r: q6 A8 b0 n' C
}2 F$ n* {$ z+ W4 F* ?- f& J4 `
else* ?* E6 q2 R' y( n+ l" |7 }" A5 v& y
{ 1 p0 X* c5 f+ v$ ]: v* o7 _ // Slowly increase time slice when there is no job! H& O7 Q3 P& ~! ^/ x7 B
cur_time += 1; ) R3 A$ h9 l5 L/ V }$ E3 F* r0 a6 @
}5 H3 a) H, {* `# |
std::cout << "[INFO] all jobs finished." << std::endl; 0 u1 N0 }3 f# s/ K std::cout << "[LOG] average turnaround time " << (average_turnaround_time / this->job_num_) 3 k3 c& [$ `& N2 g7 M << " average power turnaround time " << (average_power_turnaround_time / this->job_num_) << std::endl; 7 S# h, q, N: ^9 W4 j } . M( }) B) q u/ l- n6 G5 i+ ?7 S$ F7 ], ]1 k! ^0 s0 ?
private:: l" m7 f. _! M5 ?
+ p) g( \" h6 S
}; ' v U# |" q7 U * A6 v! D$ K2 Y# o$ T+ }$ n * H, o1 t0 J/ j! Jclass MultiprogrammedBatchProcessingSystemJobScheduling, h6 _2 Y5 l- u5 M9 P
{ ! q+ T# @- A; E' r. c/ Spublic: % w/ U& _9 G0 v struct PriorityCmpForPCB ; b& C7 F& o/ Q) O { ! Y9 _4 R+ g3 |, f" k0 U bool operator()(const PCBptr p1, const PCBptr p2) ) P$ c7 M! [7 f& z {! e$ a- q3 q: N. q- ^
return p1->priority < p2->priority; " Q8 G8 D) R5 E& G6 E7 \. m/ [ } 1 c' z, d" |, m( H5 r }; 1 c" q# [: N4 q" h3 f; `2 \' G ( H; m) X4 P0 @. q7 j) @ struct PriorityCmpForBack) ^4 F* q+ E1 {8 f D; E% Q
{& _5 ~4 ~9 S. [! w# o
bool operator()(const JCBptr j1, const JCBptr j2) $ N e9 a A) ]# Q { , [5 m4 A y7 [" \3 Q return j1->submit_time > j2->submit_time; 8 a+ j7 M4 d+ I) r }! P' P9 _+ @; Y1 c9 t7 I
}; " X5 g& l2 @, |) _! u* o u. U$ _3 s8 e9 ~6 J& W# q
$ B% {2 E9 z2 Z3 z+ t MultiprogrammedBatchProcessingSystemJobScheduling() 5 ?& N7 D' ?) i) e8 U- z8 e {& B; q, B. N. v4 B! K
back_queue_ = new std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>(); ) u* |/ L: T" E3 N psa_ready_queue_ = new std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>();: ^0 e1 I$ l% r# D c4 O2 E
4 f1 v$ \+ S' v- k2 D s , @5 r% t2 [% N9 k2 ~5 V: t; v$ b6 U std::cout << "input job num:" << std::endl;3 j1 Q( l: Z( Y2 @* t m
std::cin >> job_num_;6 M o6 b% k$ P* B: |
for (int i = 0; i < job_num_; i++) 7 a' z4 g5 b' [5 u$ [$ A; h% @ {, v x' f: {& q: ?# |+ V1 v
std::cout << "input job" << i << " submit_time & required_running_time & priority" << std::endl; 6 n- ~% G: g Q B# A4 x4 G/ X5 m# K2 v " S- E. X; L6 q* D& m JCBptr jcb = new JCB();7 i R" H# c; b8 G
jcb->job_name = "job" + std::to_string(i); $ o3 a9 e# S# E jcb->job_status = Wait; 3 j! y! l% i; Z7 ^: R std::cin >> jcb->submit_time;% g7 O8 @7 N) A7 d" {- B* D; X) T
std::cin >> jcb->required_running_time;% C( ?# ]2 r0 r0 z0 s. O, K* B* e4 r
std::cin >> jcb->pcb->priority; Q6 l: K; `6 t2 G9 C back_queue_->push(jcb); # F* Q9 l7 T: \+ Q- q% z } G( U$ l( f. r- b+ M
& F1 e D% C! @) d. E# I$ _ /*/ z! Y% Q! Z0 d+ j- `8 P @) {
job_num_ = 6;7 o+ m% u; b# M7 Z/ S/ B( y& O! Y
9 S4 C, ^, y5 e$ Y: U7 L JCBptr jcb = new JCB(); - o% M. K9 X( _8 C/ Q5 N) \/ ]! m jcb->job_name = "A";: H/ T8 W: o' o+ ^( Z
jcb->job_status = Wait; 3 J9 h1 o$ I4 x8 e! z# | jcb->submit_time = 0;$ `$ g3 d, R D( V: z2 f
jcb->required_running_time = 50; Y( A, {0 D) Y3 P5 V% Z jcb->pcb->priority = 5; 9 p1 E$ f3 f/ p- W back_queue_->push(jcb); % U8 @; `3 x \3 f ) g3 {$ Q) k2 Z2 c2 A% e jcb = new JCB();2 y# F' Z7 h9 z. H) E* E: h
jcb->job_name = "B"; 6 P; S. @% j& S3 \0 C jcb->job_status = Wait;" b. A' m; Q! Y( h6 L2 Z
jcb->submit_time = 20;- V5 D4 _7 n: w! o6 x
jcb->required_running_time = 60; ( |1 |6 _+ }8 z3 F) r8 f jcb->pcb->priority = 7;( H; N* n1 i+ U
back_queue_->push(jcb);; s. {" q2 K- `3 B$ p6 f- `
3 _, V; U$ ~, l3 m: h
jcb = new JCB(); ) t5 |- d% m5 g" g* C jcb->job_name = "C"; 2 z% ?, t) T7 f; _! M1 } jcb->job_status = Wait;. V0 h6 t" m! E
jcb->submit_time = 50; 5 ?4 Q0 G- h9 n jcb->required_running_time = 40;* f( @' C6 x2 \8 k1 W
jcb->pcb->priority = 3; ( D1 L: \- l# l1 @! o back_queue_->push(jcb);- k; ]" V/ x9 ?; X d
/ a9 L" N* ]" {! d1 y
jcb = new JCB();% R8 O$ Z. j/ J# ~: `
jcb->job_name = "D"; ' h4 D* O, U/ Q jcb->job_status = Wait;& h. N9 _/ F1 t; H- |- E
jcb->submit_time = 80; : p+ C. q/ v( M2 f" t' m jcb->required_running_time = 80; ( B/ ]; U3 j) V) x$ W: Y( n' c jcb->pcb->priority = 8;! ]" o$ `+ {6 ~! w: @% H
back_queue_->push(jcb); , P8 h( ^+ C6 }/ a4 a/ T6 I8 ~, y" o5 z1 [
jcb = new JCB(); , o% G9 D/ u% y4 f# q jcb->job_name = "E";7 _: z2 L/ Q& w' t' \6 e/ c. |0 ~' M
jcb->job_status = Wait; * q# g/ g/ r, n/ a jcb->submit_time = 100;) Q5 |( Z; s$ t3 t# j1 ] e
jcb->required_running_time = 30;$ e, u6 @1 a" Q& l- ~. o5 d$ r3 k
jcb->pcb->priority = 6; - Y4 c0 ], C" v( U2 ?% e back_queue_->push(jcb); 4 h- d& ~/ ^; m8 F+ l* w" Y9 U3 J5 I6 k+ V3 \: c7 }* d# `
jcb = new JCB(); 0 k& a( o p1 B1 a jcb->job_name = "F"; % n- v* l' P4 g& ` jcb->job_status = Wait;2 H) j% B+ j, w0 }* R3 w
jcb->submit_time = 120;5 [8 ~& y3 {# K( r" i
jcb->required_running_time = 70; + w* Z+ W) j: w4 M jcb->pcb->priority = 9;; E' O( _$ J6 t% _' b2 y: \/ ?3 _ ?
back_queue_->push(jcb); " N6 P3 O' h0 Q1 A1 l4 x. w( J */ 2 v- O" X( n$ e& x }6 p) l3 O" f8 Y0 H7 y% p6 O3 u
& }4 w. O, y5 z' Y3 s& R
bool start() , I1 ?2 i, F; L' K { ? D: A! I J, B" c+ B) _" r
cur_time = back_queue_->top()->submit_time;1 L+ K" d8 U, J+ L" A
while (!back_queue_->empty() || !psa_ready_queue_->empty()) 5 B' L; ?, {/ x a3 J( q0 S; E { ; E$ p# ^3 E8 H" h. { ] bool increase_time = true; & K) L2 @3 |5 d& M2 [ k; F9 I' F3 m // Job FCFS+ M& I# w6 O$ u. b! E
if(!back_queue_->empty() && psa_ready_queue_->size() < 2) & Y% l$ E/ m' |$ v { % l" u s: ]9 K( H; R JCBptr jcb = back_queue_->top();0 w0 R5 f& M/ {
if (jcb->submit_time <= cur_time)8 i4 U m& F) m1 j
{ ' [+ p& c4 {( J, |- O) x8 Z0 G back_queue_->pop();; Y% `. ?2 k6 e% W+ V/ f- ?
`% W/ T5 }! N9 \
// Process PSA % |+ |$ q# A" [- g% J3 G if (!psa_ready_queue_->empty())4 B* `/ X3 V) ` J3 Y% |5 Y2 V7 f
{ $ @4 z5 U$ [, M- z% D PCBptr pcb = psa_ready_queue_->top(); v8 P$ F0 x+ [- n" E
JCBptr jcb = pcb->jcb; / }% n& ^7 `- u X- x- D8 w+ T" y6 r7 t1 m. \' \, ]
if (jcb->already_run_time >= jcb->required_running_time)# K8 ]8 L8 D9 J- q2 `( y: B
{* J: |( Z. Y d, Q8 u7 t
jcb->job_status = Finish;. F( k" f5 M# p
psa_ready_queue_->pop(); 3 o# u' g# j7 [3 s //std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; ' d/ n3 R% \% r: l 7 E3 j0 H& j+ j; F) w& N jcb->finish_time = cur_time; # k0 y1 }. c8 Y& _ Util::printJobData(*jcb, true);9 l$ U& Z, P) p7 p
} 8 y- T* y' b" I% z else 7 c) l: l7 t+ Z7 [ {# g& M. _$ ]" r! F! B
jcb->job_status = Wait;2 R* v1 R# c% k
pcb->status = Ready; 2 p. _1 |9 L; d //std::cout << "[LOG]" << jcb->job_name << " Ready At " << cur_time << std::endl; 5 k0 ^3 V! v, r, \ q5 r& q9 T } / ?6 @/ w' }. |5 l; @ }6 l/ v2 Z7 R0 ]. ?1 u! O8 S
/ b9 O+ L$ u" H7 h# L
psa_ready_queue_->push(jcb->pcb); 9 o# y \& q3 d4 A A" \ & Q2 Z" I' d) m7 }* D3 O h9 s PCBptr pcb = psa_ready_queue_->top();( [, u9 {: Q) `6 T, c
JCBptr jcb = pcb->jcb; . x0 v+ `# ]8 e( |- S% y! W jcb->job_status = Run;0 q: A# B$ g3 W0 X d8 n
pcb->status = Running;3 n& H& A/ S C8 _
4 X# C' N9 O1 o2 z0 K //jcb->start_time = (jcb->start_time == -1) ? cur_time : jcb->start_time;& c" ~* G0 c& c5 b% a {% n$ k
//std::cout << "[LOG]" << jcb->job_name << " Begin Running At " << cur_time << std::endl;1 z. c* F8 O/ u! }8 d! G7 r
+ ]" ~( A/ S" f5 T$ n1 l1 n% x
increase_time = false; 8 x7 a9 T# C- f$ n }% a! M' y& d5 V: k. d8 A
} # J- v' F7 T- a: b P. d; h# x else if (!psa_ready_queue_->empty()) ~5 t# x) u: O: d { ! M& m/ o5 F0 q i2 S1 t PCBptr pcb = psa_ready_queue_->top(); ( [$ N: x' z% Q0 _, l' _# M JCBptr jcb = pcb->jcb; - l4 f$ M* X7 [* j6 Y9 D v( E( s! X* h3 } if (jcb->already_run_time >= jcb->required_running_time) 8 d1 o9 s1 F" r" B { 3 x' j: _4 T- n6 c$ l) r jcb->job_status = Finish; , c. w2 z) g7 F: a% @0 J psa_ready_queue_->pop(); ' E3 S) W1 @9 i/ |1 G0 {. G. e //std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; # t T) Y; ~* q+ a4 \ jcb->finish_time = cur_time;& S6 K# @; R! Q8 ]5 Z O
increase_time = false; 9 ~" \6 V2 b9 |% I; t1 I ' V( f- `$ ?2 c G1 ~7 i6 c, k JCBptr jtop = psa_ready_queue_->top()->jcb; 1 f4 V+ {5 a8 o8 ^7 a+ V //jtop->start_time = (jtop->start_time == -1) ? cur_time : jtop->start_time; 9 l+ d1 q2 b2 U) K8 w. ]. L& N Util::printJobData(*jcb, true); 6 N: U. g$ A; D1 g, c1 |8 x } / p; y0 \4 y' |' R } : G/ D8 f, ]+ N, n( y B9 c + \, L/ l- \: ~ e$ [
if (increase_time) 4 U: b9 }/ d7 t6 P+ `( h, V6 ?$ F { ! n( Y+ b; f- I7 n. o* [8 p if (!psa_ready_queue_->empty()), [# B/ b# t2 l0 k& m- L
{ ) K/ f* v; z. U$ p4 o% J PCBptr pcb = psa_ready_queue_->top(); ( k1 p. F% w$ p5 \* Q+ S. E pcb->jcb->already_run_time++; 7 R- v& q) W! E/ P2 Q } ; @$ g9 T% H! M8 W$ X cur_time++;# G- j# u+ h2 o% _% V1 o6 _
}: |: Q$ Q: S0 T' B3 c
}- s4 W; _; ]( {' T6 u. O1 D! A
std::cout << "[INFO] all jobs finished." << std::endl;) U! b+ E/ u" g/ q
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / job_num_)# n: j9 v6 {7 D6 Z! n- \& A! C
<< " average power turnaround time " << (average_power_turnaround_time / job_num_) << std::endl;9 D8 W! b* Q) T8 \
} 2 K6 e. s- d7 A) h* S V4 Q ! C+ j: r" i! C Rprivate:- O4 x8 x: ~- m; j" L
int job_num_;: g; c- X: `) B$ ]3 @; G
std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>* back_queue_;0 F2 C: z0 t, n$ ^. r
std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>* psa_ready_queue_;5 j. z6 ?( y( c# z! L2 y( u
};- J8 ]2 o3 J# C
8 x3 Z2 I* M! \
/* ; x$ Q) a- n' D: D) v* p/ yint main() 5 N' k1 u ~% o; { U7 T{ ) ^2 E9 b8 V$ n1 y/ n SimpleBatchProcessingSystemJobScheduling<FCFSSchedulingAlgorithm> js(4); & F0 b" _8 `% g js.getCurrentReadyQueue(); 3 `2 j; U! W6 A7 _( c . y! Q4 P$ K n* o w1 [" C // pause to see result( \7 j5 i. b: { l n
getchar();8 a: N: z/ S9 R/ T
return 0; $ G7 k; } f! ~ J. D# J} ( M9 Z' b* j; C2 u7 ~*/2 C- g2 {' {& b5 S, W
h& o8 @2 b {4 p
六、运行结果4 g& Y- z5 j! }8 `
6.1 单道批处理(FCFS) ! {0 H$ Y/ I4 q, U V$ X' M ( Z. ~: z, l/ D3 O7 q1 q3 i9 {- _6 Y1 M5 j! A; R
6.2 单道批处理(SJF) ?, t& w6 C& C, H, O
: _# U B# w% r* y% u. c7 N
, n7 N& d+ e# j$ J. Q; Z8 m
6.3 单道批处理(HRRN)8 j3 X+ D% s# }9 y$ }5 A% Z
% g& \1 \8 q4 f# m% a+ X9 U9 {; g! r% A5 S5 N; M A
6.4 多道批处理(FCFS + PSA)3 ?: ], G' a+ }0 K0 ~( R
# S0 H" k/ W% E# D: e$ i
8 y# ?" |. G$ V, c
七、结尾( Y6 U' g. O: r( v
如果本文描述的内容或使用的代码存在任何问题,请及时联系我或在本篇文章的下面进行评论,我会本着对每一位学技术同学的负责态度立即修改。在后续还会有三篇计算机操作系统的算法 C++ 复现博文,如果感兴趣可以关注我。 0 R: M; b1 g& D1 T4 U5 x# t———————————————— 8 j' t! S# ]' f+ a4 j* T% V1 A版权声明:本文为CSDN博主「杨小帆_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 . O/ K- ?( s+ H' u3 j4 H原文链接:https://blog.csdn.net/qq_40697071/article/details/1066981300 Y7 U- ~" |: l# x1 F
! V3 X& }% P% h( t/ _- a