๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ComputerScience ๐Ÿ“š/์šด์˜์ฒด์ œ

[OS] ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”(Process Synchronization)

by ์•ˆ์ฃผํ˜• 2022. 2. 24.

 

์„œ๋ก 

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

๊ณต์œ  ์ž์› ์ ‘๊ทผ์˜ ์˜ˆ

๋จผ์ € ์œ„์™€ ๊ฐ™์€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค. ๊ณต์œ  ์ž์›์ธ ์ „์—ญ ๋ณ€์ˆ˜ ์˜ˆ๊ธˆ 10๋งŒ ์›์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ํ”„๋กœ์„ธ์Šค P1์€ ์˜ˆ๊ธˆ 10๋งŒ ์›์„ ํ™•์ธํ•œ ์ƒํ™ฉ์—์„œ ํ”„๋กœ์„ธ์Šค P2๊ฐ€ ์˜ˆ๊ธˆ 5๋งŒ ์›์„ ์ž…๊ธˆํ•˜์—ฌ ์ด 15๋งŒ ์›์˜ ์˜ˆ๊ธˆ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค P1์ž…์žฅ์—์„œ๋Š” ์•„์ง ์˜ˆ๊ธˆ์ด 10๋งŒ ์› ์ด๊ธฐ์— 10๋งŒ ์›์„ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ 15 + 10 = 25๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ 10 + 10 = 20์ด๋ผ๋Š” ์ด์˜ˆ๊ธˆ์ด ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 ์ด๋Ÿฌํ•œ ๋ถ€์ •ํ™•ํ•œ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์˜ˆ๊ธˆ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜๋„๋ก ํ—ˆ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ์ž๋ฃŒ๋ฅผ ์ ‘๊ทผํ•˜์—ฌ ์กฐ์ž‘ํ•˜๊ณ , ๊ทธ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ ‘๊ทผ์ด ๋ฐœ์ƒํ•œ ํŠน์ • ์ˆœ์„œ์— ์˜์กดํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฒฝ์Ÿ ์ƒํ™ฉ(race condition)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์Ÿ ์ƒํ™ฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด, ์šฐ๋ฆฌ๋Š” ํ•œ์ˆœ๊ฐ„์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ์ด ๋ณ€์ˆ˜ count๋ฅผ ์กฐ์ž‘ํ•˜๋„๋ก ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณด์žฅ์„ ์œ„ํ•ด, ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋™๊ธฐํ™”๋˜๋„๋ก ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ์ž์› ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต๋™์œผ๋กœ ์ด์šฉํ•˜๋Š” ๋ณ€์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ ๋“ฑ์„ ๋งํ•จ
๊ณต๋™์œผ๋กœ ์ด์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ฐ€ ์–ธ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š๋ƒ์— ๋”ฐ๋ผ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ
๊ฒฝ์Ÿ ์กฐ๊ฑด 2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์„ ๋ณ‘ํ–‰์ ์œผ๋กœ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ์ƒํ™ฉ
๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ณต์œ  ์ž์› ์ ‘๊ทผ ์ˆœ์„œ์— ๋”ฐ๋ผ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ

 

๋ฌธ์ œ(_The Critical-Section Problem)

ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”์— ๊ด€ํ•œ ๋…ผ์˜๋Š” ์†Œ์œ„ ์ž„๊ณ„ ๊ตฌ์—ญ ๋ฌธ์ œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. n๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๊ณ ๋ คํ•ด ๋ด…์‹œ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ(critical section)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ ์•ˆ์—์„œ๋Š” ์ ์–ด๋„ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ  ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์˜ ์ค‘์š”ํ•œ ํŠน์ง•์€ ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์ž„๊ณ„ ๊ตฌ์—ญ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์€ ๊ทธ๋“ค์˜ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ฆ‰ ๋™์‹œ์— ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” ๊ทธ๋“ค์˜ ์ž„๊ณ„ ๊ตฌ์—ญ ์•ˆ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž„๊ณ„ ๊ตฌ์—ญ ๋ฌธ์ œ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ˜‘๋ ฅ์ ์œผ๋กœ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ž์‹ ๋“ค์˜ ํ™œ๋™์„ ๋™๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ์˜ ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•˜๋ ค๋ฉด ์ง„์ž… ํ—ˆ๊ฐ€๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์„ ์ง„์ž… ๊ตฌ์—ญ(entry section)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ž„๊ณ„ ๊ตฌ์—ญ ๋’ค์—๋Š” ํ‡ด์ถœ ๊ตฌ์—ญ(exit section)์ด ๋”ฐ๋ผ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๋“ค์€ ์ด์นญํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๊ตฌ์—ญ(remainder section)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ „ํ˜•์ ์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ๊ฐ€ ์•„๋ž˜ ์ด๋ฏธ์ง€์— ๋‚˜ํƒ€๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„์ž… ๊ตฌ์—ญ๊ณผ ํ‡ด์ถœ ๊ตฌ์—ญ์€ ์ค‘์š”ํ•œ ์ฝ”๋“œ ๋ถ€๋ถ„์ž„์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ƒ์ž๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ „ํ˜•์ ์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ

์ž„๊ณ„ ๊ตฌ์—ญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์•ˆ์€ ๋‹ค์Œ์˜ ์„ธ ๊ฐ€์ง€ ์š”๊ตฌ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒํ˜ธ ๋ฐฐ์ œ(mutual exclusion): ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.
  2. ์ง„ํ–‰์˜ ์œตํ†ต์„ฑ(progress flexibility): ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ง„ํ–‰์„ ๋ฐฉํ•ดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
  3. ํ•œ์ •๋œ ๋Œ€๊ธฐ(bounded waiting): ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋„ ๋ฌดํ•œ์ •์œผ๋กœ ๋Œ€๊ธฐํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด๋ฒˆ ๊ธ€์—์„œ ์ด๋Ÿฌํ•œ ์ž„๊ณ„ ๊ตฌ์—ญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์•ˆ์„ ํฌ๊ฒŒ ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋ฐ˜ ํ•ด๊ฒฐ๋ฒ•(Peterson์˜ ํ•ด๊ฒฐ์•ˆ)
  2. ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜ ํ•ด๊ฒฐ๋ฒ•(Memory Barriers, test_and_set & compare_and_swap)
  3. ์ƒ์œ„ ์ˆ˜์ค€ ์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ(Mutex Locks, Semaphores)

 

1. Peterson์˜ ํ•ด๊ฒฐ์•ˆ(_Peterson's Solution) - ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋ฐ˜ ํ•ด๊ฒฐ๋ฒ•

int turn;
boolean flag[2];โ€‹

๋ณ€์ˆ˜ turn์€ ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•  ์ˆœ๋ฒˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ ๋งŒ์ผ turn == i ์ด๋ฉด ํ”„๋กœ์„ธ์Šค Pi๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. flag ๋ฐฐ์—ด์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, flag[i]๊ฐ€ true์ด๋ผ๋ฉด Pi๊ฐ€์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•  ์ค€๋น„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Peterson์˜ ํ•ด๊ฒฐ์•ˆ์—์„œ ํ”„๋กœ์„ธ์Šค Pi์˜ ๊ตฌ์กฐ

 ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ Pi๋Š” ๋จผ์ € flag[i]๋ฅผ true์œผ๋กœ ๋งŒ๋“ค๊ณ , turn์„ j๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ํ”„๋กœ์„ธ์Šค j๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์ง„์ž… ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ง„์ž…ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด turn์€ ๊ฑฐ์˜ ๋™์‹œ์— i์™€ j๋กœ ์ง€์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘˜ ์ค‘ ์˜ค์ง ํ•œ ๋ฐฐ์ •๋งŒ์ด ์ง€์†๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฐ์ •์€ ๋ฐœ์ƒํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ณง๋ฐ”๋กœ ๊ฒน์ณ ์“ฐ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. turn์˜ ๊ถ๊ทน์ ์ธ ๊ฐ’์ด ๋‘˜ ์ค‘ ๋ˆ„๊ฐ€ ๋จผ์ € ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 ์ด์ œ ํ•ด๊ฒฐ์ฑ…์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ๋ณด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒํ˜ธ ๋ฐฐ์ œ(mutual exclusion)๊ฐ€ ์ œ๋Œ€๋กœ ์ง€์ผœ์ง„๋‹ค๋Š” ์‚ฌ์‹ค
  2. ์ง„ํ–‰์— ๋Œ€ํ•œ ์š”๊ตฌ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค๋Š” ์‚ฌ์‹ค(progess flexibility)
  3. ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ํ•œ์—†์ด ๊ธธ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค(bounded waiting)

1๋ฒˆ์„ ์ฆ๋ช…ํ•˜๋ ค๋ฉด ๊ฐ Pi๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ flag[j] == false์ด๋“ ์ง€ ์•„๋‹ˆ๋ฉด turn == i ์—ฌ์•ผ ํ•จ์„ ์ฃผ๋ชฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์„ธ์Šค ๋ชจ๋‘ ์ž๊ธฐ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ์ˆ˜ํ–‰ ์ค‘์ด๋ผ๋ฉด flag[0] == flag[1] == true๋กœ ์ง€์ •ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๋‘ ๊ฐ€์ง€ ๋ถ„์„์„ ์‚ดํŽด๋ณด๋ฉด P0์™€ P1์ด ๋ชจ๋‘ while ๋ฌธ์„ ๋™์‹œ์— ์„ฑ๊ณต์ ์œผ๋กœ ์ง€๋‚˜๊ฐ€์ง€๋Š” ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด turn ๋ณ€์ˆ˜์˜ ๊ฐ’์€ 0์ด๋“ ์ง€ 1 ๋‘˜ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•˜์ง€ ๋™์‹œ์— ๋‘ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ์ด, ์˜ˆ๋ฅผ ๋“ค์–ด Pj๋งŒ์ด while์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ด๊ณ , ๋‚˜๋จธ์ง€ Pi๋Š” ("turn == j") ๋ฌธ์„ ํ•œ ๋ฒˆ ์ด์ƒ ๋” ์‹คํ–‰ํ–ˆ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๊ทธ ์ˆœ๊ฐ„์— flag[j] == true์ด๊ณ  turn == j์ธ ์ƒํƒœ๋Š” Pj๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์•ˆ์— ์žˆ์„ ๋•Œ์—๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ ๋ฐฐ์ œ๋Š” ์ง€์ผœ์ง‘๋‹ˆ๋‹ค.

 2์™€ 3์„ ์ฆ๋ช…ํ•˜๋ ค๋ฉด ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค Pi๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž… ๋ชป ํ•˜๋„๋ก ๋ง‰๋Š” ๋ฐฉ๋ฒ•์€ ๊ทธ๊ฒƒ์„ while ๋ฌธ์—(flag[j] == true && turn == j) ์กฐ๊ฑด์œผ๋กœ ๋ฌถ์–ด๋‘์–ด ๊ณ„์† ๊ณตํšŒ์ „ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์‚ฌ์‹ค์— ์ฃผ๋ชฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด while loop๊ฐ€ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Pj๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋Š” (flag[j] == false)์ด๊ณ  Pi๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pj๊ฐ€ flag[j]๋ฅผ true๋กœ ์ง€์ •ํ•˜๊ณ  ์—ญ์‹œ ์ž์‹ ์˜ while ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์ด๋•Œ turn == i ์ด๋“ ์ง€ turn == j์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. turn == i ๋ผ๋ฉด Pi๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•˜๊ฒŒ ๋˜๊ณ  turn == j๋ผ๋ฉด Pj๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”ํ›„ Pj๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋น ์ ธ๋‚˜์˜ฌ ๋•Œ๋Š” Pj๊ฐ€ flag[j]๋ฅผ false๋กœ ์žฌ์ง€์ •ํ•˜์—ฌ Pi๋กœ ํ•˜์—ฌ๊ธˆ ์ง„์ž…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. Pj๊ฐ€ flag[j]๋ฅผ true๋กœ ์žฌ์ง€์ •ํ•˜๊ณ  ๋‚˜๋ฉด ๋ฐ˜๋“œ์‹œ turn ๊ฐ’๋„ i๋กœ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Pi๋Š” while ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ turn ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Pi๋Š” Pj๊ฐ€ ์ง€๋‚œ๋ฒˆ์— ์ง„์ž…ํ–ˆ๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” ์ž๊ธฐ๋„ ํ•œ ๋ฒˆ์€(๋”ฐ๋ผ์„œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ํ•œ์—†์ด ๊ธธ์–ด์ง€์ง€ ์•Š์Œ) ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ(progess ๋ณด์žฅ) ๋ฉ๋‹ˆ๋‹ค.

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

 ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ๋ คํ•ด ๋ด…์‹œ๋‹ค.

boolean flag = false;
int x = 0;

์—ฌ๊ธฐ์„œ Thread 1์€ ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

while (!flag)
	;
print x;

๊ทธ๋ฆฌ๊ณ  Thread 2๋Š” ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

x = 100;
flag = true;

 ๋ฌผ๋ก  ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ์Šค๋ ˆ๋“œ 1์ด ๋ณ€์ˆ˜ x์— ๋Œ€ํ•ด ๊ฐ’ 100์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€์ˆ˜ flag์™€ x ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์Šค๋ ˆ๋“œ 2์˜ ๋ช…๋ น์–ด๋ฅผ ์žฌ ์ •๋ ฌํ•˜์—ฌ x = 100์„ ๋ฐฐ์ •ํ•˜๊ธฐ ์ „์— flag๊ฐ€ true๋กœ ์ง€์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ์Šค๋ ˆ๋“œ 1์€ ๋ณ€์ˆ˜ x์— ๋Œ€ํ•ด 0์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ๊ฐ€ ์Šค๋ ˆ๋“œ 1์ด ์‹คํ–‰ํ•  ๋ช…๋ น๋ฌธ์„ ์žฌ ์ •๋ ฌํ•˜์—ฌ flag ๊ฐ’์„ ์ ์žฌํ•˜๊ธฐ ์ „์— ๋ณ€์ˆ˜ x๋ฅผ ์ ์žฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ช…๋ฐฑํ•ด ๋ณด์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์žฌ ์ •๋ ฌ๋˜๋ฉด ์Šค๋ ˆ๋“œ 2๊ฐ€ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋“ค์ด ์žฌ ์ •๋ ฌ๋˜์ง€ ์•Š๋”๋ผ๋„ ์Šค๋ ˆ๋“œ 1์€ ๋ณ€์ˆ˜ x์— ๋Œ€ํ•ด 0์„ ์ถœ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Peterson์˜ ํ•ด๊ฒฐ์•ˆ์—์„œ ๋ช…๋ น ์ˆœ์„œ ๋ณ€๊ฒฝ์˜ ์˜ํ–ฅ

 

2. ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜ ํ•ด๊ฒฐ๋ฒ•(Memory Barriers, test_and_set & compare_and_swap)

(1) ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ(Memory Barriers)

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

  1. ๊ฐ•ํ•œ ์ˆœ์„œ: ํ•œ ํ”„๋กœ์„ธ์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณ€๊ฒฝ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ์— ์ฆ‰์‹œ ๋ณด์ž„.
  2. ์•ฝํ•œ ์ˆœ์„œ: ํ•œ ํ”„๋กœ์„ธ์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณ€๊ฒฝ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์— ์ฆ‰์‹œ ๋ณด์ด์ง€ ์•Š์Œ.

 ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์€ ํ”„๋กœ์„ธ์„œ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฏ€๋กœ ์ปค๋„ ๊ฐœ๋ฐœ์ž๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋‹ค์ค‘ ์ฒ˜๋ฆฌ๊ธฐ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ณ€๊ฒฝ์˜ ๊ฐ€์‹œ์„ฑ์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ๊ฐ€์ •๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ๋กœ ์ „ํŒŒํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ์— ๋ฉ”๋ชจ๋ฆฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ณด์ด๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์–ด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ(memory barries) ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํŽœ์Šค(memory fences)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋  ๋•Œ, ์‹œ์Šคํ…œ์€ ํ›„์† ์ ์žฌ ๋˜๋Š” ์ €์žฅ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ๋ชจ๋“  ์ ์žฌ ๋ฐ ์ €์žฅ์ด ์™„๋ฃŒ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…๋ น์ด ์žฌ ์ •๋ ฌ๋˜๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ์€ ํ–ฅํ›„ ์ ์žฌ ๋˜๋Š” ์ €์žฅ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ์ €์žฅ ์ž‘์—…์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์™„๋ฃŒ๋˜์–ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์— ๋ณด์ด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 ๋ช…๋ น์–ด๋ฅผ ์žฌ ์ •๋ ฌํ•˜์—ฌ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์˜ˆ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฐ๊ณผ๋‚˜ ๋‚˜์˜ค๋„๋ก ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ์„ ์‚ฌ์šฉํ•ด๋ด…์‹œ๋‹ค.

 ์Šค๋ ˆ๋“œ 1์— ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ ์—ฐ์‚ฐ์„ ์ถ”๊ฐ€ํ•˜๋ฉด

while (!flag)
  memory_barrier();
print x;

flag ๊ฐ’์ด x ๊ฐ’๋ณด๋‹ค ๋จผ์ € ์ ์žฌ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šค๋ ˆ๋“œ 2์—์„œ ์ˆ˜ํ–‰ํ•œ ๋ฐฐ์ • ์‚ฌ์ด์— ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ์„ ๋„ฃ์œผ๋ฉด

x = 100;
memory_barrier();
flag = true;

flag์— ๋ฐฐ์ •ํ•˜๊ธฐ ์ „์— x์— ๋Œ€ํ•œ ๋ฐฐ์ •์ด ๋จผ์ € ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

(2) ํ•˜๋“œ์›จ์–ด ๋ช…๋ น์–ด test_and_set() & compare_and_swap()

test_and_set() ๋ช…๋ น์–ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›์ž์  test_and_set() ๋ช…๋ น์–ด์˜ ์ •์˜

์ค‘์š”ํ•œ ํŠน์ง•์œผ๋กœ๋Š” ์ด ๋ช…๋ น์–ด๊ฐ€ ์›์ž์ (atomically, ๋” ์ด์ƒ ๋‚˜๋ˆ„์–ด์งˆ ์ˆ˜ ์—†๋Š” ํ•˜๋‚˜์˜ ๋™์ž‘, ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒ๋ผ๋„ ๋ฉˆ์ถ”์ง€ ์•Š์Œ)์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. 

 

์›์ž์  ํ–‰์œ„ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์›์ž์  ํ–‰์œ„(atomic action)์˜ ๊ธฐ๋ณธ์ ์ธ ์˜๋ฏธ๋Š” ๋” ์ด์ƒ ๋‚˜๋ˆ„์–ด์งˆ ์ˆ˜ ์—†๋Š” ํ•˜๋‚˜์˜ ํ–‰์œ„์ด๋‹ค. ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ๋Š” ์ˆ˜ํ–‰ ๋„์ค‘ ์ค‘๋‹จ๋  ์ˆ˜ ์—†๋Š” ํ•˜๋‚˜์˜ ๋™์ž‘ ๋‹จ์œ„๋ฅผ ๋œปํ•˜๋ฉฐ, ์šด์˜ ์ฒด์ œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„

ko.wikipedia.org

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋งŒ์ผ ๋‘ ๊ฐœ์˜ test_and_set() ๋ช…๋ น์–ด๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค๋ฉด(๊ฐ๊ฐ ๋‹ค๋ฅธ ์ฝ”์–ด์—์„œ), ์ด๋“ค์€ ์–ด๋–ค ์ž„์˜์˜ ์ˆœ์„œ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์ผ ๊ธฐ๊ณ„๊ฐ€ test_and_set() ๋ช…๋ น์„ ์ง€์›ํ•œ๋‹ค๋ฉด, false๋กœ ์ดˆ๊ธฐํ™”๋˜๋Š” lock์ด๋ผ๋Š” boolean ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค Pi์˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

test_and_set() ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ ์ƒํ˜ธ ๋ฐฐ์ œ ๊ตฌํ˜„

๋‹ค์Œ์œผ๋กœ compare_and_swap() ๋ช…๋ น์–ด(CAS)๋Š” test_and_set() ๋ช…๋ น์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๊ฐœ์˜ ์›Œ๋“œ์— ๋Œ€ํ•ด ์›์ž์ ์ธ ์—ฐ์‚ฐ์„ ํ•˜์ง€๋งŒ ๋‘ ์›Œ๋“œ์˜ ๋‚ด์šฉ ๊ตํ™˜์— ๊ธฐ๋ฐ˜์„ ๋‘” ๋‹ค๋ฅธ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. CAS๋Š” 3๊ฐœ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์—ฐ์‚ฐ์„ ํ•˜๋ฉฐ, ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

compare_and_swap() ๋ช…๋ น์–ด์˜ ์ •์˜

ํ”ผ์—ฐ์‚ฐ์ž value๋Š” ์˜ค์ง (*value == expected) ์ˆ˜์‹์ด ์ฐธ์ผ ๋•Œ์—๋งŒ new_value๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋“  CAS ๋ช…๋ น์–ด๋Š” ์–ธ์ œ๋‚˜ value์˜ ์›๋ž˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์˜ ์ค‘์š”ํ•œ ํŠน์ง•์€ ๋ช…๋ น์ด ์›์ž์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ์˜ CAS ๋ช…๋ น์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด(๊ฐ๊ฐ ๋‹ค๋ฅธ ์ฝ”์–ด์—์„œ) ์ž„์˜์˜ ์ˆœ์„œ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 CAS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ˜ธ ๋ฐฐ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ผœ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ „์—ญ ๋ณ€์ˆ˜ (lock)์ด ์„ ์–ธ๋˜๊ณ  0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
  2. compare_and_swap()์„ ํ˜ธ์ถœํ•œ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์„ธ์Šค๋Š” lock์„ 1๋กœ ์ง€์ •ํ•  ๊ฒƒ์ด๋‹ค.
  3. lock์˜ ์›๋ž˜ ๊ฐ’์ด expected ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  4. ์ดํ›„์˜ compare_and_swap() ํ˜ธ์ถœ์€ ํ˜„์žฌ lock์˜ ๊ฐ’์ด ๊ธฐ๋Œ“๊ฐ’ 0๊ณผ ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  5. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋น ์ ธ๋‚˜์˜ฌ ๋•Œ lock์„ 0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค Pi์˜ ๊ตฌ์กฐ๊ฐ€ ์•„๋ž˜์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

compare_and_swap() ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ ์ƒํ˜ธ ๋ฐฐ์ œ ๊ตฌํ˜„

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

๊ณตํ†ต๋œ ๋ฐ์ดํ„ฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

boolean waiting[n];
int lock;

waiting ๋ฐฐ์—ด์˜ ์›์†Œ๋Š” false๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ  lock์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ƒํ˜ธ ๋ฐฐ์ œ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Pi๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์˜ค์ง waiting[i] == false์ด๋“ ์ง€ key == 0์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. key ๊ฐ’์€ compare_and_swap() ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ 0์ด ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ compare_and_swap()์„ ์‹คํ–‰์‹œํ‚ค๋Š” ํ”„๋กœ์„ธ์Šค๋Š” key == 0์„ ๋ฐœ๊ฒฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์€ ๋ชจ๋‘ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ waiting[i]๊ฐ€ false๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋– ๋‚  ๋•Œ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์˜ค์ง ํ•œ ๊ฐœ์˜ waiting[i]๋งŒ์ด false๋กœ ์ง€์ •๋˜๊ณ  ๋”ฐ๋ผ์„œ ์ƒํ˜ธ ๋ฐฐ์ œ๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

 Progress ์กฐ๊ฑด์ด ๋งŒ์กฑํ•จ์„ ๋ณด์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์˜ ์ƒํ˜ธ ๋ฐฐ์ œ ๋…ผ๋ฆฌ๋ฅผ ์—ฌ๊ธฐ์—๋„ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋– ๋‚˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” lock์„ 0์œผ๋กœ ํ•˜๋“ ์ง€ waiting[j]๋ฅผ false๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ๋‘˜ ๋‹ค ์ž„๊ณ„ ๊ตฌ์—ญ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„์ž…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

 ํ•œ์ •๋œ ๋Œ€๊ธฐ(bounded waiting) ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ด์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋– ๋‚  ๋•Œ์—๋Š” waiting ๋ฐฐ์—ด์„ ์ˆœํ™˜ํ•˜๋ฉด์„œ ํ›‘์–ด๋ณธ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ฐฉ์•ˆํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ˆœํ™˜ํ•˜๋ฉด์„œ ์กฐ์‚ฌํ•˜์—ฌ(waiting[j] == true) ์ด๋ฉด์„œ ์œ„ ์ˆœํ™˜ ์ˆœ์„œ ์ค‘ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์ตœ๋Œ€ํ•œ n - 1ํšŒ๋งŒ ์–‘๋ณดํ•˜๋ฉด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

3. ์ƒ์œ„ ์ˆ˜์ค€ ์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ(Mutex Locks, Semaphores)

(1) Mutex Locks

๋ฐ”๋กœ ์œ„์—์„œ ์ œ์‹œํ•œ ์ž„๊ณ„ ๊ตฌ์—ญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜ ํ•ด๊ฒฐ์ฑ…์€ ๋ณต์žกํ•  ๋ฟ ์•„๋‹ˆ๋ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์šด์˜์ฒด์ œ ์„ค๊ณ„์ž๋“ค์€ ์ž„๊ณ„ ๊ตฌ์—ญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์œ„ ์ˆ˜์ค€ ์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ๋“ค์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ Mutex Locks์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค mutex๋ผ๋Š” ์šฉ์–ด๋Š” mutual exclusion์˜ ์ถ•์•ฝ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋ณดํ˜ธํ•˜๊ณ , ๋”ฐ๋ผ์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด mutex ๋ฝ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ์„ธ์Šค๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋ฝ์„ ํš๋“ํ•ด์•ผ ํ•˜๊ณ  ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋น ์ ธ๋‚˜์˜ฌ ๋•Œ ๋ฝ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ acquire() ํ•จ์ˆ˜๊ฐ€ ๋ฝ์„ ํš๋“ํ•˜๊ณ  release() ํ•จ์ˆ˜๊ฐ€ ๋ฝ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Mutex ๋ฝ์„ ์‚ฌ์šฉํ•œ ์ž„๊ณ„๊ตฌ์—ญ ๋ฌธ์ œ ํ•ด๊ฒฐ์ฑ…

Mutex ๋ฝ์€ available์ด๋ผ๋Š” boolean ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ ์ด ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ฝ์˜ ๊ฐ€์šฉ ์—ฌ๋ถ€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฝ์ด ๊ฐ€์šฉํ•˜๋ฉด acquire() ํ˜ธ์ถœ์€ ์„ฑ๊ณตํ•˜๊ณ  ๋ฝ์€ ๊ณง ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์ƒํƒœ์˜ ๋ฝ์„ ํš๋“ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋ฝ์ด ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ๋ด‰์‡„๋ฉ๋‹ˆ๋‹ค.

acquire() ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

acquire() {
    while (!available)
        ; /* busy wait */
    available = false;
}

release() ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

release() {
    available = true;
}

 acquire() ๋˜๋Š” release() ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์›์ž์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ mutex ๋ฝ์€ ์ด์ „์— ์„ค๋ช…ํ•œ CAS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 ์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์˜ ๋‹จ์ ์€ ๋ฐ”์œ ๋Œ€๊ธฐ(busy waiting)๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์žˆ๋Š” ๋™์•ˆ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์€ acquire() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ๊ณ„์† ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณ„์†๋œ ๋ฃจํ”„์˜ ์‹คํ–‰์€ ํ•˜๋‚˜์˜ CPU ์ฝ”์–ด๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ณต์œ ๋˜๋Š” ์‹ค์ œ ๋‹ค์ค‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์Šคํ…œ์—์„œ ๋ถ„๋ช…ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”์œ ๋Œ€๊ธฐ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” CPU ์ฃผ๊ธฐ๋ฅผ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๋‹ค. (์ดํ›„ Semaphores์—์„œ๋Š” ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ํœด๋ฉด ์ƒํƒœ๋กœ ์ „ํ™˜ํ•œ ํ›„ ๋ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ๊นจ์›Œ์„œ ๋ฐ”์œ ๋Œ€๊ธฐ๋ฅผ ํ”ผํ•˜๋Š” ์ „๋žต์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.)

 ์šฐ๋ฆฌ๊ฐ€ ์„ค๋ช…ํ•œ mutex ๋ฝ ์œ ํ˜•์„ ์Šคํ•€ ๋ฝ(spinlock, ๋ฐ”์œ ๋Œ€๊ธฐ์˜ ํ•œ ์ข…๋ฅ˜)์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๊ฐ€ "ํšŒ์ „"ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์Šคํ•€๋ฝ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์Šคํ•€๋ฝ(spinlock)์€ ์ž„๊ณ„ ๊ตฌ์—ญ(critical section)์— ์ง„์ž…์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ ์ง„์ž…์ด ๊ฐ€๋Šฅํ•  ๋•Œ๊นŒ์ง€ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ์žฌ์‹œ๋„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ ๋ฝ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์Šคํ•€๋ฝ์ด๋ผ๋Š” ์ด๋ฆ„์€ ๋ฝ์„ ํš๋“ํ•  ๋•Œ๊นŒ์ง€ ํ•ด

ko.wikipedia.org

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

(2) ์„ธ๋งˆํฌ(_Semaphores)

์ด๋ฒˆ์—๋Š” Mutex์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์ž์‹ ๋“ค์˜ ํ–‰๋™์„ ๋” ์ •๊ตํ•˜๊ฒŒ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ธ๋งˆํฌ S๋Š” ์ •์ˆ˜ ๋ณ€์ˆ˜๋กœ์„œ, ์ดˆ๊ธฐํ™”๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋‹จ์ง€ ๋‘ ๊ฐœ์˜ ํ‘œ์ค€ ์›์ž์  ์—ฐ์‚ฐ wait()์™€ Signal()๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. wait() ์—ฐ์‚ฐ์€ ์›๋ž˜ "๊ฒ€์‚ฌํ•˜๋‹ค"๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋„ค๋œ๋ž€๋“œ์–ด proberen์—์„œ P, ๊ทธ๋ฆฌ๊ณ  signal() ์—ฐ์‚ฐ์€ "์ฆ๊ฐ€ํ•˜๋‹ค"๋ฅผ ์˜๋ฏธํ•˜๋Š” verhogen์—์„œ V๋ผ๊ณ  ์ง€์–ด์กŒ์Šต๋‹ˆ๋‹ค.

wait()์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

wait(S) {
    while (S <= 0)
        ; // busy wait
    S--;
}

signal()์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

signal(S) {
    S++;
}

 wait()์™€ signal() ์—ฐ์‚ฐ ์‹œ ์„ธ๋งˆํฌ์˜ ์ •์ˆ˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์—ฐ์‚ฐ์€ ๋ฐ˜๋“œ์‹œ ์›์ž์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์„ธ๋งˆํฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด, ๋‹ค๋ฅธ ์–ด๋–ค ์Šค๋ ˆ๋“œ๋„ ๋™์‹œ์— ๋™์ผํ•œ ์„ธ๋งˆํฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ, wait(S)์˜ ๊ฒฝ์šฐ, S์˜ ์ •์ˆ˜ ๊ฐ’์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ž‘์—…(S <=0)๊ณผ ๊ทธ์— ๋”ฐ๋ผ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ณ€๊ฒฝ(S--)ํ•˜๋Š” ์ž‘์—… ๋˜ํ•œ ์ธํ„ฐ๋ŸฝํŠธ ๋˜์ง€ ์•Š๊ณ  ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด๋“ค ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€์™€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

(2-1) ์„ธ๋งˆํฌ ์‚ฌ์šฉ๋ฒ•(_Semaphore Usage)

์šด์˜์ฒด์ œ๋Š” ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ์„ธ๋งˆํฌ๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  1. ์นด์šดํŒ… ์„ธ๋งˆํฌ(counting semaphore): ์ œํ•œ ์—†๋Š” ์˜์—ญ(domain)์˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  2. ์ด์ง„ ์„ธ๋งˆํฌ(binary semaphore): 0๊ณผ 1 ์‚ฌ์ด์˜ ๊ฐ’๋งŒ ๊ฐ€์ง„๋‹ค.

์ด์ง„ ์„ธ๋งˆํฌ๋Š” mutex๋ฝ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋ช‡๋ช‡ ์‹œ์Šคํ…œ์—์„œ๋Š” mutex๋ฝ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด์ง„ ์„ธ๋งˆํฌ๊ฐ€ ๋Œ€์‹  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 ์นด์šดํŒ… ์„ธ๋งˆํฌ๋Š” ์œ ํ•œํ•œ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

  1. ์„ธ๋งˆํฌ๋Š” ๊ฐ€์šฉํ•œ ์ž์›์˜ ๊ฐœ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์„ธ๋งˆํฌ์— wait() ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด๋•Œ ์„ธ๋งˆํฌ์˜ ๊ฐ’์€ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.
  3. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ๋ฐฉ์ถœํ•  ๋•Œ๋Š” signal() ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์„ธ๋งˆํฌ๋Š” ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  4. ์„ธ๋งˆํฌ์˜ ๊ฐ’์ด 0์ด ๋˜๋ฉด ๋ชจ๋“  ์ž์›์ด ์‚ฌ์šฉ ์ค‘์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  5. ์ดํ›„ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์„ธ๋งˆํฌ ๊ฐ’์ด 0๋ณด๋‹ค ์ปค์งˆ ๋•Œ๊นŒ์ง€ ๋ด‰์‡„๋ฉ๋‹ˆ๋‹ค.

 ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋‹ค์–‘ํ•œ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์„ธ๋งˆํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด P1์€ S1 ๋ช…๋ น๋ฌธ์„, P2๋Š” S2 ๋ช…๋ น๋ฌธ์„ ๋ณ‘ํ–‰ํ•˜๊ฒŒ(concurrently) ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๋‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณ ๋ คํ•ด ๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ๋ฅผ P1๊ณผ P2๊ฐ€ ์„ธ๋งˆํฌ synch๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ํ•˜๊ณ , synch๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. P1์— ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

S1;
signal(synch);

๋˜ P2์— ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

wait(synch);
S2;

synch ๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, P2๊ฐ€ S2๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ P1์ด signal(synch)๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์—๋งŒ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํ˜ธ์ถœ์€ S1์„ ์‹คํ–‰ํ•œ ์ดํ›„์—๋งŒ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(2-2) ์„ธ๋งˆํฌ ๊ตฌํ˜„(_Semaphore Implementation)

์ด์ „์— ๋…ผ์˜๋œ mutex ๋ฝ ๊ตฌํ˜„์€ ๋ฐ”์œ ๋Œ€๊ธฐ(busy waiting)๋ฅผ ํ•ด์•ผ ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์„ค๋ช…ํ•œ ์„ธ๋งˆํฌ ์—ฐ์‚ฐ wait()๊ณผ signal()์˜ ์ •์˜ ์—ญ์‹œ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•˜์—ฌ, ์šฐ๋ฆฌ๋Š” wait()์™€ signal() ์„ธ๋งˆํฌ ์—ฐ์‚ฐ์˜ ์ •์˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

  1. ํ”„๋กœ์„ธ์Šค๊ฐ€ wait() ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๊ณ  ์„ธ๋งˆํฌ ๊ฐ’์ด ์–‘์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค.
  2. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ”์œ ๋Œ€๊ธฐ ๋Œ€์‹ ์— ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ์„ ์ผ์‹œ ์ค‘์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  3. ์ผ์‹œ ์ค‘์ง€ ์—ฐ์‚ฐ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ธ๋งˆํฌ์— ์—ฐ๊ด€๋œ ๋Œ€๊ธฐ ํ์— ๋„ฃ๊ณ , ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•œ๋‹ค.
  4. ๊ทธ ํ›„์— ์ œ์–ด๊ฐ€ CPU ์Šค์ผ€์ค„๋Ÿฌ๋กœ ๋„˜์–ด๊ฐ€๊ณ , ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์„ ํƒํ•œ๋‹ค.

 ์„ธ๋งˆํฌ S๋ฅผ ๋Œ€๊ธฐํ•˜๋ฉด์„œ ์ผ์‹œ ์ค‘์ง€๋œ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ signal() ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋ฉด ์žฌ์‹œ์ž‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋Š” wakeup() ์—ฐ์‚ฐ์— ์˜ํ•˜์—ฌ ์žฌ์‹œ์ž‘๋˜๋Š”๋ฐ ์ด๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋Œ€๊ธฐ์ƒํƒœ์—์„œ ์ค€๋น„ ์™„๋ฃŒ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์„ธ์Šค๋Š” ์ค€๋น„ ์™„๋ฃŒ ํ์— ๋„ฃ์–ด์ง‘๋‹ˆ๋‹ค(CPU๋Š” CPU ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ค€๋น„ ์™„๋ฃŒ๊ฐ€ ๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์ „ํ™˜๋  ์ˆ˜๋„ ์žˆ๊ณ  ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค).

 ์ด๋Ÿฌํ•œ ์ •์˜๋ฅผ ๋”ฐ๋ฅด๋Š” ์„ธ๋งˆํฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด, ์šฐ๋ฆฌ๋Š” ์„ธ๋งˆํฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

typedef struct{
    int value;
    struct process *list;
} semaphore;

๊ฐ ์„ธ๋งˆํฌ๋Š” ํ•œ ๊ฐœ์˜ ์ •์ˆ˜ value์™€ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ list๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„ธ๋งˆํฌ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋ฉด, ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ธ๋งˆํฌ์˜ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. signal() ์—ฐ์‚ฐ์€ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ์—์„œ ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊บผ๋‚ด์„œ ๊ทธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์›Œ์ค๋‹ˆ๋‹ค.

 wait() ์—ฐ์‚ฐ์€ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wait(semaphore *S) {
    S->value--;
    if (S->value < 0) {
        add this process to S->list;
        sleep();
    }
}

signal() ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

signal(semaphore *S) {
    S->value++;
    if (S->value <= 0) {
        remove a process P from S->list;
        wakeup(P);
    }
}

sleep() ์—ฐ์‚ฐ์€ ์ž๊ธฐ๋ฅผ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ผ์‹œ ์ค‘์ง€์‹œํ‚ต๋‹ˆ๋‹ค. wakeup(P) ์—ฐ์‚ฐ์€ ์ผ์‹œ ์ค‘์ง€๋œ ํ”„๋กœ์„ธ์Šค P์˜ ์‹คํ–‰์„ ์žฌ๊ฐœ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋“ค ๋‘ ์—ฐ์‚ฐ์€ ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ์ ์ธ ์‹œ์Šคํ…œ ์ฝœ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

 ๋ฐ”์œ ๋Œ€๊ธฐ๋ฅผ ํ•˜๋Š” ์„ธ๋งˆํฌ์˜ ๊ณ ์ „์  ์ •์˜์—์„œ๋Š” ์„ธ๋งˆํฌ์˜ ๊ฐ’์€ ์Œ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋‚˜, ์ด์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋ฉด ์Œ์ˆ˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋งˆํฌ ๊ฐ’์ด ์Œ์ˆ˜์ผ ๋•Œ, ๊ทธ ์ ˆ๋Œ“๊ฐ’์€ ์„ธ๋งˆํฌ๋ฅผ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์‚ฌ์‹ค์€ wait() ์—ฐ์‚ฐ์˜ ๊ตฌํ˜„์—์„œ ์„ธ๋งˆํฌ ๊ฐ’์˜ ๊ฐ์†Œ์™€ ๊ฒ€์‚ฌ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พผ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

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

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

 ๋‹ค์ค‘ ์ฝ”์–ด ํ™˜๊ฒฝ์—์„œ๋Š” ๋ชจ๋“  ์ฒ˜๋ฆฌ ์ฝ”์–ด์—์„œ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๊ธˆ์ง€ํ•˜์—ฌ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด(๋‹ค๋ฅธ ์ฝ”์–ด์—์„œ ์‹คํ–‰๋˜๋Š”) ์ƒ์ดํ•œ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๋ช…๋ น์–ด๋“ค์ด ์ž„์˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์„œ๋กœ ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”์–ด์—์„œ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ๋งค์šฐ ์–ด๋ ค์šด ์ž‘์—…์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ฑ๋Šฅ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ SMP ์‹œ์Šคํ…œ์€ wait() ์™€ signal() ์—ฐ์‚ฐ์ด ์›์ž์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•˜์—ฌ compare_and_set() ๋˜๋Š” ์Šคํ•€ ๋ฝ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ธฐ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

 

์ •๋ฆฌ

  1. ๊ฒฝ์Ÿ ์กฐ๊ฑด์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ๋ณ‘ํ–‰ํ•˜๊ฒŒ(concurrently)ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋ณ‘ํ–‰ ์ ‘๊ทผ์ด ๋ฐœ์ƒํ•œ ํŠน์ • ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ๊ฒฝ์Ÿ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ๊ณต์œ  ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์†์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.
  2. ์ž„๊ณ„ ๊ตฌ์—ญ์€ ๊ณต์œ  ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ์ž‘๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ์˜์—ญ์ด๋‹ค. ์ž„๊ณ„๊ตฌ์—ญ ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ˜‘๋ ฅ์ ์œผ๋กœ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ž์‹ ์˜ ํ™œ๋™์„ ๋™๊ธฐํ™”ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  3. ์ž„๊ณ„ ๊ตฌ์—ญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ (1) ์ƒํ˜ธ ๋ฐฐ์ œ, (2) ์ง„ํ–‰์˜ ์œตํ†ต์„ฑ, (3) ํ•œ์ •๋œ ๋Œ€๊ธฐ ์˜ ์„ธ ๊ฐ€์ง€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ด์•ผ ํ•œ๋‹ค.
  4. Peterson์˜ ํ•ด๊ฒฐ์•ˆ๊ณผ ๊ฐ™์€ ์ž„๊ณ„๊ตฌ์—ญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ํ•ด๊ฒฐ์ฑ…์€ ์ตœ์‹  ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ฒ˜์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  5. ์ž„๊ณ„๊ตฌ์—ญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•˜๋“œ์›จ์–ด ์ง€์›์—๋Š” Memory Barriers, compare_and_swap ๋ช…๋ น๊ณผ ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด ๋ช…๋ น ๋ฐ ์›์ž์  ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  6. Mutex ๋ฝ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋ฝ์„ ํš๋“ํ•˜๊ณ  ์ž„๊ณ„ ๊ตฌ์—ญ์—์„œ ๋‚˜์˜ฌ ๋•Œ ๋ฝ์„ ํ•ด์ œํ•  ๊ฒƒ์„ ์š”๊ตฌํ•จ์œผ๋กœ์จ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  7. Mutex ๋ฝ๊ณผ ๊ฐ™์ด ์„ธ๋งˆํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ mutex ๋ฝ์€ ๋ฝ์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ด์ง„ ๊ฐ’์„ ๊ฐ€์ง€์ง€๋งŒ, ์„ธ๋งˆํฌ๋Š” ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ€์ง€๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 

 

์„ธ๋งˆํฌ์™€ ๋ฎคํ…์Šค์˜ ์ฐจ์ด

 

[์šด์˜์ฒด์ œ] Mutex ๋ฎคํ…์Šค์™€ Semaphore ์„ธ๋งˆํฌ์–ด์˜ ์ฐจ์ด

ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜, ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ณต์œ ๋œ ์ž์›์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด Critical Section(์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ ์ˆ˜ํ–‰๋  ๋•Œ, ๊ฐ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ณต์œ 

heeonii.tistory.com

์„ธ๋งˆํฌ์™€ ๋ฎคํ…์Šค์˜ ์ฐจ์ด๋Š” ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ์˜ ๊ฐœ์ˆ˜ ์ฐจ์ด ์ž…๋‹ˆ๋‹ค.

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

๋Œ“๊ธ€