๋๊ธฐํ์ ๊ต์ฐฉ ์ํ

์ ๊ทธ๋ฆผ์ฒ๋ผ ํ๋ก์ธ์ค ํน์ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์์ ๊ณต์ ์์(shared resource)์ด๋ผ๊ณ ํ๋ค. ๊ณต์ ์์์ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ผ์ด ๋ ์๋ ์๊ณ , ์ ์ญ ๋ณ์๋ ์ ์ถ๋ ฅ์ฅ์น๊ฐ ๋ ์๋ ์๋ค.
๋ค์์ ํ๋ก์ธ์ค ํน์ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ์ ๊ทผํ๋ ์ฝ๋ ์ค ๋์์ ์คํํ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋๋ฅผ ์๊ณ ๊ตฌ์ญ(critical section)์ด๋ผ๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด, ํ๋ก์ธ์ค A๊ฐ ์คํ๋ ๋ค ํ๋ก์ธ์ค B๊ฐ ์คํ๋๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ํ๋ก์ธ์ค B๊ฐ ์คํ๋ ๋ค ํ๋ก์ธ์ค A๊ฐ ์คํ๋๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์ฆ, ํ๋ก์ธ์ค A์ '๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ์ฝ๋'์ ํ๋ก์ธ์ค B์ '๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฝ๋ ์ฝ๋'๋ ์๊ณ ๊ตฌ์ญ์ด ๋๋ค.

๋์์ ํ์ผ์ ์์ ํ๋ ์ค๋ ๋๋ ์๊ณ ๊ตฌ์ญ์ด ๋ฐ์ํ ์ ์๋ค. ๊ฐ ์ค๋ ๋๋ค์ด ํ์ผ์ ์์ ํ๋ ๊ณผ์ ์ (1) ํ์ผ์ ์ฝ์ด ๋ค์ด๊ณ (2) ์ํ๋ ๋ด์ฉ์ ์์ฑํ ๋ค, (3) ์์ฑํ ๋ด์ฉ์ ์ ์ฅํ๋ ๊ณผ์ ๊ณผ ๊ฐ๋ค. ์ค๋ ๋ A์ B๊ฐ ๋์์ ์ํ๋ ๊ฒฝ์ฐ, ์ค๋ ๋ A์ ์์ ๋ด์ญ์ ๋ฐ์๋์ง ์์ ์ ์๋ค.
| ์ค๋ ๋ A | (1) ํ์ผ ์ฝ๊ธฐ | (2) ํ์ผ ์ฐ๊ธฐ(thread A) | (3) ํ์ผ ์ ์ฅ | ||
| ์ค๋ ๋ B | (1) ํ์ผ ์ฝ๊ธฐ | (2) ํ์ผ ์ฐ๊ธฐ(thread B) | (3) ํ์ผ ์ ์ฅ | ||
| ํ์ผ ๋ด์ฉ | first | first | first | first thread A |
first thread B |
ํน์ ์คํ ๋์ค์ ๋ฌธ๋งฅ ๊ตํ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ ์ค๋ ๋ A์ ์์ ์ ๋ฐ์๋์ง ์์ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฐ ์ค๋ ๋๊ฐ ํ์ผ์ ์์ ํ๋ ์ฝ๋๋ ์๊ณ ๊ตฌ์ญ์ด ๋๋ค.
| ์์ ์์ | ์ค๋ ๋ A ํ์ผ ์ฝ๊ธฐ |
์ค๋ ๋ A ํ์ผ ์ฐ๊ธฐ |
์ค๋ ๋ B ํ์ผ ์ฝ๊ธฐ |
์ค๋ ๋ B ํ์ผ ์ฐ๊ธฐ |
์ค๋ ๋ A ํ์ผ ์ ์ฅ |
์ค๋ ๋ B ํ์ผ ์ ์ฅ |
|
| ํ์ผ ๋ด์ฉ | first | first | first | first | first | first thread A |
first thread B |
์ ์์๋ค์ฒ๋ผ ํ๋ก์ธ์ค ํน์ ์ค๋ ๋๊ฐ ๋์์ ์๊ณ ๊ตฌ์ญ์ ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๋ ์ด์ค ์ปจ๋์ ์ด๋ผ๊ณ ํ๋ค.
๋ ์ด์ค ์ปจ๋์ ์ด ๋ฐ์ํ๋ฉด ์์์ ์ผ๊ด์ฑ์ด ์์๋ ์ ์๊ธฐ ๋๋ฌธ์ 2๊ฐ ์ด์์ ํ๋ก์ธ์ค ํน์ ์ค๋ ๋๊ฐ ์๊ณ ์์ญ์ ์ง์ ํ๊ณ ์ ํ๋ค๋ฉด ๋ ์ค ํ๋๋ ์์ ์ด ๋๋ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ค.
๋ ์ด์ค ์ปจ๋์ ์ ๋ฐฉ์งํ๋ฉด์ ์๊ณ ๊ตฌ์ญ์ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ ํ๋ก์ธ์ค์ ์ค๋ ๋๊ฐ ๋๊ธฐํ๋์ด์ผ ํ๋ค. ํ๋ก์ธ์ค ํน์ ์ค๋ ๋์ ๋๊ธฐํ๋ ๋ค์์ 2๊ฐ์ง ์กฐ๊ฑด์ ์ค์ํ๋ฉฐ ์คํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์คํ ์์ ์ ์ด: ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๋ฅผ ์ฌ๋ฐ๋ฅธ ์์๋ก ์คํํ๊ธฐ
- ์ํธ ๋ฐฐ์ : ๋์์ ์ ๊ทผํด์๋ ์ ๋๋ ์์์ ํ๋์ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๋ง ์ ๊ทผํ๊ธฐ
๋๊ธฐํ์๋ ์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ๊ฐ ์๊ณ , ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ๊ฐ ์๋ค.
๋๊ธฐํ ๊ธฐ๋ฒ
๋ฎคํ ์ค ๋ฝ(mutex lock)
๋์์ ์ ๊ทผํด์๋ ์๋๋ ์์์ ๋์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ์ํธ ๋ฐฐ์ ๋ฅผ ๋ณด์ฅํ๋ ๋๊ธฐํ ๋๊ตฌ์ด๋ค. ๋ฎคํ ์ค ๋ฝ์ '์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋ฝ(lock)'์ด๋ผ๋ ๋ป์ด๋ค.
๋ฎคํ ์ค ๋ฝ์ ์๋ฆฌ๋ ์๊ณ ๊ตฌ์ญ์ ์ ๊ทผํ๊ณ ์ ํ๋ค๋ฉด ๋ฐ๋์ ๋ฝ(lock)์ ํ๋(acquire)ํด์ผ ํ๊ณ ,
์๊ณ ๊ตฌ์ญ์์์ ์์ ์ด ๋๋ฌ์ผ๋ฉด ๋ฝ์ ํด์ (release)ํด์ผ ํ๋ค.
์ ํ์ ์ธ ๋ฎคํ ์ค ๋ฝ์ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๋ณ์(lock)์ 2๊ฐ์ ํจ์(acquire, release)๋ก ๊ตฌํ๋๋ค.
- ๊ณต์ ํ๋ ๋ณ์: ๋ฎคํ ์ค ๋ฝ์ '๋ฝ' ์ญํ ์ ์ํ
- acquire(): ๋ฝ์ ํ๋ํ๊ธฐ ์ํ ํจ์
- release(): ํ๋ํ ๋ฝ์ ํด์ ํ๊ธฐ ์ํ ํจ์
์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๋ ค๋ฉด ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๋ฝ์ ํ๋ํ๋ ๊ณผ์ ์ธ lock.acquire()์ ํธ์ถํด์ผ ํ๋ค. ๋ง์ฝ, ์ดํ ๋ค๋ฅธ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๊ฐ lock.acquire()์ ํธ์ถํ๋๋ผ๋ ๋ฝ์ ํ๋ํ ์ ์๊ณ , ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ์๊ณ ๊ตฌ์ญ์ ์์ ์ด ๋๋๋ฉด ๋ฝ์ ํด์ ํ๊ธฐ ์ํด lock.release()๋ฅผ ํธ์ถํ๋ฉฐ, ๋ง์ฝ ์๊ณ ๊ตฌ์ญ ์์์ ๋๊ธฐํ๋ ํ๋ก์ธ์ค ํน์ ์ค๋ ๋๊ฐ ์์๋ค๋ฉด ๊ทธ๋ ๋ฝ์ ํ๋ํ๊ณ (lock.acquire() ํธ์ถ์ ์ฑ๊ณต) ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๊ฒ ๋๋ค.
lock.acquire()
// ์๊ณ ๊ตฌ์ญ
lock.release()

โ ํ๋ก์ธ์ค P1 acquire() ํธ์ถ → ์๊ณ ๊ตฌ์ญ ์ง์
โก ํ๋ก์ธ์ค P2 acquire() ํธ์ถ, lock์ ํ๋ํ์ง ๋ชปํด ์๊ณ ๊ตฌ์ญ ์ ๊ทผ ๋ถ๊ฐ
โข ํ๋ก์ธ์ค P1 ์๊ณ ๊ตฌ์ญ ์์ ์ข ๋ฃ, release() ํธ์ถ
โฃ ํ๋ก์ธ์ค P2 ์๊ณ ๊ตฌ์ญ ์ง์
ํ์ด์ฌ, C/C++ ๋ฑ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๋ฎคํ ์ค ๋ฝ์ ์ง์ํ๊ณ ์์ผ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ง์ acquire(), release() ํจ์๋ฅผ ๊ตฌํํ ํ์ ์๋ค. ๋ฎคํ ์ค ๋ฝ์ด๋ผ๋ ํํ์ ์ฌ์ฉํ์ง๋ ์์ง๋ง ์๋ฐ๋ ๋ฝ์ ์ง์ํ๋ค.
// os.Mutex.java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Mutex {
static int sharedData = 0; // ๊ณต์ ๋ฐ์ดํฐ
static Lock lock = new ReentrantLock(); // ๋ฝ ์ ์ธ
public static void main(String[] args){
Thread thread1 = new Thread(new Increment());
Thread thread2 = new Thread(new Decrement());
thread1.start(); // ์ฒซ ๋ฒ์งธ ์ค๋ ๋ ์์
thread2.start(); // ๋ ๋ฒ์งธ ์ค๋ ๋ ์์
try {
thread1.join(); // ์ฒซ ๋ฒ์งธ ์ค๋ ๋ ์ข
๋ฃ ๋๊ธฐ
thread2.join(); // ๋ ๋ฒ์จฐ ์ค๋ ๋ ์ข
๋ฃ ๋๊ธฐ
} catch (InterruptedException e){
e.printStackTrace();
}
// ์ต์ข
๊ณต์ ๋ฐ์ดํฐ ๊ฐ ์ถ๋ ฅ
System.out.println("Final value of sharedData: " + sharedData);
}
static class Increment implements Runnable {
public void run() {
for(int i=0; i<1000000;i++) {
lock.lock(); // ๋ฝ ํ๋
try {
sharedData++; // ๊ณต์ ๋ฐ์ดํฐ ์ฆ๊ฐ
}finally {
lock.unlock(); // ๋ฝ ํด์
}
}
}
}
static class Decrement implements Runnable {
public void run() {
for(int i=0; i<1000000;i++) {
lock.lock(); // ๋ฝ ํ๋
try {
sharedData--; // ๊ณต์ ๋ฐ์ดํฐ ๊ฐ์
}finally {
lock.unlock(); // ๋ฝ ํด์
}
}
}
}
}
์ธ๋งํฌ(semaphore)
๋ฎคํ ์ค ๋ฝ์ ํ๋์ ๊ณต์ ์์์ ๊ณ ๋ คํ๋ ๋๊ธฐํ ๋๊ตฌ์ด๊ณ , ์ธ๋งํฌ๋ ๋ฎคํ ์ค ๋ฝ๊ณผ ๋น์ทํ์ง๋ง, ๊ณต์ ์์์ด ์ฌ๋ฌ ๊ฐ ์๋ ์ํฉ์์๋ ๋๊ธฐํ๊ฐ ๊ฐ๋ฅํ ๋๊ตฌ์ด๋ค.
์ธ๋งํฌ๋ ๋ฎคํ ์ค๋ฝ๊ณผ ๋น์ทํ๊ฒ ํ๋์ ๋ณ์์ 2๊ฐ์ ํจ์๋ก ๊ตฌ์ฑ๋๋ค.
- ๋ณ์ S: ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ณ์ → ์๊ณ ๊ตฌ์ญ์ ์ง์
ํ ์ ์๋ ํ๋ก์ธ์ค์ ๊ฐ์
๊ณต์ ์์์ ๊ฐ์๊ฐ S๊ฐ์ผ ๊ฒฝ์ฐ, ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ์ฌ ๋์์ ์คํ ๊ฐ๋ฅํ ํ๋ก์ธ์ค ํน์ ์ค๋ ๋๋ S๊ฐ์ด๋ค. - wait() ํจ์: ์๊ณ ๊ตฌ์ญ ์ง์ ์ ํธ์ถํ๋ ํจ์
- signal() ํจ์: ์๊ณ ๊ตฌ์ญ ์ง์ ํ ํธ์ถํ๋ ํจ์
wait()
// ์๊ณ ๊ตฌ์ญ
signal()
wait()๋ ํจ์ ํธ์ถ ์ ๊ฐ์ฅ ๋จผ์ (1) ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ณ์ S๋ฅผ 1 ๊ฐ์์ํค๊ณ , (2) ๋ณ์ S์ ๊ฐ์ด 0๋ณด๋ค ์์์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
- S๋ฅผ 1 ๊ฐ์์์ผฐ์ ๋ S๊ฐ 0 ์ด์์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์๊ฐ ๋จ์ ์์์์ ์๋ฏธํ๋ค. ์ด ๊ฒฝ์ฐ, wait()๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๋ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๋ค.
- S๋ฅผ 1 ๊ฐ์์์ผฐ์ ๋ S๊ฐ 0 ๋ฏธ๋ง์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์๊ฐ ๋จ์ ์์ง ์์์์ ์๋ฏธํ๋ค. ๋ณ์ S์ ๊ฐ์ด 0๋ณด๋ค ์์ผ๋ฉด (3) wait()๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๋ ๋๊ธฐ ์ํ๋ก ์ ํ๋์ด ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๊ฒ ๋๋ค.
wait() {
S--; // (1)
if (S < 0) { // (2)
sleep(); // (3)
}
}
signal() ํจ์๋ ์๊ณ ๊ตฌ์ญ์์์ ์์ ์ด ๋๋ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๊ฐ ํธ์ถํ๋ค. signal()์ ํจ์ ํธ์ถ ์ ๊ฐ์ฅ ๋จผ์ (1) ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ณ์ S๋ฅผ 1 ์ฆ๊ฐ์ํค๊ณ , (2) ๋ณ์ S์ ๊ฐ์ด 0 ์ดํ์ธ์ง ํ์ธํ๋ค.
- S๋ฅผ 1 ์ฆ๊ฐ์์ผฐ์ ๋ S๊ฐ 0๋ณด๋ค ํฌ๋ค๋ ๊ฒ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์๊ฐ 1๊ฐ ์ด์ ๋จ์ ์์์ ์๋ฏธํ๋ค.
- S๋ฅผ 1 ์ฆ๊ฐ์์ผฐ์ ๋ 0 ์ดํ๋ผ๋ ๊ฒ์ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๊ธฐ ์ํด ๋๊ธฐํ๋ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํจ์ ์๋ฏธํ๋ค. ์ด ๊ฒฝ์ฐ (3) ๋๊ธฐ ์ํ๋ก ์ ์ด๋ ํ๋ก์ธ์ค ์ค ํ๋๋ฅผ ์ค๋น ์ํ๋ก ์ ํํ๋ค.
siganl(){
S++; // (1)
if (S <= 0) { // (2)
wakeup(p) // (3)
}
}
์๋์ฒ๋ผ ๊ณต์ ์์์ด 2๊ฐ, ์ ๊ทผํ๋ ค๋ ํ๋ก์ธ์ค๊ฐ 3๊ฐ์ด๊ณ , P1→P2→P3 ์์ผ๋ก ์๊ณ ๊ตฌ์ญ์ ์ ๊ทผํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์คํ๋๋ค.

โ ํ๋ก์ธ์ค P1 wait() ํธ์ถ, S๋ฅผ 1 ๊ฐ์์ํค๋ฉด S = 1 ์ด๋ฏ๋ก ์๊ณ ๊ตฌ์ญ ์ง์
โก ํ๋ก์ธ์ค P2 wait() ํธ์ถ, S๋ฅผ 1 ๊ฐ์์ํค๋ฉด S = 0 ์ด๋ฏ๋ก ์๊ณ ๊ตฌ์ญ ์ง์
โข ํ๋ก์ธ์ค P3 wait() ํธ์ถ, S๋ฅผ 1 ๊ฐ์์ํค๋ฉด S = -1 ์ด๋ฏ๋ก ๋๊ธฐ ์ํ๋ก ์ ํ
โฃ ํ๋ก์ธ์ค P1 ์๊ณ ๊ตฌ์ญ ์์ ์ข ๋ฃ. signal() ํธ์ถ. S๋ฅผ 1 ์ฆ๊ฐ์ํค๋ฉด S=0์ด๋ฏ๋ก ๋๊ธฐ ์ํ์๋ P3์ ์ค๋น ์ํ๋ก ์ ํ
โค ๊นจ์ด๋ ํ๋ก์ธ์ค P3 ์๊ณ ๊ตฌ์ญ ์ง์
โฅ ํ๋ก์ธ์ค P2 ์๊ณ ๊ตฌ์ญ ์์ ์ข ๋ฃ. signal() ํธ์ถ. S๋ฅผ 1 ์ฆ๊ฐ์ํค๋ฉด S=1
โฆ ํ๋ก์ธ์ค P3 ์๊ณ ๊ตฌ์ญ ์์ ์ข ๋ฃ. signal() ํธ์ถ. S๋ฅผ 1 ์ฆ๊ฐ์ํค๋ฉด S=2
์ธ๋งํฌ๋ ๋ฎคํ ์ค ๋ฝ์ฒ๋ผ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ง์ํ๊ณ ์๋ค.
import java.util.concurrent.Semaphore;
public class Sem {
static int sharedData = 0; // ๊ณต์ ๋ฐ์ดํฐ
// ์ธ๋งํฌ ์์ฑ, ๊ณต์ ์์ 1๊ฐ
static Semaphore semaphore = new Semaphore(1);
public static void main(String[] args){
Thread thread1 = new Thread(new Increment());
Thread thread2 = new Thread(new Decrement());
thread1.start(); // ์ฒซ ๋ฒ์งธ ์ค๋ ๋ ์์
thread2.start(); // ๋ ๋ฒ์งธ ์ค๋ ๋ ์์
try {
thread1.join(); // ์ฒซ ๋ฒ์งธ ์ค๋ ๋ ์ข
๋ฃ ๋๊ธฐ
thread2.join(); // ๋ ๋ฒ์จฐ ์ค๋ ๋ ์ข
๋ฃ ๋๊ธฐ
} catch (InterruptedException e){
e.printStackTrace();
}
// ์ต์ข
๊ณต์ ๋ฐ์ดํฐ ๊ฐ ์ถ๋ ฅ
System.out.println("Final value of sharedData: " + sharedData);
}
static class Increment implements Runnable {
public void run() {
for(int i=0; i<1000000;i++) {
try {
semaphore.acquire(); // ์ธ๋งํฌ ํ๋
sharedData++; // ๊ณต์ ๋ฐ์ดํฐ ์ฆ๊ฐ
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // ์ธ๋งํฌ ํด์
}
}
}
}
static class Decrement implements Runnable {
public void run() {
for(int i=0; i<1000000;i++) {
try {
semaphore.acquire(); // ์ธ๋งํฌ ํ๋
sharedData--; // ๊ณต์ ๋ฐ์ดํฐ ๊ฐ์
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // ์ธ๋งํฌ ํด์
}
}
}
}
}
์ด์ง ์ธ๋งํฌ์ ์นด์ดํ ์ธ๋งํฌ
์ธ๋งํฌ๋ ํฌ๊ฒ 2๊ฐ์ง ์ข ๋ฅ๋ก ๊ตฌ๋ถํ ์ ์๋๋ฐ, ํ๋๋ ์ด์ง ์ธ๋งํฌ์ด๊ณ , ๋ ํ๋๋ ์นด์ดํ ์ธ๋งํฌ์ด๋ค. ์ ์ธ๋งํฌ๋ ์นด์ดํ ์ธ๋งํฌ๋ก, ๊ณต์ ์์์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ ์ธ๋งํฌ์ด๋ค. ์ด์ง ์ธ๋งํฌ๋ S๊ฐ 0๊ณผ 1์ ๊ฐ์ ๊ฐ์ง๋ ์ธ๋งํฌ๋ก, ์ฌ์ค์ ๋ฎคํ ์ค ๋ฝ๊ณผ ์ ์ฌํ๊ฒ ๋์ํ๋ค.
์กฐ๊ฑด ๋ณ์์ ๋ชจ๋ํฐ
์กฐ๊ฑด ๋ณ์
์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ ๋๊ตฌ๋ก, ํน์ ์กฐ๊ฑด ํ์ ํ๋ก์ธ์ค๋ฅผ ์คํ/์ผ์ ์ค๋จํจ์ผ๋ก์จ ํ๋ก์ธ์ค๋ ์ค๋ ๋์ ์คํ ์์๋ฅผ ์ ์ดํ ์ ์๋ค.
์กฐ๊ฑด ๋ณ์์ ๋ํด wait()์ signal() ํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ฐ, wait() ํจ์๋ ํธ์ถํ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋์ ์ํ๋ฅผ ๋๊ธฐ ์ํ๋ก ์ ํํ๋ ํจ์์ด๊ณ , signal() ํจ์๋ wait()๋ก ์ผ์ ์ค์ง๋ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋์ ์คํ์ ์ฌ๊ฐํ๋ ํจ์์ด๋ค.
- ์์ง ํน์ ํ๋ก์ธ์ค๊ฐ ์คํ๋ ์กฐ๊ฑด์ด ๋์ง ์์์ ๋๋ wait()๋ฅผ ํตํด ์คํ์ ์ค๋จํ๋ค.
- ํน์ ํ๋ก์ธ์ค๊ฐ ์คํ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์์ ๋๋ signal()์ ํตํด ์คํ์ ์ฌ๊ฐํ๋ค.

cv๋ผ๋ ์กฐ๊ฑด ๋ณ์๊ฐ ์๊ณ , ํ๋ก์ธ์ค P1์ ์คํ ๋์ค์ ์กฐ๊ฑด ๋ณ์ cv์ ๋ํด wait() ํจ์๊ฐ ํธ์ถํ๋ฉด, ํด๋น ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ cv.signal()์ ํธ์ถํ๊ธฐ ์ ๊น์ง ๋๊ธฐ ์ํ๋ก ์ ์ด๋ ๋ค.
๋ชจ๋ํฐ(monitor)
๊ณต์ ์์๊ณผ ๊ทธ ๊ณต์ ์์์ ๋ค๋ฃจ๋ ํจ์(์ธํฐํ์ด์ค)๋ก ๊ตฌ์ฑ๋ ๋๊ธฐํ ๋๊ตฌ๋ก, ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ๋ฟ๋ง ์๋๋ผ ์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ๊น์ง ๊ฐ๋ฅํ๋ค.

ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๋ ๊ณต์ ์์์ ์ ๊ทผํ๊ธฐ ์ํด ๋ฐ๋์ ์ ํด์ง ๊ณต์ ์์ ์ฐ์ฐ(์ธํฐํ์ด์ค)์ ํตํด ๋ชจ๋ํฐ ๋ด๋ก ์ง์ ํด์ผ ํ๊ณ , ๋ชจ๋ํฐ ์์ ์ง์ ํ์ฌ ์คํ๋๋ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๋ ํญ์ ํ๋์ฌ์ผ ํ๋ค. ์ด๋ฏธ ๋ชจ๋ํฐ ๋ด๋ก ์ง์ ํด ์คํ ์ค์ธ ํ๋ก์ธ์ค ๋ฐ ์ค๋ ๋๊ฐ ์๋ค๋ฉด ํ์์ ๋๊ธฐํด์ผ ํ๋ค.
์กฐ๊ฑด๋ณ์๋ฅผ ํจ๊ป ํ์ฉํ๋ฉด ์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ๋ ๊ตฌํํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋์์ ์คํ๋๋ ํ๋ก์ธ์ค A, B ์ค ๋ฐ๋์ A๊ฐ ๋จผ์ ์คํ๋๊ณ , ๋ค์์ผ๋ก B๊ฐ ์คํ๋์ด์ผ ํ๋ ์กฐ๊ฑด์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด, ํ๋ก์ธ์ค B๋ ๋ชจ๋ํฐ ๋ด์์ ์คํ๋๊ธฐ์ ์์ ํ๋ก์ธ์ค A์ ์คํ์ด ๋๋ฌ๋์ง๋ฅผ ๊ฒ์ฌํ๋ค.
- ํ๋ก์ธ์ค B๊ฐ ํ๋ก์ธ์ค A๋ณด๋ค ๋์ค์ ๋ชจ๋ํฐ ๋ด๋ก ์ง์ ํ์ ๊ฒฝ์ฐ, 'ํ๋ก์ธ์ค A๊ฐ ๋จผ์ ์คํ๋๊ณ , ํ๋ก์ธ์ค B๊ฐ ์คํ๋์ด์ผ ํ๋ค.'๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ์ธ์ด ํ๋ก์ธ์ค B๋ ๋ชจ๋ํฐ ๋ด๋ก ์ง์ ํด ์คํ๋๋ค.

- ํ๋ก์ธ์ค B๊ฐ ํ๋ก์ธ์ค A๋ณด๋ค ๋จผ์ ๋ชจ๋ํฐ ๋ด๋ก ์ง์
ํ์ ๊ฒฝ์ฐ, 'ํ๋ก์ธ์ค A๊ฐ ๋จผ์ ์คํ๋๊ณ B๊ฐ ์คํ๋์ด์ผ ํ๋ค'๋ ์กฐ๊ฑด์ ์ด๊ธ๋๋ฏ๋ก, ํน์ ์กฐ๊ฑด ๋ณ์(cv)์ ๋ํด cv.wait()๋ฅผ ํธ์ถํด ํ๋ก์ธ์ค B๋ฅผ ๋๊ธฐ ์ํ๋ก ์ ์ด๋ค๊ฒ ํ ์ ์๋ค.
ํ๋ก์ธ์ค B๊ฐ ๋๊ธฐํ๊ณ ์๋ ์ฌ์ด ํ๋ก์ธ์ค A๊ฐ ๋ชจ๋ํฐ ๋ด๋ก ์ง์ ํด ์คํ๋ ์ ์๊ณ , ์คํ ์ดํ cv.signal()์ ํธ์ถํด ๋๊ธฐ ์ํ์ ์๋ ํ๋ก์ธ์ค B๋ฅผ ๋ชจ๋ํฐ ์์ผ๋ก ์ฌ์ง์ ์ํฌ ์ ์๋ค.


์ค๋ ๋ ์์
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ด๋ค ๋ณ์๋ ํจ์, ๊ฐ์ฒด์ ๋์ ์ ๊ทผ์ด ์ด๋ฃจ์ด์ ธ๋ ์คํ์ ๋ฌธ์ ๊ฐ ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ค. ๋ ์ด์ค ์ปจ๋์ ์ด ๋ฐ์ํ๋ค๋ฉด ์ด๋ ์ค๋ ๋ ์์ ํ์ง ์์ ์ํฉ์ด์ง๋ง, ์ด๋ค ํจ์๊ฐ ์ค๋ ๋ ์์ ํ๋ค๋ฉด, ์ด๋ ์ฌ๋ฌ ์ค๋ ๋์ ์ํด ํธ์ถ๋์ด๋ ๋ ์ด์ค ์ปจ๋์ ์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ต์ฐฉ ์ํ
์ผ์ด๋์ง ์์ ์ฌ๊ฑด์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ํ๋ก์ธ์ค์ ์งํ์ด ๋ฉ์ถฐ ๋ฒ๋ฆฌ๋ ํ์์ ๋งํ๋ค. ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ํ๋ก์ธ์ค A๋ ์์ X๋ฅผ ์ ์ ํ ์ฑ ํ๋ก์ธ์ค B๊ฐ ์ ์ ํ๊ณ ์๋ ์์ Y์ ์ฌ์ฉ์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , ํ๋ก์ธ์ค B๋ ์์ Y๋ฅผ ์ ์ ํ ์ฑ ํ๋ก์ธ์ค A๊ฐ ์ ์ ํ ์์ X์ ์ฌ์ฉ์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ๋ ํ๋ก์ธ์ค๋ ์๋ก๊ฐ ๊ฐ์ง ์์์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ํ๋ก์ธ์ค๋ฅผ ์คํํ์ง ๋ชปํ๋ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ค.

๊ต์ฐฉ ์ํ ๋ฐ์ ์กฐ๊ฑด
๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ ์ํฉ์๋ 4๊ฐ์ง ํ์ ์กฐ๊ฑด์ด ์๋ค. ์ด ์ค ํ๋๋ผ๋ ๋ง์กฑํ์ง ์๋๋ค๋ฉด ๊ต์ฐฉ ์ํ๋ ๋ฐ์ํ์ง ์๊ณ , 4๊ฐ์ ์กฐ๊ฑด์ด ๋ชจ๋ ๋ง์กฑํ ๋ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธด๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
- ์ํธ ๋ฐฐ์
ํ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๋ ์์์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ ์ ์๋ ์ํธ ๋ฐฐ์ ์ ์ํฉ์์ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ์ ์๋ค. - ์ ์ ์ ๋๊ธฐ
ํ ํ๋ก์ธ์ค๊ฐ ์ด๋ค ์์์ ํ ๋น๋ฐ์ ์ํ(์ ์ )์์ ๋ค๋ฅธ ์์ ํ ๋น๋ฐ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค๋ฉด(๋๊ธฐ) ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ์ ์๋ค. - ๋น์ ์
์ด๋ค ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์์์ ๊ฐ์ ๋ก ๋บด์์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ์ ์๋ค. - ํํ ๋๊ธฐ
ํ๋ก์ธ์ค์ ํ๋ก์ธ์ค๊ฐ ์์ฒญํ ์์์ด ์์ ํํ๋ฅผ ์ด๋ฃจ๋ ๊ฒฝ์ฐ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ต์ฐฉ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ด์์ฒด์ ๋ ๊ต์ฐฉ ์ํ์ ๋ฐ์ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์๋๋ก ์์์ ๋ถ๋ฐฐํ๋ ๋ฐฉ์์ผ๋ก ๊ต์ฐฉ ์ํ๋ฅผ ์๋ฐฉํ ์ ์๊ณ , ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ง ์์ ์ ๋๋ก ์กฐ๊ธ์ฉ ์์์ ํ ๋นํ๋ค๊ฐ ๊ต์ฐฉ ์ํ์ ์ํ์ด ์์ ๋ ์์์ ํ ๋นํ์ง ์๋ ๋ฐฉ์์ผ๋ก ๊ต์ฐฉ ์ํ๋ฅผ ํํผํ ์๋ ์๋ค. ๋ ์์์ ์ ์ฝ ์์ด ํ ๋นํ๋ค๊ฐ ๊ต์ฐฉ ์ํ๋ฅผ ๊ฒ์ถํ ํ ํ๋ณตํ ์ ์๋ค.
- ๊ต์ฐฉ ์ํ ์๋ฐฉ
๊ต์ฐฉ ์ํ๋ฅผ ๋ฐ์์ํค๋ 4๊ฐ์ง ํ์ ์กฐ๊ฑด ์ค ํ๋๋ฅผ ์ถฉ์กฑํ์ง ๋ชปํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ํ ํ๋ก์ธ์ค์ ํ์ํ ์์์ ๋ชฐ์ ์ฃผ๊ณ , ๊ทธ ๋ค์์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ํ์ํ ์์์ ๋ชฐ์ ์ฃผ๋ฉด ์ ์ ์ ๋๊ธฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฏ๋ก ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
- ํ ๋น ๊ฐ๋ฅํ ๋ชจ๋ ์์์ ๋ฒํธ๋ฅผ ๋งค๊ธฐ๊ณ ์ค๋ฆ์ฐจ์์ผ๋ก ํ ๋นํ๋ ๊ฒฝ์ฐ๋ ์ํ ๋๊ธฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฏ๋ก ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. - ๊ต์ฐฉ ์ํ ํํผ
๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ง ์์ ์ ๋๋ก๋ง ์กฐ์ฌํ๋ฉด์ ์์์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ต์ฐฉ ์ํ ํํผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ต์ฐฉ ์ํ๋ฅผ ํ์ ๋ ์์์ ๋ฌด๋ถ๋ณํ ํ ๋น์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก ๊ฐ์ฃผํ๋ค.
ํ๋ก์ธ์ค์ ํ ๋นํ ์ ์๋ ์์์ด ์ถฉ๋ถํ ์ํฉ์์๋ ํ๋ก์ธ์ค๋ค์ด ํ๋ ๊ฐ์ ์ ์ ์์๋ง ์๊ตฌํ๋ค๋ฉด ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง, ์์์ด ํ์ ๋ ์ํฉ์์๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ค์ด ํ ๋ฒ์ ๋ง์ ์์์ ์๊ตฌํ๋ค๋ฉด ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ์ํ์ด ์ฆ๊ฐํ๋ค.
๊ต์ฐฉ ์ํ ํํผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค. - ๊ต์ฐฉ ์ํ ๊ฒ์ถ ํ ํํผ
๊ต์ฐฉ ์ํ์ ๋ฐ์์ ์ธ์ ํ๊ณ ์ฒ๋ฆฌํ๋ ์ฌํ ์กฐ์น์ ํด๋นํ๋ฉฐ, ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๊ฐ ์์์ ์๊ตฌํ ๋๋ง๋ค ๊ทธ๋ ๊ทธ๋ ์์์ ํ ๋นํ๊ณ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ต์ฐฉ ์ํ์ ๋ฐ์ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค. ๊ต์ฐฉ ์ํ๊ฐ ๊ฒ์ถ๋๋ฉด ํ๋ก์ธ์ค๋ฅผ ์์ ์ ์ ์ ํตํด ํ๋ณต์ํค๊ฑฐ๋, ๊ต์ฐฉ ์ํ์ ๋์ธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข ๋ฃํจ์ผ๋ก์จ ํ๋ณต์ํฌ ์ ์๋ค.
- ์์ ์ ์ ์ ํตํ ํ๋ณต: ๊ต์ฐฉ ์ํ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก๋ถํฐ ๊ฐ์ ๋ก ์์์ ๋นผ์์ ํ ํ๋ก์ธ์ค์ ๋ชฐ์์ ํ ๋นํ๋ ๊ฒ
์ฐธ๊ณ ์๋ฃ