[Concurrency] thread local storage (TLS)
thread local storage๋ ์ค๋ ๋๋ง๋ค ๋
๋ฆฝ์ ์ธ ์ ์ญ๋ณ์๋ฅผ ํ ๋นํ๋ ์ฌ์ฉ ํจํด์ ๋งํ๋ค.
thread local์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๊ณ , TLS๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ๋ ์ ๋ช
ํ ์ถ์ฝ์ด๊ฐ ์์ด์ ํท๊ฐ๋ฆฌ๊ธด ํ๋ค๋ง.
์๋ฌดํผ ๋์์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฃผ์ ์ธ์ด๋ค์๋ ๊ฑฐ์ ๋ค ์๋ค.
C/C++, Rust, Java, C#, Python ๋ฑ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๊ณ , Go๊ฐ ํน์ดํ๊ฒ ์์ธ์ ์ผ๋ก ์๋ค.
์ฌ์ค ์ด๊ฒ ๋ฌธ๋ฒ์ ์ผ๋ก ์ง์๋์ง ์์๋, ๋น์ทํ ์๋ฏธ๋ก ์ ์ด๋ป๊ฒ๋ ๊ตฌํํ ์ ์๋ค.
์ด์จ๋ ์ค๋ ๋์ ์๋ช
์ฃผ๊ธฐ ์ ์ฒด์์ ์ด์์๊ณ ์ ๊ทผ์ด ๋๋ฉด ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ค๋ ๋ ์ค์ฝ๋ ์ต์์์ ๋๊ณ ์ฐธ์กฐํ ์ ์๊ฒ ์ ๋ฌ๋ง ํ๋ฉด ๋น์ทํ๊ฒ ๋์์ ํ๋ค.
C/C++์์
C++11์์๋ ์ปดํ์ผ๋ฌ ์์ค์์ thread_local๋ผ๋ ์ ์ฉ ํค์๋๋ฅผ ์ ๊ณตํ๋ค.
์ด๊ฑธ ๋ถ์ธ ์ฑ๋ก ์ ์ญ๋ณ์๋ก ์ ์ธํ๊ณ , ์ฐธ์กฐํด์ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ์ค๋ ๋๋ง๋ค ๋ณต์ ๊ฐ ๋๋ค.

C๋ C11, C23์์๋ _Thread_local๋ผ๋ ๋๋ฑํ ํค์๋๋ฅผ ์ถ๊ฐํ๋ค.
๊ทธ ์ด์ ๋ฒ์ ์ ํด๋์ C์์๋ ์ปดํ์ผ๋ฌ๋ณ ๋นํ์ค ํ์ฅ์ ํตํด์๋ง ์ฌ์ฉํ ์ ์๋ค.
Rust์์
Rust๋ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์ ์ค๋ ๋ ๋ก์ปฌ์ ์ง์ํ๋ค.

์ด๋ฌ๊ณ ์ฌ์ฉํ๋ฉด ์์์ ์ค๋ ๋๋ง๋ค ๋ณต์ ๊ฐ ๋๋ค.
๋ด๋ถ ๊ตฌํ
์ด๊ฒ ๊ทธ๋ฅ ์ ์ญ๋ณ์์ฒ๋ผ ์ ๋นํ ๋ณ์ ์ ์ธํ๊ณ ๋๋ด๋ ์์ผ๋ก ์๊ฐํ๊ธฐ ์ฝ์ง๋ง, ์ค์ ๋ด๋ถ ๊ตฌํ์ ๋ค์ธต์ ์ธ ํธ์ด๋ค.
์ฌ์ค, thread local์ ๋จ์ํ ์ปดํ์ผ๋ฌ์ ๋ฌธ๋ฒ์ ์คํ์ด ์๋๋ค. OS, CPU ์์ค ์ง์์ ๋ชจ๋ ํ์ฉํด์ ๋ง๋ค์ด์ง๋ ๊ฒ์ด๋ค.
๋จผ์ CPU์์ ์ ๊ณตํ๋ ์ ์ ํ ์ธํฐํ์ด์ค๊ฐ ์๋ค.
x86์ ๊ฒฝ์ฐ์๋ fs๋ผ๋ ๊ฒ ์๋๋ฐ, TLS๋ฅผ ์ํด์ ๋ง๋ค์ด์ง ๊ฒ์ ์๋์ง๋ง ๊ฐ์ฅ ์ฌ์ฉํ๊ธฐ ์ ์ ํ๊ณ ์ค์ ๋ก๋ ๊ฑฐ์ ABI ์์ค์์ ์ฝ์์ด ๋์ด์๋ค.
TLS์ ๋ํ ์ ๊ทผ์ ์ปดํ์ผ๋ฌ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋๋ค.
mov rax, fs:[offset]
fs๋ผ๋ ์ ์ฉ ๊ณต๊ฐ์์ ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ OS์์๋ ์ด๋ฅผ ์ด์ฉํด์ OS ์ค๋ ๋๋ณ TLS ๋งคํ์ ๊ด๋ฆฌํ๋ค.
thread local ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๋ด๋ถ์ ์ผ๋ก TLS Block์ด๋ ๊ฒ์ ๋ง๋ ๋ค. ์ด๊ฑธ๋ก OS Thread => fs ๋งคํ์ ์ ์ดํ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ผ ์ปจํ
์คํธ ์ค์์นญ์ด ๋ฐ์ํ ๋๋ง๋ค fs ๊ฐ์ ์ ์ ํ ๊ต์ฒดํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ธ์ ์จ์ผํ๋?
์ฌ์ค thread local์ ์ฌ์ฉํ ๋งํ ์ํฉ์ด ๊ทธ๋ ๊ฒ ์์ฃผ ๋์ค์ง ์๋๋ค.
์ผ๋ฐ์ ์ธ ์์ฉํ๋ก๊ทธ๋จ์์๋ ์ ๋นํ ๋ก์ปฌ๋ณ์๋ง์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ์ค๋ ๋๋ณ๋ก ์ด์์๋ ์ ์ญ ๊ฐ์ด ํ์ํ๋ค๋ฉด ๊ณต์ ๊ฐ์ฒด๋ฅผ ์ ์ค๊ณํด์ ๋๊ธฐ๋ฉด ๋๋ ๊ฒ์ด๋ค.
์ฑ๋ฅ์ ์ผ๋ก๋ ์ข ์ ๋งคํ๋ค. ์ ์ญ Mutex ๊ฐ์ฒด์ ๋น๊ตํ๋ฉด thread local๊ฐ ๋น ๋ฅด๊ธด ํ๋ฐ... ๋จ์ ์ง์ญ๋ณ์๋ฅผ ๋ง๋ค๊ณ ๋๊ธฐ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ๋น์ทํ๊ฑฐ๋ ์ฝ๊ฐ ๋๋ฆด ์๋ ์๋ค.
๋ค๋ง C์ ๊ฒฝ์ฐ์๋ ๋ฌธ๋ฒ์ ํํ๋ ฅ์ ํ๊ณ ๋๋ฌธ์ thread local์ด ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํด๋ก์ ์บก์ณ๋ ์๊ณ , ์์ ์ค์ฝํ์ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ ๋๊ฒจ์ ๊ณต์ ํ๋ ๊ฒ์ด ๋งค์ฐ ์ง๋ฆฌํ๊ณ ๋ถํธํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์ค๋ ๋๋ณ ์ํ๋ฅผ ๊ณ ์ ์ ์ผ๋ก ํ ๋นํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค์ ์ค๋ ๋๊ฐ ๋์ ์ผ๋ก ๊ต์ฒด๋ ์ ์๋ ๊ทธ๋ฆฐ ์ค๋ ๋(ํน์ ๊ฐ์ ์ค๋ ๋) ๊ฐ๋
๊ณผ๋ ์ ๋ง์ง ์์ ์ ์๋ค. ๊ฒ๋ค๊ฐ ์จ๊ฒจ์ง ์ ์ญ ์ํ๊ฐ ์์์ ์ผ๋ก ๊ณต์ ๋๋, ์ ์ญ๋ณ์์ ๋น์ทํ ์ด์ ์์ ์ฝ๋ ํ์ง์ด ๋จ์ด์ง ์ ์๋ค.
์ด๊ฒ Go๊ฐ TLS๋ฅผ ๋ฐฐ์ ํ ์ด์ ์ด๊ธฐ๋ ํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Java์์๋ Virtual Thread๊ฐ ๋์
๋ ์ดํ๋ก๋ ๋์
์ ๊ฒฝ๊ณํ๋ ๋ถ์๊ธฐ๊ฐ ์๊ธด ๊ฒ ๊ฐ๋๋ผ.
์ฐธ์กฐ
https://6it.dev/blog/infographics-operation-costs-in-cpu-clock-cycles-take-2-80736
https://doc.rust-lang.org/std/macro.thread_local.html
https://learn.microsoft.com/ko-kr/windows/win32/procthread/thread-local-storage
https://maskray.me/blog/2021-02-14-all-about-thread-local-storage