์๋ก
ํ๋ ฅ์ ํ๋ก์ธ์ค๋ ์์คํ ๋ด์์ ์คํ ์ค์ธ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์คํ์ ์ํฅ์ ์ฃผ๊ฑฐ๋ ์ํฅ์ ๋ฐ๋ ํ๋ก์ธ์ค์ ๋๋ค. ํ๋ ฅ์ ํ๋ก์ธ์ค๋ ๋ ผ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ(์ฆ, ์ฝ๋ ๋ฐ ๋ฐ์ดํฐ)์ ์ง์ ๊ณต์ ํ๊ฑฐ๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋ฉ์์ง ์ ๋ฌ์ ํตํด์๋ง ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๊ทผํ๋ฉด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ง์น ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ ผ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ ํ๋ ฅ์ ํ๋ก์ธ์ค์ ํ๋ ฅ์ ํ๋ก์ธ์ค์ ์ง์ ์๋ ์คํ์ ๋ณด์ฅํ์ฌ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ค์ํ ๋ฉ์ปค๋์ฆ์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์์ ๊ฐ์ ์๋ฅผ ์ดํด๋ด ์๋ค. ๊ณต์ ์์์ธ ์ ์ญ ๋ณ์ ์๊ธ 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)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ ํ์ ์ธ ํ๋ก์ธ์ค์ ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ๊ฐ ์๋ ์ด๋ฏธ์ง์ ๋ํ๋ ์์ต๋๋ค. ์ง์ ๊ตฌ์ญ๊ณผ ํด์ถ ๊ตฌ์ญ์ ์ค์ํ ์ฝ๋ ๋ถ๋ถ์์ ๊ฐ์กฐํ๊ธฐ ์ํ์ฌ ์์๋ก ๋๋ฌ์ธ์ฌ ์์ต๋๋ค.
์๊ณ ๊ตฌ์ญ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์์ ๋ค์์ ์ธ ๊ฐ์ง ์๊ตฌ ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
- ์ํธ ๋ฐฐ์ (mutual exclusion): ํ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ ์๋ค.
- ์งํ์ ์ตํต์ฑ(progress flexibility): ํ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์งํ์ ๋ฐฉํดํด์๋ ์๋๋ค.
- ํ์ ๋ ๋๊ธฐ(bounded waiting): ์ด๋ค ํ๋ก์ธ์ค๋ ๋ฌดํ์ ์ผ๋ก ๋๊ธฐํ์ง ์์์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ฐ๋ฆฌ๋ ์ด๋ฒ ๊ธ์์ ์ด๋ฌํ ์๊ณ ๊ตฌ์ญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ ํฌ๊ฒ ์๋์ ๊ฒฝ์ฐ๋ก ๋๋์ด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ์ํํธ์จ์ด ๊ธฐ๋ฐ ํด๊ฒฐ๋ฒ(Peterson์ ํด๊ฒฐ์)
- ํ๋์จ์ด ๊ธฐ๋ฐ ํด๊ฒฐ๋ฒ(Memory Barriers, test_and_set & compare_and_swap)
- ์์ ์์ค ์ํํธ์จ์ด ๋๊ตฌ(Mutex Locks, Semaphores)
1. Peterson์ ํด๊ฒฐ์(_Peterson's Solution) - ์ํํธ์จ์ด ๊ธฐ๋ฐ ํด๊ฒฐ๋ฒ
int turn;
boolean flag[2];โ
๋ณ์ turn์ ์๊ณ ๊ตฌ์ญ์ผ๋ก ์ง์ ํ ์๋ฒ์ ๋ํ๋ ๋๋ค. ์ฆ ๋ง์ผ turn == i ์ด๋ฉด ํ๋ก์ธ์ค Pi๊ฐ ์๊ณ ๊ตฌ์ญ์์ ์คํ๋ ์ ์์ต๋๋ค. flag ๋ฐฐ์ด์ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ผ๋ก ์ง์ ํ ์ค๋น๊ฐ ๋์๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด, flag[i]๊ฐ true์ด๋ผ๋ฉด Pi๊ฐ์๊ณ ๊ตฌ์ญ์ผ๋ก ์ง์ ํ ์ค๋น๊ฐ ๋ฉ๋๋ค.
์๊ณ ๊ตฌ์ญ์ผ๋ก ์ง์ ํ๊ธฐ ์ํด์ Pi๋ ๋จผ์ flag[i]๋ฅผ true์ผ๋ก ๋ง๋ค๊ณ , turn์ j๋ก ์ง์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ํ๋ก์ธ์ค j๊ฐ ์๊ณ ๊ตฌ์ญ์ผ๋ก ์ง์ ํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์ง์ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ๋ง์ผ ๋ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ง์ ํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด turn์ ๊ฑฐ์ ๋์์ i์ j๋ก ์ง์ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ค ์ค์ง ํ ๋ฐฐ์ ๋ง์ด ์ง์๋ฉ๋๋ค. ๋ค๋ฅธ ๋ฐฐ์ ์ ๋ฐ์ํ๊ธฐ๋ ํ์ง๋ง ๊ณง๋ฐ๋ก ๊ฒน์ณ ์ฐ์ด๊ฒ ๋ฉ๋๋ค. turn์ ๊ถ๊ทน์ ์ธ ๊ฐ์ด ๋ ์ค ๋๊ฐ ๋จผ์ ์๊ณ ๊ตฌ์ญ์ผ๋ก ์ง์ ํ ๊ฒ์ธ๊ฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์ด์ ํด๊ฒฐ์ฑ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํด๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค์ ๋ณด์ฌ์ผ ํฉ๋๋ค.
- ์ํธ ๋ฐฐ์ (mutual exclusion)๊ฐ ์ ๋๋ก ์ง์ผ์ง๋ค๋ ์ฌ์ค
- ์งํ์ ๋ํ ์๊ตฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ ์ฌ์ค(progess flexibility)
- ๋๊ธฐ ์๊ฐ์ด ํ์์ด ๊ธธ์ด์ง์ง ์๋๋ค๋ ์ฌ์ค(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์ ์ถ๋ ฅํ ๊ฒ์ ๋๋ค.
2. ํ๋์จ์ด ๊ธฐ๋ฐ ํด๊ฒฐ๋ฒ(Memory Barriers, test_and_set & compare_and_swap)
(1) ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ(Memory Barriers)
์ปดํจํฐ ์ํคํ ์ฒ๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์๊ฒ ์ ๊ณตํ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ๋ณด์ฅ๋๋ ์ฌํญ์ ๊ฒฐ์ ํ ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋ผ๊ณ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๋ ๊ฐ์ง ๋ฒ์ฃผ ์ค ํ๋์ ์ํฉ๋๋ค.
- ๊ฐํ ์์: ํ ํ๋ก์ธ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์์ ์ฆ์ ๋ณด์.
- ์ฝํ ์์: ํ ํ๋ก์ธ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์์ ์ฆ์ ๋ณด์ด์ง ์์.
๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ํ๋ก์ธ์ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฏ๋ก ์ปค๋ ๊ฐ๋ฐ์๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ค์ค ์ฒ๋ฆฌ๊ธฐ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ์ ๊ฐ์์ฑ์ ๋ํ ์ด๋ ํ ๊ฐ์ ๋ ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปดํจํฐ ์ํคํ ์ฒ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์๋ก ์ ํํ๋ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์์์ ์คํ ์ค์ธ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณด์ด๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ(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() ๋ช ๋ น์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์์ต๋๋ค.
์ค์ํ ํน์ง์ผ๋ก๋ ์ด ๋ช ๋ น์ด๊ฐ ์์์ (atomically, ๋ ์ด์ ๋๋์ด์ง ์ ์๋ ํ๋์ ๋์, ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์๋ผ๋ ๋ฉ์ถ์ง ์์)์ผ๋ก ์คํ๋๋ค๋ ์ ์ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ง์ผ ๋ ๊ฐ์ test_and_set() ๋ช ๋ น์ด๊ฐ ๋์์ ์คํ๋๋ค๋ฉด(๊ฐ๊ฐ ๋ค๋ฅธ ์ฝ์ด์์), ์ด๋ค์ ์ด๋ค ์์์ ์์๋ก ์์ฐจ์ ์ผ๋ก ์คํ๋ ๊ฒ์ ๋๋ค. ๋ง์ผ ๊ธฐ๊ณ๊ฐ test_and_set() ๋ช ๋ น์ ์ง์ํ๋ค๋ฉด, false๋ก ์ด๊ธฐํ๋๋ lock์ด๋ผ๋ boolean ๋ณ์๋ฅผ ์ ์ธํ์ฌ ์ํธ ๋ฐฐ์ ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค Pi์ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
๋ค์์ผ๋ก compare_and_swap() ๋ช ๋ น์ด(CAS)๋ test_and_set() ๋ช ๋ น์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๊ฐ์ ์๋์ ๋ํด ์์์ ์ธ ์ฐ์ฐ์ ํ์ง๋ง ๋ ์๋์ ๋ด์ฉ ๊ตํ์ ๊ธฐ๋ฐ์ ๋ ๋ค๋ฅธ ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. CAS๋ 3๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ๋์์ผ๋ก ์ฐ์ฐ์ ํ๋ฉฐ, ์๋ ์ฝ๋์ ๊ฐ์ด ์ ์๋์ด ์์ต๋๋ค.
ํผ์ฐ์ฐ์ value๋ ์ค์ง (*value == expected) ์์์ด ์ฐธ์ผ ๋์๋ง new_value๋ก ์ง์ ๋ฉ๋๋ค. ์ด๋ ํ ๊ฒฝ์ฐ์๋ CAS ๋ช ๋ น์ด๋ ์ธ์ ๋ value์ ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ค์ํ ํน์ง์ ๋ช ๋ น์ด ์์์ ์ผ๋ก ์คํ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ ๊ฐ์ CAS ๋ช ๋ น์ด ๋์์ ์คํ๋๋ฉด(๊ฐ๊ฐ ๋ค๋ฅธ ์ฝ์ด์์) ์์์ ์์๋ก ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
CAS๋ฅผ ์ฌ์ฉํ๋ ์ํธ ๋ฐฐ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ง์ผ์ง ์ ์์ต๋๋ค.
- ์ ์ญ ๋ณ์ (lock)์ด ์ ์ธ๋๊ณ 0์ผ๋ก ์ด๊ธฐํ๋๋ค.
- compare_and_swap()์ ํธ์ถํ ์ฒซ ๋ฒ์งธ ํ๋ก์ธ์ค๋ lock์ 1๋ก ์ง์ ํ ๊ฒ์ด๋ค.
- lock์ ์๋ ๊ฐ์ด expected ๊ฐ๊ณผ ๊ฐ์ผ๋ฏ๋ก ํ๋ก์ธ์ค๋ ์๊ณ ๊ตฌ์ญ์ผ๋ก ๋ค์ด๊ฐ๋ค.
- ์ดํ์ compare_and_swap() ํธ์ถ์ ํ์ฌ lock์ ๊ฐ์ด ๊ธฐ๋๊ฐ 0๊ณผ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๊ณตํ์ง ๋ชปํ๋ค.
- ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ๋น ์ ธ๋์ฌ ๋ lock์ 0์ผ๋ก ๋ณ๊ฒฝํ๊ณ , ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ ์๊ฒ ํ์ฉํ๋ค.
ํ๋ก์ธ์ค Pi์ ๊ตฌ์กฐ๊ฐ ์๋์ ๋์ ์์ต๋๋ค.
์ ์๊ณ ๋ฆฌ์ฆ์ ์ํธ ๋ฐฐ์ ์กฐ๊ฑด์ ๋ง์กฑ์ํค์ง๋ง ํ์ ๋ ๋๊ธฐ ์กฐ๊ฑด์ ๋ง์กฑ์ํค์ง๋ ๋ชปํฉ๋๋ค. ์๊ณ ๊ตฌ์ญ ์๊ตฌ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑ์ํค๋ 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 ๋ฝ์ 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, ๋ฐ์ ๋๊ธฐ์ ํ ์ข ๋ฅ)์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ๋ฝ์ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ํ๋ก์ธ์ค๊ฐ "ํ์ "ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋ ์คํ ๋ฝ์ ํ๋ก์ธ์ค๊ฐ ๋ฝ์ ๊ธฐ๋ค๋ ค์ผ ํ๊ณ ๋ฌธ๋งฅ ๊ตํ์ ์๋นํ ์๊ฐ์ด ์์๋ ๋ ๋ฌธ๋งฅ ๊ตํ์ด ํ์ํ์ง ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ค์ค ์ฝ์ด ์์คํ ์ ํน์ ์ํฉ์์๋ ์ค์ ๋ก ๋ฝ์ด ํ์ํ ๋ ์คํ ๋ฝ์ด ์ ํธ๋ฉ๋๋ค. ์ต์ ๋ค์ค ์ฝ์ด ์ปดํจํ ์์คํ ์์ ์คํ ๋ฝ์ ๋ง์ ์ด์์ฒด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
(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)
์ด์์ฒด์ ๋ ์๋์ ๋ ๊ฐ์ง ์ธ๋งํฌ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
- ์นด์ดํ ์ธ๋งํฌ(counting semaphore): ์ ํ ์๋ ์์ญ(domain)์ ๊ฐ์ ๊ฐ์ง๋ค.
- ์ด์ง ์ธ๋งํฌ(binary semaphore): 0๊ณผ 1 ์ฌ์ด์ ๊ฐ๋ง ๊ฐ์ง๋ค.
์ด์ง ์ธ๋งํฌ๋ mutex๋ฝ๊ณผ ์ ์ฌํ๊ฒ ๋์ํฉ๋๋ค. ์ฌ์ค ๋ช๋ช ์์คํ ์์๋ mutex๋ฝ์ ์ ๊ณตํ์ง ์๊ณ ์ํธ ๋ฐฐ์ ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด์ ์ด์ง ์ธ๋งํฌ๊ฐ ๋์ ์ฌ์ฉ๋ฉ๋๋ค.
์นด์ดํ ์ธ๋งํฌ๋ ์ ํํ ๊ฐ์๋ฅผ ๊ฐ์ง ์์์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ธ๋งํฌ๋ ๊ฐ์ฉํ ์์์ ๊ฐ์๋ก ์ด๊ธฐํ๋ฉ๋๋ค.
- ๊ฐ ์์์ ์ฌ์ฉํ๋ ค๋ ํ๋ก์ธ์ค๋ ์ธ๋งํฌ์ wait() ์ฐ์ฐ์ ์ํํ๋ฉฐ, ์ด๋ ์ธ๋งํฌ์ ๊ฐ์ ๊ฐ์ํฉ๋๋ค.
- ํ๋ก์ธ์ค๊ฐ ์์์ ๋ฐฉ์ถํ ๋๋ signal() ์ฐ์ฐ์ ์ํํ๊ณ ์ธ๋งํฌ๋ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
- ์ธ๋งํฌ์ ๊ฐ์ด 0์ด ๋๋ฉด ๋ชจ๋ ์์์ด ์ฌ์ฉ ์ค์์ ๋ํ๋ ๋๋ค.
- ์ดํ ์์์ ์ฌ์ฉํ๋ ค๋ ํ๋ก์ธ์ค๋ ์ธ๋งํฌ ๊ฐ์ด 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() ์ธ๋งํฌ ์ฐ์ฐ์ ์ ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ํ๋ก์ธ์ค๊ฐ wait() ์ฐ์ฐ์ ์คํํ๊ณ ์ธ๋งํฌ ๊ฐ์ด ์์๊ฐ ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ฉด, ํ๋ก์ธ์ค๋ ๋ฐ๋์ ๋๊ธฐํด์ผ ํ๋ค.
- ๊ทธ๋ฌ๋ ๋ฐ์ ๋๊ธฐ ๋์ ์ ํ๋ก์ธ์ค๋ ์์ ์ ์ผ์ ์ค์ง์ํฌ ์ ์๋ค.
- ์ผ์ ์ค์ง ์ฐ์ฐ์ ํ๋ก์ธ์ค๋ฅผ ์ธ๋งํฌ์ ์ฐ๊ด๋ ๋๊ธฐ ํ์ ๋ฃ๊ณ , ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๋๊ธฐ ์ํ๋ก ์ ํํ๋ค.
- ๊ทธ ํ์ ์ ์ด๊ฐ 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๊ฐ์ ๋ช ๋ น์ด๋ฅผ ๋์ง ์๋๋ค). ๊ทธ๋ฌ๋ฏ๋ก ์๊ณ ๊ตฌ์ญ์ ๊ฑฐ์ ํญ์ ๋น์ด ์์ผ๋ฉฐ, ๋ฐ์ ๋๊ธฐ๋ ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ฉฐ, ๋ฐ์ํ๋๋ผ๋ ๊ทธ ์๊ฐ์ด ์์ฃผ ์งง์ต๋๋ค. ์๊ณ ๊ตฌ์ญ์ด ๋งค์ฐ ๊ธธ๊ฑฐ๋(์ ๋ถ ๋๋ ์ฌ์ง์ด ์ ์๊ฐ ์ ๋) ๋๋, ๊ฑฐ์ ํญ์ ์ ์ ๋ ์์ฉ ํ๋ก๊ทธ๋จ๋ค์ ๊ฐ๋ ์ ํ ๋ค๋ฅธ ํฉ๊ฒฝ๋ ์กด์ฌํฉ๋๋ค ์ด ๊ฒฝ์ฐ์ ๋ฐ์ ๋๊ธฐ๋ ๊ทน๋๋ก ๋นํจ์จ์ ์ ๋๋ค.
์ ๋ฆฌ
- ๊ฒฝ์ ์กฐ๊ฑด์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ๋ณํํ๊ฒ(concurrently)ํ๊ฒ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ฉฐ ์ต์ข ๊ฒฐ๊ณผ๋ ๋ณํ ์ ๊ทผ์ด ๋ฐ์ํ ํน์ ์์์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. ๊ฒฝ์ ์กฐ๊ฑด์ผ๋ก ์ธํด ๊ณต์ ๋ฐ์ดํฐ ๊ฐ์ด ์์๋ ์ ์๋ค.
- ์๊ณ ๊ตฌ์ญ์ ๊ณต์ ๋ฐ์ดํฐ๊ฐ ์กฐ์๋ ์ ์์ผ๋ฉฐ, ๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐ์ํ ์ ์๋ ์ฝ๋ ์์ญ์ด๋ค. ์๊ณ๊ตฌ์ญ ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ ฅ์ ์ผ๋ก ๊ณต์ ํ๊ธฐ ์ํ์ฌ ์์ ์ ํ๋์ ๋๊ธฐํํ๋ ํ๋กํ ์ฝ์ ์ค๊ณํ๋ ๊ฒ์ด๋ค.
- ์๊ณ ๊ตฌ์ญ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ (1) ์ํธ ๋ฐฐ์ , (2) ์งํ์ ์ตํต์ฑ, (3) ํ์ ๋ ๋๊ธฐ ์ ์ธ ๊ฐ์ง ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํด์ผ ํ๋ค.
- Peterson์ ํด๊ฒฐ์๊ณผ ๊ฐ์ ์๊ณ๊ตฌ์ญ ๋ฌธ์ ์ ๋ํ ์ํํธ์จ์ด ํด๊ฒฐ์ฑ ์ ์ต์ ์ปดํจํฐ ์ํคํ ์ฒ์์ ์ ๋๋ก ์๋ํ์ง ์๋๋ค.
- ์๊ณ๊ตฌ์ญ ๋ฌธ์ ์ ๋ํ ํ๋์จ์ด ์ง์์๋ Memory Barriers, compare_and_swap ๋ช ๋ น๊ณผ ๊ฐ์ ํ๋์จ์ด ๋ช ๋ น ๋ฐ ์์์ ๋ณ์๊ฐ ํฌํจ๋๋ค.
- Mutex ๋ฝ์ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ๋ฝ์ ํ๋ํ๊ณ ์๊ณ ๊ตฌ์ญ์์ ๋์ฌ ๋ ๋ฝ์ ํด์ ํ ๊ฒ์ ์๊ตฌํจ์ผ๋ก์จ ์ํธ ๋ฐฐ์ ๋ฅผ ์ ๊ณตํ๋ค.
- Mutex ๋ฝ๊ณผ ๊ฐ์ด ์ธ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ํธ ๋ฐฐ์ ๋ฅผ ์ ๊ณตํ ์๋ ์๋ค. ๊ทธ๋ฌ๋ mutex ๋ฝ์ ๋ฝ์ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ์ด์ง ๊ฐ์ ๊ฐ์ง์ง๋ง, ์ธ๋งํฌ๋ ์ ์ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก ๋ค์ํ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.
์ธ๋งํฌ์ ๋ฎคํ ์ค์ ์ฐจ์ด
์ธ๋งํฌ์ ๋ฎคํ ์ค์ ์ฐจ์ด๋ ๊ณต์ ์์์ ์ ๊ทผํ ์ ์๋ ๋์์ ๊ฐ์ ์ฐจ์ด ์ ๋๋ค.
- ๋ฎคํ ์ค๋ ํ๊ฐ์ ์ค๋ ๋๋ง์ด ๊ณต์ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.(์ด์ง ์ธ๋งํฌ๋ ๊ฐ์ ๊ฐ๋ )
- ์ธ๋งํฌ๋ ์นด์ดํธ ๋ณ์๋ฅผ ์ฌ์ฉํด ๊ณต์ ์์์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ๋ ๊ฒ์ ๋ง์ต๋๋ค.
'ComputerScience ๐ > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[OS] ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ(1) - ๋ฌผ๋ฆฌ, ๋ ผ๋ฆฌ์ฃผ์ ๋ฐ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (0) | 2022.03.20 |
---|---|
[OS] ๊ต์ฐฉ ์ํ(Deadlocks) (0) | 2022.03.10 |
[OS] ์์ฌํ๋ ์ฒ ํ์๋ค ๋ฌธ์ (The Dining-Philosophers Problem) (0) | 2022.03.02 |
[OS] CPU ์ค์ผ์ค๋ง(CPU Scheduling) (0) | 2022.02.20 |
[OS] ์ค๋ ๋ ํ(thread pool) (0) | 2022.02.14 |
[OS] ์ค๋ ๋์ ๋์์ฑ(Thread & Concurrency) (0) | 2022.02.14 |
๋๊ธ