[Concurrency] Lock: ์„ธ๋งˆํฌ์–ด (semaphore)

์„ธ๋งˆํฌ์–ด(semaphore)๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ ์ž์›์„ ๊ด€๋ฆฌํ•˜๋Š” ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜๋‹ค.
๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ ๊ณ ์•ˆํ–ˆ๋‹ค.

๋…ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋Š” ๋Œ€๋žต ์ด๋ ‡๋‹ค.

atomicํ•œ ์„ธ๋งˆํฌ์–ด ์ œ์–ด ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋‘”๋‹ค. (int a;)
์ด๊ฑด ๋ณดํ†ต ์ •์ˆ˜์ด๋ฉฐ, ํ•œ๋ฒˆ์— ์ตœ๋Œ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž„๊ณ„์˜์—ญ(critical section)์ด๋ผ๋Š” ์„ธ๋งˆํฌ์–ด ์ฒ˜๋ฆฌ ๊ตฌ๊ฐ„์„ ๋‘”๋‹ค.

  1. ์ž„๊ณ„์˜์—ญ์— ๋“ค์–ด๊ฐˆ๋•Œ ์„ธ๋งˆํฌ์–ด๊ฐ€ ์—ด๋ ค์žˆ๋Š” ์ƒํƒœ๋ฉด ์„ธ๋งˆํฌ์–ด๋ฅผ ์ž ๊ทธ๊ณ (a--) ์ž„๊ณ„์˜์—ญ์„ ์ˆ˜ํ–‰ํ•œ ๋’ค, ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์„ธ๋งˆํฌ์–ด๋ฅผ ๋‹ค์‹œ ์—ด์–ด์ค€๋‹ค.(release, a++)
  2. ์ž„๊ณ„์˜์—ญ์— ๋“ค์–ด๊ฐˆ๋•Œ ์„ธ๋งˆํฌ์–ด๊ฐ€ ๋‹ซํ˜€์žˆ๋Š” ์ƒํƒœ๋ฉด(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์— ์˜์กดํ•œ๋‹ค.