Intro
๋๊ธฐํ(Synchronization)
Race Conditions
Critical Region
ํด๊ฒฐ์ฑ
Mutex & Semaphore
Lock
Semaphores
Monitor
ํ๋ก์ธ์ค๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ด๋ค.
ํ๋ก๊ทธ๋จ์ ์ํํ๊ธฐ ์ํด์ Processor(CPU)๊ฐ ํ์ํ๋ค. ์ด์์ฒด์ ๋ ์ฌ์ฉ์์๊ฒ ๋์์ ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ณ ์๋ค๋ ์ฐฉ๊ฐ์ ์ผ์ผํจ๋ค. ์ฌ์ค CPU๋ process to process๋ก switch๋ฅผ ํ๋ฉด์ ์ฌ๋ฌ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์ํํ๋ ๊ฒ์ด๋ค.
๊ฐ๊ฐ์ ํ๋ก์ธ์ค๋ address space(core image), process table entry๋ฅผ ๊ฐ์ง๋ค.
- Running,์คํ
- ์ค์ ๋ก CPU๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ํ
- Ready,์ค๋น
- Runnable, ์ผ์์ ์ผ๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์คํ๋๋๋ก ๋ฉ์ถฐ์๋ ์ํ
- CPU๋ process๊ฐ์ ๊ณต์ ๋์ด์ผ ํ๋ค.
- Blocked
- ์ค๋จ๋ ์ํ, disk๊ฐ ์ฝํ๊ฑฐ๋ ์ ๋ ฅ์ด ๋ค์ด์์ ์ผ์์ ์ผ๋ก runํ ์ ์๋ ์ํ
๊ณต์ ๋ฐ์ดํฐ(Shared data)์ ๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ ๊ทผํ๋ฉด data inconsistency(๋ฐ์ดํฐ ๋ชจ์์ฑ)๊ฐ ๋ฐ์ ํ ์ ์๋ค.
- ์ธ ๊ฐ์ง ์ด์
- ์ด๋ป๊ฒ ํ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ์ ๋ณด๋ฅผ ๋๊ธธ ๊ฒ์ธ๊ฐ?
- ๋๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ํ๋์ ๋ฐ์ดํฐ์ ๋์์ ์ ๊ทผํ์ง ์๋๋ก ํ ๊ฒ์ธ๊ฐ?
- ์์กด ๊ด๊ณ๊ฐ ์กด์ฌํ ๋ ์ด๋ป๊ฒ ์ ์ ํ ์์ ๋ถ์ฌ๋ฅผ ํ ๊ฒ์ธ๊ฐ?
- ๋ง์ฝ process A๊ฐ ๋ฐ์ดํฐ C ์์ฐํ๊ณ , B๊ฐ C๋ฅผ ์ถ๋ ฅํ๋ ์ญํ ์ ์ํํ๋ค๋ฉด, B๋ A๊ฐ ์ํ๋ ํ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
Race condition(๊ฒฝ์ ์ํ)์ ๋ ๊ฐ ๋๋ ์ด์์ ํ๋ก์ธ์ค๊ฐ shared data๋ฅผ ๋์์ ์ฝ๊ฑฐ๋ ์ฐ๋ ์ํฉ์์ ๋ง์ง๋ง ๊ฒฐ๊ณผ๋ ์ ํํ ์ด๋ค ํ๋ก์ธ์ค๊ฐ ์ธ์ ์ํ๋์๋์ง์ ๋ฐ๋ผ์ ๊ฒฐ์ ๋๋ค.
- ์ปค๋ ์์ ์ ์ํ ์ค์ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ ๋
- ํ๋ก์ธ์ค๊ฐ system call์ ํ์ฌ ์ปค๋ ๋ชจ๋๋ก ์ง์ ํ์ฌ ์์ ์ ์ํํ๋ ๋์ค context switch๊ฐ ๋ฐ์ํ ๋
- ๋ฉํฐ ํ๋ก์ธ์์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์ปค๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋
- Mutual Exclusion(์ํธ๋ฐฐ์ )
- ํ ํ๋ก์ธ์ค๊ฐ Critical region์ ๋ค์ด์ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ critical region์ ๋ค์ด๊ฐ ์ ์๋ค.
- Critical Region(์๊ณ๊ตฌ์ญ)
- ๋ฉํฐ ํ๋ก์ธ์ค ํ๊ฒฝ์์ ๋ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ ๊ทผํด์๋ ์๋๋ ๊ณต์ ์์์ ์ฝ๋ ์์ญ ์ด๋ค.
critical region์ ์๊ฐ์ด ์ง๋๋ฉด ์ข ๋ฃ๋๋ฉฐ, ์ด๋ค ํ๋ก์ธ์ค๊ฐ ์๊ณ๊ตฌ์ญ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์ง์ ๋ ์๊ฐ๋งํผ ๋๊ธฐํด์ผ ํ๋ค. ์ด๋ ์ค๋ ๋๋ ํ๋ก์ธ์ค๊ฐ ๋ฐฐํ์ ์ธ ์ฌ์ฉ๊ถ์ ๋ณด์ฅ๋ฐ๊ธฐ ์ํด์ ์ธ๋งํฌ์ด ๊ฐ์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ค.
- Mutual Exclusion
- ๋๊ฐ์ ํ๋ก์ธ์ค๋ ๋์์ critical region์ ๋ค์ด๊ฐ ์ ์๋ค.
- CPU์ ๊ฐฏ์๋ ์ฑ๋ฅ์ ๊ดํ์ฌ ์ด๋ ํ ๊ฐ์ ๋ ํด์๋ ์๋๋ค.
- Critical region ๋ฐ์ ์๋ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ process๋ฅผ blockํด์๋ ์๋๋ค.
- Bounded Waiting(ํ์ ๋๊ธฐ)
- ๊ทธ ์ด๋ค ํ๋ก์ธ์ค๋ critical region์ ๋ค์ด๊ฐ๊ธฐ ์ํด ์์ํ ๊ธฐ๋ค๋ ค์๋ ์๋๋ค.
์ ๋ ์ ๋ค ๊ฐ์ง๋ก ๋ฐฐ์ ์ง๋ง ๋ค๋ฅธ ๊ณณ์์ ์ธ ๊ฐ์ง๋ก ์ ๋ฆฌํ๊ฒ ๋ง์ ์ธ ๊ฐ์ง๋ ์ ์ด๋ณด๊ฒ ์ต๋๋ค.
- Mutual Exclusion(์ํธ๋ฐฐ์ ) - ํ๋์ ํ๋ก์ธ์ค๊ฐ ์๊ณ๊ตฌ์ญ์ ์๋ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๋ค์ด๊ฐ ์ ์๋ค.
- Progress(์งํ) - ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด ์ด๋ ํ๋ก์ธ์ค๊ฐ ๋ค์ด๊ฐ ๊ฒ์ธ์ง ์ ์ ํ ์ ํํด์ค์ผ ํ๋ค.
- Bounded Waiting(ํ์ ๋๊ธฐ) - ๊ทธ ์ด๋ค ํ๋ก์ธ์ค๋ critical region์ ๋ค์ด๊ฐ๊ธฐ ์ํด ์์ํ ๊ธฐ๋ค๋ ค์๋ ์๋๋ค.
์๊ณ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ์์ ๋ง์ง๋ง ํฌ๊ฒ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉด
- Disabling Interrupt
- Lock
- Peterson's solution
- TSL instruction(h/w)
- Sleep and Wakeup
- Producer-consumer
- Semaphore
- Monitor ๋ฑ๋ฑ ๋ง์ต๋๋ค. ํ์ง๋ง ์ฃผ๋ก ๋ค๋ฃจ๋ ๊ฒ์ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ๊ถ๊ธํ์ ๋ถ๋ค์ ๊ฐ์ธ์ ์ผ๋ก ์ฐพ์๋ณด์๋ฉด ๋๊ณ ์ ์๊ฐ์๋ ๋ฉด์ ์ ๋ณด๊ธฐ ์ํด์ ๊ผญ ์์์ผ ํ๋ ๊ฐ๋ ์ ์๋ ์ธ๊ฐ์ง ์ ๋์ธ ๊ฑฐ ๊ฐ์ต๋๋ค.
์ํํธ์จ์ด์ ์ธ ํด๊ฒฐ๋ฐฉ๋ฒ์ผ๋ก ๊ณต์ ๋ฝ์ ์ด์ฉํ๋ค.
- ์ด๋ค ํ๋ก์ธ์ค๊ฐ critical region์ ๋ค์ด๊ฐ๋ ค ํ ๋ lock์ ๊ฒ์ฌํ๋ค.
- ๋ง์ฝ lock์ด 0์ด๋ผ๋ฉด, ํ๋ก์ธ์ค๋ lock->1๋ก ๋ฐ๊พธ๊ณ critical region์ ๋ค์ด๊ฐ๋ค.
- ๋ง์ฝ lock์ด ์ด๋ฏธ 1์ด๋ผ๋ฉด, ํ๋ก์ธ์ค๋ lock์ด 0์ผ๋ก ๋ฐ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
*Spooler directory์ ๊ฐ์ ๊ฒฐ์ ์ ๊ฐ์ง๊ณ ์๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ mutual exclusion์ ์ ๊ณตํ์ง ๋ชปํฉ๋๋ค.
๋ฌธ์ ์ํฉ ์์
1. A๊ฐ lock์ 0์ธ ๊ฒ ํ์ธ
2. B ์ฐจ๋ก๊ฐ ๋์ด lock์ด 0์ธ ๊ฒ์ ํ์ธํ์ฌ critical region์ ์ง์
ํ๋ฉด์,
lock -> 1๋ก ๋ฐ๊ฟ
3. ํ์ง๋ง A๊ฐ critical region์ ๋ค์ด๊ฐ๋ ค๊ณ ํ์ธํ ๊ฑฐ์์ด์ critical region
์ ๋ค์ด๊ฐ๊ณ ๋ณ์ 1๋ก ๋ฐ๊พผ๋ค.
=> A, B ๋์์ critical region์ ๋ค์ด๊ฐ๊ณ ์กฐ๊ฑด 1์ ์๋ฐฐ
- ์ธ๋งํฌ์ด๋ ์์์ ๊ฐ์๋ฅผ ๋ปํ๋ค.
- ๋์์ ์์์ ์ ๊ทผํ ์ ์๋ ํ์ฉ๊ฐ๋ฅํ counter์ ๊ฐ์
- ์ธ๋งํฌ์ด๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ค์ ์ํด ๊ณต์ ๋๋ ๋ณ์ ๋ก ์ ์
- ์ด ๋ณ์๋ ์ค์ง P, V๋ผ๋ atomicํ ์ฐ์ฐ์ ์ํด์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- ๋ฆฌ์์ค ์ํ๋ฅผ ๋ํ๋ด๋ ์นด์ดํฐ ๊ฐ๋ ์ด๋ค.
- lock์ ๊ฒฝ์ฐ์๋ 0, 1๋ก๋ง ๊ตฌ๋ถ์ ํ์ง๋ง ์ธ๋งํฌ์ด๋ shared data ๊ฐ์๋ฅผ ์๋ฏธํ๋ค. semaphore๋ lock๊ณผ๋ ๋ฌ๋ฆฌ 1๋ก ์ด๊ธฐํํ๊ณ ์ฌ์ฉ์ค์ด๋ฉด 0์ผ๋ก ๋ฐ๋๋ค.
- ์ธ๋งํฌ์ด๋ ์์ ์ ๊ฐ๋
์ด ์๋ค.(์นด์ดํฐ๋ก ์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ)
- ์ธ๋งํฌ์ด๋ฅผ ์์ ํ์ง ์์ ํ๋ก์ธ์ค๊ฐ ์ธ๋งํฌ์ด๋ฅผ ํด์ ํ ์๋ ์๋ ๋ฌธ์ ๊ฐ ์์ => mutual exclusion ์ด ๋ณด์ฅ๋์ง ์๋๊ฒ ์๋๊ฐ..?
- Semaphore counter ๊ฐฏ์ 1๊ฐ - binary semaphore, 2 ์ด์ - counting semaphore
- Down(P) operation
- ๋ง์ฝ ์ธ๋งํฌ์ด๊ฐ 0๋ณด๋ค ํฌ๋ค๋ฉด, ๊ฐ์ ๊ฐ์์ํจ๋ค.
- ๋ง์ฝ ์ธ๋งํฌ์ด๊ฐ ์ด๋ฏธ 0์ด๋ผ๋ฉด process๋ down(P) op๋ฅผ ๋๋ด์ง์๊ณ sleepํ๋ค.
- critical region
- up(V) operation
- ์ธ๋งํฌ์ด ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉด์ ์ธ๋งํฌ์ด์ ์ํด ๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ์๊ณ ์๋ค๋ฉด ์ด์ ์ ์์ ์ ๋๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ณ ์๋ ๊ฒ๋ค์ค์์ ํ๋๋ฅผ ๊นจ์ ์์ ์ ๋๋ด๊ณ down์ํ๋ก ๊ฐ ์ ์๊ฒ ํ๋ค.
// ์ธ๋งํฌ์ด๋ฅผ ํ์ฉํ์ฌ producer consumer ๋ฌธ์ ํด๊ฒฐ ์ฝ๋ (์ฐธ๊ณ ๋ง ํ์ธ์!)
#define N 100
typedef int semaphore;
semaphore mutex = 1;
semaphore empty = N;
semaphore full = 0;
void producer(){
int item;
while(TRUE){
item = produce_item();
down(&empty);
down(&mutex);
insert_item(item);
up(&mutex);
up(&full);
}
}
void consumer(){
int item;
while(TRUE){
down(&full);
down(&mutex);
item = remove_item();
up(&mutex);
up(&empty);
consume_item(item);
}
}
- ์ธ๋งํฌ์ด์ ๊ฐ์ํ๋ ๋ฒ์ , semaphore๊ฐ ์๋๋ค.
- Unlock :0, lock :1
- ๋ฎคํ ์ค ๊ฐ์ฒด๋ฅผ ๋ ์ค๋ ๋๊ฐ ๋์์ ์ฌ์ฉํ ์ ์๋ค.
- ์ผ์ข ์ locking ๋งค์ปค๋์ฆ์ผ๋ก ๊ณต์ ์์์ ๋ํ ์ ๊ทผ์ ์กฐ์จํ๊ธฐ ์ํด locking๊ณผ unlocking์ low level์์ ๊ด๋ฆฌํ๋ค.
์๋ ์์ ๋ tsl instruction์ ์ด์ฉํ mutex ์ ์ด ์ ๋๋ค.
- TSL instruction์ ํ๋์จ์ด์ ๋์์ ๋ฐ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. TSL(test set lock)์ mutual exclusion์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด์ lock๊ณผ unlock์ ํ๋์จ์ด์ ์ผ๋ก ๋์์ํค๊ณ ๋๊ฐ์ operation์ ์ชผ๊ฐค ์ ์์ต๋๋ค.์ฆ, ํ ํ๋ก์ธ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ์ฝ์ด์ค๊ณ ๊ทธ ์ฃผ์์ ๊ฐ์ ์ ์ฅํ๋ ๋์ค ๋ค๋ฅธ ํ๋ก์ธ์๊ฐ ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ง ๋ชปํ๋ ๊ฒ์ ํ๋์จ์ด๊ฐ ๋ณด์ฅํด ์ฃผ๋ ๊ฒ์ด๋ค. TSL ๋ช ๋ น์ ์คํํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค๋ฅผ ์ ๊ถ์ ๋ค๋ฅธ CPU๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ง ๋ชปํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
mutex_lock:
TSL REGISTER, MUTEX | mutex๋ฅผ ๋ ์ง์คํฐ ๊ฐ์ผ๋ก ์ฎ๊ธฐ๊ณ mutex๋ 1๋ก ๋ฐ๊พผ๋ค.
CMP REGISTER, #0
JZE ok
CALL mutex_lock
ok: RET | critical region์ ๋ค์ด๊ฐ๋ค.
mutex_unlock:
MOVE MUTEX #0 | mutexfmf 0์ผ๋ก ๋ฐ๊พผ๋ค.
RET
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฅ ํฐ ์์ ๋ ๊ณต์ ์์ ๊ด๋ฆฌ
์
๋๋ค. ๊ณต์ ์์์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ ์ํธ๋ฐฐ์ ๋ฅผ ๋ฌ์ฑํ๋ ๊ธฐ๋ฒ์ด ํ์ํฉ๋๋ค.
๋ฎคํ
์ค๋ ํ์ฅ์ค์ด ํ๋ ๋ฟ์ด ์๋ ์๋น
๊ณผ ๋น์ทํฉ๋๋ค. ์๋ฅผ ๋ค์ด์ ํ์ฅ์ค์ ๊ฐ๊ธฐ์ํด ์นด์ดํฐ์์ ์ด์ ๋ฅผ ๋ฐ์ ๊ฐ์ผ ํ๋ค๊ณ ์๊ฐํฉ์๋ค.
ํ์ฅ์ค์ ๊ฐ๋ ค๊ณ ํ๋๋ฐ ์นด์ดํฐ์ ํค๊ฐ ์์ผ๋ฉด ํ์ฅ์ค์ด ๋น์ด์๋ ๊ฒ์ด๊ณ ๊ทธ ์ด์ ๋ฅผ ์ด์ฉํด์ ํ์ฅ์ค์ ๊ฐ ์ ์์ต๋๋ค. ๐
ํ์ฅ์ค์์ ํ๋ณตํ ์๊ฐ์ ๋ณด๋ด๊ณ ์๋๋ฐ ๋ค๋ฅธ ํ ์ด๋ธ์์ ์ด๋ค ๋จ์๊ฐ ํ์ฅ์ค์ ๊ฐ๊ณ ์ถ์ด์ก์ต๋๋ค. ์ด ๋จ์๋ ์๋ฌด๋ฆฌ ์ฉ๋ฌด๊ฐ ๊ธํด๋ ๊พน ์ฐธ์์ผ๊ฒ ์ฃ ? ํ์ฅ์ค์ด ํ๋ฐฉ์ด๋๊น์.. ๊ฒฐ๊ตญ ๋จ์๋ ๋ด๊ฐ ํ์ฅ์ค์ ๋ค ์ธ ๋๊น์ง ์นด์ดํฐ์์ ์ธ๋ด์ ์๊ฐ์ ๋ณด๋ด์ผ ํฉ๋๋ค. ๐
๊ณง์ด์ด ์ ํ ์ด๋ธ์ ์๋ ์ฌ์๋ ํ์ฅ์ค์ ๊ฐ๊ณ ์ถ์ ๊ฐ๋ด์,, ์ด๋กํ์ง? ์ด๋กํ๊ธด ๊ธฐ๋ค๋ ค์ผ์ฃ ,, ์นด์ดํฐ์์.. ๐
์ด์ ๋ด๊ฐ ํ์ฅ์ค์์ ๋์๊ณ ์นด์ดํฐ์ ํค๋ฅผ ๋๋ ค๋จ์ต๋๋ค. ๊ทธ๋์ ์๊น ์ธ๋ด์ ์๊ฐ์ ๋ณด๋ด๋ ๋๋ฌด ๊ธํ๋ ๋จ์๋ ์นด์ดํฐ์ ์ฌ๋ ค์ง ํค๋ฅผ ๋ค๊ณ ๋ฐ๋ก ํ์ฅ์ค๋ก ์งํ~ ๐
์ด๊ฒ ๋ฎคํ ์ค๊ฐ ๋์ํ๋ ๋ฐฉ์์ ๋๋ค. ํ์ฅ์ค์ ์ด์ฉํ๋ ์ฌ๋๋ค์ ํ๋ก์ธ์ค ํน์ ์ฐ๋ ๋์ด๊ณ ํ์ฅ์ค์ ๊ณต์ ์์์ธ ๊ฒ์ด์ฃ . ํ์ฅ์ค ํค๋ ๊ณต์ ์์์ ์ ๊ทผํ๊ธฐ ์ํด ํ์ํ ์ด๋ค ์ค๋ธ์ ํธ์ ๋๋ค. ์ด์์ฒด์ ์์ ๋ ๊ต์๋์ ๋ง์์ ๋๋ฌ์ด์ ์๊ฐ์ ํด๋ณด๋ฉด ์ด ํ์ฅ์ค ํค๋ฅผ ํ๋์จ์ด์ ์ผ๋ก ๊ด๋ฆฌํ๋ค๊ณ ํ์ จ๋๊ฑฐ ๊ฐ์์. tsl lock ์ฒ๋ผ์.! ๊ทธ๋์ ์ด ํ์ฅ์คํค๋ ์ผ๋ฐ lock๊ณผ๋ ๋ค๋ฅธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํด๋ ์ข์๊ฑฐ ๊ฐ์ต๋๋ค. ๐
์ธ๋งํฌ์ด๋ ์๋์ด ํ์ฅ์ค์ ์ข ๋ ์ฝ๊ฒ ์ด์ฉํ ์ ์๋ ์ ์ง์ ๋๋ค. ์ธ๋งํฌ์ด๋ฅผ ์ด์ฉํ๋ ์ ์ง ํ์ฅ์ค์๋ ์ฌ๋ฌ ๊ฐ์ ํ์ฅ์ค ์นธ์ด ์์ด์.. ๋คํ์ด๋ค์. ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฐ๊ฒ๋ ํ์ฅ์ค ํํฉํ์ด ์๋ค๊ณ ๊ฐ์ ์ ํ๋ค์. ๐
๋ด๊ฐ ํ์ฅ์ค์ ๊ฐ๊ณ ์ถ์ผ๋ฉด ์ ๊ตฌ์์ ํํฉํ์ ํตํด ๋น ์นธ์ด ์๋์ง ํ์ธํ๊ณ ํํฉํ์ n-- ์ ์ฅํด์ฃผ๋ฉด ๋ฉ๋๋ค. ๋ง์ฝ ๋ณผ ์ผ์ ๋ค ๋ง์น๋ฉด n++ ์์ผ์ผ๊ฒ ์ฃ ? ๐
๋ชจ๋ ์นธ์ ์ฌ๋๋ค์ด ์ฐจ์๋ค๋ฉด ๋น ์นธ์ ๊ฐ์๋ 0์ธ๋ฐ์ ์ด๋๋ถํฐ ๋ ๋ค์ ์ธ๋ด์ ์๊ฐ์ด ์์๋ฉ๋๋ค. ์ฌ๋์ด ๋์ฌ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ์ฃ .. ๐
์ฌ๋๋ค์ด ๋์ฌ ๋ ๋ง๋ค ๋น ์นธ์ ๊ฐ์++ ์์ผ์ค์ผ ํ๊ณ ๊ธฐ๋ค๋ฆฌ๋ ์ฌ๋์ ๋ค์ ๋น ์นธ์ ๊ฐ์-- ํ๊ณ ์ ์ฅํ์ ์ผ ํฉ๋๋ค. ๐
์ ๋ฆฌํ๋ฉด
mutex <= ํ ์ฐ๋ ๋, ํ๋ก์ธ์ค์ ์ํด ์์ ๋๋ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ mutual exclusion ๊ธฐ๋ฒ
semaphore <= signaling mechanism์ผ๋ก ํ์ฌ ๊ณต์ ์์์ ์ ๊ทผํ ์ ์๋ ์ค๋ ๋ ํ๋ก์ธ์ค์ ์๋ฅผ ๋ํ๋ด๋ ๊ฐ์ ๋์ด ์ํธ๋ฐฐ์ ๋ฅผ ๋ฌ์ฑํ๋ค๊ณ ํฉ๋๋ค.
- Mutex์ Condition Variables๋ฅผ ๊ฐ์ง๊ณ ์๋ synchronization ๋งค์ปค๋์ฆ์ด๋ค.
- Mutex์ monitor๋ ์ํธ๋ฐฐ์ ๋ฅผ ํจ์ผ๋ก์จ ์๊ณ๊ตฌ์ญ์ ํ๋์ ํ๋ก์ธ์ค๋ง ๋ค์ด๊ฐ ์ ์๋ค.(์ธ๋งํฌ์ด๋ ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค ๋ค์ด๊ฐ ์ ์์.)
- ์ธ๋งํฌ์ด๋ฅผ ์ค์ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ ๊ฒ์ด๋ค.
- ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋ฐ์ดํฐ ๋ฐ ํ๋ก๊ทธ๋จ ๋ชจ๋, ์ด์์ฒด์ ๋ด๋ถ์ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ํฐ๋ผ๊ณ ํ๋ค.
์์ง ์๋๋ฌ์ต๋๋ค... ์์ง ํ๋ฐ ๋จ์์ต๋๋ค...
- ๋ฎคํ ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ค๋ ๋ ๊ฐ์ ๋๊ธฐํ๋ฅผ ์ํด ์ฌ์ฉ๋๋ค.
- ๋ชจ๋ํฐ๋ ํ๋์ ํ๋ก์ธ์ค ๋ด์์ ๋ค๋ฅธ ์ค๋ ๋ ๊ฐ์ ๋๊ธฐํํ ๋ ์ฌ์ฉํ๋ค.
- ๋ฎคํ
์ค๋ ์ด์์ฒด์ ์ปค๋์ ์ํด ์ ๊ณต๋๋ค.
- kernel์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ system call์ ์ด์ฉํจ. ๊ทธ๋์ ๋๋ฆฌ๋ค.
- ๋ชจ๋ํฐ๋ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ทธ ์์ฒด์์ ์ ๊ณต๋๋ค.
- ํ๋ก๊ทธ๋จ์์ ์ ๊ณตํ๋ ๊ฒ์ผ๋ก user level์์ ์ ๊ณต๊ฐ๋ฅ, ๊ทธ๋์ ๋น ๋ฆ
- ์๋ฐ์์๋ ๋ชจ๋ํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ฒด์๊ฒ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ์ง๋ง C์์๋ ์ฌ์ฉํ ์ ์๋ค.
- ์ธ๋งํฌ์ด๋ ์นด์ดํฐ๋ผ๋ ๋ณ์๊ฐ์ผ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ์ํธ๋ฐฐ์ ๋ ์ ๋ ฌ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ ์ ๋งค๋ฒ ๊ฐ์ ๋ฐ๋ก ์ง์ ํด์ค์ผํ๋ ๋ฒ๊ฑฐ๋ฌ์์ด ์๋ค.
- ๋ฐ๋ฉด์ ๋ชจ๋ํฐ๋ ์ด๋ฌํ ์ผ๋ค์ด ์บก์ํ ๋์ด ์์ด์ ๊ฐ๋ฐ์๋ ์นด์ดํฐ ๊ฐ์ 0๋๋ 1๋ก ์ฃผ์ด์ผ ํ๋ ๊ณ ๋ฏผ์ ํ ํ์๊ฐ ์์ด synchronized, wait(), notify() ๋ฑ์ ํค์๋๋ฅผ ์ด์ฉํด ์ข ๋ ํธํ๊ฒ ๋๊ธฐํํ ์ ์๋ค.
- ์ธ๋งํฌ์ด๋ ๋ฎคํ ์ค๊ฐ ๋ ์ ์์ง๋ง ๋ฎคํ ์ค๋ ์ธ๋งํฌ์ด๊ฐ ๋ ์ ์๋ค.
- ์ธ๋งํฌ์ด๋ ์์ ํ ์ ์์ง๋ง ๋ฎคํ ์ค๋ ์์ ํ ์ ์๊ณ ์์ ์ฃผ๊ฐ ๊ทธ ์ฑ ์์ ์ง๋ค.(?)
- ๋ฎคํ ์ค์ ๊ฒฝ์ฐ ๋ฎคํ ์ค๋ฅผ ์์ ํ๊ณ ์๋ ์ค๋ ๋๊ฐ ์ด ๋ฎคํ ์ค๋ฅผ ํด์ ํ ์ ์๋ค. ํ์ง๋ง ์ธ๋งํฌ์ด๋ ์์ ํ์ง ์๊ณ ์๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ธ๋งํฌ์ด๋ฅผ ํด์ ํ ์ ์๋ค.
- ๋ฎคํ ์ค๋ ๋๊ธฐํ ๋์์ด 1๊ฐ ์ผ ๋ ์ฌ์ฉํ์ง๋ง ์ธ๋งํฌ์ด๋ ๋๊ธฐํ ๋์์ด ์ฌ๋ฌ ๊ฐ์ผ ๋ ์ฌ์ฉํ๋ค. (ํ์ฅ์ค ์์ ๋ฅผ ๋ ์ฌ๋ฆฌ์๋ฉด๋ ๊ฑฐ ๊ฐ์์~)
There is an ambiguity between binary semaphore and mutex. We might have come across that a mutex is a binary semaphore. But it is not! The purpose of mutex and semaphore are different. Maybe, due to similarity in their implementation a mutex would be referred to as a binary semaphore.
๋ฎคํ ์ค์ ์ธ๋งํฌ์ด์ ๋ํด์ ๋ง์ด ํท๊ฐ๋ฆด ์ ์์ต๋๋ค. ํน์ ์ฌ์ดํธ์์๋ "mutex๊ฐ binary semaphore์ด๋ค"๋ผ๋ ์ค๋ช ์ด ์๋๋ฐ geeks for geeks์์๋ ์ด๊ฒ ์๋ชป๋ ๊ฑฐ๋ผ๊ณ ํ๋ค์. ๋ฎคํ ์ค์ ์ธ๋งํฌ์ด๋ ์์ ๋ค๋ฅธ ๊ฒ ์ ๋๋ค. ํ๊ต ์ด์์ฒด์ ๊ฐ์์์๋ ๊ต์๋์ด ๋ค๋ฅธ๊ฑฐ ๋ผ๊ณ ๊ฐ์กฐํ์ จ๋ ๊ธฐ์ต์ด ๋ฉ๋๋ค. ์๊ฒฉํ ๋งํด์
Strictly speaking, a mutex is a locking mechanism used to synchronize access to a resource. Only one task (can be a thread or process based on OS abstraction) can acquire the mutex. It means there is ownership associated with a mutex, and only the owner can release the lock (mutex). geeks for geeks ๋ณธ๋ฌธ..
์๊ฒฉํ ๋งํด์ ๋ฎคํ ์ค๋ locking ๋ฉ์ปค๋์ฆ์ผ๋ก์จ ๊ณต์ ์์ ์ ๊ทผ์ ๋ํ ๋๊ธฐํ์ ์ฐ์ ๋๋ค. ๋จ ํ๋์ ์ ๋ฌด ์ฆ ๊ณต์ ์์ ์ ๊ทผ ๋๊ธฐํ๋ง ํ๋ ๊ฒ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ฎคํ ์ค๋ ์์ ๊ถ์ด ์๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ ์๋ง์ด lock์ ๊ฑธ๊ณ ํ ์ ์์ต๋๋ค.
Semaphore is signaling mechanism (โI am done, you can carry onโ kind of signal). For example, if you are listening to songs (assume it as one task) on your mobile phone and at the same time, your friend calls you, an interrupt is triggered upon which an interrupt service routine (ISR) signals the call processing task to wakeup.
์ธ๋งํฌ์ด๋ signaling ๋ฉ์ปค๋์ฆ์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด์ ์ ๊ฐ ์์ ์ ๋ฃ๊ณ ๋์์ ์น๊ตฌ์๊ฒ ์ ํ๋ฅผ ํ๋ ์ํฉ์ด๋ผ๋ฉด interrupt๊ฐ ๋ฐ์ํด service routine์ ์ ๋ฐํด ์์ ์ ๋ฉ์ถ๊ณ ์น๊ตฌ์ ํตํ๋ฅผ ํ๊ณ ์ ํ๋ฅผ ๋์ผ๋ฉด ๋ค์ ์์ ์คํธ๋ฆฌ๋ฐ ํ๋ก๊ทธ๋จ์ wakeup ์ ํธ๋ฅผ ์ค์ ์์ ์ด ์ ์ ๋ก ์ฌ์๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
-> ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ค๋ฅธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํด์ผํฉ๋๋ค. signaling ๊ณผ locking ๋ฉ์ปค๋์ฆ์ด๋ผ๊ณ ์๊ฐํด์~.~
-> ๋ฎคํ ์ค๋ lock์ ๋๋ค. ๋จ ํ๋์ ์ํ(lock/unlock)๊ณผ ์ฐ๊ด๋์ด ์์ต๋๋ค. ํ์ง๋ง ์ฌ๊ท์ ์ธ ๋ฎคํ ์ค(POSIX)๋ ํ ๋ฒ ์ด์ ์ ๊ธธ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ๋์ mutex๋ฅผ ์ ๊ตฐ ํ์๋งํผ unlockํ๋๋ก ์ ์ดํด์ผํฉ๋๋ค.
์ ์ถ์ฒ๋ก ๊ฐ์ ์ ํ ๋ฒ ์ ๋ ํ๋ ๊ฒ๋ ๋์์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. :) ์๊ณ ํ์ จ์ต๋๋ค.
- Process๋ฅผ ๋๊ธฐํ ํด์ผํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ์?
1-1. ๋๊ธฐํ๋ฅผ ํ๊ธฐ ์ํด์ ์ด๋ค ์ด์๋ฅผ ํด๊ฒฐํด์ผํ๋์?
- Race Condition์ ๋ฌด์์ธ๊ฐ์?
2-1. Race condition์ ์ธ์ ๋ฐ์ํ๋์?
- Critical Region์ ๋ฌด์์ธ๊ฐ์?
3-1. Critical region์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋งํด์ฃผ์ธ์.
3-2. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฌด์์ด ์๋์?
3-3. Semaphore, mutex, monitor์ด ๋ฌด์์ธ๊ฐ์? (๋ด์ฉ ์ค๋ช )
- Mutex vs. Semaphore vs. Monitor๋ฅผ ๋งํด์ฃผ์ธ์
4-1. Mutex vs. semaphore
4-2. semaphore vs. monitor
4-3. monitor vs. mutex