( S. q2 \0 a7 ]: Z8 L// Highest Response Ratio Next7 W# D1 a* D& s$ G: e2 T
class HRRNSchedulingAlgorithm : public SchedulingAlgorithm- J8 N* W& s$ v$ m9 U8 X. k: a
{ ' z7 P" K8 m+ t+ cpublic: ( g! g* m9 x7 e$ ~ struct PriorityCmp! B l9 g5 h+ P' x5 ]
{' A$ {3 s, L2 b! n
double getPriority(JCB jcb). {' r& S/ a. D3 o9 o1 v& X. I
{ . p; Q3 Y$ e* w1 ~* ` return ((cur_time - jcb.submit_time) + jcb.required_running_time) / jcb.required_running_time; % @/ _4 f$ d+ X% y. i% ^ } , k% g4 @/ N w \7 Z: K 5 p9 S; n. s# {, }) ~' I bool operator()(const JCB j1, const JCB j2) 2 L9 G G4 Y1 |& M* n( R {: r5 L' G* a, C$ G1 S
return getPriority(j1) > getPriority(j2);, @) J; [( ^) t+ e; E1 b
} $ x0 p( V. b7 ~& U }; t0 f7 S' {5 N- ]4 t. ?( m7 R% U; ?( B* z: i/ R) ]$ x
HRRNSchedulingAlgorithm() 4 M5 ^: f8 F7 g" O/ ? {} 9 i6 X/ _8 M& ?7 m& I};% W, u% g) Q: h6 r
1 A; M$ ?( d9 g' P* i5 Z; \template<typename PriorityCmp> ( w& D' s- [" Pclass JobScheduling* Z+ _0 y7 q; v5 e0 i4 f( i& l P
{1 m' T, T1 j8 n; L. ~
public:6 `2 l1 `8 _% q# _8 S. S* v
JobScheduling(int job_num) & c2 N8 e ]# h( p: A { 7 t( e7 V% P, a) Q7 f job_num_ = job_num; / @' Y) q \8 a a sa_ = new SchedulingAlgorithm();" r. Q! x7 c }1 y1 G3 @6 s
wait_queue_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>(); * E7 y% ~7 b9 G4 D7 \1 }7 s mock_jcbs_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>();$ F9 ~# l$ H2 B8 B
finish_queue_ = new std::queue<JCB>(); . M- s3 Y0 c% [4 ?% b # r- ^8 R1 X/ ?. X mockJCBs();, a7 V) d; u" x) v
}4 a& o# ?$ b$ n
6 V# X! F4 d; K+ ?4 M- H# H1 m: Vprotected: - b7 N1 A9 z! r5 c' V struct PriorityCmpForMock 1 g5 q; B, Z) |0 R {8 J' m: U" S* R& Y( j* J
bool operator()(const JCB j1, const JCB j2)/ N, _ ^9 M. o/ k; i: s
{$ ^9 f+ R+ d7 S R
return j1.submit_time > j2.submit_time; 6 n$ V" e. Z3 H3 m1 l* U' h! A } 3 W8 w8 b' ? w };# Z1 I+ H0 O( A. R! n
, c5 g( f$ T8 f, h2 [# R( H
bool mockJCBs() # j7 y7 ?8 R1 {% J" z/ u5 p {( c2 t% G5 `, C4 \- T# r* Z; B
for (int i = 0; i < job_num_; ++i)% z1 y- C2 `, I0 _6 t* M+ j A
{% U, `! ]. C/ Q! I6 y: K% ~( o; d
JCBptr jcb = new JCB(); ' [6 ^2 I0 x5 q: A8 S# ~# Q$ K$ _; E jcb->job_name = "job" + std::to_string(i); . ?$ k# _, |; d$ f jcb->job_status = Wait;/ t3 X- _% D" H& k8 [
jcb->submit_time = Util::getRandom(1, 20, i);7 P, G- C7 `# N; {
// The minimum value is 3 so that each segment can be divided into time slice+ N" Q9 v, G! R3 _6 E* R
jcb->required_running_time = Util::getRandom(3, 10, i);* `. Z# B7 a! W: O" t
6 ?' t& }2 J8 D5 B. i! L mock_jcbs_->push(*jcb);) a, X4 c1 G3 N( z+ F" k
std::cout << "[INFO] finish init " << jcb->job_name << " with "! n8 r3 t% S5 a% N7 N
<< " submit_time " << jcb->submit_time& Z% f5 f* b. U# l
<< " required_running_time " << jcb->required_running_time << std::endl;, E) u7 i) N3 r/ |; d) a
}5 v* T5 H7 N. H9 i
} ( k( b3 m" a3 i 4 u1 O' C* U6 I void getCurrentReadyQueue() |" }/ {9 K: L5 v5 d F# i
{ # a( F+ Q% t1 e, H" P } while (!wait_queue_->empty())6 a/ m0 R, z. y: u m
{ 6 w4 g3 ~4 C5 Q7 f JCB jcb = wait_queue_->top();. e7 ?3 h" x) [3 R' j
std::cout << jcb.submit_time << std::endl; , v3 F2 C- k" x3 Z; } wait_queue_->pop(); 2 {2 [' l0 {9 k }2 K) C* [3 X+ s/ Q& r
}6 K! N. w! W$ S; W' Q: l
) i+ c v$ n% s
int job_num_; 5 Q6 F8 Q* \/ ] SchedulingAlgorithm* sa_; ! t# @. r H6 c) I: V9 e std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>* mock_jcbs_;- C9 R6 g) ~$ p. p v' y
std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>* wait_queue_; 7 ^* x& O" {# R std::queue<JCB>* finish_queue_;5 @, {' J. T! F6 a- i
};/ ~7 U3 @3 f+ j/ F
% y, R7 @. U: N5 J! w$ @% Etemplate<typename SchedulingAlgorithm, typename PriorityCmp> * X/ T* v/ ?' p6 [" J! zclass SimpleBatchProcessingSystemJobScheduling : JobScheduling<PriorityCmp>! g8 h, R% _- t; d9 Q+ c
{ " N5 q& D M# I8 \6 n: ^# [public:/ Z& K4 y V3 |* M7 F$ B
SimpleBatchProcessingSystemJobScheduling(int job_num) ! d4 `# n9 b) z5 ]# m : JobScheduling<PriorityCmp>(job_num) 4 [7 W3 s6 j H. c5 u {}/ ?4 H9 f5 p( O* u
9 q( f+ C% y: d9 @# k" U4 }
bool start(); r4 W, W4 X4 }+ g! p- \) F1 c T
{ % U1 F2 y% B# ~. l( M; r cur_time = this->mock_jcbs_->top().submit_time;2 X+ p, k K5 e; `" M# c
while (!this->wait_queue_->empty() || !this->mock_jcbs_->empty()) ) C1 s0 {, [8 L {8 V( H2 c9 F3 \% V# O
// Simulate adding tasks dynamically $ F6 L8 C" f! x2 b/ b1 g$ D& p if (!this->mock_jcbs_->empty() && this->mock_jcbs_->top().submit_time <= cur_time) 2 }4 A% |) d+ N7 B {' j2 B: ]! R9 q" z& T- O
JCB jcb = this->mock_jcbs_->top(); 0 x. M! @: e y" t* t1 P* c* D this->mock_jcbs_->pop();* A. ~4 ~- n0 D
+ I' m! J i, _$ n' [
std::cout << "[INFO] add " << jcb.job_name << " to wait queue." << std::endl;% D. L( S1 v# Y+ ?% e
this->wait_queue_->push(jcb); & _0 a: r% o9 c" w( X( t }: _3 G* U# z" L- M
* y$ @" {% o! M1 d) \/ e
if (!this->wait_queue_->empty())$ p) E% f0 i r8 O( P
{, t: F( y# e Y: q+ i8 t4 h% w) p
JCB jcb = this->wait_queue_->top();6 V! e* y# k$ P" J
this->wait_queue_->pop();* j( z6 C0 a+ h" l
1 g" {0 U. i# }5 }' ?3 F1 @6 |, o std::cout << "[INFO] begin to do " << jcb.job_name << "." << std::endl;1 n, ]+ O/ L, T
jcb.job_status = Run;7 z' ^1 M ^- `2 t7 A" S+ b
// simulation do job : G6 i( R5 Z" x: D) s sleep(1);8 U! P# z5 M2 S$ l
std::cout << "[INFO] do " << jcb.job_name << " finish." << std::endl;- O7 T3 O- H h8 o, ~9 _
8 n" q5 V1 m0 L) n8 e a2 _, z) d jcb.job_status = Finish; 4 G$ O& Y3 J% M2 L# u // print job Data. : i7 Q9 W- ^( r8 K' N n2 i Util::printJobData(jcb); ; Y3 z% V2 F- ~0 x this->finish_queue_->push(jcb);6 t' D# b* c. D6 y$ |4 ^
cur_time += jcb.required_running_time; % }6 x) z2 Q7 D, L- @' S }6 @9 }' c% G' Z, h; h
else + O) x+ K' J- P$ q5 _" ^4 O { 7 J' a( J- X6 R) g5 q // Slowly increase time slice when there is no job / ^' [" Y5 R) m9 {. |( ^. G cur_time += 1; 7 q4 u& }' F1 j4 L' b. e } - p9 T2 ?$ }% V( o } ! b, A5 R5 _6 L- m! | std::cout << "[INFO] all jobs finished." << std::endl;7 | ^, n v" n/ m2 i% t+ o9 R
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / this->job_num_)0 \% J, a- m/ H9 M- C# o
<< " average power turnaround time " << (average_power_turnaround_time / this->job_num_) << std::endl;% L) K+ e' o6 o* F
}4 l3 R2 G' }7 } X% L
X t# n; l/ qprivate: : o, N+ D c& ? e! j. G* ~ 8 i1 z: ^5 V. u2 _};2 ?+ v, h5 N& ~2 g) t$ S# R, H- {
! K: Z& Y1 F3 i( g
, v! t& ?4 V% a: aclass MultiprogrammedBatchProcessingSystemJobScheduling , u9 @& \% \8 E! b{, U: }9 ^$ D7 R6 `+ P
public: 1 A. j( ]% N1 T) U struct PriorityCmpForPCB6 y! r8 Z; Q k, L" O
{, ^! U, T/ Q" F& ^0 w1 I: N; R, y
bool operator()(const PCBptr p1, const PCBptr p2) : G6 b: |2 m3 R) M {2 u9 k( ?" f$ e& D! X( T
return p1->priority < p2->priority;8 ?4 B% y( d7 h7 x
} & j3 j" x- \% L0 P' ~$ |% A }; 8 r$ Q) V: ~/ _, Z7 \+ w* `( p2 c' W
struct PriorityCmpForBack4 D2 A9 m9 p# C m O9 C* z% T1 r
{ % A. n2 \- ` q- P5 ?6 f% q- J bool operator()(const JCBptr j1, const JCBptr j2) / z$ o8 G/ }. t/ e9 i {" U; }: @0 ? c" t3 C/ n( _8 h
return j1->submit_time > j2->submit_time;8 |8 H' P f; \8 |+ f
}: v8 c5 v8 O5 X& a% r# }1 f) M
}; # T. z' I- O2 S5 Z5 Q% \( k# x# h! H" G8 B/ l' W1 d4 u+ }
' _$ D. f7 d3 v- h7 X8 e. H9 D* \! a
MultiprogrammedBatchProcessingSystemJobScheduling()' ^; y' a" W0 m7 m% W
{ . }! h! A$ i ]6 P& R3 P- ] back_queue_ = new std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>();: S3 j6 X I& D! Z0 {4 T
psa_ready_queue_ = new std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>(); * G$ T: v) I$ ^1 N$ O4 I' T5 Q( }6 U ! K1 q* W' z; y( K7 n8 }% F : D, w) r# q& R& y1 m
std::cout << "input job num:" << std::endl;6 c1 l* y/ R1 R' B# ?- a& ~' y
std::cin >> job_num_;) C; e9 ?+ u" z: \/ o; D6 W5 }
for (int i = 0; i < job_num_; i++)& z; {9 n' w! O/ @: }4 j
{ ( E L+ G' [2 ? std::cout << "input job" << i << " submit_time & required_running_time & priority" << std::endl; , _: _& b7 F# y D$ i 2 j3 A! u- F8 A+ |, F- i# w' ] JCBptr jcb = new JCB();3 E; E. c0 c1 J& t
jcb->job_name = "job" + std::to_string(i); - Q% P% R4 z0 C [+ p jcb->job_status = Wait; $ O# m, C" }& E" O4 r, M# g# j std::cin >> jcb->submit_time; ! D& ^0 M( u! |+ |% s( Y std::cin >> jcb->required_running_time;& L! m" N/ d8 f+ |+ L
std::cin >> jcb->pcb->priority;; t( M% t3 y, R$ o
back_queue_->push(jcb); ( O% J+ B5 `3 f" d. s }# G) y+ A3 k2 R) M* w, q; q
) K# ~" ^9 j; j9 j7 O /* 0 G3 o2 ~4 x+ c) C job_num_ = 6;5 D( u, {# J. M# G$ k% j
$ H) Y2 a; j: w2 m \, B
JCBptr jcb = new JCB();! r: U- x9 _4 N; g' f7 k# c: S m0 d
jcb->job_name = "A"; 3 l* ~% L0 x7 G: p jcb->job_status = Wait; & J! v f+ r- f, \5 V T% s jcb->submit_time = 0;4 i- \6 y- W* p, F' k. ^- c
jcb->required_running_time = 50;: \! L8 }: k& { H, R5 L
jcb->pcb->priority = 5; % N! K2 K0 A5 q' B& \7 i8 x0 T back_queue_->push(jcb); # z9 Y% R& n& D' {0 F 2 T( D( [ r4 @9 o7 n6 V' R jcb = new JCB();6 Y- W' @5 o" A5 _# f: H3 {' E
jcb->job_name = "B"; a) Y; l. E; c/ B jcb->job_status = Wait; ( ?0 E c8 |% {7 E9 ?) ` jcb->submit_time = 20;( J1 c' Y! `3 k2 w N
jcb->required_running_time = 60;9 z# _* x4 K3 M/ E
jcb->pcb->priority = 7;) i& c. o$ c! x; A
back_queue_->push(jcb); ) Z K9 v5 `% f- K( m( q9 g' Z; {) T# F: d. Y1 X
jcb = new JCB(); 8 c, s' E$ [9 x3 g7 i jcb->job_name = "C";$ l4 ^3 A' r x
jcb->job_status = Wait; , o% e8 Q/ \- ?5 F% c0 ^) v6 y jcb->submit_time = 50;3 U2 ]) e+ m& F/ t3 t
jcb->required_running_time = 40; " \. a; U4 C; ^. A* G jcb->pcb->priority = 3;3 {( b: b2 A# v; n
back_queue_->push(jcb); 0 i! @, W. N" ?2 R1 o: H2 q9 ~- I7 y5 B: \' |% }. K. A) d
jcb = new JCB();. ` j8 @$ N, M- X
jcb->job_name = "D"; 2 J5 D$ [2 t' o jcb->job_status = Wait; - j8 ^/ E2 P4 q8 M" ?: H3 ]$ z6 U jcb->submit_time = 80; 1 V3 {. U! |1 K1 k; U% X8 R* W jcb->required_running_time = 80;; {; H' |' n1 _
jcb->pcb->priority = 8; 0 V* [# H5 ]7 I, n0 X back_queue_->push(jcb);2 j+ b B6 w) ?/ U
: m% g2 z2 b5 Z, T% v, H jcb = new JCB();& T5 a" u# y/ \' B1 m8 j9 u
jcb->job_name = "E"; l% \9 }2 F& z3 x, @9 A
jcb->job_status = Wait;( r: p0 ?) n- c1 Z) o, a( A
jcb->submit_time = 100;- {5 h/ f' }5 v0 s% V
jcb->required_running_time = 30; 2 C! o1 e5 q7 W jcb->pcb->priority = 6;* l& m3 P% E/ S t4 Q8 b
back_queue_->push(jcb); % G% f9 y6 y4 G q. V 9 b- u; U# p. g; @ jcb = new JCB();9 L1 c6 O: B& P4 ~7 f7 f5 G0 ]! D
jcb->job_name = "F"; 2 f4 E3 Z# ]; J8 d' G* m jcb->job_status = Wait;! P8 N( C; @# Q# W
jcb->submit_time = 120; / _* o! X% `* |9 [4 I# ]8 ] jcb->required_running_time = 70;% z' k. C9 J9 U2 g" t5 Y
jcb->pcb->priority = 9;9 v2 ]$ h6 g. c; t/ B
back_queue_->push(jcb);* u. r2 t0 f7 Y9 M- }1 P/ x1 {
*/ ( k; L" w5 V- u: [& k6 T- Z* B }+ `3 O- S; Y* M. U
1 U+ S# l. [: l6 c
bool start() $ Q' ]/ s$ T, U3 u g {4 E! C9 ^( X5 v' r7 r J- j
cur_time = back_queue_->top()->submit_time;- I7 n2 l7 Y- i
while (!back_queue_->empty() || !psa_ready_queue_->empty()), D9 ?+ E3 H8 F8 J( J# p- U/ V
{! m' u& S" m- K3 F) S1 z
bool increase_time = true;% N: F% E) W% v4 E5 Z5 P- m
// Job FCFS / z/ y$ d- j/ |6 N# w- v* t e3 ^ if(!back_queue_->empty() && psa_ready_queue_->size() < 2)) ^5 L A. x% Y5 o; V0 p
{ % g6 ]0 D' |# N' O, w JCBptr jcb = back_queue_->top();( W( U5 S1 L1 ]2 r1 _
if (jcb->submit_time <= cur_time) ! o5 M+ S6 {$ ^ { " T4 K6 d8 I! W back_queue_->pop(); . c9 f2 J7 b* e- W- z8 e) I8 }" M9 T2 ^
// Process PSA 4 k/ V, Y2 J, Z: c H. s if (!psa_ready_queue_->empty())3 w& `4 G/ G7 v: V8 h5 A) ^
{0 V* f, A% q" n7 _5 u6 ?; `
PCBptr pcb = psa_ready_queue_->top(); 4 _" \/ r% V) S$ H JCBptr jcb = pcb->jcb; - d2 `% V% w: g @0 A# H( D, p+ v4 W4 c/ i1 w' V2 F, {
if (jcb->already_run_time >= jcb->required_running_time) 7 f, }7 i- I# l3 \ K {) l/ S* R8 \8 L1 m) X
jcb->job_status = Finish;& |" w4 X- ~. k1 W
psa_ready_queue_->pop();( I+ c; L/ L" K9 }6 |/ c
//std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; 6 _2 ?& H3 S+ A3 |4 K$ E5 v - B8 o" {0 y2 S- ?+ p; H8 w9 x jcb->finish_time = cur_time; ) ]. g" g0 h- q# Y Util::printJobData(*jcb, true); , N4 T- ^4 o6 Z }: B# K7 Y2 w: u8 j, w0 _
else 2 i* L1 L( V; q% ]8 W2 W( l& t1 j! q { 2 M \0 L# H' R" j2 ~6 y* B jcb->job_status = Wait;) t1 T/ m/ M: ~5 |& Y9 I& W2 L
pcb->status = Ready; 4 U' n; d4 d, M7 t/ y //std::cout << "[LOG]" << jcb->job_name << " Ready At " << cur_time << std::endl;# e9 H7 W7 t$ ^2 p
}1 [) v9 r6 E1 L: d& Z
}; a! E, x& s2 h, |) ]$ m* w) T7 W
& A+ G7 G' {; A/ C; w psa_ready_queue_->push(jcb->pcb);7 _$ x% s/ t1 _
% |' i! [+ E( c0 P% A& }
PCBptr pcb = psa_ready_queue_->top(); 5 s4 u5 G& O! V, `, P8 ?. L JCBptr jcb = pcb->jcb; / Y0 ^5 ^, d- ~) e, b2 t3 g jcb->job_status = Run; _2 w+ Q# ], Z3 Y* _4 { pcb->status = Running; , e/ r) A0 @% ?% A5 s1 }+ Q $ F3 p) C8 o* ]5 M8 S! ] //jcb->start_time = (jcb->start_time == -1) ? cur_time : jcb->start_time;) U, x5 G* U% w' w, h
//std::cout << "[LOG]" << jcb->job_name << " Begin Running At " << cur_time << std::endl;8 f) L3 l H" r$ L% O, W) J
5 |2 h. `3 I1 ?$ x, I& b
increase_time = false;$ l* e! h0 c4 U: G( `
} * A$ n7 [1 m1 j8 w6 V }/ q$ C0 r/ g$ T3 k: _: Z) X
else if (!psa_ready_queue_->empty()) $ V2 x, A- n. M V' X% z0 v { 4 E/ R d) E2 l0 u4 ^5 N9 Y' o PCBptr pcb = psa_ready_queue_->top();% E( v; H7 [7 y0 }) v
JCBptr jcb = pcb->jcb;3 d5 f, o* ]. a! B* b4 q% `
" N& G, J! {7 S" C( d if (jcb->already_run_time >= jcb->required_running_time) ]) x- E! S$ q5 ^ {( Q! m2 }% b6 e. M2 z* }
jcb->job_status = Finish; 7 t9 n( r |5 |7 n: b psa_ready_queue_->pop();/ L/ k' f. W# r8 p2 p3 {
//std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; ' G( O2 B) j' U: I jcb->finish_time = cur_time; / L/ l# ?4 m4 u' B9 N# A increase_time = false;* j9 }$ E& Q% l* ^* r4 \3 ]; Z
. q- y1 y* H# w! b7 g7 B. e' p JCBptr jtop = psa_ready_queue_->top()->jcb;9 a6 E: N6 P) o" s7 F/ s- F
//jtop->start_time = (jtop->start_time == -1) ? cur_time : jtop->start_time; % `; `3 {$ Y8 N Util::printJobData(*jcb, true); 0 z' Y5 v$ T& d9 y# W5 g } # [& Z5 k: D) ? } 1 D2 U3 _5 l! a4 Q' H & E8 w6 A0 [1 H9 h; o if (increase_time)8 B' H; u/ i% {
{# l9 a; X) ~! U9 T
if (!psa_ready_queue_->empty())/ u2 ]. f" b7 m
{ * z& `1 \( g. s+ A# t& ]! L PCBptr pcb = psa_ready_queue_->top(); ; _3 T1 S; L9 F# Y pcb->jcb->already_run_time++; & ^" L# c3 I( n$ ] }) I3 u+ \$ U6 J+ o
cur_time++; , g c8 p2 l5 v) L5 ^ }* n" `+ c( t& S k3 G/ ]/ H) ~
}/ H) p/ G; u- b- k6 L
std::cout << "[INFO] all jobs finished." << std::endl; e( ?9 J( x# `5 L, Z3 z1 x
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / job_num_) * q) \' u4 d0 G' d4 ^2 B, d << " average power turnaround time " << (average_power_turnaround_time / job_num_) << std::endl;, w, S( j8 u* t2 z* S& {- @
} 1 V- S& B! K4 _. B * i+ S: k- c5 m0 ]private:% b! x2 M/ ~- T* w4 h: t9 T& m
int job_num_;, q+ n+ T2 F# u# Y+ {6 R7 D3 r
std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>* back_queue_;1 F! r( G8 }2 ?3 v' \4 @
std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>* psa_ready_queue_; ; r/ t6 j; Q$ [$ \};& d" K( S' c2 y# F
+ o+ b; x) j8 c9 c$ L' W/*, z4 |6 x* K) E2 V! w
int main()# u; j4 T8 c; W
{) L) K) C* l3 t0 l5 g
SimpleBatchProcessingSystemJobScheduling<FCFSSchedulingAlgorithm> js(4); 7 w! j4 ] T. r0 ?5 R" O js.getCurrentReadyQueue(); % [- d6 V" S8 m! o4 |" M/ I* N2 H- ]3 O* n6 k, Y' O* f8 e8 a
// pause to see result 8 Z5 K7 O* O/ ?! e getchar();4 T/ k' ?( i9 q% n8 j
return 0;' m/ `6 n+ n# o: c
} : i2 g1 |7 V9 O: }& _! x*/ " h5 L5 N: L+ ^* k; t1 Q4 O T- P4 b; W! L$ H六、运行结果- W# O: ^3 D+ d- o- P4 S0 n
6.1 单道批处理(FCFS) # I% x# q) A3 a7 H& |, G$ S0 ?' D7 t9 q1 }, ]5 n7 U, E9 z
4 S1 `, O8 b2 F! p! B& k
6.2 单道批处理(SJF)1 n% V5 A+ u% b+ j+ j
7 ^ U2 ^% B2 @) s' G4 W6 m: s" t3 j& W' r% W
6.3 单道批处理(HRRN) 1 R: e# S3 J; H( ]! x9 C0 W0 C5 _: i1 L
: Y+ \6 B6 ? m( s; ~( A
6.4 多道批处理(FCFS + PSA)9 i* n7 v& F+ K( g9 j
" h8 F+ x. _ `4 [4 q/ j' p% J9 {" l$ x9 T V9 [
七、结尾7 d- Y& P# [ s* p" g4 b4 N) J
如果本文描述的内容或使用的代码存在任何问题,请及时联系我或在本篇文章的下面进行评论,我会本着对每一位学技术同学的负责态度立即修改。在后续还会有三篇计算机操作系统的算法 C++ 复现博文,如果感兴趣可以关注我。, i; [0 w- e2 ?4 u, `
————————————————( l) b. X6 }! Y; R
版权声明:本文为CSDN博主「杨小帆_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 7 q H9 e0 l [# v1 C# R原文链接:https://blog.csdn.net/qq_40697071/article/details/106698130 + N) }, l" j4 u; d8 d k : ~/ M" G- h& i) ~0 U+ S4 n+ U+ ~3 H& i1 U8 r# J5 i% U: Q3 d