Table of Contents
ํ๋ก์ธ์ค๋ ๋์์ ์คํ๋ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ํ๋ ฅํ ๋๋ ํ๋ก์ธ์ค ์ฌ์ด์ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
Background
๋ง์ฝ ๋ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ด๋ค ๋ณ์์ ๊ฐ์ ๋ฐ๊พผ๋ค๋ฉด ํ๋ก๊ทธ๋๋จธ์ ์๋์๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ์ด๋ค. ์ด์ฒ๋ผ ํ๋ก์ธ์ค๊ฐ ์ด๋ค ์์๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ๋๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ฌ๋ผ์ง ์ ์๋ ์ํฉ์ ๊ฒฝ์ ์ํ(race condition)๋ผ๊ณ ํ๋ค.
The Critical-Section Problem
์ฝ๋์์์ ๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐ์ํ ์ ์๋ ํน์ ๋ถ๋ถ์ critical section์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. critical section problem๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ช๊ฐ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํ๋ค.
- Mutual exclution (์ํธ ๋ฐฐ์ ): ์ด๋ฏธ ํ ํ๋ก์ธ์ค๊ฐ critical section์์ ์์ ์ค์ผ ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ critical section์ ์ง์ ํด์๋ ์ ๋๋ค.
- Progress (์งํ): critical section์์ ์์ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ critical section์ ์ง์ ํ ์ ์์ด์ผ ํ๋ค.
- Bounded waiting (ํ์ ๋๊ธฐ): critical section์ ์ง์ ํ๋ ค๋ ํ๋ก์ธ์ค๊ฐ ๋ฌดํํ๊ฒ ๋๊ธฐํด์๋ ์ ๋๋ค.
Non-preemptive kernels๋ก ๊ตฌํํ๋ฉด ์๊ณ ์์ญ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. ํ์ง๋ง ๋น์ ์ ์ค์ผ์ค๋ง์ ๋ฐ์์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ์ํผ ์ปดํจํฐ๊ฐ ์๋๊ณ ์ ์ ์ฌ์ฉํ์ง ์๋๋ค.
Petersonโs Solution
Petersonโs solution์ผ๋ก ์๊ณ ์์ญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์๊ณ ์์ญ์์ ํ๋ก์ธ์ค๊ฐ ์์
์ค์ธ์ง ์ ์ฅํ๋ ๋ณ์ flag
์ critical section์ ์ง์
ํ๊ณ ์ํ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์ turn
์ ๋ง๋ค์ด ์ด๋ค ํ๋ก์ธ์ค๊ฐ ์๊ณ ์์ญ์ ์ง์
ํ๋ฉด flag
๋ฅผ lock
ํ๊ณ , ๋์ค๋ฉด unlock
ํ๋ ๋ฐฉ์์ผ๋ก ์๊ณ ์์ญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
do {
flag[i] = true;
turn = j;
while (flag[j] && turn == j);
// Critical section
flag[i] = false;
// Remainder section
} while(true);
Mutex Locks
mutex locks์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณตํต ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ ์ ์ดํ๋ ๊ธฐ๋ฒ์ผ๋ก, lock
์ด ํ๋๋ง ์กด์ฌํ ์ ์๋ locking ๋งค์ปค๋์ฆ์ ๋ฐ๋ฅธ๋ค. (์ฐธ๊ณ ๋ก 'mutexโ๋ 'MUTual EXclusionโ์ ์ค์ธ ๋ง์ด๋ค.) ์ด๋ฏธ ํ๋์ ์ค๋ ๋๊ฐ critical section์์ ์์
์ค์ธ lock
์ํ์์ ๋ค๋ฅธ ์ค๋ ๋๋ค์ critical section์ ์ง์
ํ ์ ์๋๋ก ํ๋ค.
Semaphores
์ธ๋งํฌ์ด(Semaphore)๋ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๋ ์ค๋ ๋๊ฐ critical section์ ์ง์ ํ ์ ์๋ locking ๋งค์ปค๋์ฆ์ด๋ค. ์ธ๋งํฌ์ด๋ ์นด์ดํฐ๋ฅผ ์ด์ฉํด ๋์์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ํ๋ก์ธ์ค๋ฅผ ์ ํํ๋ค. ๋ฌผ๋ก ํ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋์์ ๊ฐ์ ๋ณ๊ฒฝํ์ง๋ ๋ชปํ๋ค. ์ธ๋งํฌ์ด๋ P์ V๋ผ๋ ๋ช ๋ น์ผ๋ก ์ ๊ทผํ ์ ์๋ค. (P, V๋ try์ increment๋ฅผ ๋ปํ๋ ๋ค๋๋๋์ด Proberen๊ณผ Verhogen์ ๋จธ๋ฆฟ๊ธ์๋ค.)
Semaphore Usage
์ธ๋งํฌ์ด์ ์นด์ดํฐ๊ฐ ํ ๊ฐ์ธ ๊ฒฝ์ฐ ๋ฐ์ด๋๋ฆฌ ์ธ๋งํฌ์ด(Binary semaphore), ๋ ๊ฐ ์ด์์ธ ๊ฒฝ์ฐ ์นด์ดํ ์ธ๋งํฌ์ด(Counting semaphore)๋ผ๊ณ ํ๋ค. ๋ฐ์ด๋๋ฆฌ ์ธ๋งํฌ์ด๋ ์ฌ์ค์ mutex์ ๊ฐ๋ค.
Deadlocks and Starvation
๋ ํ๋ก์ธ์ค๊ฐ ์๋ก ์ข ๋ฃ๋ ๋๊น์ง ๋๊ธฐํ๋ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค๊ณ ์๊ฐํด๋ณด์. ํ๋ก์ธ์ค A๋ B๊ฐ ์ข ๋ฃ๋ ๋๊น์ง, ํ๋ก์ธ์ค B๋ A๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์์ ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ์ด๋ค ๋์๋ ํ์ง ๋ชปํ ๊ฒ์ด๋ค. ์ด์ฒ๋ผ ๋ ํ๋ก์ธ์ค๊ฐ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ๊ณ ๋์์ฃผ์ง ์๊ฑฐ๋, ์ด๋ ํ ํ๋ก์ธ์ค๋ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ์ง ๋ชปํ๋ ์ํ๊ฐ ๋์ด ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ๋ ํ์์ ๋ฐ๋๋ฝ(Deadlock)์ด๋ผ๊ณ ํ๋ค. ์ด์์ฒด์ ๋ ๊ฒฐ๊ตญ ์ํํธ์จ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋๋ฝ์ ๋น ์ง ์ ์๋ค.
Classic Problems of Synchronization
๋ฐ๋๋ฝ์ ๊ดํ ์ ๋ช ํ ๋น์ ๊ฐ ์๋ค. ์ฒ ํ์ 5๋ช ์ด ์ํ ๊ฐ์ด๋ฐ ์์์ ๋๊ณ ์ฒ ํ์๋ค์ ์ฌ์๊ณผ ์์ฌ๋ฅผ ๋ฐ๋ณตํ๋ค. ํฌํฌ๋ ์ด 5๊ฐ, ๋จ ์์์ ๋จน์ผ๋ ค๋ฉด 2๊ฐ์ ํฌํฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์ฆ, ๋์์ ์์์ ๋จน์ ์ ์๋ ์ฌ๋์ ๋ ๋ช ๋ฟ์ด๋ค. ์ด์ด ์ข์ผ๋ฉด 5๋ช ์ ์ฒ ํ์๋ค์ด ๋์๊ฐ๋ฉด์ ์ฌ์๊ณผ ์์ฌ๋ฅผ ์ด์ด๊ฐ ์ ์๋ค. ํ์ง๋ง ๋ชจ๋๊ฐ ํฌํฌ๋ฅผ ํ๋์ฉ ๋ค๊ณ ์์ฌ๋ฅผ ํ๋ คํ๋ฉด ๋๊ตฌ๋ ์์ฌ๋ฅผ ํ ์ ์๋ ์ํ, ๋ค์๋งํด ๋ฐ๋๋ฝ์ ๋น ์ ธ ๋ฒ๋ฆฐ๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ฒ ํ์๋ค์ ๋ง์ฐฌ ๋ฌธ์ (Dining-Philosophers Problem)์ด๋ค.