[Rust] Lock: parking_lot

parking_lot์€ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์— ์ตœ์ ํ™”๋œ Lock ๊ตฌํ˜„์ฒด๋“ค์„ ์ œ๊ณตํ•˜๋Š” ๋ฒ ์ด์Šค crate์ด๋‹ค.
tokio์˜ ๊ฒฝ์šฐ์—๋„ ์ผ๋ถ€ Lock ๊ด€๋ จ๋œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๊ฑธ ์‚ฌ์šฉํ•œ๋‹ค.

๋Œ€์ฒด๋กœ๋Š” std Mutex๋‚˜ tokio Mutex๊ฐ€ ํšจ์œจ์ ์ด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ๋ฌด๋‚œํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‚˜, ํŠน์ • ์‚ฌ์šฉ์‚ฌ๋ก€์—์„œ๋Š” ์„ฑ๋Šฅ์ด๋‚˜ ๋ณด์žฅ ์ˆ˜์ค€์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. parking_lot์€ ๊ทธ๋Ÿฐ ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ๋“ค์— ์ตœ์ ํ™”๋˜์–ด์žˆ๋‹ค.
๊ฒŒ๋‹ค๊ฐ€ ํ‘œ์ค€ Mutex ์ž์ฒด๋„ parking_lot์— ์˜ํ–ฅ์„ ๋ฐ›์•„์„œ ์ตœ์ ํ™”๊ฐ€ ๊ณ„์† ์ž˜ ๋œ ๋ถ€๋ถ„๋„ ์žˆ๋‹ค.

ํ˜„์žฌ ์‹œ์ ์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์‚ฌ๋ก€์—์„œ๋„ ํ‘œ์ค€ Mutex๊ฐ€ ๋น ๋ฅผ ๋•Œ๋„ ์žˆ๊ณ  parking_log์ด ๋น ๋ฅผ ๋•Œ๋„ ์žˆ๋‹ค. ์ผ๋‹จ ์ง€๊ธˆ๊นŒ์ง€๋„ ๊ฒฝ์Ÿ ์ƒํƒœ์— ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค๋ฅธ Mutex๋“ค๊ณผ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.

๋˜‘๊ฐ™์ด ๋ฝ ๊ฑธ๊ณ  ๊ฐ€๋“œ ๋ฐ›์•„์™€์„œ ์“ฐ๋Š” ํ˜•ํƒœ๋‹ค.
๋‹ค๋งŒ poison ์ƒํƒœ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์ข€ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ž˜์„œ unwrap์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.




๊ธฐ๋ณธ Mutex

๊ทธ๋Ÿฌ๋ฉด ๋ญ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ณ , ์–ด๋–ค ์ƒํ™ฉ์— ์“ธ ๋•Œ ์ข‹์€๊ฑธ๊นŒ?

์ž, ์ผ๋‹จ ์ด mutex์˜ ๊ฒฝ์šฐ์—๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋†€๋ผ์šธ๋งŒ์น˜ ๋‹จ์ˆœํ•˜๋‹ค.
์ถ”๊ฐ€์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋”ฑ 1๋ฐ”์ดํŠธ๋ฐ–์— ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

ํ‘œ์ค€ ๋ฎคํ…์Šค๋Š” ๊ทธ์— ๋น„ํ•˜๋ฉด ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”๊ฒŒ ๊ฝค ๋งŽ๋‹ค.
poison ์ƒํƒœ ๊ด€๋ฆฌ์— 1๋ฐ”์ดํŠธ, Futex ์ƒํƒœ ๊ด€๋ฆฌ์— 4๋ฐ”์ดํŠธ๋ฅผ ์“ด๋‹ค. ๋‚ด๊ฐ€ ๋ดค์„๋•Œ๋Š” ์ตœ์†Œ 5๋ฐ”์ดํŠธ๋ฅผ ๋จน๋Š”๋‹ค.

poison flag๊ฐ€ 1๋ฐ”์ดํŠธ

์ƒํƒœ๊ด€๋ฆฌ 4๋ฐ”์ดํŠธ



futex ๊ธฐ๋ฐ˜ ๊ตฌํ˜„

https://blog.naver.com/sssang97/224019441610

parking_lot์€ ํ˜„์žฌ์˜ ํ‘œ์ค€ Mutex๊ณผ ๋น„์Šทํ•˜๊ฒŒ, futex ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. CAS ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ•€๋ฝ ๋Œ๋ฆฌ๋‹ค๊ฐ€ ์˜ค๋žซ๋™์•ˆ ์ ์œ ์— ์‹คํŒจํ•˜๋ฉด futex syscall์„ ๋‚ ๋ฆฌ๋Š” ์‹์ด๋‹ค.
๊ทธ๋ž˜์„œ ํ‘œ์ค€ Mutex์— futex๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š์•˜์„ ๋•Œ๋Š” parking_lot์ด ํ›จ์”ฌ ํšจ์œจ์ ์ด์—ˆ๋‹ค.



๊ณต์ •์„ฑ

parking_log์˜ ๊ธฐ๋ณธ Mutex๋Š” ํ‘œ์ค€ ๋ฎคํ…์Šค์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ตœ์†Œํ•œ์˜ ๋А์Šจํ•œ ๊ณต์ •์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ตœ์†Œํ•œ 1ms ์ด์ƒ์„ ๋ถˆ๊ณต์ •ํ•˜๊ฒŒ ๊ธฐ๋‹ค๋ฆฌ์ง€๋Š” ์•Š๋Š”๋‹ค. ์•ฝ 0.5ms๋งˆ๋‹ค ๊ณต์ •์„ฑ ์ฒดํฌ๋ฅผ ํ•ด์„œ ์šฐ์„ ์ˆœ์œ„ ๋ฐฐ์ •์„ ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  lock์„ ํ•ด์ œํ• ๋•Œ unlock_fair์„ ์“ด๋‹ค๋ฉด, ์™„๋ฒฝํ•œ ๊ณต์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.




FairMutex

FairMutex์€ ์™„๋ฒฝํ•œ ๊ณต์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ตฌํ˜„์ฒด๋‹ค.
ํฌ๊ธฐ๋‚˜ ๋™์ž‘ ๋ฐฉ์‹์€ ์‚ฌ์‹ค ๊ฑฐ์˜ ๋™๋“ฑํ•˜๋‹ค.

์• ์ดˆ์— FairMutex ์ž์ฒด๊ฐ€ ๊ธฐ๋ณธ Mutex์˜ ๋ž˜ํผ๊ณ 

์œ ์ผํ•œ ์ฐจ์ด์ ์€ unlock์ด unlock_fair์„ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํ•ญ์ƒ ๊ณต์ •ํ•˜๊ฒŒ ๋ถ„๋ฐฐ๋˜๋„๋ก ๋™์ž‘์„ ๊ฐ•์ œํ•œ๋‹ค.




ReentrantMutex

ReentrantMutex์€ ๋˜๋‹ค๋ฅธ ๋ณ€์ข… ์ค‘ ํ•˜๋‚˜๋‹ค.
Mutex ๊ตฌํ˜„์ฒด๋“ค์€ lock์„ ์žก๊ณ  ํ’€์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋˜ lock์„ ์žก์œผ๋ฉด ๋ฐ๋“œ๋ฝ์— ๋น ์ง„๋‹ค.

๋‹น์—ฐํ•œ ์ผ์ด๋‹ค.
์ฒซ๋ฒˆ์งธ lock์ด ํ’€๋ฆฌ์ง€ ์•Š์•˜์œผ๋‹ˆ ๋‘๋ฒˆ์งธ lock์ด ๋ฌดํ•œ ๋Œ€๊ธฐ์— ๋น ์ ธ๋ฒ„๋ฆฌ๊ณ , ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์ง€ ์•Š์œผ๋‹ˆ ์ฒซ๋ฒˆ์งธ lock์ด ํ’€๋ฆฌ์ง€๋„ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

ReentrantMutex๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋ฌ˜ํ•œ ๋™์ž‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

ํ•ต์‹ฌ ๊ตฌํ˜„ ์ž์ฒด๋Š” ๊ธฐ๋ณธ ๋ฎคํ…์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค.

๋‹ค๋งŒ ์ด๊ฑด ์‚ฌ์šฉ๋ฐฉ์‹์ด๋‚˜ ์ œ์•ฝ์ด ์ข€ ๋งŽ์ด ๋‹ค๋ฅด๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€๋ณ€์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆ˜์ •์ด ์•ˆ๋œ๋‹ค.

๊ฐ’์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด RefCell์„ ๋‹ค์‹œ ๊ตฌ๊ฒจ๋„ฃ์–ด์„œ ์จ์•ผ ํ•œ๋‹ค.

๋ณด๊ธฐ ํ‰ํ•˜๊ธด ํ•œ๋ฐ, ์ €๊ฒŒ ํ•œ๊ณ„๋‹ค.

์•„๋ฌดํŠผ ์ด๊ฑธ ์“ฐ๋ฉด

์ด๋Ÿฐ ์‹์œผ๋กœ ์žฌ์ง„์ž…ํ•ด๋„ ๋ฐ๋“œ๋ฝ์— ๋น ์ง€์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์‹ค ์ด๋Ÿฐ๊ฑธ ์“ธ ์ผ์ด ์žˆ๋‚˜ ์‹ถ๊ธด ํ•œ๋ฐ.


์ด๋Ÿฐ Mutex ๊ณ„์—ด ์ด์™ธ์—๋„ ์ž์ฒด ๊ตฌํ˜„๋œ RWLock, CondVar ๋“ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
CondVar๋„ ํ‘œ์ค€ ๊ตฌํ˜„์— ๋น„ํ•ด ๊ฒฝ๋Ÿ‰ํ™”๋œ ์ƒํƒœ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์ œ์•ฝ์‚ฌํ•ญ์ด๋‚˜ ๋™์ž‘๋ฐฉ์‹์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค.



์ฐธ์กฐ
https://users.rust-lang.org/t/which-mutex-to-use-parking-lot-or-std-sync/85060/5
https://docs.rs/parking_lot/latest/parking_lot/
https://github.com/rust-lang/rust/pull/95035#issuecomment-1087366812
https://blog.naver.com/sssang97/224019441610
https://blog.cuongle.dev/p/inside-rusts-std-and-parking-lot-mutexes-who-win