[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์˜ ๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋Š” ์ด๋ ‡๋‹ค.

  1. read๋Š” ๋‹ค๋ฅธ read๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.

  2. read๋Š” ๋‹ค๋ฅธ write๋ฅผ ์ฐจ๋‹จํ•œ๋‹ค.

  3. writer๋Š” ๋‹ค๋ฅธ write๋ฅผ ์ฐจ๋‹จํ•œ๋‹ค.

  4. 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์œผ๋กœ ์‹œ๋„ํ•˜๋Š” ๊ทธ๋Ÿฐ ๋ฐ˜๋ณต ๋กœ์ง์ด๋‹ค.