[Concurrency] Lock: Mutex์ RWLock์ ์๋ฆฌ
๋ณดํต Mutex์๋ 2๊ฐ์ง ๊ตฌํ์ฒด๊ฐ ์๋ค.
์ผ๋ฐ์ ์ธ ์ต์ ํ๋ ์ผ๋ฐ Mutex์, read์ ๋น์จ์ด ๋์ ์ํฉ์ ์ต์ ํ๋ RWLock(Read Write Lock)์ด๋ค.
ํ์๋ RWMutex๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
read๊ฐ ๋ง์๋ RWLock์ด ๋ ๋น ๋ฅด๋ค๋ ๊ฒ์ ํผ์์ ์ผ๋ก ์์ง๋ง, ๊ทธ ๊ตฌํ ์์ธ๊ฐ ์ด๋ค ์์ธ์ง๋ ๋๋ถ๋ถ ์ ๋ชจ๋ฅผ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ Rust์ ํ์ค ๊ตฌํ์ ์๋ก ๋ค์ด์ ํ๋ฒ ๊ฐ๋จํ ํ์ด๋ณด๊ฒ ๋ค.
Futex์ ๊ตฌํ ํจํด์ ๋ํด์ ์๋ค๋ฉด ์ดํด๊ฐ ๋ ๋น ๋ฅผ ๊ฒ์ด๋ค.
https://blog.naver.com/sssang97/224019441610
์ผ๋ฐ Mutex์ ๊ตฌํ
๊ธฐ๋ณธ Mutex๋ futex๋ผ๊ณ ํ๋ ๋งค์ปค๋์ฆ์ ํตํด ๊ตฌํ๋๋ค.
๊ฒฝ์์ด ์ ์ ๊ฒฝ์ฐ๋ฅผ ์ต์ ํํ๊ธฐ ์ํด์ CAS ๊ธฐ๋ฐ์ ๊ฐ๋ฒผ์ด User ๋ ๋ฒจ Lock์ ๋จผ์ ์ฌ์ฉํ๊ณ , ๊ฒฝ์์ผ๋ก ์ธํด ์ถฉ๋์ด ๋ฐ์ํ๋ฉด OS ์์ค์์ ์ง์ํ๋ Queue ๊ธฐ๋ฐ์ ์ค๋ ๋ ์ค์ผ์ค๋ง์ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๊ตฌํ์ ๊น๋ณด๋ฉด
์ฒ์์ CAS ๋ ๋ ค์ Lock ์๊ฑธ๋ ค์์ผ๋ฉด ๋ฐ๋ก lock์ ์ ์ ํ๋ค.
CAS ์์ค ์ ์ ์ ์คํจํ๋ฉด, ๊ทธ๋๋ถํฐ ๋ณธ๊ฒฉ์ ์ธ lock ๊ฒฝ์ ์์
์ ์์ํ๋ค.
์ด๋ ๊ฒ.
๋จผ์ spin lock์ผ๋ก User ๊ธฐ๋ฐ์ ๊ฐ๋ฒผ์ด ๋ฝ์ ์ก๊ณ , spinlock์ผ๋ก๋ ์ ์ ๊ฐ ๋ถ๊ฐ๋ฅํ ์ํฉ์์๋ OS ๊ธฐ๋ฅ์ธ futex๋ฅผ ํธ์ถํด์ ์ค๋ ๋๋ฅผ ๋๊ธฐ์ด์ ๋๋๋ก ๊ตฌ์ฑ์ ํ๋ค.
futex_wait ํจ์๋ฅผ ํธ์ถํ๋ฉด, OS์์ Lock ์ ์ ๊ฐ ๊ฐ๋ฅํ ๋๊น์ง ์ค๋ ๋๋ฅผ ๋ฉ์ท๋ค๊ฐ ์คํํด์ค๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์ ๋์ผํ๊ฒ spinlock์ ๋๋ฆฌ๋ ๊ฒ์ด๋ค.
์คํ๋ฝ์ ์ด๋ฐ ์์ผ๋ก ๊ตฌํ๋์ด์๋ค.
100๋ฒ๊น์ง ์ฌ์๋ํ๋ค.
์คํ์ ์ผ๋ง๋ ๋์ง๋ ์๋ง ์ธ์ด ๊ตฌํ์ฒด๋ค๋ง๋ค ๋ค๋ฅผ ์ ์์ ๊ฒ์ด๋ค. Rust๋ 100๋ฒ์ด๋ค.
RWLock์ ๊ตฌํ
์ด๋ฒ์๋ RWLock์ ๊น๋ณด์.
RWLock์ ๊ธฐ๋ณธ์ ์ธ ์์ด๋์ด๋ ์ด๋ ๋ค.
-
read๋ ๋ค๋ฅธ read๋ฅผ ์ฐจ๋จํ์ง ์๋๋ค.
-
read๋ ๋ค๋ฅธ write๋ฅผ ์ฐจ๋จํ๋ค.
-
writer๋ ๋ค๋ฅธ write๋ฅผ ์ฐจ๋จํ๋ค.
-
writer๋ read๋ณด๋ค ์ ์ ์ฐ์ ์์๊ฐ ๋๋ค.
๋ค์ ๋งํด์ ๋์ read๊ฐ ๋ง์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ์ ์ต์ ํ๋ ๊ตฌํ์ด๋ผ๊ณ ํ ์ ์๋ค. write๋ ๋น๊ต์ ๋ฌด๊ฒ๋ค.
์ด๊ฒ๋ futex์ ๊ตฌํ ํจํด์ ๋ฐ๋ฅด๋ ๊ฒ์ ๋์ผํ๋, ์ธ๋ถ์ ์ธ ๊ตฌํ์ ๋ณด๋ค ๋ณต์กํ ํธ์ด๋ค.

write๋ถํฐ ํ๋ฒ ๋ณด์.
CAS ํ๋ฒ ๋ ๋ ค์ ๊ฒฝ์ ์์ผ๋ฉด ์ฆ์ lock์ ์ป๋๊ฑด ๋๊ฐ๋ค.
๊ฒฝ์ ๊ตฌํ๋ถ๋ ๋น๊ต์ ๋ณต์กํ ํธ์ด๋ค.

์ฌ๊ธฐ์ ์กฐ๊ธ ํน์ดํ ๊ฒ์, ๋จ์ 0/1 ํ๋๊ทธ๋ฅผ ์ฐ๋๊ฒ ์๋๋ผ ๋นํธ๋จ์ ๋งํน์ผ๋ก WRITE LOCK ์ํ์ READ LOCK ์ํ๋ฅผ ๊ตฌ๋ถํ๋ค๋ ๊ฒ์ด๋ค.
์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ๋ฝ ๋จผ์ ์๋ํ๊ณ , ๊ธ๋ฐฉ Lock์ ์ป๋๋ค๋ฉด futex syscall ์์ด ์ข
๋ฃ๋๋ค.
ํ์ง๋ง lock์ด ๊ฑธ๋ ค์๋ค๋ฉด futex syscall์ ๋ ๋ ค์ OS์ ์ค์ผ์ค๋ง์ ์ป๋ ํํ๋ค.
๋ ํน์ดํ ๊ฒ์ด WRITERS_WAITING ๋นํธ ํ๋๊ทธ๋ก ์ต์ด write ์ง์
์๊ฐ ๋จผ์ ์ ์ ์ฒดํฌ๋ฅผ ํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ต์ด writer๋ os syscall ์์ด ๊ณ์ํด์ ์คํ๋ฝ์ ๊ฑด๋ค.
๊ทธ ์ดํ์ ๋ค์ด์ค๋ ํ์ writer๋ ์ผ๋จ futex_wait์ผ๋ก os systecall์ ๋ ๋ ค์ ์ฅ๊ธฐ๊ฐ ๋๊ธฐ๋ฅผ ๊ณ ๋ คํ๋ค.
spinlock์ ๋น์ทํ๊ฒ ์ต๋ 100๋ฒ๊น์ง ๋๋ค.


์๋ฌดํผ ์ด๋์ RWLock์ write Lock์ด Mutex์ ์ผ๋ฐ Lock๋ณด๋ค๋ ๋ฆฌ์์ค ๋นํจ์จ์ ์ธ ๊ฒ์ด๋ค. writer๊ฐ ๋น๋ฒํ๊ฒ ์ง์ ํ๋ค๋ฉด ์คํ๋ฝ์ผ๋ก CPU๋ฅผ ๊ณ์ ๊ฐ๊ตฌ๋ ๋์ด ํญ์ ์๊ธฐ๋ ํํ๋ค.
์ด๋ฒ์๋ read lock์ ๋ด๋ณด์.

read lock์ lock ์ ์ ์กฐ๊ฑด์ด ๋์จํ๋ค.
state๊ฐ 0์ผ ํ์๋ ์๊ณ , read lock ์ํ๋ผ๋ฉด ์ธ์ ๋ ์ง์
๊ฐ๋ฅํ๊ฒ ํด๋๋ค.
๋์ read lock์ ์ ์ ์ค์ธ reader ๊ฐ์๋ฅผ state๋ก ๊ณ์ํด์ ๋ํ๋ค.
๊ฒฝ์ ๊ตฌํ๋ถ๋ ๋์ถฉ ๋น์ทํ๋ค.
write lock์ด ์กํ์ read lock์ ์ก์ ์ ์๋ ๊ฒฝ์ฐ์ ์ง์
ํ ํ
๋ฐ
์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒ์์๋ spinlock์ผ๋ก ์ ์ ๋ฅผ ์๋ํ๋ค๊ฐ, ์๋๋ฉด futex_wait์ผ๋ก OS ๋๊ธฐ๋ฅผ ๊ฑธ๊ณ , lock์ ์๋ฆฌ๊ฐ ๋ ๋๋ฉด spinlock์ผ๋ก ์๋ํ๋ ๊ทธ๋ฐ ๋ฐ๋ณต ๋ก์ง์ด๋ค.