[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