[Concurrency] Mutex์ futex
๊ด๋ จ ํฌ์คํธ
https://blog.naver.com/sssang97/223131650074
futex๋ Mutex์ ๋ํ์ ์ธ ๊ตฌํ ํจํด์ด๋ค.
๊ธฐ์กด์ ๋๋ฆฌ๊ณ ๋นํจ์จ์ ์ธ Mutex ๊ตฌํ์ ๋์ฒดํ๊ธฐ ์ํด ๋์๋ค.
ํ์ฌ ์ฌ์ฉ๋๋ ๋๋ถ๋ถ์ Mutex ๊ตฌํ์ฒด๋ ์ ๋ถ futex ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ ธ์๋ค.
์ด๊ฑด Rust์ ํ์ค Mutex
๊ธฐ์กด์ Mutex ๊ตฌํ
futex๊ฐ ๋์ค๊ธฐ ์ ์ Mutex ๊ตฌํ์ ํจ์จ์ ์ด๋ผ๊ณ ๋งํ๊ธฐ ์ด๋ ค์ ๋ค.
์ค๋ ๋๊ฐ ํต์ ์ IPC ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๋ ๋ฆฌ๊ธฐ๋ ํ๊ณ , lock/unlock์ ํ ๋๋ง๋ค syscall์ ๋ฌด์ง์ฑ์ผ๋ก ๋ ๋ ค๋๋ค. ์๋๋ฉด spinlock์ฒ๋ผ ๋๊ธฐ ์ค์ CPU ๋ฆฌ์์ค๋ฅผ ๊ณผ๋ํ๊ฒ ๊ฐ์๋จน๊ธฐ๋ ํ๋ค.
๊ทธ๋์ ๊ณผ๊ฑฐ์๋ Mutex๋ฅผ ์ฐ๋ฉด ์ค๋ ๋๊ฐ ๋์ด๋ ์๋ก ๊ทน์ฌํ๊ฒ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ์๋ค. ์์ฆ ๊ตฌํ๊ณผ ๋น๊ตํ๋ฉด ์์ญ๋ฐฐ, ํน์ ์๋ฐฑ๋ฐฐ๊น์ง๋ ๋๋ ธ๋ค.
๊ทธ๋์ futex๊ฐ ๋ฌด์์ธ๊ฐ?
futex๋ ์๊ธฐํ ๋นํจ์จ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋์๋ค.
๋จ, ์ ์ํ ์ ์ ์ด๊ฒ os syscall๋ก๋ง ์๊ฒฐ๋๋ ๊ธฐ๋ฅ์ ์๋๋ ๊ฒ์ด๋ค.
OS ์์ค์์๋ futex ํจ์๋ฅผ ์ ๊ณตํ๊ธด ํ๋๋ฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์๋ ํจ๊ป ๋ง์ถฐ์ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
์ปค๋์คํ์ด์ค์ ์ ์ ์คํ์ด์ค๋ฅผ ์ ์ ํ ์ค๊ฐ๋ฉด์ ์ปค๋ ํธ์ถ์ ์ค์ด๋ ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ๋ฒ๋ก ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ๋๋ถ๋ถ์ ์ฑ์ํ ์ธ์ด๋ค์ ๊ธฐ๋ณธ Mutex ์์ฒด๊ฐ ๊ฑฐ๊ธฐ์ ๋ง์ถฐ์ ๊ตฌํ์ ํด๋๋ค. ๋ด๊ฐ ํ์ธํ ๋ฐ๋ก Java, Rust, Go๋ ํ์ค Mutex๊ฐ ํ์คํ๊ฒ futex ๊ตฌํ์ ์ฌ์ฉํ๋ค.
๊ณ์ธต ๋ถ๋ฆฌ: user + kernel
์๋ฌดํผ futex๋ฅผ ๋ํํ๋ ํต์ฌ ์๋ฆฌ๋ lock๊ณผ wait/wake ๊ตฌ์กฐ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
lock์ ์ ์ ์คํ์ด์ค์์ ๊ด๋ฆฌํ๊ณ , wait/wake๋ฅผ OS ์ปค๋ ์์ค์์ ๊ด๋ฆฌํ๋ค.
user ์์ค lock์ ์ ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ค๊ฐ, ์ด์ฉ ์ ์์ ๋๋ง os ์์ค wait/wake๋ฅผ ์ฌ์ฉํ๋ ์์ผ๋ก ๊ตฌ์ฑ๋๋ค.
1. user ์์ค lock
futex์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค ๊ตฌํ์์๋ ๋๋ถ๋ถ ๋ด๋ถ์ ์ผ๋ก ์ถ๊ฐ ํ๋๊ทธ๋ฅผ ๋๊ณ compare and swap ๊ฐ์ atomic operation์ ๋๋ ค์ ๋น๊ต์ ๊ฐ๋ฒผ์ด ์ ์ ์คํ์ด์ค Lock์ ๊ตฌํํ๋ค.
์ด๋ฅผ ํตํด lock/unlock์ ํ ๋ ๊ฒฝ์์ค์ธ ์ค๋ ๋๊ฐ ์๋ค๋ฉด ์ปค๋ ํธ์ถ ์์ด ์ ์ ์คํ์ด์ค Lock๋ง์ผ๋ก ์๋ฃํ ์ ์๋๋ก ์ฒ๋ฆฌํ๋ค. ๋น์ฐํ ์ปค๋ ํธ์ถ์ด ์์ผ๋ ๊ฒฝ์์ด ์ ์ ๊ฒฝ์ฐ์๋ ํจ์ฌ ๋นจ๋ผ์ง๋ค.
ํ์ง๋ง ๊ฒฝ์์ด ์ฌํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์คํ๋ฝ์ฒ๋ผ ๋ฆฌ์์ค๋ฅผ ๊ณผ๋คํ๊ฒ ์๋ชจํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๊ฒฐ๊ตญ 2๋ฒ์ ์ ๊ทผ๋ฒ์ด ํ์ํ๋ค.
2. ์ปค๋ ์์ค wait/wake - ๋๊ธฐ์ด ๊ธฐ๋ฐ์ ์ค๋ ๋ ์ ์
futex์์ ์ค์ํ ์ ์ค ํ๋๊ฐ "๋๊ธฐ ์ค๋ ๋"์ ๋ํ ๋ฆฌ์์ค ์ ์ฝ์ด๋ค. ๋น์ฐํ lock์ ์ป์ง ๋ชปํด์ ๋๊ธฐ ์ค์ธ ์ค๋ ๋์ ๊ฒฝ์ฐ์๋, ๊ตณ์ด ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ๊ฒ ํ ํ์๊ฐ ์๋ค.
์ด ๊ฒฝ์ฐ์๋ ์ค๋ ๋ ์์ฒด๋ฅผ "๋๊ธฐ์ด"์ ๋ฃ์ด๋๊ณ , ๋ค๋ฅธ ์ค๋ ๋์์ unlock์ ํ๋ ์์ ์ ์ผ์ด๋์(wake) ํ์ฑํ๊ฐ ๋๊ฒ ํ๋ฉด ๋๋ ๊ฒ์ด๋ค. ์ด๊ฒ futex syscall์ด ์ง์ํ๋ ์์ญ์ด๋ค.
์ด๊ฑด ๊ฒฝ์์ด ์ ์ ๊ฒฝ์ฐ์๋ ๋นํจ์จ์ ์ด๊ณ , ๊ฒฝ์์ด ์ฌํด์ lock์ ์ฝ๊ฒ ์ป์ ์ ์๋ ๊ฒฝ์ฐ์๋ง ํจ์จ์ ์ด๋ค. ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก user ์์ค Lock์์ ์ฌํ ๊ฒฝ์์ด ํ์ง๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๋๊ณค ํ๋ค.
๋ค์์ Rust ํ์ค ๋ฎคํ ์ค์ lock ๊ตฌํ๋ก๋ค.
atomic op์ผ๋ก ๋จผ์ ์ ๊ฒจ์๋์ง ์ต๋ 2๋ฒ๊น์ง ์ฒดํฌํ๊ณ , ๊ทธ๋๋ ์ถฉ๋์ด ๋ฐ์ํ๋ค๋ฉด "futex_wait"์ผ๋ก ์ปค๋ ํธ์ถ์ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ futex๋ ๋จ๋ ์ผ๋ก ๊ธฐ๊น๋๊ฒ ์ต์ ํ๋ฅผ ์ ํ ๋ฐฉ๋ฒ๋ก ์ด๋ผ๊ณ ํ ๊ฒ์ ์๋๋ค. ๊ฒฝ์์ด ์ฌํ ๊ฒฝ์ฐ์ ๊ฒฝ์์ด ์ฌํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ข ํฉํด์ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๋ 2๋จ๊ณ ๋ฐฉ๋ฒ๋ก ์ธ ์ ์ด๋ค.
futex์ ์ญ์ฌ
2002๋ ์ฏค์ ๋ฆฌ๋ ์ค ์ปค๋์ futex๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฒ์ ๋ค์ด๊ฐ๋ค. ์ด๋๋ถํฐ ๋ฆฌ๋ ์ค์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ก๋ค.
Windows์์๋ WaitOnAddress๋ผ๋ ์ด๋ฆ์ผ๋ก 2012๋
๋ถํฐ ์ง์๋๋ค.
MacOS๋ 2016๋
๋ถํฐ ์ง์ํ๋ค.
์ฌ์ค ์๋ฏธ์ ์ผ๋ก ๊ฐ์ฅ ์ ํํ ์ด๋ฆ์ futex๊ฐ ์๋๋ผ windows๊ฐ ์๋ช
ํ WaitOnAddress๋ค.
futex syscall ์์ฒด๊ฐ ๋จ๋
์ผ๋ก ํ๋ ์ญํ ์ ๋๊ธฐ์ด ๊ด๋ฆฌํ๊ณ ๊นจ์์ฃผ๋๊ฒ ์ ๋ถ์ด๊ธฐ ๋๋ฌธ์ด๋ค...
์ฐธ์กฐ
https://h4x0r.org/futex/
https://stackoverflow.com/questions/45764378/how-are-threads-processes-parked-and-woken-in-linux-prior-to-futex
http://www.wowotech.net/kernel_synchronization/futex.html