[Rust] ํ์ค Mutex์ tokio Mutex
๋น๋๊ธฐ Rust๋ฅผ ์ ํ ์ฌ๋๋ค์ด ํผ๋์ ๊ฒช์ ๋งํ ๋ถ๋ถ ์ค ํ๋๊ฐ ๋ฐ๋ก Mutex๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ Mutex๊ฐ ์๋๋ฐ, ๋น๋๊ธฐ ๋ฐํ์์ธ tokio์๋ ์์ฒด ๊ตฌํ Mutex๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ญ๊ฐ ๋ค๋ฅด๊ณ , ๋ญ ์จ์ผํ๋๊ฑธ๊น?
tokio์์ ์ ๊ณตํ๋๊น tokio๋ฅผ ์ฐ๋ ์ํฉ์์๋ ํญ์ ์ ํฉํ๋ค๊ณ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง, ๊ผญ ๊ทธ๋ ์ง๋ ์๋ค.
tokio์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ํ์ค ๋ฎคํ
์ค๋ฅผ ์ฐ๋ ๊ฒ์ ๊ถ์ฅํ๊ธฐ ๋๋ฌธ์, ๋ด๋ถ ๋์ ๋ฐฉ์๊ณผ tradeoff๋ฅผ ์ดํดํ๊ณ ์ ์ ํํด์ผ ํ๋ค.
API ๋น๊ต
๋๋ต์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋น์ทํ๋, ์ธ์ธํ ๋ถ๋ถ์์ ๋ค๋ฅด๋ค.
ํ์ค ๋ฎคํ
์ค๋ ํ์ฌ์ OS ์ค๋ ๋๋ฅผ ๋ธ๋ฝํ ์ ์๋ ํํ๋ก ๋์ํ๋ฉฐ, Result๋ฅผ ๋ฐํํ๋ค.
Result๋ฅผ ๋ฐํํ๋ ์ด์ ๋, ๋ฎคํ
์คํ ์ก์ ์ฑ๋ก ์ค๋ ๋๊ฐ ํจ๋์ผ๋ก ์ฃฝ์ผ๋ฉด "poison" ์ํ๊ฐ ๋์ด ๋ฎคํ
์ค ์ฌ์ฉ์ ์ ๊ฐ๋ฒ๋ฆฌ๋ ๋์์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
tokio ๋ฎคํ
์ค๋ ํ์ฌ์ tokio Task๋ฅผ ๋ธ๋ฝํ๋ ํํ๋ก ๋์ํ๋ฉฐ, ๋ฝ์ ์ก๋ ํ์ ์์ฒด๊ฐ Future ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฑด poison ์ํ๊ฐ ์์ด์ ์คํจ์ฌ๋ถ ์ฒดํฌ๊ฐ ์๋ค.
tokio Mutex Internal
๊ทธ๋ผ tokio์ Mutex๋ ์ด๋ป๊ฒ ๋ง๋ค์ด์ง ๋
์์ผ๊น?
์ฌ์ค ์ด๊ฑด Mutex๋ฅผ ์์ ํ๊ฒ ๋ง๋ค์ด๋ธ๊ฑด ์๋๊ณ , ํ์ค Mutex๋ฅผ ๋ณต์กํ๊ฒ ๋ํํด๋ ๋ํผ์ ๊ฐ๊น๋ค.
๋ค์ด๊ฐ๋ณด๋ฉด ์์ฒด ๊ตฌํ ์ธ๋งํฌ์ด๋ฅผ ๋ด์ฅํ๊ณ
๊ทธ ์ธ๋งํฌ์ด๋ ๋ ๋ด๋ถ ํํ์ฉ ๋ฎคํ
์ค๋ฅผ ๊ฐ๊ณ ์๋๋ฐ
๊ทธ ์ธ๋งํฌ์ด๋ ํ์ค ๋ฎคํ
์ค์ ๋ํผ๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฒด์ ์ธ ๋๊ธฐ์ด์ ๋ด์ฅํ๊ณ ์๋ค.
๊ทธ๋์ tokio์ Mutex lock์ FIFO ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, ์ต์ํ์ ๊ณต์ ์ฑ์ ๋ณด์ฅํ๋ค.
๊ณต์ ์ฑ (Fairness)
ํ์ค ๋ฎคํ
์ค์ ๊ฒฝ์ฐ์๋ ๊ณต์ ์ฑ์ด ์กด์ฌํ์ง ์๋๋ค.
๋จผ์ ๊ธฐ๋ค๋ ธ๋ค๊ณ ํด์ ๋จผ์ lock์ ์ ์ ํ๋๊ฑด ์๋๋ผ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ค๋ ๋ ์ฒ๋ฆฌ์ ๊ณต์ ์ฑ์ด ๋ง์ด ๋จ์ด์ง ์ ์๋ค.
๋ฐ๋ฉด tokio์ ๋ฎคํ
์ค๋ FIFO ๊ธฐ๋ฐ์ ํ๋ฅผ ์ฌ์ฉํด์ ์ต์ํ์ ๊ณต์ ์ฑ์ด ๋ณด์ฅ๋๋ค.
๋จผ์ ๊ธฐ๋ค๋ ธ๋ค๋ฉด, ๋จผ์ lock์ ํ๋ํ ์ ์๋ค.
์ค๋ ๋ ์ฐจ๋จ ๋ฌธ์
ํ์ค ๋ฎคํ
์ค๋ lock์ ์คํํ ๋ ๋๊ธฐ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ํ์ฌ ํจ์๋ฅผ ์ค๋ ๋์์ ์ฐจ๋จํ ์ ์๋ค.
์ด ๋ง์ธ์ฆ์จ ํ์ฌ ํจ์๋ฅผ OS์ ์ค์ผ์ค๋ฌ์ ์ง์ด๋ฃ๊ณ ์ง์ง ์คํ์ ๋ฉ์ถ๋ค๋ ๊ฒ์ด๋ค.
์ด ๋ฐฉ์์ std::thread๋ฅผ ์ฐ๋ ๋ฐฉ์์์๋ ์์ ํ ์๋๋ ๋์์ด๊ณ ํจ์จ์ ์ด์ง๋ง, tokio๋ฅผ ์ฐ๋ ์ํฉ์์๋ ์๋์ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์๋ค.
tokio์ Task๋ ์ฌ๋ฌ๊ฐ์ Task๊ฐ ํ๋์ OS ์ค๋ ๋ ์์์ ๋๋์ด ์คํ๋ ์ ์๊ณ , OS ์ค๋ ๋๋ฅผ ๋ธ๋ฝํ๋ฉด ๊ทธ OS ์ค๋ ๋์ ์์๋ Task๋ค์ด ์ ๋ถ ์ฐจ๋จ๋๋ ๋ถ์์ฉ์ ์ผ๊ธฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์๋์น ์์ ๋ฐ๋๋ฝ์ ์ ๋ฐํ ์ ์๋ค.
๋ฐ๋ฉด tokio Mutex๋ lock().await์ ์คํํ ๋ ๋๊ธฐ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ๋ฉ์ถ๋ ๋ค๋ฅธ Task์๊ฒ ์์ฐ์ค๋ฝ๊ฒ ์ค๋ ๋ ์ฌ์ฉ์ ์๋ณดํ ์ ์๋ค.
Mutex ์ ์ ์ํ์์์ await
ํ์ค ๋ฎคํ
์ค๋ ๊ทผ๋ณธ์ ์ธ ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
lock์ ์ ์ ํ ์ํ์์ await์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.

ํ์ค ๋ฎคํ
์ค๋ Send๋ฅผ ๊ตฌํํ๋, ํ์ค ๋ฎคํ
์ค์ Guard๊ฐ Send๋ฅผ ๊ตฌํํ์ง ์๊ณ , await ํธ์ถ์ ๋ฐ๋์ Send๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก MutexGuard๋ ๋ค๋ฅธ ์ค๋ ๋์ ์ ์ก๋๋ ๊ฒ์ ๊ณ ๋ คํ์ง ์์ ํ์
์ด๋ค.
๊ทผ๋ฐ await์ ํธ์ถํ๊ฒ ๋๋ฉด ํด๋น ํจ์๋ tokio runtime์ ์ ์ด๊ถ์ ๋๊ธฐ๊ฒ ๋๊ณ , ํด๋น ํจ์๊ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ์ฌ์คํ๋ ์๋ ์์์ ๋ปํ๊ฒ ๋๋ค.
ํ์ค ๋ฎคํ
์ค๋ ์ด๋ฐ ๊ฒ์ ์์ ํ ๊ธฐ๋ฅ์ด ์๋๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ํ์ฉ์ด ๋์๋ค๊ณ ํด๋ ์ค๋์์ ํ์ ๊ฒ์ด๋ค.
์ด๋ฐ ์ํฉ์์๋ ๋ฐ๋์ tokio Mutex๋ฅผ ์จ์ผ ํ๋ค.
๋ฆฌ์์ค ํจ์จ์ฑ
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ tokio์ Mutex๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ค Mutex๋ณด๋ค๋ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค.
๊ทธ๋์ CPU ์ง์ฝ์ ์ธ ์ํฌ๋ก๋๋ผ๋ฉด, ๊ทธ๋ฆฌ๊ณ lock ์ ์ ์๊ฐ์ด ์งง์ ๊ฒฝ์ฐ๋ผ๋ฉด ํ์ค ๋ฎคํ ์ค๋ฅผ ์ฐ๋ ๊ฒ์ด ๊ฐ๋ ฅํ๊ฒ ๊ถ์ฅ๋๋ค. ์๋ฅผ ๋ค์ด ์ฝ์ด ์ค๋ ๋ 20๊ฐ์ ๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฆฌ๊ณ ๋ถํ ํด์ ์ฐ์ฐํ๋ ๊ฒฝ์ฐ๋ผ๋ ์ง...
๋ฐ๋ฉด I/O ์ง์ฝ์ ์ธ ์ํฌ๋ก๋๋ผ๋ฉด, tokio Mutex๋ฅผ ์ฐ๋ ๊ฒ์ด ๋ณด๋ค ํจ์จ์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ lock ์ ์ ์๊ฐ์ด ๊ธธ๋ค๋ฉด ๋์ฑ ๊ทธ๋ ๋ค. ๊ทธ๋์ ์ฌ์ค ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ tokio Mutex๋ฅผ ์ฐ๋ ํธ์ด ๋ ์์ฐ์ค๋ฝ๊ธด ํ๋ค.
์ ์ด์ async ๋ฐํ์ ์์ฒด๊ฐ I/O ์ง์ฝ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ํด ์ค๊ณ๋ ๊ฒ์ด๊ธฐ๋ ํ๊ณ .
๊ทธ๋์
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋, tokio Mutex๋ฅผ ์ฐ๋ ๊ฒ์ด ๋์ฒด๋ก ๋ ๋์ ์ ์๋ค.
tokio ๋ฎคํ
์ค๊ฐ ์ ์ ํ ๊ณณ์ ํ์ค ๋ฎคํ
์ค๋ฅผ ์ฐ๋ฉด ์ปดํ์ผ์กฐ์ฐจ ์๋๊ฑฐ๋ ์์์น ๋ชปํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๋ฐ๋ฉด์,
ํ์ค ๋ฎคํ
์ค๊ฐ ์ ์ ํ ๊ณณ์ tokio ๋ฎคํ
์ค๋ฅผ ์ฐ๋๊ฑด ๋ฏธ๋ฏธํ ์ฑ๋ฅ ์ ํ(CPU ๋ฐ์ด๋) ์ ๋๊ฐ ์ ๋ถ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ด๊ฐ ๋ณผ ๋๋ tokio ๋ฎคํ ์ค๋ฅผ ๋จผ์ ์จ๋ณด๊ณ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ํ์ค ๋ฎคํ ์ค๋ฅผ ์จ๋ ์ถฉ๋ถํ๋ค.
์ฐธ์กฐ
https://stackoverflow.com/questions/73840520/what-is-the-difference-between-stdsyncmutex-vs-tokiosyncmutex
https://docs.rs/tokio/latest/tokio/sync/struct.Mutex.html
https://blog.naver.com/sssang97/224019441610
https://www.linkedin.com/pulse/comparison-between-stdsyncmutex-tokiosyncmutex-async-rust-nadiger-3tnlc/