์ํธ ๋ฐฐ์ (mutual exclusion)
๋ฉํฐ ํ๋ก๊ทธ๋๋ฐ์์ ๊ณต์ ๋ถ๊ฐ๋ฅํ ์์์ ๋์ ์ฌ์ฉ์ ํผํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์๊ณ ๊ตฌ์ญ์ผ๋ก ๋ถ๋ฆฌ๋ ์ฝ๋ ์์ญ์ ์ํด ๊ตฌํ๋๋ค. = ํ๋์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์์ ์ฌ์ฉํ ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ ๊ทผ์ ๋ง๋ ๊ฒ์ด๋ค.
- ๋ฐ์ปค ์๊ณ ๋ฆฌ์ฆ, ํผ์ปค์จ ์๊ณ ๋ฆฌ์ฆ, ์ ๊ณผ์ ์๊ณ ๋ฆฌ์ฆ
- ์ํธ๋ฐฐ์ ๋ ๊ต์ฐฉ์ํ์ 4๊ฐ์ง ํ์์กฐ๊ฑด ์ค ํ๋์ด๋ค.
1. ์ํธ๋ฐฐ์ - ๋ฐฐํ์ ํต์ ๊ถ(๋์ ์ฌ์ฉ ๋ถ๊ฐ)
2. ์ ์ ๋๊ธฐ - ํ ๋น๋ ์์์ ๊ฐ์ง ์ํ์์ ๋ค๋ฅธ ์์์ ๊ธฐ๋ค๋ฆผ
3. ๋น์ ์ - ์์์ ๋บ์ ์ ์์
4. ์ํ๋๊ธฐ - ๊ฐ ํ๋ก์ธ์ค๋ ์ํ์ ์ผ๋ก ๋ค์ ํ๋ก์ธ์ค๊ฐ ์๊ตฌํ๋ ์์์ ๊ฐ๊ณ ์์ - ๊ต์ฐฉ ์ํ์ ๊ธฐ์ ์ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ต์ฐฉ ์ํ(Deadlock) : ๋ฌดํ ๋๊ธฐ
๊ธฐ์ ์ํ(Starvation) : ์ฐ์ ์์๊ฐ ๋ฎ์ ์์์ ๊ณ์ ํ ๋น ๋ฐ์ง ๋ชปํ๋ ์ํ - ๋ฉํฐ ํ๋ก์ธ์ค๋ ๋ฉํฐ ์ค๋ ๋ ๋๊ธฐํ์ ์ฌ์ฉ๋๋ค.
๋๊ธฐํ(synchronize): mutual exclusion์ ์ํด ์คํ์ ์ ์ดํ๋ ๊ฒ. ๋ฎคํ ์ค, ์ธ๋งํฌ์ด, ๋ชจ๋ํฐ ๋ฑ
์๊ณ ์์ญ(Critical Section)
๊ณต์ ์์์ ์ ๊ทผํ๋ ํ๋ก์ธ์ค ๋ด๋ถ์ ์ฝ๋ ์์ญ์ผ๋ก ์ด๋ค ํ ํ๋ก์ธ์ค๊ฐ ์ด ์์ญ์ ์ํ์ค์ผ ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์์ญ์ ์ํํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ์ด์ฉํ๊ฒ๋ ๋ณด์ฅํด์ผ ํ๋ ์์ญ์ด๋ค.
์๊ณ ์์ญ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์๋ 3๊ฐ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํ๋ค.
- ์ํธ๋ฐฐ์
- ํ๋์ ํ๋ก์ธ์ค๊ฐ ์๊ณ ์์ญ์ ๋ค์ด๊ฐ์๋ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๋ค์ด๊ฐ ์ ์์ด์ผ ํ๋ค.
- ์งํ
- ์๊ณ ์์ญ์ ๋ค์ด๊ฐ ํ๋ก์ธ์ค๊ฐ ์๋ ์ํ์์ ๋ค์ด๊ฐ๋ ค ํ๋ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ์ด๋ ๊ฒ์ด ๋ค์ด๊ฐ์ง ๊ฒฐ์ ํด์ฃผ์ด์ผ ํ๋ค.
- ํ์ ๋๊ธฐ
- ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๊ธฐ์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, ํ ๋ฒ ์๊ณ ์์ญ์ ๋ค์ด๊ฐ ํ๋ก์ธ์ค๋ ๋ค์๋ฒ ์๊ณ ์์ญ์ ๋ค์ด๊ฐ ๋ ์ ํ์ ๋์ด์ผ ํ๋ค.
์๊ณ ์์ญ์ ๋์์ ๊ทผ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฝ(lock), ์ธ๋งํฌ์ด(semaphore), ๋ชจ๋ํฐ(monitor)๋ฑ์ด ์๋ค.
๋ฎคํ ์ค (Mutex, ์ํธ๋ฐฐ์ ) Mutual Exclusion
- ๋ค๋ฅธ ํ๋ก์ธ์ค ๊ฐ ๋๊ธฐํ์ ์ฌ์ฉ๋๋ค.
- ๊ณต์ ๋ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ๊ทผํ๋ ๊ฒ์ ๋ง๋ ๊ฒ
- ์๊ณ์์ญ(Critical Section)์ ๊ฐ์ง ์ค๋ ๋์ Running time์ด ์๋ก ๊ฒน์น์ง ์๊ฒ ๋จ๋
์ ์ผ๋ก ์คํ๋๊ฒ ํ๋ ๊ฒ
- ์๊ณ ๊ตฌ์ญ์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ(์ผ์ข ์ binary semaphore)
- ์ํ๊ฐ 0, 1๋ก ์ด์ง ์ธ๋งํฌ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ
- ๋ค์ค ํ๋ก์ธ์ค๋ค์ ๊ณต์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ์ ์กฐ์จํ๊ธฐ ์ํด Locking๊ณผ Unlocking์ ์ฌ์ฉ
- ํ ์ค๋ ๋๊ฐ ์๊ณ์์ญ์ ๋ค์ด๊ฐ๊ธฐ ์ํด์ lock์ ํ๊ณ , ๋์ฌ ๋ unlock์ ํ๋ค.
๋ฎคํ ์ค ์๊ณ ๋ฆฌ์ฆ
1. ๋ฐ์ปค(Dekker) ์๊ณ ๋ฆฌ์ฆ
- flag์ turn ๋ณ์๋ฅผ ํตํด ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ ํ๋ก์ธ์ค/์ค๋ ๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์
- flag : ํ๋ก์ธ์ค ์ค ๋๊ฐ ์๊ณ์์ญ์ ์ง์ ํ ๊ฒ์ธ์ง ๋ํ๋ด๋ ๋ณ์
- turn : ๋๊ฐ ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ฐจ๋ก์ธ์ง ๋ํ๋ด๋ ๋ณ์
while(true) {
flag[i] = true; // ํ๋ก์ธ์ค i๊ฐ ์๊ณ ๊ตฌ์ญ ์ง์
์๋
while(flag[j]) { // ํ๋ก์ธ์ค j๊ฐ ํ์ฌ ์๊ณ ๊ตฌ์ญ์ ์๋์ง ํ์ธ
if(turn == j) { // j๊ฐ ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์ค์ด๋ฉด
flag[i] = false; // ํ๋ก์ธ์ค i ์ง์
์ทจ์
while(turn == j); // turn์ด j์์ ๋ณ๊ฒฝ๋ ๋๊น์ง ๋๊ธฐ
flag[i] = true; // j turn์ด ๋๋๋ฉด ๋ค์ ์ง์
์๋
}
}
}
// ------- ์๊ณ ๊ตฌ์ญ ---------
turn = j; // ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ๋๋๋ฉด turn์ ๋๊น
flag[i] = false; // flag ๊ฐ์ false๋ก ๋ฐ๊ฟ ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์๋ฃ๋ฅผ ์๋ฆผ
2. ํผํฐ์จ(Peterson) ์๊ณ ๋ฆฌ์ฆ
- ๋ฐ์ปค์ ์ ์ฌํ์ง๋ง, ์๋๋ฐฉ ํ๋ก์ธ์ค/์ค๋ ๋์๊ฒ ์ง์ ๊ธฐํ๋ฅผ ์๋ณดํ๋ ๊ฒ์ ์ฐจ์ด๊ฐ ์์
while(true) {
flag[i] = true; // ํ๋ก์ธ์ค i๊ฐ ์๊ณ ๊ตฌ์ญ ์ง์
์๋
turn = j; // ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ์ง์
๊ธฐํ ์๋ณด
while(flag[j] && turn == j) { // ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ง์
์๋ํ๋ฉด ๋๊ธฐ
}
}
// ------- ์๊ณ ๊ตฌ์ญ ---------
flag[i] = false; // flag ๊ฐ์ false๋ก ๋ฐ๊ฟ ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์๋ฃ๋ฅผ ์๋ฆผ
3. ์ ๊ณผ์ (Bakery) ์๊ณ ๋ฆฌ์ฆ
- ์ฌ๋ฌ ํ๋ก์ธ์ค/์ค๋ ๋์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ.
- ๊ฐ์ฅ ์์ ์์ ๋ฒํธํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๋ค.
while(true) {
isReady[i] = true; // ๋ฒํธํ ๋ฐ์ ์ค๋น
number[i] = max(number[0~n-1]) + 1; // ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค ์ค์ ๊ฐ์ฅ ํฐ ๋ฒํธ ๋ฐฐ์
isReady[i] = false; // ๋ฒํธํ ์๋ น ์๋ฃ
for(j = 0; j < n; j++) { // ๋ชจ๋ ํ๋ก์ธ์ค ๋ฒํธํ ๋น๊ต
while(isReady[j]); // ๋น๊ต ํ๋ก์ธ์ค๊ฐ ๋ฒํธํ ๋ฐ์ ๋๊น์ง ๋๊ธฐ
while(number[j] && number[j] < number[i] && j < i);
// ํ๋ก์ธ์ค j๊ฐ ๋ฒํธํ ๊ฐ์ง๊ณ ์์ด์ผ ํจ
// ํ๋ก์ธ์ค j์ ๋ฒํธํ < ํ๋ก์ธ์ค i์ ๋ฒํธํ
}
}
// ------- ์๊ณ ๊ตฌ์ญ ---------
number[i] = 0; // ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์ข
๋ฃ
์ธ๋งํฌ์ด (Semaphore)
- ๋ฎคํ ์ค๊ฐ ์๊ณ ์์ญ์ ๋ค์ด๊ฐ๋ ์ค๋ ๋๊ฐ ํ๋๋ผ๋ฉด, ์ธ๋งํฌ์ด๋ ๋ณต์๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค.
- wait๊ณผ signal์ ํตํด ๊ตฌํ๋๋ค.
- wait์ด ๋จผ์ ํธ์ถ๋์ด ์๊ณ์์ญ์ ๋ค์ด๊ฐ ์ ์๋์ง ํ์ธ or ๋จผ์ ์คํ๋์ด์ผ ํ๋ ํ๋ก์ธ์ค๊ฐ ์คํ๋๋์ง ํ์ธ
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด wait์ ๋น ์ ธ๋์ ์๊ณ์์ญ์ผ๋ก ๋ค์ด๊ฐ๋ค.
- ์ดํ signal์ด ํธ์ถ๋์ด ์๊ณ์์ญ์์ ๋น ์ ธ๋์์์ ์๋ฆฐ๋ค.
๋ฎคํ
์ค์ ์ธ๋งํฌ์ด์ ์ฐจ์ด
์ฐ๋ฆฌ(ํ๋ก์ธ์ค)๊ฐ ๋ฐฉ(์์)์ ๋ค์ด๊ฐ๋ ค๊ณ ํ ๋, ๋ฎคํ ์ค๋ ๋ฐฉ์ ๋ค์ด๊ฐ๊ธฐ ์ํ ์ด์ ์ ๊ฐ์์ด๋ฉฐ, ์ธ๋งํฌ์ด๋ ๋น ๋ฐฉ์ ์ด์ ์ ๊ฐ์์ด๋ค.
์ฆ ๋ฎคํ ์ค๋ ํ ์ฌ๋์ด ๋น ๋ฐฉ์ ๋ํ ์ด์ ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ๋ฐฉ์ ๋ค์ด๊ฐ๋ค๋ฉด, ๊ทธ ์ฌ๋์ด ๋์์ผ๋ง ๋ค๋ฅธ ์ฌ๋์ด ์ด์ ๋ฅผ ๊ฑด๋ค๋ฐ์ ๋ฐฉ์ ๋ค์ด๊ฐ ์ ์๋ค.
๋ฐ๋ฉด ์ธ๋งํฌ์ด๋ ๋ฐฉ์ด ๋ค๊ฐ๋ฉด ์ด์ ๋ ๋ค๊ฐ์ผ ๊ฒ์ด๊ณ ํ ์ฌ๋์ด ๋ค์ด๊ฐ ๋๋ง๋ค ๋ค์ด๊ฐ ์ ์๋ ๋ฐฉ์ ํ๋์ฉ ์ค์ด๋ค์ด 0๊ฐ๊ฐ ๋๋ฉด ๋น ๋ฐฉ์ด ๋์ฌ๋ ๊น์ง ๋๊ธฐํด์ผ ํ๋ ์ํฉ์ด๋ค. ์๋ฌด๋ ๋จผ์ ๋์์ผ๋ง ๋ฐฉ๊ณผ ์ด์ ๋ฅผ ํ๊ฐ์ฉ ์ป์ด์ ๋ค์ด๊ฐ ์ ์๋ค.
- ์ธ๋งํฌ์ด๋ ์์์ ์ํ๋ฅผ ๋ํ๋ด๋ ์ผ์ข ์ '๋ณ์'๋ก์จ ์์ ๊ฐ๋ ์ด ์๋์ง๋ง, ๋ฎคํ ์ค๋ ์์์ ์ ์ ํ ํ๋ก์ธ์ค๋ ์ฐ๋ ๋๊ฐ ์ ์ ์์ ํ์๋ค๊ฐ ์์ ์ด ๋๋๋ฉด ๋ฐํํ๋ ๊ฐ๋ ์ด๋ค.
- ์ธ๋งํฌ์ด์ ๋ฐ์ด๋๋ฆฌ ๊ฐ์ ๊ฐ๋ ๊ฒ์ด ๋ฎคํ ์ค์ด๋ค.
- ์ธ๋งํฌ์ด๋ ๋ฎคํ ์ค๊ฐ ๋ ์ ์์ง๋ง, ๋ฎคํ ์ค๋ ์ธ๋งํฌ์ด๊ฐ ๋ ์ ์๋ค.
- ์ธ๋งํฌ์ด๋ ์์คํ ๋ฒ์์ ๊ฑธ์ณ์๊ณ ํ์ผ ์์คํ ์์ ํ์ผ ํํ๋ก ์กด์ฌํ๋ค. ๋ฐ๋ฉด, ๋ฎคํ ์ค๋ ํ๋ก์ธ์ค ๋ฒ์๋ฅผ ๊ฐ์ง๊ณ , ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋ ์๋์ผ๋ก ์ง์์ง๋ค.
- ์ธ๋งํฌ์ด๋ ๋๊ธฐํ ๋์์ด ์ฌ๋ฌ๊ฐ์ผ ๋, ๋ฎคํ ์ค๋ ๋๊ธฐํ ๋์์ด ์ค๋ก์ง ํ๋์ผ๋ ์ฌ์ฉ๋๋ค.
๋ชจ๋ํฐ (Monitor)
- ํ๋์ ํ๋ก์ธ์ค ๋ด์ ๋ค๋ฅธ ์ค๋ ๋ ๊ฐ ๋๊ธฐํ์ ์ฌ์ฉ๋๋ค.
- ๋ชจ๋ํฐ๋ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ทธ ์์ฒด์์ ์ ๊ณต๋๋ค.
- C์ธ์ด์๋ ์๊ณ , Java์๋ ์๋ค.
- ์ผ๋ จ์ ๋๊ธฐํ ์์ ๋ค์ด ์บก์ํ๋์ด ์์ด์ synchronized, wait(), notify()๋ฑ์ ํค์๋๋ฅผ ํตํด ํธํ๊ฒ ๋๊ธฐํ ํ ์ ์๋ค.
- ์ฆ, ์ธ๋งํฌ์ด์ ๋ฌ๋ฆฌ wait, signal ์ค์ ์์ด ํจ์ ์์ synchronized๋ฅผ ๋ถ์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ์ํธ๋ฐฐ์ ํ์ฌ ํจ์์ ์์ ์ ์ํํ๋ค.
๋ฎคํ ์ค์ ๋ชจ๋ํฐ ์ฐจ์ด
๋ฎคํ ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ์ ๋๊ธฐํ ํ ๋ ์ฌ์ฉํ ์ ์๊ณ , ๋ชจ๋ํฐ๋ ํ๋์ ํ๋ก์ธ์ค ๋ด์์ ๋ค๋ฅธ ์ค๋ ๋ ๊ฐ์ ๋๊ธฐํ์ ์ฌ์ฉ๋๋ค.
์ฐธ๊ณ
'๐CS > OS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[OS] ์ค์ผ์ค๋ฌ์ ์ข ๋ฅ: ์ฅ๊ธฐ, ์ค๊ธฐ, ๋จ๊ธฐ ์ค์ผ์ค๋ฌ (0) | 2021.08.04 |
---|---|
[OS] ๋ธ๋ญ/๋ ผ๋ธ๋ญ, ๋๊ธฐ/๋น๋๊ธฐ (0) | 2021.07.28 |
[OS] ํ๋ก์ธ์ค ๊ฐ ํต์ ๋ฐฉ๋ฒ(Inter Process Communication, IPC) (1) | 2021.05.02 |
[OS] ์ค๋ ๋ (0) | 2021.04.04 |
[OS] ํ๋ก์ธ์ค (0) | 2021.04.02 |
๋๊ธ