๋ชฉ๋ก์ ์ฒด ๊ธ (1099)
KoreanFoodie's Study
[C++ ๊ฒ์ ์๋ฒ] 1-17, 18, 19. Lock-Free Stack ํต์ฌ : 1. Lock-Free Stack ์ ๋ฝ์ ์ฌ์ฉํ์ง ์๊ณ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ Stack ์ ์ด๋ป๊ฒ ํ๋ฉด ์ ๋๋ก Push/Pop ์ ํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ค๋ค. popCount ๋ ์ฐธ์กฐ๊ถ/์์ ๊ถ ๊ฐ๋ ์ ํ์ฉํด ์ด๋ฅผ ๊ตฌํํ ์ ์๋ค. 2. Lock-Free Stack ์ ์ค์ ๋ก ํ์ฉํ๊ธฐ์๋ ๊น๋ค๋ก์ฐ๋ฉฐ, Lock ๊ธฐ๋ฐ์ ์๋ฃ๊ตฌ์กฐ๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ผ๊ณ ์ฅ๋ดํ ์ ์๋ค. ๊ฒฐ๊ตญ ๊ฒฝํฉ์ด ์ผ์ด๋ฌ์ ๋, ์ค์ง์ ์ผ๋ก ์ญ์ ๋ฅผ ํ๋ ์ฐ๋ ๋๋ 1๊ฐ์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. 3. compare_exchange_weak ์ compare_exchange_strong ๊ณผ ๋น๊ตํ์ ๋, spurious fail ์ด ์ผ์ด๋ ์๋ ์๋ค๋ ์ฐจ์ด๊ฐ ์๋ค. ๊ทธ sp..
[C++ ๊ฒ์ ์๋ฒ] 1-16. Lock-Based Stack/Queue ํต์ฌ : 1. Lock-Based Queue/Stack ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ฉด, ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ํด๋น ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ ๋ ๋ถํ์ํ Lock ์ ์ถ๊ฐ๋ก ์ก์ ํ์๊ฐ ์์ด, ์ฑ๊ธ์ฐ๋ ๋ ํ๊ฒฝ์์์ฒ๋ผ Push/Pop ์ ์ฌ์ฉํ ์ ์๋ค. 2. Push/Pop ํจ์ ๋ด๋ถ์ ์ผ๋ก lock_guard ๋ฅผ ์ก์์ฃผ๋ฉด ๋๋ค. 3. WaitPop ์ ๊ฒฝ์ฐ, Condition Variable ์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค. Queue ๋ Stack ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์ ๊ทผํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ์ง๊ธ๊น์ง ๋ฐฐ์ด ๊ฒ์ ์์ฉํ๋ฉด, ๊ฐ ์ฐ๋ ๋๊ฐ ํน์ ์๋ฃ๊ตฌ์กฐ์ ์ ๊ทผํ ๋๋ง๋ค ๋ฝ์ ๊ฑธ๊ณ ํ๊ธฐ๋ฅผ ๋ฐ๋ณตํด์ผ ํ๊ฒ ์ง๋ง... ์ด๋ ์ฌ์ค ๋งค์ฐ ๊ท์ฐฎ์ ์ ์๋ค. ๊ทธ๋ฅ ..
[C++ ๊ฒ์ ์๋ฒ] 1-15. Thread Local Storage ํต์ฌ : 1. Thread Local Storage(TLS) ๋, ์ฐ๋ ๋ ๋ณ๋ก ํ ๋น๋ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ฏธํ๋ค. 2. TLS ๋ฅผ ์ด์ฉํ๋ฉด, ๊ฐ ์ฐ๋ ๋๋ณ๋ก ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๋ ํ์ด๋ ๋ฐ์ดํฐ ์์ญ์์ ๋ณ๋์ ๋ณ์ ์ ์ธ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ ์ ์์ด ๋ถํ์ํ Race Condition ์ ํผํ ์ ์๋ค. 3. TLS ๋ ์ปดํ์ผ๋ฌ ์์กด์ ์ผ๋ก ์ ์ธํ ์๋ ์์ง๋ง, C++ ์์๋ ์ด์ ์ธ์ด ํ์ค์์ ํด๋น ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. Thread Local Storage ๋, ์ฐ๋ ๋ณ๋ก ๋ ๋ฆฝ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๋ฏธํ๋ค. ์คํ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ณ๋์ stack ์์ญ์ด ์กด์ฌํ๊ณ , Heap ๊ณผ ๋ฐ์ดํฐ ์์ญ์ ๊ณต์ ํ๋๋ฐ... TLS ์ ๊ฒฝ์ฐ, ๊ฐ ์ฐ๋ ๋๋ณ..
[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 ์ ์ด์ฉํด '๋ฌด์์ ๊ธฐ๋ค๋ฆฌ๋..