[Concurrency] Lock-Free ์๋ฃ๊ตฌ์กฐ
๋ฉํฐ์ค๋ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํ๋ฉด, ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Mutex์ ๊ฐ์ ๋น๊ด์ Lock ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๋ค. ๊ฐ์ฅ ๋จ์ํ๊ณ , ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค.
๋์ถฉ ์ด๋ฐ ์์ผ๋ก, ์ปฌ๋ ์
์ Lock์ ์์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ ํ๋ก Lock ๊ฑธ๊ณ ํ๊ณ ํ๋ฉด์ ์ฐ๋ ๊ฒ์ด๋ค.
Lock์ ๊ฐ๋ ฅํ๊ณ ๋น๊ต์ ๋ค๋ฃจ๊ธฐ ์ฝ์ง๋ง, ๋จ์ผ ๊ณต์ ์ง์ ์์์ ์ ๊ทผ์ด ๋๋ฌด ๋น๋ฒํ๊ฑฐ๋ ๊ธธ๋ค๋ฉด ํ์ฐ์ ์ธ ์ฑ๋ฅ ์ ํ๋ ๋ถ๊ณต์ ์ฑ, ๊ธด ์ง์ฐ์๊ฐ(์๋์ ์ผ๋ก) ๋ฑ์ด ๋ฐ์ํ ์ ์๋ค.
๊ทธ๋์ ๊ฐ๋์ ์ด๋ฌํ ํ๊ณ๋ฅผ ๋ฒ์ด๋๊ณ ์ ์๋ฃ๊ตฌ์กฐ ์์ค์์ ๊ตฌํ์ ๋ง๊ฐ์กฐํ ๊ฒ์ ์ฐ๊ณค ํ๋ค. ๊ทธ๋ฐ๊ฑธ Lock-Free ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ณดํต์ queue๋ stack, key-value map ์ ๋๋ฅผ ๊ตฌํํด์ ์ฐ๋ ๊ฒ ๊ฐ๋ค. queue์ ๋น๋๊ฐ ๊ฐ์ฅ ๋๋ค.
์ธ๋ถ์ ์ธ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ ์ํ์ง๋ ์๊ณ , ์ผ๊ฐ๋ง ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.
๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ
Lock-Free ์๋ฃ๊ตฌ์กฐ๋ Lock-Free ์ฐ์ฐ๋ค์ ๊ธฐ๋ฐํด์ ๊ตฌํ๋๋ค.
Compare And Swap, Atomic Load&Store ๊ฐ์ ๊ฒ๋ค์ด ๋ํ์ ์ด๋ค.
์ด ๊ธฐ๋ฐ ์ฐ์ฐ ๋ฐฉ๋ฒ๋ก ๋ค์ ๋ํด์ ์ ๋ชจ๋ฅธ๋ค๋ฉด, ์ ๋ถ ์์๋๊ธธ ๊ถํ๋ค.
https://blog.naver.com/sssang97/224054767242
https://blog.naver.com/sssang97/223131630420
https://blog.naver.com/sssang97/223131730615
https://blog.naver.com/sssang97/223356930725
Lock-Free ์๋ฃ๊ตฌ์กฐ์๋ ๊ตฌํ ๋ฐฉ๋ฒ์ด ๋ฑํ ์ ๋ฆฝ๋์ด์๋๊ฑด ์๋์ง๋ง, ๋ณดํต์ Compare and Swap ๊ธฐ๋ฐ์ ์ ๊ทผ๋ฒ์ ๋ง์ด ์์ฉํ๋ค.
Linked List ์ฒ๋ผ Node๋ฅผ ๋์ ์ผ๋ก ์ด์ด๋ถ์ด๋ ์๋ฃ๊ตฌ์กฐ์ ๊ฒฝ์ฐ์๋ ๋์ถฉ ์ด๋ฐ ๋๋์ผ๋ก ๊ตฌํ์ด ๋๋ค.
์๋ ์ฝ๋๋ rust crate์ธ "lockfree"์ deque ๊ตฌํ์ฒด ์์๋ค.
์ ์ด์ ์์์ ๋
ธ๋๊ฐ ํต์งธ๋ก๋ฅผ Atomic Operation์ ๋์์ผ๋ก ์ฐ์ง๋ ๋ชปํ๋ค. ํ๋์จ์ด ์์ค ์ ํ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ์์ฒ๋ผ ๋
ธ๋์ ํฌ์ธํฐ๋ฅผ ๋์์ผ๋ก Atomic ์ฐ์ฐ์ ๋๋ฆฐ๋ค.
List์ ๋ ํฌ์ธํฐ์ Atomic ์ฐ์ฐ์ผ๋ก ์ต์ ๊ฐ์ appendํ๊ณ , Atomic store๋ก ์ค๊ฐ์ ๋ค์ ์ฐ๊ฒฐ์ ํ๋ค.
์ด๋ ๊ฒ ํ๋ค๋ฉด Acqrel=>Release ์์ memory ordering์ ํตํด์ ์ต์ํ์ ์์๋ฅผ ๋ณด์ฅํ ์๋ ์๋ค.
๊ทผ๋ฐ ์ฝ๋ฉํธ์ ์ฐ์ฌ์๋ฏ์ด ์ ์ฝ์
์ ๋ํ ๊ฐ์์ฑ์ ์ง์ฐ์ด ์๊ธธ ์๋ ์๋ค.
์ด๊ฑด ํ๋ก๋์ ์ผ๋ก ๊ฒ์ฆ๋๊ฑด ์๋๊ณ ์คํ์ ์ธ ๊ตฌํ์ด๋ผ์ ์ด๊ฒ ์ต์ ์ด๋ผ๊ณ ํ ์๋ ์๋ค. ๊ทธ๋ฅ ํ๋์ ์์์ผ ๋ฟ์ด๋ค.
ํน์, ์ด๋ฐ ์์ผ๋ก comapre and swap ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
๊ฐ๋จํ stack ๊ตฌํ๋ก๋ค.
์ด๋ฐ ๊ตฌํ ๋ฐฉ์์ ์ข ๋ ๋น ๋ฆฟํ๊ฒ ๋๊ธด ํ์ง๋ง, set ํ์ ์์ฒด์ ์คํจ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ๊ณ , ๊ทธ ๋๋ฌธ์ ๋ฃจํ ์ฌ์๋๋ก ์ธํ spinning์ด ๋ฐ์ํ ์ ์๋ค๋ ์ง์ ์ด ์๊ธด๋ค. ๋น์ฐํ CPU ๋ฆฌ์์ค๋ฅผ ๋ ๋จน๋๋ค.
์ฃผ์์
์ฌ์ค Lock-Free ์๋ฃ๊ตฌ์กฐ๊ฐ ํ์ํ ์์ค์ ์์ฉํ๋ก๊ทธ๋จ์ ๊ทธ๋ค์ง ๋ง์ง๋ ์๋ค. ๋ณดํต์ ๊ฒ์ ์๋ฒ ๊ฐ์ ๋งค์ฐ ๋น ๋ฅด๊ณ ์ง์ค์ ์ธ ์ค์๊ฐ-๋์์ฑ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋ถ๋ถ์ ๋๋ฌผ๊ฒ ์ฌ์ฉ๋๊ณค ํ๋ค.
๊ทธ๊ฒ ์๋๋ผ๋ฉด ์ถ์ฒํ๊ธฐ ์ด๋ ต๋ค. ์ฌ์ฉ์ฌ๋ก์ ์ต์ ํ๋ Lock-Free ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ์๊ฐ๋ณด๋ค ์ฝ์ง ์๊ณ , ๋์์ฑ ๊ตฌ์กฐ์์ ๋ฐ์ํ๋ ๋งค์ฐ ๋ง์ ์ ์ฌ์ ๋ฒ๊ทธ๋ค์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒ๋ค๊ฐ, Lock-Free ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด๋ค๊ณ ํด์ ๋ฐ๋์ ๋นจ๋ผ์ง๊ฑฐ๋ ๋ฆฌ์์ค๋ฅผ ์ ํ์ฉํ๊ฒ ๋๋ ๊ฒ์ ์๋๋ค. ์คํ๋ ค Lock-Free ์ ๊ทผ๋ฒ ํน์ ์ ๋บ๋บ์ด ๋ฃจํ ๋๋ฌธ์ CPU ๋ฆฌ์์ค๋ฅผ ๋ ์๋ชจํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๋ค.
๋๊ตฐ๋ค๋, ์ผ๋ฐ์ ์ธ ํธ๊ฒฌ๋ค๊ณผ ๋ค๋ฅด๊ฒ Mutex๋ก ๋ํ๋๋ ํ์ค Lock ๋งค์ปค๋์ฆ๋ค์ OS ์์ค ์ง์์ ๊ธฐ๋ฐํด์ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฌ์ฉํ๊ฒ๋ ์ค๊ณ๋์ด์๋ค. ๊ดํ ๋ค๋ค Lock์ ์ฐ๋๊ฒ ์๋๋ผ๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก ํน์ ์ wake-up ๊ตฌ์กฐ์์ ๋์ค๋ ์ฝ๊ฐ์ ๋ ์ดํด์๋ ์กด์ฌํ๋ค. ํ์ง๋ง ๊ทธ๊ฒ ๋ฌธ์ ๊ฐ ๋ ๊ฒฝ์ฐ๋ ์ ์๋ค.
๊ทธ๋์ ํต์์ ์ผ๋ก Lock-Free ์๋ฃ๊ตฌ์กฐ๋, ๋ ์ดํด์๊ฐ ๋งค์ฐ ๋ฎ์์ผ ํ๊ฑฐ๋, ๊ทน๋์ ๋์ ์ฒ๋ฆฌ๋์ ์๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ๋ ์ ํฉํ๋ค. ๊ทธ๋ฆฌ๊ณ CPU ๋ฆฌ์์ค๋ฅผ ํจ์ฌ ๋ง์ด ๋จน๊ธฐ ๋๋ฌธ์ ์ฝ์ด๊ฐ ๊ต์ฅํ ๋ง์ ๋จ์ผ ๋จธ์ ์ ์ฅ์ด์ง๋๋ฐ ๋ ์ฉ์ดํ๋ค. ์ฝ์ด ๋ช๊ฐ ๋์ง๋ ์๋ ๊ฐ๋ํ ์ปดํจํ ํ๊ฒฝ์๋ ์ด์ธ๋ฆฌ์ง ์๋๋ค.
Lock-Free ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ์ ๊ฒฐ์ ํ๋ ค๋ฉด ๋ฐ๋์ ํ์คํ ๋ฒค์น๋งํน๊ณผ ๊ฒ์ฆ์ ๊ฑฐ์ณ์ผ๋ง ํ๋ค.
์ฐธ์กฐ
https://velog.io/@cedongne/Server-Lock-free
https://stackoverflow.com/questions/64938715/when-should-we-choose-locking-over-lock-free-data-structures
https://stackoverflow.com/questions/1585818/when-are-lock-free-data-structures-less-performant-than-mutual-exclusion-mutexe
https://www.baeldung.com/lock-free-programming
https://xtozero.tistory.com/7
https://www.linkedin.com/pulse/low-latency-rust-lock-free-data-structures-luis-soares-m-sc--va5xf/
https://www.reddit.com/r/cpp/comments/vg4myt/is_lockfree_programming_is_always_better_than/