[Concurrency] Lock: ์ธ๋งํฌ์ด (semaphore)
์ธ๋งํฌ์ด(semaphore)๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณต์ ์์์ ๊ด๋ฆฌํ๋ ๋๊ธฐํ ๋ฐฉ๋ฒ๋ก ์ค ํ๋๋ค.
๋ค์ต์คํธ๋ผ๊ฐ ๊ณ ์ํ๋ค.
๋ ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ ๋๋ต ์ด๋ ๋ค.
atomicํ ์ธ๋งํฌ์ด ์ ์ด ๋ณ์๋ฅผ ํ๋ ๋๋ค. (int a;)
์ด๊ฑด ๋ณดํต ์ ์์ด๋ฉฐ, ํ๋ฒ์ ์ต๋ ์ ๊ทผ ๊ฐ๋ฅํ ์ค๋ ๋์ ๊ฐ์๊ฐ ์ด๊ธฐ๊ฐ์ด ๋์ด์ผ ํ๋ค.
๊ฐ ์ค๋ ๋๋ ์๊ณ์์ญ(critical section)์ด๋ผ๋ ์ธ๋งํฌ์ด ์ฒ๋ฆฌ ๊ตฌ๊ฐ์ ๋๋ค.
- ์๊ณ์์ญ์ ๋ค์ด๊ฐ๋ ์ธ๋งํฌ์ด๊ฐ ์ด๋ ค์๋ ์ํ๋ฉด ์ธ๋งํฌ์ด๋ฅผ ์ ๊ทธ๊ณ (a--) ์๊ณ์์ญ์ ์ํํ ๋ค, ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์ธ๋งํฌ์ด๋ฅผ ๋ค์ ์ด์ด์ค๋ค.(release, a++)
- ์๊ณ์์ญ์ ๋ค์ด๊ฐ๋ ์ธ๋งํฌ์ด๊ฐ ๋ซํ์๋ ์ํ๋ฉด(a==0) ์ด๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.(wait)
๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋งํฌ์ด ๋ณ์๋ ์ ์๊ฐ์ด๋ฉฐ, 0์ ์ด๊ณผํ ๋ ์ด๋ ค์๋ค๊ณ ๊ฐ์ ํ๋ค. 0์ด ๋๋ฉด ์ ๊ธด ๊ฒ์ผ๋ก ์ทจ๊ธํ๋ค.
์ธ๋งํฌ์ด์ ์ฉ๋
๊ธฐ๋ณธ์ ์ผ๋ก๋ ์์์ ์ถฉ๋ ๋ฐฉ์ง๋ณด๋ค๋ ๋์์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์๋ฅผ ์ ํํ๋, ์ฌ์ฉ๋ ์ ํ ๊ด์ ์์ ๋ ์ ์ฌ์ฉ๋๋ ํธ์ด๋ค. ์๋ฐํ ์์ค์ data race ๋ฐฉ์ง๋ฅผ ์ํ๋ค๋ฉด ์ธ๋งํฌ์ด๋ณด๋ค๋ mutex๋ฅผ ์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์ด์ง ์ธ๋งํฌ์ด: mutex
์ด ์ธ๋งํฌ์ด์ ๋ ผ๋ฆฌ์ ๋ณ์ข ์ค ํ๋๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๋ฎคํ ์ค(Mutex)๋ค. - ๊ตฌํ ๊ด์ ์์๋ ๋ง์ด ๋ค๋ฅด๋ค.
์ธ๋งํฌ์ด ์นด์ดํธ๊ฐ 0/1๋ง ๋๊ณ , lock๊ณผ unlock 2๊ฐ์ ์ํ๋ง ์๋ค๊ณ ํด์ binary ์ธ๋งํฌ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋์ ๋ฌด์กฐ๊ฑด ๋์์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๊ณ , ์ถฉ๋์ ๊ฐ์ฅ ์์ ํ ํธ์ด๋ค.
https://blog.naver.com/sssang97/223131650074
์ธ๋งํฌ์ด์ ๊ตฌํ
์ธ๋งํฌ์ด์ ๊ตฌํ๋ฒ์ ๋ฑ ์ ํด์ ธ์์ง๋ ์๋ค. Mutex๊ฐ ์ผ๋ฐ์ ์ผ๋ก OS์ mutex ๊ธฐ๋ฅ์ ์์กดํ ์ฑ๋ก ์ถ๊ฐ์ ์ธ ์ต์ ํ๋ง ์ฝ๊ฐ ํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๋ค.
๊ทธ๋๋ ๋ด๊ฐ ํ์ธํ ๊ตฌํ์ฒด๋ค์ ์ ๊ทผ๋ฒ์ด ๋๋ถ๋ถ ๋น์ทํ๊ธด ํ๋ค.
์ผ๋จ count์ ์ ์ด ๊ฐ์๊ฑด ํ์คํ๊ฒ ์์์ ์ฒ๋ฆฌ๊ฐ ๋์ด์ผ ํ๋ฏ๋ก, ๋๋ถ๋ถ์ ๊ตฌํ์ฒด๋ ๊ทธ ๊ธฐ๋ณธ์ ์ธ ๋ณด์ฅ์ ๋ํ ๋ถ๋ถ์ Mutex์ ์์กดํ๋ค.
tokio์ Semaphore์ ๊ฒฝ์ฐ๋ฅผ ์๋ก ๋ค๋ฉด, Mutex์ Atomic ์นด์ดํธ๋ฅผ ํ๋ ๋๋ ๊ฒ์ผ๋ก ๊ตฌํ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์๋ LinkedList ๊ธฐ๋ฐ์ผ๋ก ๋๊ธฐ์ด์ ๊ตฌํํ๊ณ ๊ทธ๋ฐ๋ค.
๋น ๊ณต๊ฐ์ด ๋๋ฉด ๋๊ธฐ์ด ๊ธฐ๋ฐ์ผ๋ก, ๋๊ธฐ์์๊ฒ ์ ๊ทผ๊ถํ์ ์ฃผ๋ ๊ฒ์ด๋ค.
Golang์ ๋ฐ-ํ์ค ๊ตฌํ์ฒด(golang.org/x/sync/semaphore)๋ ์ ๊ทผ๋ฒ์ ๋ค๋ฅด์ง ์๋ค.
์ฌ๊ธฐ์๋ ์ฑ๋ ๊ธฐ๋ฐ์ผ๋ก ๋๊ธฐ๋ฅผ ๊ตฌํํ๋๋ผ.
๋์ ์ ๊ทผ์ ๋ํ ๋ณด์ฅ์ ๋๊ฐ์ด Mutex์ ์์กดํ๋ค.