[Concurrency] Compare And Swap (CAS)
compare and swap์ ๋ฉํฐ์ค๋ ๋ ์ฐ๊ธฐ ์์ ์ ์ฌ์ฉ๋๋ ์ฃผ์ ๊ฐ๋ ์ค ํ๋๋ค.
lock ์์ด ํจ์จ์ ์ผ๋ก ๋ณ๋ ฌ ์์ ์ ๋๊ธฐํํ ์ ์์ด์ lock-free operation์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
๋ฌธ์
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ํ๊ฒฝ๊ณผ ๋ค๋ฅด๊ฒ ๋์ํ๋ค.
integer ๋ณ์ ํ๋๋ฅผ ๋๊ณ ๋์์ +1๋ฅผ ํ๋ ๊ฐ๋จํ ๋ก์ง์ ์ํํ๋ ๊ฒ๋ง์ผ๋ก๋ data race๋ก ์ธํ ์ฐ๊ธฐ ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋จ์ ์ฐ๊ธฐ๊ฐ ์๋๋ผ ์ฝ๊ธฐ-์ฐ๊ธฐ๊ฐ ์ข
ํฉ์ ์ผ๋ก ์ด๋ค์ง๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ฌธ์ ๋ ๋น์ฐํ ๋ ์ปค์ง ๊ฒ์ด๋ค.
Compare And Swap
Compare And Swap, ์ดํ CAS๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ Atomic Operation์ด๋ค.
ํ๋์จ์ด ์ง์์ด๊ธฐ ๋๋ฌธ์ ์์ ํ ์์์ฑ์ ๋ณด์ฅํ๋ค.
๋ฐฉ๋ฒ๋ก ์ ๊ฐ๋จํ๋ค. ํน์ ๋ณ์๋ฅผ ๋ด๊ฐ ๋ค์ด์์๊ฑฐ๋ผ ์์ํ ๊ฐ๊ณผ ๋์กฐํด์, ๊ฐ์ผ๋ฉด ์ฐ๊ธฐ ์์
์ ์ํํ๊ณ , ๋ค๋ฅด๋ฉด ์ฐ๊ธฐ ์คํจ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ด๋ค.
๋ง ๊ทธ๋๋ก ๋น๊ตํด์(compare) & ๋ฐ๊ฟ์น๋(swap) ๊ฒ์ด๋ค.
์์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค. ์ธ์ด๋ Rust๋ค.
์ด๊ฑด ๊ธฐ์กด ๊ฐ์ 1์ ๋ํ๋ ์ ๋ง ๋จ์ํ ์ฝ๋๋ค.
ํ์ง๋ง ์ด๊ฒ๋ ๋์์ฑ ํ๊ฒฝ์ ๋ง์ถฐ์ง ์ฐ์ฐ์ด๋ผ ์ง์ง ๋จ์ํ์ง ์๋ค. ๋ถ๊ฐ์ ์ธ ๋
ผ๋ฆฌ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ ์ฝ๋๋ current ๊ฐ์ด 4์ธ ์ํ์๋ค๋ฉด (4=>5)๋ก CAS๋ฅผ ๋ ๋ฆฌ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ CAS๊ฐ ์คํ๋๋ ์์ ์ด ์ง์ง 4๊ฐ ๋ง์๋ค๋ฉด, CAS ์ฐ์ฐ์ ์ฑ๊ณตํ๋ค.
ํ์ง๋ง CAS๊ฐ ์คํ๋๋ ์์ ์, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ๊ฐ์ 100์ผ๋ก ๋ณ๊ฒฝํ๋ค๋ฉด, (4!=100)์ด๋ฏ๋ก CAS ์ฐ์ฐ์ด ์คํจํ๋ค.
์ด๋ฐ ์คํจ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์, ๋๋ถ๋ถ์ CAS ๊ธฐ๋ฐ ์ฝ๋๋ ์คํจ-์ฌ์๋๋ฅผ ๋ฐ๋ณตํ๋ spin loop ๋ก์ง์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
CAS ์ฐ์ฐ ๊ฐ๊ฐ์ ๋จ์ผ ์ธ์คํธ๋ญ์
์ด๋ผ ๋ฆฌ์์ค๊ฐ ๊ทธ๋ค์ง ํฌ์ง ์์ง๋ง, ์ค๋ซ๋์ ๋๋ค๋ณด๋ฉด CPU ๋ฆฌ์์ค๋ฅผ ๋ง์ด ๊ฐ์๋จน๊ฒ ๋๋ค. ๊ทธ๋์ ์ฐ๋๋ผ๋ ์ ์จ์ผํ๋ค.
CPU ์ธ์คํธ๋ญ์
CAS๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ตฌํํ๊ฑฐ๋ ํ๋๊ฒ ์๋๋ผ, ์ค์ ๋ก CPU ์ธ์คํธ๋ญ์
์์ค์์ ์ง์๋๋ ๋ช
๋ น์ด๋ค. ์ด๋ฐ ์ง์ ํ ์์์ฑ์ ํ๋์จ์ด ์ง์ ์์ด๋ ์ ๋น์ด ๋ฌ์ฑ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ ์ผ๋ฐ์ ์ธ ์ปดํจํ
ํ๊ฒฝ์ด ์๋๋ผ๋ฉด, CAS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ ์ ์๋ค.
์ธํ
๊ณ์ด ํ๋ก์ธ์์์๋ ์ด ์์
์์ฒด๊ฐ ํ๋์ ์ธ์คํธ๋ญ์
์ผ๋ก ์ ๊ณต์ด ๋๋ค. ์ด๋ฆ์ cmpxchg์ด๋ค.
์๋ฅผ ๋ค์ด, ์๋ ์ฝ๋๋ rust์ ํ์ค ํจ์๋ฅผ ์ปดํ์ผํ ์ด์
๋ธ๋ฆฌ ์ฝ๋๋ค.
l์ด ๋ถ์ด์ ํผ์ฐ์ฐ์ ์์๊ฐ ๋ฐ๋๊ธด ํ๋ฐ,
cmpxchgl [์ ๊ฐ] [์ ์ฅ์์น]
cmpxchg [์ ์ฅ์์น] [์ ๊ฐ]
์ ํํ๋ฅผ ๊ฐ์ง๋ค.
๋น๊ตํ ๊ธฐ์กด ๊ฐ์ rax, eax, ๋๋ ax, al ๋ ์ง์คํฐ์์ ๊ฐ์ ธ์จ๋ค.
๋ ์ง์คํฐ์ ๊ฐ๊ณผ ์ ์ฅ์์น์ ๊ธฐ์กด๊ฐ์ด ๊ฐ๋ค๋ฉด ์ ๊ฐ์ ๋ฃ๋ ๊ฒ์ด๋ค.
ARM์ ๊ฒฝ์ฐ์๋ ์ธ์คํธ๋ญ์ ์ ๋ฐ๋ก ์ง์ํ๋ค. ์ด๋ฆ๋ ๋งค์ฐ ์ง๊ด์ ์ธ CAS๋ค.

Strong CAS vs Week CAS
๊ทผ๋ฐ ์ ๋ณด๋ฉด, cas๋ ํ๊ฐ์ง๋ง ์๋๊ฒ ์๋๋ผ 2๊ฐ์ง๊ฐ ์กด์ฌํ๋ค. week๋ผ๋ ๋ฒ์ ์ด ๋ ์กด์ฌํ๋๋ฐ

์ด๊ฑด Rust์๋ง ์๋๊ฑด ์๋๊ณ , C++ ๋ฑ์๋ ์๋ค.
week๋ ๋ณด์ฅ ์์ค์ด ๋ฎ์ CAS ๋ฒ์ ์ด๋ค.
Strong CAS๊ฐ ์ ์ฉ ์ธ์คํธ๋ญ์
์ ์ฌ์ฉํด์ ์์ ํ ๋์์ ๋ณด์ฅํ๋ค๋ฉด, week CAS๋ ์์์ฑ๊ณผ ๊ด๋ จ์ด ์๋ ์ธ์คํธ๋ญ์
2๊ฐ๋ฅผ ์กฐํฉํด์ ๋์จํ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
strong CAS๋ ์ฐ๊ธฐ์ ์ฑ๊ณตํ๋ค๋ฉด ์ฑ๊ณตํ๋ค๊ณ ํ๊ณ , ์คํจํ๋ค๋ฉด ์คํจํ๋ค๊ณ ํ๋ค.
๋ฐ๋ฉด week CAS๋ ์ฐ๊ธฐ์ ์ฑ๊ณตํ๋๋ผ๋ ์คํจํ๋ค๊ณ ์๋ ค์ค ์ ์๋ค. ๋ค๋ง ์ฑ๊ณตํ๋ค๊ณ ํ๋ ๊ฒ์ ์ ๋ง ์ฑ๊ณตํ ๊ฒ์ด๋ค.
week CAS๊ฐ ์ด๋ฐ ๋์จํ ๋ณด์ฅ์ผ๋ก ์ป์ ์ ์๋ ๊ฒ์ ์ฑ๋ฅ์ด๋ค. week CAS๋ strong CAS์ ๋นํด ๊ทผ์ํ๊ฒ ์คํ ์ฑ๋ฅ์ด ์ข๋ค. ๊ทธ๋์ ๋ง์ดํฌ๋กํ ์ต์ ํ๋ฅผ ํ ๋, ๊ฑฐ์ง-์คํจ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฌ์ฉํ๊ณค ํ๋ค.
week/strong ๊ฐ์ ์ฑ๋ฅ ์ฐจ์ด๋ CPU ํ๋ซํผ๋ง๋ค ๋ค๋ฅด๋ค.
arm์ ์๋ฅผ ๋ค๋ฉด strong CAS ์ธ์คํธ๋ญ์
์ ๋จ์ผ ์ธ์คํธ๋ญ์
์ด๊ธด ํ์ง๋ง, ์ฌ์ค ํ๋์จ์ด ๋ด๋ถ์์ retry loop๋ฅผ ๋๋ฆฐ๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์ฐ์ฐ์ ๋นํด์๋ ๋งค์ฐ ๋๋ฆฐ ํธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ arm์ week CAS๋ LDAXR/STLXR 2๊ฐ์ ์กฐํฉ์ผ๋ก ๊ตฌํ๋๋๋ฐ, ์ด๊ฑด ์คํจํ๋ฉด retry loop ์์ด ๊ทธ๋๋ก ๋ฐํํ๋ค. ๊ทธ๋์ race๊ฐ ์ฌํ ์๋ก ์ฑ๋ฅ์ด ์ข์ ์ ์๋ค.
Memory Ordering
์์์ CAS ์ฐ์ฐ์ ํ ๋๋ง๋ค ordering์ด๋ผ๋ ๊ฐ์ ๋๊ธฐ๋ ๊ฒ์ ๋ดค์ ๊ฒ์ด๋ค.
์ด๊ฑด ์ปดํ์ผ๋ฌ๊ฐ ์ต์ ํํ ๋ ์ฝ๋ ์คํ ์์๋ฅผ ์ด๋ป๊ฒ ํ ์ง์ ๋ํ ์ต์ํ์ ๋ณด์ฅ์ด๋ค.
์์ธํ ๊ฒ์ ๋ณ๋ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํ๋ค.
https://blog.naver.com/sssang97/223356930725
์ธ์ด๋ณ ๊ตฌํ
์ธ์ด ๊ผด์ ์ ๋๋ก ๊ฐ์ถ๊ณ ์๋ ์ธ์ด๋ค์ ์ ๋ถ Atomic Primitive์ ํํ๋ก ์ง์์ ํด์ค๋ค.
์ด๋ฆ์ ๋๋ถ๋ถ compare_and_swap์ด๋ compare_and_exchange๋ค.
Go๋ sync/atomic ๋ชจ๋์ ํตํด ์ง์ํ๋ค.

Java๋ atomic ํจํค์ง๋ฅผ ํตํด ์ง์ํ๋ค.


๋ท๋ท์ CompareExchange

llvm-ir์์๋ ์ธ์คํธ๋ญ์
์์ค์ผ๋ก ์ ๊ณต์ด ๋๋ค.
https://blog.naver.com/sssang97/221688788376
์์ฉ
๋๊ธฐํ ๊ด๋ จ ๊ธฐ์ ์๋ ํญ์ ํต์ฌ์ ์ผ๋ก ๋ค์ด๊ฐ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ lock-free ์ฐ์ฐ์ด๋ผ์ ๋๊ด์ ์ธ ๋์์ฑ์ ๊ตฌํํ๋๋ฐ ์ฃผ๋ก ์ฐ์ด์ง๋ง, ๋น๊ด์ ์ธ ๋์์ฑ์ ๊ตฌํํ ๋๋ ์ง๋ฐฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
์คํ๋ฝ์ ๊ตฌํํ๋ ๊ฐ์ฅ ์ฝ๊ณ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ๋ bool flag๋ฅผ ๋๊ณ CAS๋ก ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ด๋ค.
์๋๋ ์คํ๋ฝ์ ๊ฐ๋จํ ๊ตฌํ๋ก๋ค.
CAS๋ก false=>true ์ฐ๊ธฐ๊ฐ ์ฑ๊ณตํ๋ค๋ฉด lock ์ ์ ์ ์ฑ๊ณตํ ๊ฒ์ด๋ ์ฆ์ ์ค๋จํ๋ค.
ํ์ง๋ง ์ฐ๊ธฐ๊ฐ ์คํจํ๋ค๋ฉด ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ์ด๋ฏธ ์ ์ ์ ์ฑ๊ณตํ ๊ฒ์ด๋ ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ฆฐ๋ค.
Mutex๋ฅผ ๋น๋กฏํ ๋๊ธฐํ primitive๋ค๋ ์ฌ์ค ๊น๋ณด๋ฉด ๋ค CAS ๊ธฐ๋ฐ์ผ๋ก User ๋ ๋ฒจ ์คํ๋ฝ์ ๊ตฌํํ๋ค.
CAS๋ง ์ฐ๋๊ฑด ์๋๊ณ ์ด๊ฒ์ ๊ฒ ๋ง์ด ๋ง๋์ง๋ง, ์ฌํํผ.
์ฐธ์กฐ
https://en.m.wikipedia.org/wiki/Compare-and-swap
https://www.felixcloutier.com/x86/cmpxchg
https://developer.arm.com/documentation/dui0801/l/A64-Data-Transfer-Instructions/CASA--CASAL--CAS--CASL--CASAL--CAS--CASL--A64-
https://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html
https://stackoverflow.com/questions/25199838/understanding-stdatomiccompare-exchange-weak-in-c11