[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