[Concurrency] spinlock
spinlock์ ๋ฝ์ ๊ฑฐ๋ ๋๊ธฐํ ๊ธฐ๋ฒ ์ค ํ๋๋ค.
๊ตฌ์กฐ์ ์๋ฆฌ
์๋ฆฌ๋ ๊ฐ๋จํ๋ค. ๊ทธ๋ฅ ์ ์ ๊ฐ ๋๋ ๋๊น์ง ๋ฃจํ๋ฅผ ๋๋ฉด์ ๋๊ธฐํ๊ณ , ์ ์ ๊ฐ ๋๋๋ฉด ๋ฃจํ๋ฅผ ์ข ๋ฃํ๊ณ ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ์ง์ ํ๋ ๊ฒ์ด๋ค.
๋บ๊ธ๋บ๊ธ ๋๋ฉด์ lock์ ๊ฑด๋ค๊ณ ํด์ spin lock์ด๋ค.
mutex์ ๊ฐ์ฅ ๋ค๋ฅธ ์ ์, OS ๊ธฐ๋ฅ์ ์์กด ์์ด ์์ํ ์ํํธ์จ์ด ๊ตฌํ์ด๋ผ๋ ๊ฒ์ด๋ค.
mutex๊ฐ os ์์ค์ ๊ธฐ๋ฅ์ ํ์ฉํด์ ๋ฝ ํ๋ ์คํจ์์ ์ค๋ ๋๋ฅผ "์ ์ ๋ชจ๋"๋ก ๋ฐ๊พธ๊ณ cpu ์์์ ๋์ง๋ง, spinlock์ ๊ณ์ ๋ฃจํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์๋ค.
https://velog.io/@soopsaram/Kernel-Mutex%EC%99%80-Spinlock-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
ํ์ง๋ง lock ๋๊ธฐ๊ฐ ๋น ๋ฅด๊ฒ ๋๋ ์ ์๋๊ฒ ๋ณด์ฅ๋๋ ์ํฉ์ด๋ผ๋ฉด ์คํ๋ฝ์ด ๋ ์ ํจํ ์ ์๋ค.
mutex์์ ์ค๋ ๋๋ฅผ "์ ์ ๋ชจ๋"๋ก ๋ฐ๊พธ๊ณ ๋ค์ ๊นจ์ฐ๋ ๋์์ ์๊ฐ๋ณด๋ค ๋น์ผ ์ฐ์ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก spinlock์ test and set์ด๋ compare and swap loop๋ฅผ ํตํด ๊ตฌํ๋๋ ๊ฒ์ด ๋ณดํต์ด๋ค.
https://blog.naver.com/sssang97/223131630420
๊ทธ๋ฆฌ๊ณ ์ฌ์ค, futex ์๋ฆฌ์ ๊ธฐ๋ฐํ Mutex ๊ตฌํ์ ์คํ๋ฝ ๊ธฐ๋ฅ์ ๋ด์ฌํ๊ณ ์๋ค.
๊ทธ๋์ ๊ทผ๋ ๋ค์ด์๋ spinlock์ ์จ์ผ๋ง ํ๋ ๋น์์ฑ์ด ์ ์ ํธ์ด๋ค.
queued spinlock
๊ฒฝ์์ด ๋งค์ฐ ์ฌํ ๊ฒฝ์ฐ์ ์ ํฉํ ์คํ๋ฝ์ ๋ณํ ์ค ํ๋๋ค. ๊ฒฝ์์ด ์ฌํ์ง ์๋ค๋ฉด ์ผ๋ฐ ์คํ๋ฝ์ด ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ค.
๋ํ์ ์ผ๋ก ๋ฆฌ๋ ์ค ์ปค๋์ด ์ด ๋ฐฉ๋ฒ์ ํตํด ๋ฝ์ ๊ตฌํํ๋ค.
๋จ์ํ ์คํ๋ฝ์ ๊ตฌํ์๋ ๊ฝค ํฐ ๋จ์ ์ด ์กด์ฌํ๋๋ฐ, ์ฐ์ ์์์ ๋ถ์ฌ๊ฐ ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ C ์ค๋ ๋์์ lock์ ๋ค๊ณ ์๋ ์ํ์์ A ์ค๋ ๋๊ฐ ๋จผ์ lock์ ์๋ํ๊ณ B ์ค๋ ๋๊ฐ 5๋ถ ๋ค์ lock์ ์๋ํ๋๋ผ๋, B ์ค๋ ๋๊ฐ ๋จผ์ lock์ ์ป๋ ๋ถ๊ณตํํ ์ํฉ์ด ์ผ์ด๋ ์ ์๋ค.
queued spinlock์ ํ๋ฅผ ๋์ ํจ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๋ฐฉ๋ฒ๋ก ์ ๋จ์ํ๋ค.
lock์ ์๋ํ์๋, ์ป์ ์ ์์ผ๋ฉด queue์ ํด๋น ์ค๋ ๋๋ฅผ ์์๋๋ก ๋ฑ๋กํ๋ค.
๊ทธ๋ฆฌ๊ณ lock์ด ํ๋ ธ์๋ ๋ค์ด์จ ์์๋๋ก ์ค๋ ๋์๊ฒ lock์ ๋ถ์ฌํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฟ์ด๋ค.
์ฐธ์กฐ
https://stackoverflow.com/questions/5869825/when-should-one-use-a-spinlock-instead-of-mutex
https://junsoolee.gitbook.io/linux-insides-ko/summary/syncprim/linux-sync-2
https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/queued-spin-locks