์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

Pintos Prerequisite: Mutex์™€ Semaphore, Condition Variable

Unused 2025. 5. 12. 22:32

Credit: https://x.com/RaulJuncoV/status/1847621858763370802

Mutex์™€ Semaphore, Condition Variable๋Š” ๋™๊ธฐํ™”/๋™์‹œ์„ฑ ์ œ์–ด์—์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. Mutex์™€ Semaphore๊ฐ€ ๋งˆ์น˜ ๊ตํ†ต ์ฒด์ฆ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์ฐฐ๊ด€์ด๋‚˜ ์‹ ํ˜ธ๋“ฑ๊ณผ ๊ฐ™๋‹ค๋ฉด, Condition Variable์€ ์‹ ํ˜ธ๊ฐ€ ๋ฐ”๋€Œ๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ฐจ๋Ÿ‰๋“ค์˜ ์ •์ง€์„  ๊ฐ™์€ ์กด์žฌ์ž…๋‹ˆ๋‹ค. Condition Variable์€ ์–ด๋–ค ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•ด์ฃผ๋Š” ๋™๊ธฐํ™” ๋„๊ตฌ์ด๊ธฐ์—, ์ด๋ฅผ ๊ตํ†ต ์‹ ํ˜ธ์— ๋น„์œ ํ•˜๋ฉด, ์ฐจ๋“ค์ด ์‹ ํ˜ธ๊ฐ€ ์ดˆ๋ก๋ถˆ๋กœ ๋ฐ”๋€Œ๊ธฐ ์ „๊นŒ์ง€ ์ •์ง€์„ ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ์ด๋ž‘ ๋น„์Šทํ•˜๊ฑฐ๋“ ์š”.


Mutex (Mutual Exclusion)

Mutex๋Š” ํ•œ๊ตญ์–ด๋กœ "์ƒํ˜ธ ๋ฐฐํƒ€(๋ฐฐ์ œ)"๋กœ ๋ฒˆ์—ญ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•ด ์˜ค์ง ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ํ™”์žฅ์‹ค ๋ฌธ์— ์žˆ๋Š” ์ž ๊ธˆ์žฅ์น˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋ฝ๋„ lock์ž…๋‹ˆ๋‹ค. Credit: https://blog.naver.com/soj24/223067129317

  • ์ž ๊ธˆ(Lock)๊ณผ ํ•ด์ œ(Unlock): Mutex๋Š” ๋”ฑ ๋‘ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. '์ž ๊ธˆ ์ƒํƒœ'์™€ 'ํ•ด์ œ ์ƒํƒœ'. ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์— Mutex๋ฅผ ์ž ๊ทธ๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Mutex๊ฐ€ ์ž ๊ฒจ ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๊ทธ ์Šค๋ ˆ๋“œ๋Š” Mutex๋ฅผ ์ž ๊ทธ๊ณ  ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ๋งˆ์น˜๋ฉด, ๊ทธ ์Šค๋ ˆ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ Mutex๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์œ ๊ถŒ(Ownership): ์ค‘์š”ํ•œ ์ ์€ Mutex๋ฅผ ์ž ๊ทผ ์Šค๋ ˆ๋“œ๋งŒ์ด ๊ทธ Mutex๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ์ž ๊ธด Mutex๋ฅผ ๊ฐ•์ œ๋กœ ํ’€ ์ˆ˜ ์—†์–ด์š”. ๋งˆ์น˜ ํ™”์žฅ์‹ค ํ‚ค๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋งŒ ๋ฌธ์„ ์—ด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ .
  • ์ฃผ ์‚ฌ์šฉ์ฒ˜: ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์ž„๊ณ„ ์˜์—ญ(critical section)์„ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด๋‚˜ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ์ž‘์—… ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Semaphore

Semaphore๋Š” Mutex๋ณด๋‹ค ์ข€ ๋” ์ผ๋ฐ˜ํ™”๋œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค (Semaphore๋Š” Mutex๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ Mutex๋Š” Semaphore๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ฃผ์ฐจ์žฅ์˜ ๋นˆ์ž๋ฆฌ๋ฅผ ์„ธ๋Š” ์ „๊ด‘ํŒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Credit: https://www.signal-tech.com/products/parking/space_available_and_end_of_aisle

  • ์นด์šดํ„ฐ(Counter): Semaphore๋Š” ์นด์šดํ„ฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” 0 ์ด์ƒ์˜ ์ •์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ํ˜„์žฌ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ž์›์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • wait (P ์—ฐ์‚ฐ)๊ณผ signal (V ์—ฐ์‚ฐ)
    • wait (P ์—ฐ์‚ฐ): ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, Semaphore์˜ ์นด์šดํ„ฐ๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์นด์šดํ„ฐ๊ฐ€ 0๋ณด๋‹ค ํฌ๋ฉด ์ฆ‰์‹œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์นด์šดํ„ฐ๊ฐ€ 0 ์ดํ•˜๊ฐ€ ๋˜๋ฉด, ๊ทธ ์Šค๋ ˆ๋“œ๋Š” ์ž์›์ด availableํ•ด์งˆ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ฃผ์ฐจ์žฅ์— ์ž๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • signal (V ์—ฐ์‚ฐ): ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์› ์‚ฌ์šฉ์„ ๋งˆ์น˜๋ฉด, Semaphore์˜ ์นด์šดํ„ฐ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊นจ์–ด๋‚˜ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ฐจ๊ฐ€ ์ฃผ์ฐจ์žฅ์—์„œ ๋‚˜๊ฐ€๋ฉด ๋‹ค๋ฅธ ์ฐจ๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์ข…๋ฅ˜
    • Binary Semaphore: ์นด์šดํ„ฐ๊ฐ€ 0 / 1๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” Semaphore์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ Mutex์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋” ์ž์„ธํ•˜๊ฒŒ ์„œ์ˆ ๋ฉ๋‹ˆ๋‹ค.
    • Counting Semaphore: ์นด์šดํ„ฐ๊ฐ€ 0 ์ด์ƒ์˜ ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” Semaphore์ž…๋‹ˆ๋‹ค. ํŠน์ • ๊ฐœ์ˆ˜์˜ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋™์‹œ์— ์ ‘์† ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  Mutex Semaphore
๋ชฉ์  ์ƒํ˜ธ ๋ฐฐ์ œ (ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผ) ์ž์› ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ ์ˆ˜ ์ œํ•œ
์ƒํƒœ ์ž ๊น€(Locked) / ํ•ด์ œ(Unlocked) 0 ์ด์ƒ์˜ ์ •์ˆ˜ ๊ฐ’ (์นด์šดํ„ฐ)
์†Œ์œ ๊ถŒ ์ž ๊ทผ ์Šค๋ ˆ๋“œ๋งŒ ํ•ด์ œ ๊ฐ€๋Šฅ ์†Œ์œ ๊ถŒ ๊ฐœ๋… ์—†์Œ
์‚ฌ์šฉ ์‚ฌ๋ก€ ์ž„๊ณ„ ์˜์—ญ ๋ณดํ˜ธ, ๋‹จ์ผ ์ž์› ์ ‘๊ทผ ์ œ์–ด ์ œํ•œ๋œ ๊ฐœ์ˆ˜์˜ ์ž์› ์ ‘๊ทผ ์ œ์–ด, ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”

Condition Variable

Credit: https://velog.io/@takealittletime/

Pintos์—์„œ๋Š” Condition Variable (์ดํ•˜ ์ปจ๋””์…˜ ๋ณ€์ˆ˜)๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ปจ๋””์…˜ ๋ณ€์ˆ˜๋ž€, ์Šค๋ ˆ๋“œ๋“ค์ด ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜, ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋™๊ธฐํ™” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์‹๋‹น์—์„œ ์Œ์‹์ด ๋‚˜์˜ค๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์†๋‹˜๊ณผ ์Œ์‹์ด ์™„์„ฑ๋˜๋ฉด ์†๋‹˜์„ ํ˜ธ์ถœํ•˜๋Š” ์ง์›๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ปจ๋””์…˜ ๋ณ€์ˆ˜ ์ž์ฒด๋Š” ํŠน์ • ์กฐ๊ฑด๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์ด ์กฐ๊ฑด์ด ์ฐธ์ด ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ์ด ์กฐ๊ฑด์„ ์ฐธ์œผ๋กœ ๋งŒ๋“  ํ›„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ๋“ค์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจ๋””์…˜ ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ mutex์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Mutex๋Š” ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ , ์ปจ๋””์…˜ ๋ณ€์ˆ˜์€ ๊ทธ ๊ณต์œ  ๋ณ€์ˆ˜์˜ ์ƒํƒœ(ํŠน์ • ์กฐ๊ฑด)์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ๋“ค์„ ๋Œ€๊ธฐ์‹œํ‚ค๊ฑฐ๋‚˜ ๊นจ์šฐ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 

์ปจ๋””์…˜ ๋ณ€์ˆ˜๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • wait(condition, mutex): ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋Š” mutex๋ฅผ ํ•ด์ œํ•˜๊ณ , condition์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ์ž ์‹œ ์ž ๋“ญ๋‹ˆ๋‹ค (๋Œ€๊ธฐ ํ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค). ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๊ณ  signal ๋˜๋Š” broadcast๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์ด ์Šค๋ ˆ๋“œ๋Š” ๊นจ์–ด๋‚˜ ๋‹ค์‹œ mutex๋ฅผ ํš๋“ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. wait ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ mutex๊ฐ€ ์ž ๊ธด ์ƒํƒœ์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊นจ์–ด๋‚œ ํ›„์—๋Š” ๋‹ค์‹œ mutex๋ฅผ ํš๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • signal(condition): ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, condition์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์›๋‹ˆ๋‹ค. ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์–ด๋‚ ์ง€๋Š” ์Šค์ผ€์ค„๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊นจ์–ด๋‚œ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์‹œ mutex๋ฅผ ํš๋“ํ•˜๋ ค๊ณ  ๊ฒฝ์Ÿํ•ฉ๋‹ˆ๋‹ค.
  • broadcast(condition): ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, condition์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์›๋‹ˆ๋‹ค. ๊นจ์–ด๋‚œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์‹œ mutex๋ฅผ ํš๋“ํ•˜๋ ค๊ณ  ๊ฒฝ์Ÿํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, Pintos์˜ ์šฐ์„ ์ˆœ์œ„ ์ปจ๋””์…˜ ๋ณ€์ˆ˜ ๊ด€๋ จ ํ…Œ์ŠคํŠธ(priority-condvar)์—์„œ๋Š” semaphore๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ, ์ด์ชฝ์€ mutex๋ฅผ ์•ˆ ์”๋‹ˆ๋‹ค. ๋Œ€์‹  ์ž์ฒด์ ์ธ struct lock + struct condition ๊ตฌํ˜„์ฒด๋ฅผ ์กฐํ•ฉํ•œ struct semaphore๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ

์„ค๋ช…๋งŒ์œผ๋กœ๋Š” ์ž˜ ์•ˆ ์™€๋‹ฟ์ง€์š”? ์•„๋ž˜๋Š” ์ „ํ˜•์ ์ธ ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ํŒจํ„ด ์˜ˆ์‹œ๋กœ. ์ƒ์‚ฐ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‘๋ฉด ์†Œ๋น„์ž๊ฐ€ ๊ทธ๊ฑธ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ตฌ์กฐ์ด๋ฉฐ, ์†Œ๋น„์ž๋Š” ์ปจ๋””์…˜ ๋ณ€์ˆ˜๋กœ ์‹ ํ˜ธ๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด ๊นจ์–ด๋‚ฉ๋‹ˆ๋‹ค.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

int buffer = 0;  // ๊ณต์œ  ์ž์›
int data_ready = 0;

/* POSIX ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ํˆด */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void* producer(void* arg) {
    sleep(1);  // ์ƒ์‚ฐ์ด ๋Šฆ๊ฒŒ ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    pthread_mutex_lock(&mutex);

    buffer = 42;  // ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
    data_ready = 1;
    printf("Producer: ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์™„๋ฃŒ!\n");

    pthread_cond_signal(&cond);  // ์–˜๊ฐ€ ์ปจ๋””์…˜ ๋ณ€์ˆ˜. ์†Œ๋น„์ž์—๊ฒŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ„.
    pthread_mutex_unlock(&mutex);
    return NULL;
}

void* consumer(void* arg) {
    pthread_mutex_lock(&mutex);
    while (data_ready == 0) {
        printf("Consumer: ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...\n");
        pthread_cond_wait(&cond, &mutex);  // ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
    }

    printf("Consumer: ๋ฐ์ดํ„ฐ ํš๋“! %d\n", buffer);
    pthread_mutex_unlock(&mutex);
    return NULL;
}

void main() {
    pthread_t t1, t2;

    pthread_create(&t1, NULL, consumer, NULL);
    pthread_create(&t2, NULL, producer, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
}

์—ฌ๊ธฐ์„œ pthread_cond_t cond;๊ฐ€ ๋ฐ”๋กœ ์ปจ๋””์…˜ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. pthread_cond_wait()์™€ pthread_cond_signal()์—์„œ ์“ฐ์ด๊ณ , ์Šค๋ ˆ๋“œ ๊ฐ„์— "์กฐ๊ฑด์ด ๋งŒ์กฑ๋๋‹ค"๋Š” ์‹ ํ˜ธ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํ•œํŽธ int data_ready;๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์–ธ์ œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ €์žฅํ•˜๋Š” flag๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ปจ๋””์…˜ ๋ณ€์ˆ˜ ์ž์ฒด๋Š” "์‹ ํ˜ธ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์ˆ˜๋‹จ"์ด์ง€, ์กฐ๊ฑด์˜ ์ฐธ/๊ฑฐ์ง“์„ ์ €์žฅํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ ์กฐ๊ฑด(๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋๋Š”์ง€)์„ ๋‚˜ํƒ€๋‚ผ flag๊ฐ€ ๊ฐ™์ด ๋”ฐ๋ผ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์™œ Mutex์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ ๊นŒ์š”?

์ปจ๋””์…˜ ๋ณ€์ˆ˜๋Š” ๊ณต์œ  ๋ณ€์ˆ˜์˜ ์ƒํƒœ(์กฐ๊ฑด)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจ๋””์…˜ ๋ณ€์ˆ˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ Mutex๋ฅผ ํš๋“ํ•˜์—ฌ ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์Šค๋ ˆ๋“œ๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ํ™•์ธํ•˜๊ธฐ ์ „์— Mutex๋ฅผ ์ž ๊ธ‰๋‹ˆ๋‹ค.
  2. ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด, ์Šค๋ ˆ๋“œ๋Š” ์ปจ๋””์…˜ ๋ณ€์ˆ˜์˜ wait ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ Mutex๋ฅผ ํ•ด์ œํ•˜๊ณ  ์ž ๋“ญ๋‹ˆ๋‹ค.
  3. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ์ปจ๋””์…˜ ๋ณ€์ˆ˜์˜ signal ๋˜๋Š” broadcast ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์›๋‹ˆ๋‹ค. ์ด๋•Œ, ๊นจ์–ด๋‚œ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์‹œ Mutex๋ฅผ ํš๋“ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  4. Mutex๋ฅผ ํš๋“ํ•œ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์‹œ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๊ณ , ๋งŒ์กฑ๋˜๋ฉด ์ž‘์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Binary Semaphore (์ด์ง„ ์„ธ๋งˆํฌ์–ด)

์ด์ง„ ์„ธ๋งˆํฌ์–ด๋Š” ์„ธ๋งˆํฌ์–ด์˜ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ๋กœ, ์นด์šดํ„ฐ๊ฐ€ 0 / 1๋งŒ ๋˜๋Š” ์„ธ๋งˆํฌ์–ด์ž…๋‹ˆ๋‹ค. ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋Š” Mutex์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ, ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐ ๊ฐ’์€ ๋ณดํ†ต 1๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • wait ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•˜๋ฉด ์นด์šดํ„ฐ๊ฐ€ 0์ด ๋˜๊ณ , ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” wait ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค (์ž ๊ธˆ ์ƒํƒœ์™€ ์œ ์‚ฌ).
  • signal ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•˜๋ฉด ์นด์šดํ„ฐ๊ฐ€ 1์ด ๋˜์–ด, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค์‹œ wait ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค (ํ•ด์ œ ์ƒํƒœ์™€ ์œ ์‚ฌ).

Mutex vs. Binary Semaphore

๋‘˜์ด ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ์„ธ๋ถ€์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  ๋ฎคํ…์Šค ์ด์ง„ ์„ธ๋งˆํฌ์–ด
๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ž ๊ธˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‹ ํ˜ธ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜
๋ฝ ํ•ด์ œ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•œ ์Šค๋ ˆ๋“œ๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋ฒ—์–ด๋‚  ๋•Œ๋งŒ ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์Šค๋ ˆ๋“œ๋„ ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ธ๋งˆํฌ์–ด๋ฅผ ํ•ด์ œํ•˜๊ณ  ์ž ๊ธˆ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ’ ๋ฎคํ…์Šค ๊ฐ’์€ ์ž ๊ธˆ ๋˜๋Š” ์ž ๊ธˆ ํ•ด์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋งˆํฌ์–ด ๊ฐ’์€ wait() ๋ฐ signal() ์ž‘์—…์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
๋™์‹œ ํš๋“ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์†Œ์œ ๊ถŒ ๋ฎคํ…์Šค์—๋Š” ์†Œ์œ ๊ถŒ์ด ์žˆ์–ด, ์†Œ์œ ์ž๋งŒ์ด ์ž ๊ธˆ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ง„ ์„ธ๋งˆํฌ์–ด์—๋Š” ์†Œ์œ ๊ถŒ์ด ์—†์Šต๋‹ˆ๋‹ค.
์˜ค๋ฒ„ํ—ค๋“œ ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋ณด๋‹ค ๋А๋ฆฐ ์ด์œ ๋Š” ์ž ๊ธˆ์„ ํš๋“ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ์ž ๊ธˆ์„ ํ•ด์ œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ธ๋งˆํฌ์–ด๋ฅผ ์ž ๊ธˆ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฎคํ…์Šค๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค.
์ธ์Šคํ„ด์Šค ์ˆ˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ์ ‘๊ทผ์—๋Š” ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.
ํ™œ์šฉ ์‚ฌ๋ก€ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ ๋” ์ผ๋ฐ˜์ ์ธ ๋™๊ธฐํ™” ๋ฐ ์Šค๋ ˆ๋“œ๊ฐ„ ํ†ต์‹ 

์ถœ์ฒ˜: https://www.geeksforgeeks.org/difference-between-binary-semaphore-and-mutex/

๊ฒฐ๊ตญ ๋‘˜์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ์‚ฌ์šฉ๋ฒ•, ์†Œ์œ ๊ถŒ, ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ถ”๊ฐ€: ์ปจ๋””์…˜ ๋ณ€์ˆ˜๋ฅผ ์–˜๊ธฐํ•  ๋•Œ ์ด์ง„ ์„ธ๋งˆํฌ์–ด๊ฐ€ ๊ฐ™์ด ๋“ฑ์žฅํ•˜๋Š” ์ด์œ 

๋ธ”๋กœ๊ทธ๋ฅผ ์ฐพ์•„๋ณด๋‹ค ๋ณด๋ฉด ์ปจ๋””์…˜ ๋ณ€์ˆ˜๋ฅผ ์„ค๋ช…ํ•˜๋ฉด์„œ ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋ฅผ ๊ฐ™์ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ปจ๋””์…˜ ๋ณ€์ˆ˜๋Š” ๋กœ์šฐ๋ ˆ๋ฒจ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ์—, ๋•Œ๋กœ๋Š” ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปจ๋””์…˜ ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜, ์ปจ๋””์…˜ ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์“ฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, wait ์—ฐ์‚ฐ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋ก์‹œํ‚ค๊ณ , signal ์—ฐ์‚ฐ์€ ๋ธ”๋ก๋œ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ์ด์ง„ ์„ธ๋งˆํฌ์–ด๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žŠ์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ์€ ์ปจ๋””์…˜ ๋ณ€์ˆ˜์™€ ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋Š” ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง„ ๋„๊ตฌ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋Š” ์ฃผ๋กœ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด, ์ปจ๋””์…˜ ๋ณ€์ˆ˜๋Š” ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ„ ํšจ์œจ์ ์ธ ๋Œ€๊ธฐ ๋ฐ ์•Œ๋ฆผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.