λͺ©λ‘μ 체 κΈ (1096)
KoreanFoodie's Study
[C++ κ²μ μλ²] 1-14. λ©λͺ¨λ¦¬ λͺ¨λΈ (atomic, μ½λ μ¬λ°°μΉ) ν΅μ¬ : 1. atomic μ°μ°μ΄λ, λ§ κ·Έλλ‘ ν΄λΉ μ°μ°μ΄ 'μμμ 'μΌλ‘ μνλλ€λ λ»μ΄λ€. 'μμμ ' μ΄λΌλ κ²μ, ν΄λΉ μ°μ° μ¬μ΄μ λ€λ₯Έ μ°μ°μ΄ λΌμ΄λ€μ§ μλλ€λ κ²μ μλ―Ένλ€. 2. μ»΄νμΌλ¬λ μ¬λ¬ μ΄μ (μ£Όλ‘ μ΅μ ν)λ‘ μ½λλ₯Ό μ¬λ°°μΉνλλ°, μ΄λ¬ν memory order λ λͺ¨λ μ°λ λλ€μ΄ 'μμ μμ' μ λμνλ€λ μμΉμ μ§μΌμΌ νλ€. 3. λνμ μΌλ‘ λ€μ μΈ κ°μ§μ λ©λͺ¨λ¦¬ λͺ¨λΈ μ΅μ μ΄ μλ€ : memory_order_relaxed, memory_order_release, memory_order_seq_cst μμμ μ°μ°μ΄λ 무μμΌκΉ? λ©ν°μ°λ λ νκ²½μμ μμμ μ°μ°μ λ§μΉ μΌμμ μΌλ‘ λ½μ 건λ€κ³ μκ°νκΈ° μ½μ§λ§, μ ν..
[C++ κ²μ μλ²] 1-13. CPU νμ΄νλΌμΈ (feat. μ½λ μ¬λ°°μΉ) ν΅μ¬ : 1. μ»΄νμΌλ¬λ μ΄μ λΈλ¦¬μ΄λ₯Ό λ°°μΉνλ κ³Όμ μμ μ½λ μ¬λ°°μΉλ₯Ό ν μ μλ€. μ΄ κ³Όμ μμ μλμΉ μμ κ²°κ³Όκ° λμΆλ μ μλ€. 2. CPU νμ΄νλΌμΈμ CPU κ° λͺ λ Ήμ΄λ₯Ό ν¨μ¨μ μΌλ‘ νκΈ° μν μμ€ν μ΄λ€. CPU νμ΄νλΌμΈμ λν΄ κ³΅λΆλ₯Ό νκ² λλ©΄, μ΅μ νλ₯Ό μν΄ μ»΄νμΌλ¬κ° μμλ‘ μ΄μ λΈλ¦¬ μ½λλ₯Ό μ¬λ°°μΉνλ€λ κ²μ μ μ μλ€. μ±κΈ μ°λ λμμλ μμ°¨μ μΌλ‘ λ‘μ§μ΄ μ€νλ¨μ΄ 보μ₯λμ§λ§, λ©ν° μ°λ λμμλ κΌ μλλλ‘ νλ‘κ·Έλ¨μ΄ λμνμ§ μμ μ μλλ°... λ€μ μ½λλ₯Ό 보μ. volatile bool ready = false; // κ°μμ±, μ½λ μ¬λ°°μΉ int32 x = 0; int32 y = 0; int32 r1 = 0;..
[C++ κ²μ μλ²] 1-12. μΊμ (Temporal Locality, Spatial Locality) ν΅μ¬ : 1. RAM μΌλ‘λΆν° λ°μ΄ν°λ₯Ό κ°μ Έμ¬ λ, μμ£Ό μ°μΌ κ²μΌλ‘ μμλλ λ°μ΄ν°λ μΊμμ μ μ₯λλ€ 2. μΊμ± μ² νμλ Temporal Locality μ Spatial Locality κ° μλλ°, κ°κ° 'μ΅κ·Όμ μ¬μ©λ λ μμ λ€μ μ¬μ©λ νλ₯ μ΄ λλ€' , 'λ©λͺ¨λ¦¬μμΌλ‘ κ°κΉμ΄ μλ λ μμ ν¨κ» μ¬μ©λ νλ₯ μ΄ λλ€' λΌλ μΆλ‘ μ κΈ°λ°μΌλ‘ νλ€. 3. μ€μ λ©λͺ¨λ¦¬ μ‘°νλ₯Ό ν λλ μμ Temporal Locality μ Spatial Locality λ₯Ό κ³ λ €νμ¬ μ€κ³λ₯Ό νλ κ²μ΄ μ’λ€. νν μ°λ¦¬λ μΊμλ₯Ό ν΅ν΄ κ°μ μ‘°νν λ, μ°λ¦¬κ° νμν μ λ³΄λ§ μ»μ΄μ¬ κ²μ΄λΌκ³ κΈ°λνμ§λ§, μ€μ λ‘λ κ·Έλ μ§ μλ€..
[C++ κ²μ μλ²] 1-11. future, promise, packaged_task ν΅μ¬ : 1. future, promise, packaged_task λ λ¨λ°μ± μ΄λ²€νΈλ₯Ό λΉλκΈ°μ μΌλ‘ μ€νν λ μ μ©νλ€. 2. μΈ λ μμ μ°¨μ΄λ Level of Control μ λ¬λ € μλ€. future λ νΉμ ν¨μμ μμ μ λ§‘κΈ°κ³ , packaged_task λ μμ μ λ§λ λ€μ, μ°λ λμ μ΄λ₯Ό μ€μ΄ 보λΈλ€. λ§μ§λ§μΌλ‘, promise λ μμ μ μ€μ΄ 보λ΄λ©΄μ, λμμ μ€μ΄ 보λ΄λ ν¨μ λ΄λΆμμ future μ λκΈΈ κ°μ 컀μ€ν νκ² μΈν ν μ μλ€. 3. 'λΉλκΈ°μ 'μΈ μμ κ³Ό 'λ©ν°μ°λ λ' λ λ€λ₯Έ μλ―Έμ΄λ€. μ΄λ€ μμ μ΄ λΉλκΈ°μ μΌλ‘ μ€νλλ€κ³ ν΄μ, κΌ λ©ν°μ°λ λλ₯Ό μ΄μ©ν νμλ μλ€. μ¬μ€ μμ£Ό μ°μ΄λ λ μλ€μ..
[C++ κ²μ μλ²] 1-10. Condition Variable (쑰건 λ³μ) ν΅μ¬ : 1. 쑰건 λ³μ(Condition Variable) μ μ μ λ 벨 μ€λΈμ νΈλ‘, λμΌν νλ‘κ·Έλ¨ λ΄μμ μ κ·Ό κ°λ₯νλ€. 2. 쑰건 λ³μλ₯Ό μ΄μ©νλ©΄ νλμ μ°λ λ νΉμ λͺ¨λ μ°λ λμ μκ·Έλμ μ λ¬ν μ μλ€. 3. 쑰건 λ³μλ Lock κ³Ό νμ΄λ₯Ό μ΄λ£¨μ΄ μ¬μ©νλ€! μ λ²μ Handle μ μ΄μ©ν΄ μ΄λ²€νΈλ₯Ό ꡬννλ κ²μ μ‘°κΈ λ°μ μμΌ, μ΄λ²μλ condition variable μ μ¬μ©ν΄λ³Ό κ²μ΄λ€. μ¬μ€ condition variable μ Handle μ μ¬μ©νλ κ²λ³΄λ€ μ‘°κΈ λ μ°μν(?) λ°©μμ΄λ©°, 쑰건μ 체ν¬νμ¬ λ½μ μ‘κ³ νΈλ κΈ°λ₯μ μ κ³΅ν΄ μ€λ€. λν condition variable μ μ μ λ 벨 μ€λΈμ νΈμ΄λ―λ‘..
[C++ κ²μ μλ²] 1-9. μ΄λ²€νΈ ꡬν (+ Handle) ν΅μ¬ : 1. μ΄λ²€νΈλ₯Ό μ¬μ©νλ©΄ SpinLock μ λΉν΄ CPU λλΉλ₯Ό μ€μΌ μ μλ μ₯μ μ΄ μλ€. 2. μ΄λ²€νΈμ κ°λ μ κ°λ¨νλ€. νΈλ€μ λ§λ ν, Consumer λ νΈλ€μ μ°Έκ³ νμ¬ κΉ¨μΈ λκΉμ§ μ€λΉ μνμ λ€μ΄κ°κ³ , Producer κ° μ€λΉκ° λμμ λ νΈλ€μκ² μ΄λ²€νΈλ₯Ό 보λ΄κΈ°λ§ νλ©΄ λλ€. 3. νΈλ€μ 컀λ μ€λΈμ νΈμ ν΄λΉνμ¬, μ¬λ¬ μ°λ λκ° μ΄λ₯Ό νμ©ν μ μλ€. μ΄μ Lock ꡬνμ ν¨μ μμ΄ '무μμ κΈ°λ€λ¦¬κΈ°' μ 'μ κΉ κΈ°λ€λ¦¬κΈ°' λ₯Ό ꡬνν΄ λ³΄μμΌλ, λ§μ§λ§ μμκ° λ¨μμλ€. λ°λ‘... 'μ 3μκ° κΉ¨μμ£ΌκΈ°' μΈλ°, μ¬κΈ°μ 'μ 3μ'λΌ ν¨μ μΌλ°μ μΌλ‘ OS μ μ€μΌμ€λ¬λ₯Ό μλ―Ένκ³ , 'κΉ¨μμ€λ€' λ κ²μ ν΄λΉ μ°λ λμ μκ·Έλμ ..
[C++ κ²μ μλ²] 1-8. Sleep κ°λ κ³Ό ꡬν ν΅μ¬ : 1. Lock μ μ‘μ μ μμ λ, μΌμ μκ° λμ κΈ°λ€λ¦¬κ² ν λ sleep μ μ¬μ©νλ€. 2. Sleep μ μ¬μ©νλ©΄ μΌμ μκ° λμ ν΄λΉ μ°λ λλ μ€λΉ μνμ μλ€κ° λ€μ λμμ¨λ€. μ΄ μκ°λμμλ CPU μμμ μ¬μ©νμ§ μλλ€. λμ Kernel Space λ‘ μ νλλ κ³Όμ μμμ λΉμ©μ λ°μνλ€(컨ν μ€νΈ μ€μμΉ). 3. yield λ μ°λ λμκ² μ£Όμ΄μ§ Time Slice λ₯Ό μ¦μ λ°λ©νλλ‘ νλ©°, μ€μΌμ€λ¬μκ² μ°λ λκ° μ΄λ€ μΌμ ν μ§ μμμ μ ν΄λ¬λΌκ³ μμ²μ νκ² λλ€. μ΄μ μ Lock ꡬν μ΄λ‘ μμ μ€λͺ ν κ² μ€ λλ²μ§ΈμΈ, 'λλ€ μκ° ν 볡κ·' λ©νκ° λ°λ‘ sleep μ΄λ€. μ΄μ κΈμμ SpinLock μ μ΄μ©ν΄ '무μμ κΈ°λ€λ¦¬λ..
[C++ κ²μ μλ²] 1-7. SpinLock ν΅μ¬ : 1. SpinLock μ Lock μ μ‘κΈ° μν΄ '무μμ κΈ°λ€λ¦¬λ' λ°©μμ΄λ€. 2. SpinLock μ atomic λ³μμ lock, unlock ν¨μλ‘ μ½κ² λ§λ€ μ μλ€. compare_exchange_strong ν¨μλ₯Ό κΈ°μ΅νμ. 3. SpinLock μ λΆνμν CPU clock μ λλΉνμ§λ§, λλ‘λ 컨ν μ€νΈ μ€μμΉμ λλ κ²λ³΄λ€ λΉμ©μ΄ μ λ ΄ν μλ μλ€. μ΄μ 본격μ μΌλ‘ SpinLock μ ꡬνν΄ λ³΄μ. SpinLock μ κ°λ¨νλ€. κ·Έλ₯ Lock μ μ‘μ λκΉμ§ 무μμ While λ¬Έμ λλ©΄μ κΈ°λ€λ¦¬λλ‘ λ§λ€ κ²μ΄λ€ π€£ κ°λ¨νκ² μκ°νλ©΄ μλμ κ°μ΄ ꡬννκ² μ§λ§... int sum = 0; class SpinLock { private: b..
[C++ κ²μ μλ²] 1-6. Lock ꡬν μ΄λ‘ ν΅μ¬ : 1. Lock μ ꡬννλ λ°©μμ ν¬κ² μΈ κ°μ§λ‘ λλλ€. 무μμ κΈ°λ€λ¦¬κΈ°, μ μ ν λμμ€κΈ°, κΉ¨μμ€ λκΉμ§ κΈ°λ€λ¦¬κΈ° 2. SpinLock μ μ¬μ©νμ¬ λ¬΄μμ κΈ°λ€λ¦¬κ±°λ, μ΄λ μ λ Sleep μ νκ³ λ ν Lock μ λ€μ μ‘μΌλ €κ³ μλν μλ μλ€. 3. νΉμ λ€λ₯Έ μΌμ νλ€κ°, Lock μ μ‘μ μ μκ² λλ μνκ° λμμ λ λ Έν°λ₯Ό λ¬λΌκ³ μμ²ν μλ μλ€. μλ₯Ό λ€μ΄ Condition Variable μ΄ μλ€. μ΄ κ³Όμ μμ 컨ν μ€νΈ μ€μμΉμ΄ μΌμ΄λ μ μλ€! 본격μ μΌλ‘ Lock μ ꡬννκΈ° μ , Lock μ ꡬννλ μΌλ°μ μΈ λ°©μ 3 κ°μ§μ λν΄ λ¨Όμ μκ°νκ³ κ°λλ‘ νκ² λ€. μ¬μ€ λ΄μ©μ κ°λ¨νλ€. Lock μ΄ μ΄λ―Έ κ±Έλ¦° μνλΌκ³ ν ..
[C++ κ²μ μλ²] 1-5. DeadLock μ κ°λ κ³Ό κΈ°μ΄ (+ std::lock) ν΅μ¬ : 1. DeadLock μν©μ, μ¬λ¬ μ°λ λλ€μ΄ Lock μ μλ‘ μ‘κ³ μμ΄ νκ±°λ μλ‘ μ‘μ§ λͺ»νλ κ΅μ°© μνλ₯Ό μλ―Ένλ€. 2. DeadLock μν©μ Lock μ μ‘λ μμλ₯Ό μ μ‘°μ νκ±°λ, μ μ ν Lock μ μ¬μ©νμ¬ ννΌν μ μλ€. 3. std::lock μ μ¬λ¬ κ°μ Lock μ DeadLock μμ΄ νκΊΌλ²μ μ‘μ μ μλλ‘ λμμ€λ€. λ€μκ³Ό κ°μ΄, Lock μ΄ 2κ° μ‘΄μ¬νκ³ μ°μ°μ μν΄ Lock 2 κ°λ₯Ό μ λΆ μ‘μμΌ νλ€κ³ κ°μ νμ. int sum = 0; mutex mutexAdd; mutex mutexSub; void Add() { for (int i = 0; i < 1000; ++i) { mu..