์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๊ณต์ ๋ ๋ฐ์ดํฐ๋ค์ ๋์์ ์ ๊ทผํ๋ ค ํ ๋, ๊ทธ ์คํ๋ค์ ์ ์ดํด์ฃผ์ด์ผ ํ๋ค. ์คํ๋๋ ์ฌ๋ฌ ์์ ๋ค์ด ๋ฌธ์ ๊ฐ ์๊ฒ๋ ๋ง์ถฐ์ฃผ๋ ๊ฑธ Synchronization ์ด๋ผ๊ณ ํ๋ค.
Race Condition
๋๊ฐ์ ์ํ์ ํ๋๋ฐ ๋งค๋ฒ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์ค๋ ๊ฒ (ํ์ด๋ฐ์ ๋ฐ๋ผ์)
- ์ด๋ก์ ๋ฆฌํด๋ ๋ค์์ ๋นจ๊ฐ์ ์คํ๋ ๊ฑฐ
- put_balance์ ๊ฐ ๋ฃ๊ธฐ ์ ์ Context Switch๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ
- ์ด๋ก์์ 9000์, ๋นจ๊ฐ์์ 8000์ ๋ฆฌํด.
- ๋นจ๊ฐ์ ๋ฆฌํด(8000)ํ ๋ค์์ ๋ค์ ์ด๋ก์ ํ ๋ฐธ๋ฐ์ค๋ก ๋์๊ฐ์ ์ด๋ก์ ๋ฆฌํด(9000).
- ์ด ์ผ์ฒ์ ๋นผ๊ฐ๊ฑด๋ฐ ๊ฒฐ๊ณผ์ ์ผ๋ก 1000์๋ง ์์ด์ง. ๊ฐ๊ฟ? -> ์ด๊ฒ race condition
Critical Regions
- ํ๋ก๊ทธ๋จ ์ฝ๋ ์ค ๊ณต์ ๋ ์์์ ์ ๊ทผํ๋ ๋ถ๋ถ
- ํด๋น ์์์ ๋์์ accessํ ๋๋ synchronization์ด ํ์ํ๋ค
- Critical Region์ ์ง์ ํ ๋๋ mutual exclustionํ๊ฒ ์ํํ๋ค.
Critical Section Problem (CSP)
critical section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์๋์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- Mutual exclusion
- No Starvation
- Progress : T๊ฐ CR ๋ฐ๊นฅ์ ์์ ๋, S๊ฐ T๋๋ฌธ์ CR์ ๋ชป๋ค์ด์ค๋ฉด ์๋๋ค.
- CPU์ ์๋์ ๋ํด์ ์ด๋ ํ ๊ฐ์ ๋ ํด์ ์๋๋ค
Mechanisms for Solving the CSP
- with Busy Waiting
- Disabling Interrupt
- Lock Variables -> ์ค๊ฐ์ ๊ผฌ์ด๋ฉด CR์์ ์ถฉ๋
- Strict Alteration -> ์ค๊ฐ์ ๊ผฌ์ด๋ฉด ์๋ฌด๋ CR ๋ชป๋ค์ด๊ฐ
- Peterson's Solution -> ๋๊ธด ํ๋๋ฐ ๋ณต์กํ๊ณ ์ฑ๋ฅ ์์ข์
- TSL => ์ํ ๋ฏนํ๊ฒ, ํ๋์จ์ด ์ค๊ณ๋ก
- Sleep and Wakeup => busy waiting ๋จ์ ์ค์ (๊นจ์์ค), ์๋ ์ง์ฐ์๊ธฐ๋ฉด ๊ผฌ์ผ ์ ์์
- Semaphores => ํด๊ฒฐ ๊ฐ๋ฅ but ์ฝ๋ฉ ์ด๋ ค์
- Montiors
-> ๋๊บผ์ด ๊ธ์จ๋ก ๋์ด์๋๊ฒ shared memory๋ผ๊ณ ๊ฐ์๋ก์ ์จ์์.
sleep and wakeup๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ง๋๊ฑฐ๊ฐ์.
- Message Passing : ์๋ non-shared memory
1. Busy Waiting
a) Disabling Interrupt
Critigcal region์ ์ง๋๋ ๋์ interrupt๊ฐ ๋ฐ์ํ๋ฉด ๋ฌด์ํ๋ค. ๋ฐฉํด๋ฐ์ง ์๊ณ ๋๊น์ง ์ํํ ๋ค์ enable์ํด. OS๋ก ์๋์ด๊ฐ๋๋ก. ์ฆ, Context Switch๋ฅผ ์ผ์ด๋์ง ์๊ฒ ํ๋ค.
- ์ ์ด์ context switch๊ฐ ์ผ์ด๋์ง ์์ผ๋๊น ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ CR์ ์ํํ์ง ๋ชปํ๋ค.
- ์์ ๋ฌธ์ฅ์.. CPU๊ฐ ํ๋์ผ๋๋ง ํด๋น๋๋ ๋ง!! ๋ฉํฐ ํ๋ก์ธ์ ํ๊ฒฝ์์๋ ๋ค๋ฅธ CPU์ ์ํด ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ CR์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์.
- User-process์์๋ ๋ถ๊ฐ๋ฅํ ๋ฐฉ๋ฒ : ์ด๋ฐ๊ฑด ๊ถํ์ด ํ์ํ ์์ (privilege instruction).
b) Lock Variables
while ( lock == 1 ); // Waiting
// ํ์ง๋ง ์ฌ๊ธฐ์!! Context Switch๊ฐ ๋๋ค๋ฉด?
// A๋ while ๋ฃจํ๋ฅผ ํต๊ณผํ๋๋ฐ lock์ ๋ฏธ์ณ 1๋ก ๋ฐ๊พธ์ง ๋ชปํ ๊ฒฝ์ฐ
// : B๋ ์ํ ๊ฐ๋ฅํด์ง๋ค. CR์ ๋์ด ๋ค์ด๊ฐ ์ ์๊ฒ ๋จ.
lock = 1;
Critical_Region();
lock = 0;
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ global ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
- 0 : ์ ๊ทผ ๊ฐ๋ฅ
- 1 : ๋๊ฐ ์ฐ๋ ์ค -> ๊ธฐ๋ค๋ฆฐ๋ค
- lock๊ฐ์ด 0์ด ๋ ๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ Critical Region์ ๋์์ ์ง์ ํ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
c) Strict Alteration
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด turn ์ด๋ผ๋ ๋ณ์๋ฅผ ๋์ ํจ.
- ํ์ชฝ์ turn์ด 1์ผ๋ ์ํ, ๋ค๋ฅธ์ชฝ์ 0์ผ๋ ์ํ.
- turn์ด ๋์์ 0 ๋๋ 1์ผ ์ ์์ผ๋ฏ๋ก, ๋ฌด์กฐ๊ฑด CR์๋ ํ๋์ ํ๋ก์ธ์ค๋ง ์ง์ ํ ์ ์๋ค.
๋ฌธ์ ์
- ํ์ง๋ง ๋ฌด์กฐ๊ฑด ababab ์ด๋ ๊ฒ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์ํํด์ผ ํ๋ค. CR์ด ๋น์ด์๋ค ํ๋๋ผ๋, ๋๋ฒ ์ด์ ์ฐ์์ ์ผ๋ก ์ ๊ทผํ์ง ๋ชปํจ. (CSP 3๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ : ๋ฐ์ ์๋ ๋๋๋ฌธ์ ๋ค๋ฅธ์ ๊ฐ ๋ชป๋ค์ด๊ฐ๋ฉด ์๋จ)
critical_region()
ํ๊ณ turn 1๋ก ๋ฐ๊พธ๊ธฐ ์ง์ ์ ๋ฉ์ท์๋!! -> CR์ ๋น์ด์๋๋ฐ turn = 0์ด๋ผ ์๋ฌด๋ ๋ชป๋ค์ด๊ฐ๋ ์ํฉ์ด๋ค.
Busy Waiting
- ์ด๋ ๊ฒ, while loop ๋๋ฉด์ ๊ณ์ ๊ฒ์ฌํ๋ฉด์ ๊ธฐ๋ค๋ฆฌ๋๊ฑธ Busy Waiting์ด๋ผ๊ณ ํจ.
- spin lock : lock variable์ ๋ํ busy waiting. CPU ๋ญ๋น!!
d) Peterson Solution
์ง๊ธ๊น์ง ๋์จ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ software์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ.
๋๊ธด ํ๋๋ฐ ์ค๋ฒํค๋๊ฐ ๋ง๋ง์น ์์ ํด๊ฒฐ์ฑ ์ด๋ค.
e) TSL instructionv (Test and Set Lock)
CPU๊ฐ ์ ๊ณตํ๋ ํ๋์จ์ด์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. Atomicํ๊ฒ ์ํ๋๋ค.
- Atomic instrunction : instruction์ด ์์ํ๋ฉด ๋๋ ๋๊น์ง interrupt๋ฅผ ๋ฐ์ง ์๋๋ค.
bool TSL(bool *flag)
{
bool old = *flag;
*flag = true;
return old;
}
- ํจ์๋ก ํํ๋์ด ์์ง๋ง ํ๋์จ์ด๋ก ๊ตฌํ๋์ด ์๋ค.
- ์ธ์๋ก ๋ค์ด์จ flag์ ๊ฐ์ ๋ฆฌํดํ๊ณ , 1๋ก ์ธํ ํ๋ค. (์ธํ ์ ์ ๊ฐ์ ๋ฆฌํดํด์ฃผ๋ ๊ฒ)
- TSL ๋ช ๋ น ์ฌ์ฉํ๋ ์์
TSL ๊ตฌํ
- lock ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๊ณ , CPU์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค๋ก ์ฐ๊ฒฐ๋์ด ์๋ค.
- CPU์์ lock์ ์ ๊ทผํ๊ธฐ ์ํด์๋ - ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค์ ์ฌ์ฉ๊ถ์ ์ป์ด๋ด์ผ ํ๋ค.
์ฆ, ํ๋ฒ์ ํ CPU๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์๋ค. HW์ ์ผ๋ก ์ฒ๋ฆฌ. - CRITICAL_REGION์ด ๋๋๋ฉด ๋ค์์ leave_region ์ด ๋์ค๋ ํํ.
spinlock์ ๋ฌธ์ ์
- CPU ๋ญ๋น
- A๊ฐ lock 0์ด ๋ ๋๊น์ง ๊ณ์ CPU๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ธฐ๋ค๋ฆฌ๋๋ฐ, ๋ง์ B๋ ์ฐ์ ์์๊ฐ ๋ฎ์์ CPU ํ ๋น์ ๋ชป๋ฐ์ leave_region์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ.. ๊ฒฐ๊ตญ ์๋ฌด๋ ๋ชป์ด๋ค.
2. Sleep and Wakeup
- busy waiting์ ๋์ฒดํ๊ธฐ ์ํด
sleep()
๊ณผwakeup
์ ์ฌ์ฉํ๋ค. ํ๋ก์ธ์ค ์๊ธฐ ์์ ์ Block์ํค๊ฑฐ๋, ์๊ณ ์๋ (์ธ์๋ก ๋ฃ์) ํ๋ก์ธ์ค๋ฅผ wakeup์ผ๋ก ํธ์ถํด์ ๊นจ์ธ ์ ์๋ค. - sleep๊ณผ wakeup๋ ์์คํ ์ฝ.
Producer - Consumer Problem
- Producer๋ Item์ ๋ง๋ค์ด์ Buffer๋ก ๋ฃ๊ณ , Consumer๋ Buffer์์ Item์ ๊บผ๋ด์ ์ฌ์ฉ
- Producer๋ ๋ฒํผ๊ฐ ๊ฝ์ฐจ๋ฉด, Consumer๋ ๋ฒํผ๊ฐ ๋น๋ฉด sleep
- Producer๋ ๋น ๋ฒํผ์ item์ ํ๋ ์ถ๊ฐํ๋ฉด
wakeup(Consumer)
,
Consumer๋ ๊ฝ ์ฐฌ ๋ฒํผ์ item์ ํ๋ ์ฌ์ฉํ๋ฉดwakeup(Producer)
๋นจ๊ฐ์์ Producer-Consumer์ ์คํ๊ณผ์ , ๋ณด๋ผ์์ ๋ฌธ์ ์ .
count = count + 1
๋๋- 1
ํ๋ ๋ถ๋ถ์ด Atomicํ์ง ์๊ธฐ ๋๋ฌธ์, Mutual Exclusive ํ์ง ์์. ์ด ๊ณผ์ ์์ ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด๋ค์ด ์์๊ฐ ๊ผฌ์ฌ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.- P์์
count == N
์กฐ๊ฑด์ ํต๊ณผํด์ sleep ํ๋ ค๋ ์ฌ์ด์ Context switch๊ฐ ๋ฐ์ํ๊ณ C๊ฐ ์ํ๋๋ค๋ฉด : C์์๋ ๋ฒํผ์ ์์ดํ ์ด ์์ผ๋ฏ๋ก ๊ณ์ count๋ฅผ ์ค์ฌ๋๊ฐ.
๊ทธ๋ฌ๋ค๊ฐ count = 0 ์ด ๋ผ์ C๋ ์๋ฒ๋ฆฐ๋ค. ๋๋ค Sleepํ๊ฒ ๋จ. ์์ํ!- ๊ทผ๋ฐ ์ฌ๊ธฐ์ wakeup()์ ์ ์ฅํ๋ค๊ฐ ๋์ค์ ๋ค sleepํ์๋ ๊บผ๋ด์ ์ธ์๋..?
3. Semaphores
Sleep and Wait์ ๋ฐ๋๋ฝ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด!
- ์ธ๋งํฌ์ด๋ ๋ณ์์ผ.
- Atomicํ๊ฒ ๋์ํ๋ ๋ค์ด๊ณผ ์ ์ฐ์ฐ์ผ๋ก ์กฐ์ํจ (์ํ ๋ฏนํ๋ค!)
- Down(semaphore) : 0๋ณด๋ค ํฌ๋ฉด sem--; / 0์ด๋ฉด wait(๋ธ๋ฝ ์ฒ๋ฆฌ)
- Up(semaphore) : sem++; / wait์ค์ธ ์ค๋ ๋๊ฐ ์์ผ๋ฉด ํ๋๋ฅผ wakeup
์ธ๋งํฌ์ด ๋ ์ข ๋ฅ
- Binary semaphore (mutex semaphore) : 0๊ณผ 1 (๋ฒํผ๊ฐ 1์ธ๊ฑฐ?)
- Counting Semaphore (N๊น์ง). synchronization์ ๊ตฌํํ ๋ ์ด์ฉ
์ด ๋๊ฐ์ง ์ธ๋งํฌ์ด๋ฅผ ์ด์ฉํด์ Producer-Consumer ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณผ๊ฑฐ์ผ.
var mutex: semaphore = 1 // mutex (lock๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉ)
empty: semaphore = n // ๋ฒํผ์ ๋น ๊ณต๊ฐ "empty"
full : semaphore = 0 // ๋ฒํผ๊ฐ ์ฐฌ ๊ณต๊ฐ "full"
// empty + full == N
producer:
<produce item>
down(empty)
down(mutex)
<add item to buffer>
up(mutex)
up(full)
consumer:
down(full)
down(mutex)
<remove item from buffer>
up(mutex)
up(empty)
<use item>
Mutex
add
๋ remove
๊ฐ์ด ๋ฒํผ(๊ณต์ ๋ฐ์ดํฐ)์ ์ ๊ทผํ๋ ๋ถ๋ถ์
- ๋ค์ด๊ฐ๋ :
down(mutex)
1 -> 0 - ๋๊ฐ๋ :
up(mutex)
0 -> 1
Synchronization
- Producer
- Item ํ๋ ๋ง๋ค๊ณ
down(empty)
: ๋น์ด์๋ ๋ฒํผ์--;
(CR์์ ๋๋๋ฉด);up(full)
: ์ฐจ์๋ ๋ฒํผ์++; - ์ปจ์๋จธ์์๋ ์ฒ์์ ์ฐจ์๋ ๋ฒํผ์๋ฅผ ๋ณด๊ณ CR์ง์ ํ๊ธฐ ๋๋ฌธ์, ๋ฒํผ์ ์ ๋ ฅํ๋ ์์ ์ด ๋๋ ๋ค์์ full ์ธ๋งํฌ์ด๋ฅผ ์ฌ๋ ค์ฃผ๋ ๋ฏ
- ์ฒ์์ empty = 0 ์ด๋ฉด
down(empty)
ํ ๋ ๋ธ๋ฝ๋จ
- Item ํ๋ ๋ง๋ค๊ณ
- Consumer
- ๋ฐ๋ก
down(full)
: ์ฐจ์๋ ๋ฒํผ์--; (CR์์ ๋๋๋ฉด);up(empty)
: ๋น์ด์๋ ๋ฒํผ์++; - empty ์ฌ๋ ค์ค ๋ค์์, ๊ฐ์ ธ์จ item์ ์ฌ์ฉํ๋ค.
- ์ฒ์์ full = 0 ์ด๋ฉด
down(full)
ํ ๋ ๋ธ๋ฝ๋จ
- ๋ฐ๋ก
์ฅ์ ๋จ์
- Busy Waiting์ ํ์ง ์๋๋ค.
- ์ฝ๋ฉํ๊ธฐ ์ด๋ ค์์ ๋ฒ๊ทธ๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
down(mutex)
์down(empty)
์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ๋ฐ๋๋ฝ ์ผ์ด๋ ๊ฐ๋ฅ์ฑ.
4. Monitors
- shared data mutex ์ง์
- Critical Region์ ๋น์ ์์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ์์ฒ์ ์ผ๋ก ๋ง๋๋ค!
monitor example
integer i;
condition c;
procedure producer(); // CR
...
end;
procedure consumer(); // CR
...
end;
end monitor;
- ํ๋ฒ์ ํ๋์ process๋ง ํด๋น ๋ชจ๋ํฐ์ procedure๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Condition Variables
๋ชจ๋ํฐ ์์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ condition variables์ ์ด์ฉํด์ ์๊ทธ๋์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค. ์ด๋ฅผ ์ด์ฉํด sleep and wakeup์ ๊ตฌํํ๋ค.
count ๋ณ์๋ monitor์์ ์์. ๊ทธ๋์ ๊ทธ count ๋ณ์์ ์ ๊ทผํ๋ ค๋ฉด monitor ์์ ์๋ procedure๋ก ๋ฐ์ ์ ๊ทผํ ์ ์๋ค!!
์ปจ๋์ ์ด๋ผ๋๊ฑด ๊ทธ ๋ณ์๋ง๋ค ํ๊ฐ ์๋๊ฑด๋ฐ.. ์ฌ๊ธฐ์ ๊ดํ ์ด๋ฆ์ full empty๋ผ๊ณ ํด๊ฐ์ง๊ณ ํท๊ฐ๋ฆฌ๋ ๊ฒ.
- wait(c)
- wait ๊ฑธ๋ฆฌ๋ฉด ๋ชจ๋ํฐ ์์์ ๋น ์ ธ๋์ค๊ณ , ๋ค๋ฅธ ์ ๊ฐ ๋ค์ด์์ ์ธ ์ ์๋๋ก ์ด์ด์ค๋ค
: release monitor lock - ๋๊ฐ ๋ชจ๋ํฐ ์์ ํ๋ก์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ชป๋ค์ด์ค๊ฒ ๋ชจ๋ํฐ๋ฅผ ์ ๊ฐ์ค๋ค
: monitor lock if count = N then wait(full)
๋ง์ฝ์ ํ๋ก๋์๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด, p1 - p2 - p3 ์ด๋ ๊ฒ ํ์์ ๋๊ธฐํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ ์ด๋ฆ์ด full์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ. ํ๋ก๋์๋ ํญ์ full ํ์์ ๋๊ธฐํ๊ณ ์๊ณ , ์ปจ์๋จธ๋ ํญ์ empty ํ์์ ๋๊ธฐํ๊ณ ์๋ค. ํ๋ก๋์๊ฐ count 0 ์์ 1๋ก ๋ง๋ค์ด์ฃผ๋ฉด signal(empty)๋ฅผ ํด์ฃผ๋ ์ด์ ๋, empty ํ์ ๋๊ธฐํ๊ณ ์๋ ์ปจ์๋จธ๋ฅผ ๊นจ์ฐ๊ธฐ ์ํด์!!
- wait ๊ฑธ๋ฆฌ๋ฉด ๋ชจ๋ํฐ ์์์ ๋น ์ ธ๋์ค๊ณ , ๋ค๋ฅธ ์ ๊ฐ ๋ค์ด์์ ์ธ ์ ์๋๋ก ์ด์ด์ค๋ค
- signal(c)
- ํด๋น ์ปจ๋์ ๋ณ์์ wait์ค์ธ ํ๋ก์ธ์ค๋ ์ฐ๋ ๋๋ฅผ ๊นจ์ด๋ค.
- ์ข๋ ์ฝ๊ฒ ์ฐ์๋ฉด.. (c) ์ํ์์ ๋๊ธฐ์ค์ธ ๋์ ๊นจ์ด๋ค
๋ชจ๋ํฐ๋ก ๊ตฌํํ sleep & wake
- ๋ชจ๋ํฐ์์ ํ๋ฒ์ ์ค์ง ํ๋์ ํ๋ก์์ ๋ง ๋์๊ฐ๋ค. ๋ง์ฝ ์ด๋ค ํ๋ก๋์๊ฐ item์ ๋ง๋ค๊ณ ์์ผ๋ฉด, ๋ค๋ฅธ ์ปจ์๋จธ๊ฐ remove๋ฅผ ํ๊ณ ์ถ์ด๋ ๋ชปํ๋ค.
- mutexํ๊ธฐ๋๋ฌธ์.. Race Condition์ ๋ฐ์ํ์ง ์์!
- ๋ณด๋ผ์ ๊ธ์จ : signal()์ ํธ์ถํ ๋ค์ ์ด๋์ ๋ค์ ์ํ์ ํ๋?
- Hoare monitors : ์๋ก wakeup๋ ํ๋ก์ธ์ค๊ฐ ๋ฐ๋ก ๋ชจ๋ํฐ์ ๋ค์ด๊ฐ์ ์ํ๋๋ค. ๊ทธ ๋ค์์ signaler๊ฐ ๋ธ๋ฝ๋จ. ๋ฐ๋ก ๋ฒํผ ๋ฐ๋๋ ์ผ ์์ด ๋ค์ด๊ฐ๋ฏ๋ก, Condition์ ๋ฐ๋์ง ์์์ด ๋ณด์ฅ
- Hansen monitors : signal์ด ๋ฐ์ํ๋๋ผ๋ ์ํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ์ํํ๊ณ , ์
- Mesa monitors : signaler๊ฐ ๋ค ์ํ๋๊ณ ๋น ์ ธ๋๊ฐ๊ณ ๋์ waiter๊ฐ ์ํ๋๋ค. waiter๊ฐ ์ํ๋ ๋ condition์ด ๋ฌ๋ผ์ ธ์์์๋ ์์.
monitor ๋ฌธ์ ์
- ๋ชจ๋ํฐ๋ OS ์๋๋ผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋จ์์ ์ง์ํ๋ ๊ฒ c/c++์์ ์๋๋
- ๋ถ์ฐ ์์คํ (๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ฅผ ์ํจ. ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์)์์๋ ์ฌ์ฉํ ์ ์๋ค.
- ๋ถ์ฐ์์คํ ์์๋ message passing์ผ๋ก ๊ตฌํ!!
5. Message Passing
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ ์ผ๋ก ๊ณต์ ํ ์ ์๋ ํ๊ฒฝ์์ send, receive system call ์ฌ์ฉํด์ ๋ฐ๋๋ค
- P์ C๊ฐ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ๋จธ์ ์์ ๊ฐ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ๊ณต์ ๋ฆฌ์์ค ์์. CR ์๋ค.
- send(dest, &message) : ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค
- Receive(src, &message) : ๋ฉ์์ง๋ฅผ ๋ฐ๋๋ค. ๋ฆฌ์๋ฒ๋ ๋ฉ์ธ์ง๋ฅผ ์์ ํ ๋๊น์ง ๋ธ๋ฝ๋จ.