, L1 s2 M! T0 ], _template<typename PriorityCmp> , e/ ?! r8 {9 a/ Yclass JobScheduling! k9 Z( j$ V5 U' y5 _3 D5 U/ Q
{ , E( \6 j4 P, q) t: q# Q: W9 N, ?public: * D' @' t, d5 _ JobScheduling(int job_num), o! r6 |, M) u" _ n U' g( [% f
{ , r$ y+ n' A' g! M job_num_ = job_num; 6 w- b, ]& q% z- r) Y sa_ = new SchedulingAlgorithm(); A! W7 t0 ]$ c q9 w wait_queue_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>(); 3 I, q+ B% J1 Z2 m, p+ f7 o mock_jcbs_ = new std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>();* z7 ]5 t& k' P1 c; T4 w6 b
finish_queue_ = new std::queue<JCB>(); 9 A% g) }" g* @3 B* `* I / }8 k6 T4 y. v4 P3 V mockJCBs();, I& T8 z4 f. X* Y9 {
} 2 u+ L: r: U+ Z8 K2 G) N% {! p; g. n) |& y/ K- r2 O
protected:- e* i! \( @- R& P) h" a6 ~3 j
struct PriorityCmpForMock 1 J" U0 ^; U+ W s# y4 E {' L% P" z, g* [: K5 `
bool operator()(const JCB j1, const JCB j2)/ B6 _& w _: m6 {9 Q2 j9 b( Y; R
{4 X( F; I" E8 Y8 C
return j1.submit_time > j2.submit_time;" ?8 z4 g5 N& j5 n- e! D% i! k
}$ O% v% S; ~1 N: G; q
}; " G' m4 ? b6 _. } & s D8 x" h* k, L3 } bool mockJCBs() 8 I8 N. N. R3 v {0 @% f/ Y9 v: ] [5 O7 N. M1 T2 U
for (int i = 0; i < job_num_; ++i); l! y8 l b: p# v7 \
{& O$ P/ d( y" W3 O. L- ^. `# A
JCBptr jcb = new JCB();" e/ V: r5 a9 t& g
jcb->job_name = "job" + std::to_string(i); 3 ?4 x6 X, G) c# l' _7 H. n jcb->job_status = Wait; + g! B4 d2 H& k) e1 I jcb->submit_time = Util::getRandom(1, 20, i); # Y6 ~$ K) Y# W+ P' w9 [/ b# o // The minimum value is 3 so that each segment can be divided into time slice 4 t( ]0 v% G+ }8 U% w4 l0 g jcb->required_running_time = Util::getRandom(3, 10, i);+ F5 d0 H9 K0 \1 u
# u/ n! V. @- K) Z; c* S# ?) m: ^ mock_jcbs_->push(*jcb); & p2 R4 u% D, v Q std::cout << "[INFO] finish init " << jcb->job_name << " with ". P5 t; B+ N- n1 R) T' V) y7 r
<< " submit_time " << jcb->submit_time # j4 [+ F. H$ q$ L: U << " required_running_time " << jcb->required_running_time << std::endl;1 {. J- a) X6 M3 j) A- C6 m
} ( t6 b6 @ u5 X9 h( z } 5 X) k u7 ]* b" {/ O# R" J' e, k' l( u3 j
void getCurrentReadyQueue()9 v! N# K8 R7 X
{ - L3 h8 \ ~" [6 @ while (!wait_queue_->empty())* T1 b! V9 {& h$ i
{ ' Z& }/ s# k6 k3 z JCB jcb = wait_queue_->top(); ) u& U& Y# ]3 [) l# n! v std::cout << jcb.submit_time << std::endl;. s# ^0 B ?: ?# D. x2 D7 A4 _* |
wait_queue_->pop();. d$ Q8 A( b( V
} - q. w4 S5 _3 _5 g } 1 Y3 T. x' P. @: S , h3 y& P% K$ I9 c1 ^* e int job_num_;. t6 C6 Y. g4 M# o" V. m
SchedulingAlgorithm* sa_;% r- z" k! U) |$ ?( Q+ G
std::priority_queue<JCB, std::vector<JCB>, PriorityCmpForMock>* mock_jcbs_; " v/ h4 D6 q" X$ E0 }+ R, N: y0 j std::priority_queue<JCB, std::vector<JCB>, PriorityCmp>* wait_queue_;! o; \0 H$ t, i3 N+ @1 }8 p
std::queue<JCB>* finish_queue_; 4 d3 P2 r5 T6 |4 E};: X( d2 n! N) p3 x3 c8 N
0 U' b! p6 K0 l# j1 I _template<typename SchedulingAlgorithm, typename PriorityCmp> & g& e6 u# S$ U3 c5 W, S" lclass SimpleBatchProcessingSystemJobScheduling : JobScheduling<PriorityCmp>: L+ {; x/ E% x T6 J' t& ^
{8 d* v6 |7 u+ I
public: # y$ c0 V5 N' ?$ H SimpleBatchProcessingSystemJobScheduling(int job_num) , ?, c8 h2 Y" l. i% O% c) m : JobScheduling<PriorityCmp>(job_num)( s( C* A) r& ^: e8 Z* w
{} 4 |, Y) M' Q5 P9 y 4 k2 y3 s0 V$ |" P3 s bool start()+ B* f. `9 G5 w" J
{ , I* Z2 S7 s4 a/ B( R* w5 F cur_time = this->mock_jcbs_->top().submit_time; & k5 k' k; j- \; W/ a while (!this->wait_queue_->empty() || !this->mock_jcbs_->empty())+ n9 m" x/ u' @( Z
{ 1 N8 Z- z0 ?8 x M* H- O // Simulate adding tasks dynamically - d; Q; ^$ a9 z: ~! V$ O7 d7 ` if (!this->mock_jcbs_->empty() && this->mock_jcbs_->top().submit_time <= cur_time)( Q# r7 z' T& [, O3 k# H/ M
{ , Y7 S& Z! M5 k' h9 d JCB jcb = this->mock_jcbs_->top();1 C u- Z/ k' X! Y% T
this->mock_jcbs_->pop();0 v1 W% Z9 X( N/ g* A+ ?& u. Z
+ ?% C/ r( R. A/ c std::cout << "[INFO] add " << jcb.job_name << " to wait queue." << std::endl;8 M/ Z. c& p- Z2 Z* ]& j% V: ^
this->wait_queue_->push(jcb);' f {% Q m! i2 V9 d
} / N$ X) p& y7 m( d' o; ^3 N: D2 a' F" l: F5 `! ]: ?
if (!this->wait_queue_->empty())% d! i. Z% t" g/ @" T& S
{" S& C6 I; C9 Y9 o
JCB jcb = this->wait_queue_->top();3 F8 \# G6 Q6 n+ {: b6 [ |( G
this->wait_queue_->pop();( c( k8 F- H- l; t! V9 r
* M1 ]3 m6 `9 z; d- R
std::cout << "[INFO] begin to do " << jcb.job_name << "." << std::endl;9 l- o: m( @2 \9 V$ Q% ~
jcb.job_status = Run; & j1 O+ ]! X- K- M! v) s" V // simulation do job * B8 {9 ]. M5 `1 v1 { sleep(1);3 K) c/ X8 c" T9 x0 b
std::cout << "[INFO] do " << jcb.job_name << " finish." << std::endl; / m; E1 v: r6 N+ G7 ?7 y8 h; E+ S- }" o6 O1 a2 x0 k7 U, R- n
jcb.job_status = Finish;8 K+ d* N) Z* T+ }: [! W" |, G
// print job Data.7 h5 I+ K) K7 [1 K( }( h
Util::printJobData(jcb); 9 j3 Z& z. E% V this->finish_queue_->push(jcb); - p, `: S$ }/ {3 F$ p5 W& @ cur_time += jcb.required_running_time; . x$ w3 c0 S' p4 S0 s+ f' U( m }/ J D1 ]+ S+ _' E6 s
else ! o2 O% S1 h- T5 A0 r {. J# o2 u9 A. f2 S, E0 t5 u
// Slowly increase time slice when there is no job 1 M5 g, ^; d8 U% M9 i cur_time += 1;. g) y% m8 g. D1 [% D5 D' e
}$ ~& h) a- Y7 B3 x5 w1 G
} % ?* o; ?" u, H" O std::cout << "[INFO] all jobs finished." << std::endl;, ]" Y; j7 X( ^4 `' D" r
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / this->job_num_): d2 Q ~$ e7 M6 Y; \# i4 h
<< " average power turnaround time " << (average_power_turnaround_time / this->job_num_) << std::endl;8 H* k7 H8 }& _' N3 G8 U8 _
} ; e0 V, M& s! n# j7 h, t * G! G' \0 C0 \) y7 U4 t) B: s D% Hprivate: ( _, t; i) y$ [& G/ _( Y& ` ; k; J9 Y- A: ^* N0 w# @3 P/ @}; ) U# z/ ^7 I7 p3 O e 4 v5 i! r' k0 X" V8 w! ]" i' T" x ! `5 {; n d/ ?! _% }class MultiprogrammedBatchProcessingSystemJobScheduling& L1 h6 f+ {$ |4 G$ S! I
{ Y8 C! l1 ]8 \' gpublic: ; r ~7 w/ U* j+ q. d g8 S struct PriorityCmpForPCB" A# F8 X% z3 V! v* T: @, F8 u
{" x7 c6 y+ X7 D+ `1 W, _
bool operator()(const PCBptr p1, const PCBptr p2) 3 o. U4 Q1 @/ G/ ~% c {' R) [1 _. u9 |3 P6 p
return p1->priority < p2->priority; 8 ]1 Z' }5 B5 v! d3 e } # ~9 W* n. e7 K* u6 y }; 9 M2 r; h6 X& I9 A+ `3 ^8 `! t/ B3 `" ?. u/ k0 ^# Z
struct PriorityCmpForBack+ \ |# B" J, {: U
{ : X) M5 v9 g5 O* {# s! m$ b bool operator()(const JCBptr j1, const JCBptr j2) # F$ m/ Z5 [2 d' Y+ C5 [ {$ e. X/ G4 l) G0 B/ ]1 L$ K
return j1->submit_time > j2->submit_time; + n+ F$ v5 I4 G, K0 M+ ?& A- K } M3 M+ k1 T2 z l8 }6 S, m }; . X/ j9 @( m+ ?- z& K5 Q3 n/ K1 K( Y' Y, Y
) O' g# F+ i) X, D# \1 j% T MultiprogrammedBatchProcessingSystemJobScheduling() # p' G8 |+ }: N4 A+ ] { + }5 j, I0 q7 B( y- @) ?2 k, o# k# a7 w back_queue_ = new std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>(); # J: t1 Y* q. X/ H) i' H) ] psa_ready_queue_ = new std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>();+ }4 O+ ^( H0 J
& Y" u. f I. C
/ M8 j3 B* @' O$ K* o2 h6 a9 P5 M
std::cout << "input job num:" << std::endl; 3 x3 e5 P j5 t! a8 O std::cin >> job_num_; 8 x: T; O2 ?( N7 C- \1 I y for (int i = 0; i < job_num_; i++) ! D2 | y' j. I/ I { 7 R- Q& ?1 R' T2 Z9 q! A std::cout << "input job" << i << " submit_time & required_running_time & priority" << std::endl;: \- t8 \/ n& ?" L k$ o
$ }3 h$ g I: e) v6 I7 `0 i; Z" i JCBptr jcb = new JCB(); 6 x4 ^& W/ ~8 p jcb->job_name = "job" + std::to_string(i);9 C2 O+ d8 X- C
jcb->job_status = Wait;4 w& x+ v( d8 y& w, s" n8 q9 w% e
std::cin >> jcb->submit_time; 9 z1 H* r" [0 |" g& i W* D std::cin >> jcb->required_running_time;8 z; {/ N3 p, V7 ?+ h
std::cin >> jcb->pcb->priority; & m( x: B+ m. V back_queue_->push(jcb);1 L9 x: P6 m9 [9 ?9 M8 C
} ) d4 S/ s3 F: z/ j4 | s 7 X: ?; j$ W, C$ U( R4 ?0 C3 Q
/*8 L( r V& n' N6 x
job_num_ = 6; 5 o. ?* M" l [8 |2 L* J. T9 Z$ Y; n S" ?
JCBptr jcb = new JCB();$ ]( c$ Q+ L) R/ | W
jcb->job_name = "A"; / ^0 q- I/ i T: L9 j4 w" r" q% H" Q jcb->job_status = Wait;" ]0 f2 f4 f5 Q5 v: j9 p ^" C" l
jcb->submit_time = 0; 7 i& W% d% ~3 X7 r$ B jcb->required_running_time = 50; " ]: q S+ s$ s# G jcb->pcb->priority = 5;9 I0 U1 m( _ G6 c* G
back_queue_->push(jcb); * P' B# S6 t6 n3 v' j/ ?' U! J 6 y9 v8 H6 ^) p. O9 d jcb = new JCB();& y' Y1 U' W# j
jcb->job_name = "B"; * D4 q# d* Y7 \% ` jcb->job_status = Wait; 3 x. a! [- q/ {7 @; o2 ?' o4 ? jcb->submit_time = 20;! k- h1 z; O! \2 k
jcb->required_running_time = 60; ( D2 ]+ _+ J- c jcb->pcb->priority = 7; - F0 K3 x( C" l' Y back_queue_->push(jcb); 1 Z% M- u7 o) [# p# n4 } 3 U8 E9 p) _6 M) |% G/ z jcb = new JCB();0 S# ?; q1 h: C" O% a9 h8 |
jcb->job_name = "C";$ l& ^$ T' H, l& S1 U
jcb->job_status = Wait;( n* K7 C; q' f# _3 i
jcb->submit_time = 50; " E w; z; z1 ?* j9 b8 k; h jcb->required_running_time = 40; ' x7 h% s4 U& d& `* p5 R1 [ jcb->pcb->priority = 3; : w, p5 Z) ?* P: A$ H back_queue_->push(jcb); ' i1 L9 m; u0 Y 9 ]8 ?- o& {4 w3 j- q5 t! l jcb = new JCB();" u8 W' V, y2 ?. M3 l0 A
jcb->job_name = "D";- t- y) }6 O4 w. \- y! o
jcb->job_status = Wait;; e9 C! E; V0 m1 L6 U- ?/ `
jcb->submit_time = 80;/ x% |& g# b2 s5 O
jcb->required_running_time = 80;: p8 W8 S W. p* d' a
jcb->pcb->priority = 8; + @+ l6 [0 a$ x2 `2 Y back_queue_->push(jcb); 7 c: Q/ r2 v4 T$ x, I. k3 F' u. N7 j1 G
jcb = new JCB(); {. f8 ]0 {* w6 b. |& k( s& u jcb->job_name = "E"; 3 S$ q/ T5 Y* V( s' G. ~0 @- {! f jcb->job_status = Wait; 5 M. f9 N/ J+ h2 s( B" I/ T jcb->submit_time = 100;, \ b# f3 r0 k" c* V
jcb->required_running_time = 30; 3 T4 ^% }3 Y6 O" y# y jcb->pcb->priority = 6; $ f2 P3 _7 p2 X4 a2 X back_queue_->push(jcb);: ~3 e/ I& ?4 Y7 E) f
& o; C3 h) J. i; f$ F jcb = new JCB();& t. ]4 ]- D, }( }$ O/ L. d, o( j T
jcb->job_name = "F"; ; W$ W$ W9 z4 H; M8 q* p jcb->job_status = Wait;# x" Q- S+ P) `0 f" Z6 J
jcb->submit_time = 120; 0 \& r0 R4 L& H, M jcb->required_running_time = 70;, S# U7 o8 ?& x# r5 }
jcb->pcb->priority = 9;% \) p9 L% J+ A) Q. _/ N
back_queue_->push(jcb);) v+ O5 J# Z- c2 Q# Y
*/ ! ~+ j5 r# F5 l } . T4 e( V# r4 j9 M* D) h( X / f% N; ?# C0 R; |: A0 l bool start() |8 T+ Q5 R& A7 x5 k0 o4 W1 S w2 N% n" y
{ * C3 g9 R5 B% V+ b. A7 J cur_time = back_queue_->top()->submit_time; 8 t2 ]# m. @. g/ T while (!back_queue_->empty() || !psa_ready_queue_->empty())# {2 _4 J+ g# C; n% C3 ~/ A; s5 n5 a
{! p( H: \6 i; j7 o) {) p X' P
bool increase_time = true; 1 g# U6 f5 t; m$ y5 |3 D$ d // Job FCFS 2 L0 a* m; k6 [1 k* q if(!back_queue_->empty() && psa_ready_queue_->size() < 2) , j+ Z- x$ U4 u6 u/ P' W; w' O { 2 b0 C. g7 `2 Q& \ JCBptr jcb = back_queue_->top(); " u3 ^1 r( F+ U k if (jcb->submit_time <= cur_time) 8 \# E* S7 c, @ {3 a& U( J( B9 p6 z
back_queue_->pop();# @6 J/ a0 M9 U: d
& L; y8 | N' h0 _. \1 F // Process PSA % x+ T. d' d' G# j. b if (!psa_ready_queue_->empty()) ! Z+ `5 [+ R2 l {2 A6 r9 F4 s/ {3 Z
PCBptr pcb = psa_ready_queue_->top(); 1 X3 Y" S- d4 K JCBptr jcb = pcb->jcb; % ]+ B& n* F6 w1 O- t, {0 `5 r ' j1 l8 r& a) f! F6 g$ O if (jcb->already_run_time >= jcb->required_running_time)1 {- o$ }- |9 e \# n5 \& s
{ * M$ a. B5 z# H5 z8 I jcb->job_status = Finish;# w. `$ j: P e+ ] G1 \* j( l, |
psa_ready_queue_->pop();! T/ V4 }* R0 `; f" ~5 J, S ^! }7 E
//std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl; 0 t6 S# W1 I" o4 _% J, n* Y# P1 U" n2 s# I
jcb->finish_time = cur_time; , o" ~2 t1 @8 h" q+ v6 x Util::printJobData(*jcb, true); ( O; P( h' Q6 W9 S } % ^7 O% _, F8 S K- j4 q9 N" O+ v* ^ else ' o/ v9 [ x; r. H4 N$ J { ) R K) T. T2 [! G8 b* ^3 X) \ jcb->job_status = Wait; 7 I' g$ `3 V: r- j0 \( a pcb->status = Ready; 9 w [, X& o( o- L! Z0 {) O //std::cout << "[LOG]" << jcb->job_name << " Ready At " << cur_time << std::endl; + x- d* N" |. ^0 o1 H& H- I e } 3 O; J* f. m q# [ } 8 v! R1 K. g; z2 E, T# S B3 t! v9 }9 k/ O
psa_ready_queue_->push(jcb->pcb);$ @( x4 ?# }" H" e. G/ i
+ U; ^. O- \, j7 y9 s, U* @: z& Y/ F2 [ PCBptr pcb = psa_ready_queue_->top();0 I6 c- f1 j5 v# Y% Q: B) G
JCBptr jcb = pcb->jcb;: A* b" Q* ?3 y; ~/ K C
jcb->job_status = Run; & P5 J9 S$ F: T8 w6 O pcb->status = Running; 3 ^1 }% M0 J! g" d/ ?7 Z ! _% e% l) R: p //jcb->start_time = (jcb->start_time == -1) ? cur_time : jcb->start_time; 7 C7 c- z& q) D" b //std::cout << "[LOG]" << jcb->job_name << " Begin Running At " << cur_time << std::endl; 5 U8 l/ `, l. ~ 5 v0 u) E( \. r3 a1 w increase_time = false; & C$ ?9 l; t/ f* ], W! p } ~5 }( [6 } U$ f* W% d* J } . v0 F, R% ]/ v0 e else if (!psa_ready_queue_->empty())- b: h& m( F6 y
{) ?% l5 R8 g3 d& m1 ^- B% W$ }
PCBptr pcb = psa_ready_queue_->top();) Q4 }0 F- b9 Z. W/ X+ W
JCBptr jcb = pcb->jcb;7 c# B* b; b: L& }" T
" t; y3 [. l% E. }( z6 F if (jcb->already_run_time >= jcb->required_running_time) $ Y2 b4 S# R% y. f, `" v { G% k' {. p5 y4 s( v jcb->job_status = Finish; ' B6 t6 V& s7 D: C6 x/ g psa_ready_queue_->pop();& L6 c3 {, L9 U" u
//std::cout << "[LOG]" << jcb->job_name << " Finish At " << cur_time << std::endl;1 |2 S$ @1 x9 R4 q8 V+ u3 s
jcb->finish_time = cur_time; ! w& d/ l7 {9 J; `+ K increase_time = false;; g n' _! z1 }2 L( W4 b
/ X4 _ X( b. e3 f& ]* I5 `8 x- K; d
JCBptr jtop = psa_ready_queue_->top()->jcb;: Q9 n( i- T- e
//jtop->start_time = (jtop->start_time == -1) ? cur_time : jtop->start_time;1 K/ [5 n$ d: H, R2 }" S8 N3 f3 b6 }
Util::printJobData(*jcb, true); , J8 B8 ^; L9 \1 J } 7 b8 e! B6 o# a4 O% { }! Q( E. m9 }& [- g n* c
( Y; {" ]6 l9 J# o' v9 u
if (increase_time) 1 X4 l. S8 b0 |3 E/ q3 K {# d& L- i& L. z: z9 O; F8 W
if (!psa_ready_queue_->empty())# C6 [: l. V& e# `
{" l" _- B( w y. A( i
PCBptr pcb = psa_ready_queue_->top(); ( Q) B9 X; Y+ H p; A pcb->jcb->already_run_time++;6 @& P, |, _; Z$ K6 Z
} - _1 ~2 Q1 E6 r4 a1 b3 e4 A* w cur_time++;3 a# E- G ^4 m
} f: W2 ~* K B! W4 H; o) D( k1 g }- s: I# S7 Z" u8 j
std::cout << "[INFO] all jobs finished." << std::endl;: z- {; l* G7 `- q! Y
std::cout << "[LOG] average turnaround time " << (average_turnaround_time / job_num_) . p: A' _- L! \' Q0 Z << " average power turnaround time " << (average_power_turnaround_time / job_num_) << std::endl; 7 K# j: ]3 _0 d2 w. ~/ Y l }/ g9 |4 p0 i: v! o& o+ [
z( ^2 u! I5 ^% E* [( I1 uprivate: ' c3 D/ U$ `$ E8 N2 F; K6 z int job_num_;) y! D' M7 L' [2 J2 z; C
std::priority_queue<JCBptr, std::vector<JCBptr>, PriorityCmpForBack>* back_queue_;, I, ]* k: s' a: V
std::priority_queue<PCBptr, std::vector<PCBptr>, PriorityCmpForPCB>* psa_ready_queue_;* ~9 J1 G5 V- i
};: e# l( T3 C! \! g; X: w
! }9 e# i9 q, B
/*3 f# H" M7 t. V. v6 ~
int main()9 ] k5 C, O* ]% d+ S
{ / N2 s! X0 Z9 V( F6 M SimpleBatchProcessingSystemJobScheduling<FCFSSchedulingAlgorithm> js(4); 2 q: E. }7 V4 y$ m% T4 e js.getCurrentReadyQueue();/ y. _; O7 f( R2 q' k( O. @
# U1 P4 |4 Z6 o( r3 C3 h, f$ T // pause to see result ; k4 N& s4 t# M2 ^0 q1 N' {4 Z getchar();5 V) Y' U# Y8 O+ A1 @- b* a
return 0; & G0 W; b/ E6 T( ?& v F}/ [5 @; m+ i! ^" O& W/ u
*/8 @) g: L) o3 A7 l( z4 z
( r; y$ _, J( }1 w
六、运行结果 0 S, C: M* Y" s' i+ Z6.1 单道批处理(FCFS) ; f* N/ S; @, C) Q0 L6 s4 [6 a1 x0 P0 @/ l& b
# e- `% K, d# x4 B6 N! \$ f' u6.2 单道批处理(SJF); {) F; i* D" t* f% }- p, \; X& p# }1 n
6 Z# ?! w' i; l& y4 \# ^
" V0 t5 r# ^& M8 t* t; |: e
6.3 单道批处理(HRRN), e( _8 K3 O( l- ?0 F
. O- V F; }, o. W6 W8 Z( V
4 J" @! e: f" c; u
6.4 多道批处理(FCFS + PSA)# r4 w% L2 r. S/ B- B( y0 L0 y
z+ e: z5 \, x4 x2 X3 G % n* i& D) }4 `( E A# k七、结尾0 i! _/ }/ B# ~" @4 u
如果本文描述的内容或使用的代码存在任何问题,请及时联系我或在本篇文章的下面进行评论,我会本着对每一位学技术同学的负责态度立即修改。在后续还会有三篇计算机操作系统的算法 C++ 复现博文,如果感兴趣可以关注我。1 z2 ?, D' P* n8 `, h/ T
———————————————— 5 p8 `. s s* d' }0 q. t. V版权声明:本文为CSDN博主「杨小帆_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! E: H- `3 }- C: D ]) V! R
原文链接:https://blog.csdn.net/qq_40697071/article/details/106698130 & ^+ X- J p% L/ d: i! a, ]9 a. a/ d$ [/ q5 d- k