[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/