[OS] Operating System(6-3): Monitors, Liveness
๐ ์ด์์ฒด์ ์ ๊ณต ์์ ์ ๋ฆฌ
semaphore๋ ์๋ชป ์ฌ์ฉํ๋ฉด ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค!!
- ์๋ชป๋ ์ฐ์ฐ ์์:
signal(mutex)
ํ์wait(mutex)
ํธ์ถ - ์ค๋ณต
wait()
ํธ์ถ:wait(mutex)
ํ์ ๋ค์wait(mutex)
ํธ์ถ - ์ฐ์ฐ ๋๋ฝ:
wait(mutex)
๋๋signal(mutex)
๋๋ฝ
์ ๋ฌธ์ ๋ค์ Deadlock, Race Condition, Starvation ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํจ!
์ด๋ฌํ ๋ฌธ์ ์ ํด๊ฒฐ์ ์ํด ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ synchronization tool์ด ํ์
โ Monitors๊ฐ ๊ฐ๋ฐ๋จ
Monitors
๐Monitors: semaphore๋ณด๋ค ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ
โ ์ฃผ์ ํน์ง:
- Abstract Data Type: ๊ณต์ ๋ฐ์ดํฐ์ ์ด๋ฅผ ์กฐ์ํ๋ ์ฐ์ฐ์ ํ๋์ ๋ชจ๋๋ก ์บก์ํ
- ๋ด๋ถ ๋ณ์ ์๋: monitor ๋ด๋ถ ๋ณ์๋ ์ค์ง monitor๋ด๋ถ์ ์ฝ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ
- ์ํธ ๋ฐฐ์ ์๋ ๋ณด์ฅ: ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ๋ชจ๋ํฐ ๋ด๋ถ์์ ํ์ฑํ ๊ฐ๋ฅ
- Condition Variable: ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๊น์ง ํ๋ก์ธ์ค๋ฅผ ๋๊ธฐ์ํฌ ์ ์๋ ๋ฉ์ปค๋์ฆ ์ ๊ณต
Monitor ๊ตฌ์กฐ
1
2
3
4
5
6
7
8
9
10
11
12
monitor monitor-name {
// ๊ณต์ ๋ณ์ ์ ์ธ
Data data
...
//๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ํจ์๋ค
function P1 (...) { ... }
function P2 (...) { ... }
function Pn (...) { ... }
//๋ชจ๋ํฐ ์ด๊ธฐํ๋ฅผ ์ํ ์ฝ๋
initialization code (...) { ... }
}
- ๊ณต์ ๋ฐ์ดํฐ(Shared Data): ๋ชจ๋ํฐ ๋ด๋ถ์ ๊ณต์ ๋ณ์๋ค
- ์ฐ์ฐ(Operations): ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ํจ์๋ค
- ์ด๊ธฐํ ์ฝ๋(Initialization Code): ๋ชจ๋ํฐ ์ด๊ธฐํ๋ฅผ ์ํ ์ฝ๋
- ์ง์ ํ(Entry Queue): ๋ชจ๋ํฐ์ ์ง์ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค๋ค์ ํ
- ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ์คํ ๊ฐ๋ฅ
- ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ ์ง์ ํ์์ ๋๊ธฐ
- ์คํ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์ด๋ค ์ด์ ๋ก ๋ ์งํํ ์ ์์ผ๋ฉด Monitors condition variable์ ์ฌ์ฉํ์ฌ ์ค์ค๋ก suspend ๊ฐ๋ฅ
Condition Variables
๐Condition Variables: ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๊น์ง ํ๋ก์ธ์ค๋ฅผ ๋๊ธฐ์ํด
condition x,y
์ ํ์
Condition Variables operation
x.wait()
: ์ด ์ฐ์ฐ์ ํธ์ถํ ํ๋ก์ธ์ค๋x.signal()
์ด ํธ์ถ๋ ๋๊น์ง suspendedx.signal()
:x.wait()
์ ํธ์ถํ์ฌ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด ๊ทธ ์ค ํ๋๋ฅผ ๊นจ์(resume)
โ ํน์ง:
- ์กฐ๊ฑด ๋ณ์(x or y)๋ ๊ฐ๋ ์ ์ผ๋ก ๋๊ธฐ ํ์ ์ด๋ฆ
x.wait()
์ ํธ์ถํ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉดx.signal()
์ ์๋ฌด ํจ๊ณผ ์์์กฐ๊ฑด ๋ณ์๋ ํน์ ์ํ๋ ์ฌ๊ฑด์ ๋ํ๋ด๋ฉฐ, ํด๋น ์ฌ๊ฑด์ด ๋ฐ์ํ ๋๊น์ง ํ๋ก์ธ์ค๋ฅผ ๋๊ธฐ์ํด
- ํ๋ก์ธ์ค(๋๋์ค๋ ๋)๋ ๋ชจ๋ํฐ ์์์ ํจ์๋ฅผ ๋ฐฉํด๋ฐ์ง ์๊ณ ์คํํ ์ ์๋ ๊ฒ์ ๋ณด์ฅ๋ฐ์
- ๋ง์ผ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ณํ์คํ์ ํ์ฉํ๊ณ ์ถ์ผ๋ฉด ์กฐ๊ฑด๋ณ์์
wait()
๋ฅผ ์คํํจ์ผ๋ก์จ ๊ฐ๋ฅ - ์ฆ, ํ๋ก์ธ์ค๊ฐ preemption ์์น๋ฅผ ์ค์ค๋ก ์ง์ ํ ์ ์์์ ๋ปํจ
semaphore์ monitor ์กฐ๊ฑด ๋ณ์ ๋น๊ต
Condition Variable ์ฌ์ฉ ์ ๊ณ ๋ ค์ฌํญ
- ์กฐ๊ฑด ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ ๊ฐ๋ฅํ ๋ฌธ์ : signal ํ ํ๋ก์ธ์ค ์คํ ์์
ํ๋ก์ธ์ค P๊ฐ x.signal()์ ํธ์ถํ๊ณ ํ๋ก์ธ์ค Q๊ฐ x.wait()์์ ์ผ์ ์ค๋จ๋ ์ํ์ผ ๋, ๋ค์์ ๋ฌด์์ด ์ผ์ด๋์ผ ํ ๊น?
โ ๊ฐ๋ฅํ ์ต์ :
- signal and Wait: P๋ Q๊ฐ ๋ชจ๋ํฐ๋ฅผ ๋ ๋๊ฑฐ๋ ๋ค๋ฅธ ์กฐ๊ฑด ๋ณ์์์ ๋๊ธฐํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
- Signal and Continue: Q๋ P๊ฐ ๋ชจ๋ํฐ๋ฅผ ๋ ๋๊ฑฐ๋ ๋ค๋ฅธ ์กฐ๊ฑด ๋ณ์์์ ๋๊ธฐํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
- Concurrent Pascal ๋ฐฉ์: P๋ ์ ํธ๋ฅผ ๋ณด๋ธ ํ ์ฆ์ ๋ชจ๋ํฐ๋ฅผ ๋ ๋๊ณ , Q๊ฐ ์ฌ๊ฐ๋จ
๊ฐ ์ต์ ๋ง๋ค ์ฅ๋จ์ ์ด ์กด์ฌ, ์ธ์ด๋ ์์คํ ์ ๋ฐ๋ผ ๊ตฌํ ๋ฐฉ์ ์์ด
Signal-and-Wait ๊ตฌํ
- Semaphore:
mutex
: ๋ชจ๋ํฐ ์ง์ ์ ์ ์ดํ๋ ์ธ๋งํฌ์ด, ์ด๊ธฐ๊ฐ 1(binary semaphore)next
: Condition variable์ ์ ํธ๋ฅผ ๋ณด๋ธ ํ ๋๊ธฐํ๋ ํ๋ก์ธ์ค๋ฅผ ์ํ ์ธ๋งํฌ์ด, ์ด๊ธฐ๊ฐ 0x.sem
: Condition variable x์ ๋ํด ๋๊ธฐํ๋ ํ๋ก์ธ์ค๋ฅผ ์ํ ์ธ๋งํฌ์ด, ์ด๊ธฐ๊ฐ 0
- Counter:
x.count
: ์กฐ๊ฑด ๋ณ์ x์ ๋ํด ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค ์next_count
:next
์ธ๋งํฌ์ด์์ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค ์
- Condition variable x
x.sem
: ์กฐ๊ฑด ๋ณ์์์ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋ธ๋ก/์ธ๋ธ๋กํ๋ ์ธ๋งํฌ์ดx.count
: ํ์ฌ ์ด ์กฐ๊ฑด ๋ณ์์์ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค์ ์
wait(next)
๋ฅผ ์คํํ๋ฉด ์ด๋ฅผ ์คํํ ์ค๋ ๋๋ ๋๊ฐ ๊นจ์์ฃผ๋๊ฐ?
โ ์๊ทธ๋์ ๋ฐ์ ์ค๋ ๋๊ฐ ํจ์๋ฅผ ๋ง์น๊ฑฐ๋ ๋ค๋ฅธ ์กฐ๊ฑด์ ๊ธฐ๋ค๋ฆด ๋
- ์กฐ๊ฑด ๋ณ์ x์ ์ ํธ๋ฅผ ๋ณด๋ธ ํ๋ก์ธ์ค A๋ ๋๊ธฐ ์ํ
- ์ ํธ๋ฅผ ๋ฐ์ ํ๋ก์ธ์ค B๊ฐ ๊นจ์ด๋์ ์คํ๋จ
- ํ๋ก์ธ์ค A๋ ๋ค์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ๋ค์ ๊นจ์ด๋ ์ ์๋ค:
- ํ๋ก์ธ์ค B๊ฐ ์์
์ ์๋ฃํ๊ณ ๋ชจ๋ํฐ๋ฅผ ๋ ๋ ๋ (
signal(next)
) - ํ๋ก์ธ์ค B๊ฐ ๋ค๋ฅธ ์กฐ๊ฑด ๋ณ์๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ ๋ (
x.wait()
)
- ํ๋ก์ธ์ค B๊ฐ ์์
์ ์๋ฃํ๊ณ ๋ชจ๋ํฐ๋ฅผ ๋ ๋ ๋ (
Resuming Processes withing a Monitor
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ condition variable x์์ ๋๊ธฐํ๊ณ ์๊ณ ,
x.signal()
d์ด ์คํ๋ ๋ ์ด๋ค ํ๋ก์ธ์ค๊ฐ ์ฌ๊ฐ๋์ด์ผ ํ ๊น?
FCFS ๋ฐฉ์์ด ๋ฌด์กฐ๊ฑด ์ ์ ํ์ง๋ ์๋ค!
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด ์กฐ๊ฑด๋ถ ๋๊ธฐ(conditional-wait) ๋์
Coditional Wait
1
x.wait(c)
- ์ฌ๊ธฐ์
c
๋ priority number - ๋ฎ์ ๋ฒํธ = ๋์ ์ฐ์ ์์
Single Resource Allocation
์ฌ๋ฌ ํ๋ก์ธ์ค ๊ฐ์ ํ๋์ ์์์ ํจ์จ์ ์ผ๋ก ๋ฐฐ๋ถํ๋ ๋ฌธ์
์ฐ์ ์์ ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ฌ์ฉํ ๊ณํ์ธ ์ต๋ ์๊ฐ์ ์ง์ ํจ์ผ๋ก์จ ๊ฒฝ์ํ๋, ํ๋ก์ธ์ค ๊ฐ์ ๋จ์ผ ์์์ ํ ๋น
- ๊ธฐ๋ณธ ์ฌ์ฉ ํจํด:
1
2
3
4
5
R.acquire(t);
...
access the resource;
...
R.release;
R
: ResourceAllocator ํ์ ์ ์ธ์คํด์คt
: ํด๋น ํ๋ก์ธ์ค์ ์ฐ์ ์์- ResourceAllocator ๊ตฌํ ์ฝ๋:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
monitor ResourceAllocator
{
boolean busy;
condition x;
void acquire(int time) {
if (busy)
x.wait(time);
busy = true;
}
void release() {
busy = false;
x.signal();
}
initialization code() {
busy = false;
}
}
- ์ํ ๋ณ์:
boolean busy
: ์์์ด ํ์ฌ ์ฌ์ฉ ์ค์ธ์ง ์ฌ๋ถcondition x
: ์์์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๋ค์ ๋๊ธฐ์ด์ ๊ด๋ฆฌํ๋ ์กฐ๊ฑด ๋ณ์
acquire(int time)
:- ํ๋ก์ธ์ค๊ฐ ์์์ ์์ฒญํ ๋ ํธ์ถ
time
: ํ๋ก์ธ์ค๊ฐ ์์์ ์ฌ์ฉํ๊ธฐ ์ํ ์ฐ์ ์์- ์์์ด ์ด๋ฏธ ์ฌ์ฉ ์ค์ด๋ฉด (
busy
= true), ํ๋ก์ธ์ค๋ ์กฐ๊ฑด ๋ณ์ x์์ ๋๊ธฐ - ์์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉด (
busy
= false), ์ฆ์ ์์์ ํ ๋น๋ฐ๊ณ busy๋ฅผ true๋ก ์ค์
releasea()
:- ํ๋ก์ธ์ค๊ฐ ์์ ์ฌ์ฉ์ ๋ง์น๋ฉด ํธ์ถ
busy
๋ฅผ false๋ก ์ค์ ํ์ฌ ์์์ด ์ฌ์ฉ ๊ฐ๋ฅํจ์ ํ์x.signal()
์ ํธ์ถ โ ์กฐ๊ฑด ๋ณ์ x์์ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค ์ค ํ๋(๊ฐ์ฅ ๋ฎ์time
๊ฐ์ ๊ฐ์ง ํ๋ก์ธ์ค)๋ฅผ ๊นจ์ด๋ค
- ์ด๊ธฐํ ์ฝ๋:
- ๋ชจ๋ํฐ๊ฐ ์์ฑ๋ ๋
busy
๋ฅผ false๋ก ์ด๊ธฐํ
- ๋ชจ๋ํฐ๊ฐ ์์ฑ๋ ๋
Liveness
๐Liveness: ์์คํ ์ด ๊ณ์ ์งํ๋๊ณ ์์ ์ ์๋ฃํ ์ ์๋ ๋ฅ๋ ฅ
- liveness failure ์ํ๋ ์๋ค โ ๋ฌดํ ๋๊ธฐ(Indefinite Waiting)
Deadlock
๐Deadlock: ๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค ์ค ํ๋๋ง์ด ๋ฐ์์ํฌ ์ ์๋ ์ด๋ฒคํธ๋ฅผ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ
โ ์์:
1
2
3
4
5
6
7
8
Let S and Q be two semaphores initialized to 1
Pโ Pโ
wait(S); wait(Q);
wait(Q); wait(S);
... ...
signal(S); signal(Q);
signal(Q); signal(S);
- Pโ๊ฐ
wait(S)
๋ฅผ ์คํํ๊ณ , Pโ์ดwait(Q)
๋ฅผ ์คํ - Pโ๊ฐ
wait(Q)
๋ฅผ ์คํํ๋ ค ํ์ง๋ง, Q๋ Pโ์ด ์ด๋ฏธ ํ๋ํ์ผ๋ฏ๋ก Pโ๋ Pโ์ดsignal(Q)
๋ฅผ ์คํํ ๋๊น์ง ๋๊ธฐํด์ผํจ - ๋ง์ฐฌ๊ฐ์ง๋ก, Pโ์ด
wait(S)
๋ฅผ ์คํํ๋ ค ํ์ง๋ง, S๋ Pโ์ด ์ด๋ฏธ ํ๋ํ์ผ๋ฏ๋ก Pโ์ Pโ๊ฐsignal(S)
๋ฅผ ์คํํ ๋๊น์ง ๋๊ธฐํด์ผํจ - ๊ฒฐ๊ตญ, Pโ๋ Pโ์ด Q๋ฅผ ํด์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , Pโ์ Pโ๊ฐ S๋ฅผ ํด์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ!
signal()
์ฐ์ฐ์ ์ ๋ ์คํ๋์ง ์๊ณ ๋ ํ๋ก์ธ์ค๋ deadlock
Starvation
๐Starvation: ํ๋ก์ธ์ค๊ฐ ํ์ํ ์์์ ์ป์ง ๋ชปํ๊ณ ๋ฌดํํ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ
Priority Inversion
๐Priority Inversion: ๋ฎ์ ์ฐ์ ์์ ํ๋ก์ธ์ค๊ฐ ๋์ ์ฐ์ ์์ ํ๋ก์ธ์ค๊ฐ ํ์๋ก ํ๋ ๋ฝ์ ๋ณด์ ํ ๋ ๋ฐ์ํ๋, ์ค์ผ์ค๋ง ๋ฌธ์
โ ๋ฌธ์ ๋ฐ์ ์ํฉ ์์:
- ๋์ ์ฐ์ ์์์ ํ๋ก์ธ์ค P1์ด ์์
R
์ ์์ฒญ - ์์
R
์ ์ด๋ฏธ ๋ฎ์ ์ฐ์ ์์์ ํ๋ก์ธ์ค P3๊ฐ ์ฌ์ฉ ์ค - P1์ P3๊ฐ ์์์ ํด์ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
- ์ค๊ฐ ์ฐ์ ์์์ ํ๋ก์ธ์ค P2๊ฐ ์คํ ๊ฐ๋ฅํด์ง๋ฉด, P2๊ฐ P3๋ฅผ ์ ์
- P2(๋ฎ์ ์ฐ์ ์์)๊ฐ ๊ฐ์ ์ ์ผ๋ก P1(๋์ ์ฐ์ ์์)์ด ์์์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉํด
์ด๋ฌํ ๋ฌธ์ ๋ Priority Ingeritance Protocol๋ก ํด๊ฒฐ ๊ฐ๋ฅ
Priority Ingeritance Protocol
๐Priority Ingeritance Protocol: ๋ฎ์ ์ฐ์ ์์ ํ๋ก์ธ์ค๊ฐ ์์์ ์ฌ์ฉ ์ค์ผ ๋ ๋์ ์ฐ์ ์์ ํ๋ก์ธ์ค๊ฐ ๊ทธ ์์์ ์์ฒญํ๋ฉด, ๋ฎ์ ์ฐ์ ์์ ํ๋ก์ธ์ค๋ ์ผ์์ ์ผ๋ก ๋์ ์ฐ์ ์์ ํ๋ก์ธ์ค์ ์ฐ์ ์์๋ฅผ ์์๋ฐ๋๋ค
- P3๊ฐ ์์ R์ ์ฌ์ฉ ์ค์ผ ๋ P1์ด R์ ์์ฒญํ๋ฉด, P3๋ P1์ ๋์ ์ฐ์ ์์๋ฅผ ์์๋ฐ๋๋ค
- ๊ทธ๋ฌ๋ฉด P2๋ ๋ ์ด์ P3๋ฅผ ์ ์ ํ ์ ์๋ค
- P3๋ ๋์ ์ฐ์ ์์๋ก ์คํ์ ๊ณ์ํจ โ ์์ R์ ๋น ๋ฅด๊ฒ ํด์ ๊ฐ๋ฅ
- P3๊ฐ ์์์ ํด์ ํ๋ฉด, P3๋ ์๋์ ๋ฎ์ ์ฐ์ ์์๋ก ๋์๊ฐ๊ณ P1์ R์ ํ๋ํ์ฌ ์คํ