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