- ๋๊ธฐํ (synchronization)
: ๋์๋ค๋ฐ์ ์ผ๋ก ์คํ๋๋ ํ๋กฏํค์ค๋ค์ ์คํ ์์์ ์์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํด์ผ ํ๋ค
: ํ๋ก์ธ์ค ๋๊ธฐํ = ํ๋ก์ธ์ค ์ฌ์ด์ ์ํ ์๊ธฐ๋ฅผ ๋ง์ถ๋ ๊ฒ
: ์ํ ์๊ธฐ๋ฅผ ๋ง์ถ๋ค = ์คํ ์์ ์ ์ด, ์ํธ ๋ฐฐ์
: 1) ๋์์ ์ ๊ทผํด์ ์๋๋ ์์์ ๋์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ์ดํ๋ ๊ฒ
: 2) ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋์ด์ผ๋ง ์คํํ ์ ์๋ ์ํฉ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋๋๋ก ํ๋ ๊ฒ
- ์ํธ ๋ฐฐ์ (mutual exclusion)๋ฅผ ์ํ ๋๊ธฐํ
: ์ํธ ๋ฐฐ์ = ๊ณต์ ๊ฐ ๋ถ๊ฐ๋ฅํ ์์์ ๋์ ์ฌ์ฉ์ ํผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๊ณต์ ์์ (shared resource)
: ๊ณต๋์ ์์(์ ์ญ๋ณ์, ํ์ผ, ์ ์ถ๋ ฅ์ฅ์น ๋ฑ), ์ด ๊ณต์ ์์์ ๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๋ฅผ ๋์์ ์คํํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์์์ด ์์. ์ด ์์์ ์ ๊ทผํ๋ ์ฝ๋ ์์ญ์ ์๊ณ๊ตฌ์ญ(critical section)์ด๋ผ ํจ.
- Race Condition
: ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์ ๋ค๋ฐ์ ์ผ๋ก ์๊ณ ๊ตฌ์ญ์ ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ.
: ๋ฐ๋ผ์ ์ด๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์๊ณ๊ตฌ์ญ์ ํด๊ฒฐํด์ผ ํจ.
1) ์ํธ๋ฐฐ์ (mutual exclusion) : ํ ํ๋ก์ธ์ค๊ฐ ์๊ณ๊ตฌ์ญ์ผ๋ก ์ง์ ํ๋ค๋ฉด, ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๋ค์ด์ฌ ์ ์๋ค.
2) ์งํ(progress) : ์๊ณ ๊ตฌ์ญ์ ์ด๋ค ํ๋ก์ธ์ค๋ ์ง์ ํ์ง ์์๋ค๋ฉด, ๋ค์ด๊ฐ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๋ ๋ค์ด๊ฐ ์ ์์ด์ผ ํ๋ค.
3) ์ ํ ๋๊ธฐ(bounded waiting) : ํ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด, ๊ทธ ํ๋ก์ธ์ค๋ ์ธ์ ๊ฐ๋ ์๊ณ ๊ตฌ์ญ์ ๋ค์ด์ฌ ์ ์์ด์ผ ํ๋ค. (๋ค์ด์ค๊ธฐ ์ํด ๋ฌดํ์ ๋๊ธฐX)
< ๋๊ธฐํ ๊ธฐ๋ฒ >
1. ๋ฎคํ ์ค ๋ฝ
: ๋์์ ์ ๊ทผํด์ ์ ๋๋ ์์์ ์ ๊ทผํ์ง ์๋๋ก ๋ง๋๋ ๋๊ธฐํ ๋๊ตฌ.
: ์๋ฌผ์ ์ญํ - ํ๋ก์ธ๋ค์ด ๊ณต์ ํ๋ ์ ์ญ ๋ณ์ lock.
: ์๊ณ ๊ตฌ์ญ์ ์ ๊ทธ๋ ์ญํ : acquire ํจ์ - ์ ๊ฒจ์๋์ง ์ด ์ ์์ด ๋ฐ๋ณตํด ํ์ธ (busy wait)
: ์๊ณ ๊ตฌ์ญ์ ์ ๊ธ์ ํด์ ํ๋ ์ญํ : release ํจ์
acquire(){
while (lock == true) // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ์๋ค๋ฉด
; // ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋์ง๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ
lock = true; // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ์์ง ์์ผ๋ฉด ์ ๊ธ
}
release(){
lock = false; // ์๊ณ ๊ตฌ์ญ ์์
์ด ๋๋ฌ์ผ๋ ์ ๊ธ ํด์
}
// ์๊ณ ๊ตฌ์ญ ์ ํ๋ก ํธ์ถํ์ฌ ํ๋์ ํ๋ก์ธ์ค๋ง ์๊ณ ๊ตฌ์ญ์ ์ง์
ํ๊ฒ ํ ์ ์์
acquire();
// ์๊ณ๊ตฌ์ญ
release();
2. ์ธ๋งํฌ(semaphore)
: ๋ฎคํ ์ค ๋ฝ๊ณผ ๋น์ทํ๋, ์ข ๋ ์ผ๋ฐํ๋ ๋ฐฉ์์ ๋๊ธฐํ
: ๊ณต์ ์์์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ์ ์ฉํ ์ ์๋ ๋๊ตฌ (counting semaphore)
: ์ ์ญ๋ณ์ S - ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค์ ๊ฐ์(์ฌ์ฉ ๊ฐ๋ฅ ๊ณต์ ์์ ์)
: wail ํจ์ - ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ๋ ์ข์์ง, ๊ธฐ๋ค๋ ค์ผ ํ ์ง ๋๊ธฐ
: signal ํจ์ - ์๊ณ ๊ตฌ์ญ ์์์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค์ ๊ฐ๋ ๋๋ค๋ ์ ํธ ๋ณด๋
wait()
// ์๊ณ๊ตฌ์ญ
signal()
wait()
{
while (S <= 0)
;
S--;
}
signal()
{
S++
}
// ์ธ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋ ๊ฐ์ ๊ณต์ ์์์ ์์๋๋ก ์ ๊ทผ
// ํ๋ก์ธ์ค1 wait ํธ์ถ, S = 2 ์์ -1 ํ ํ ์๊ณ ๊ตฌ์ญ ์ง์
// ํ๋ก์ธ์ค2 wait ํธ์ถ, S = 1 ์์ -1 ํ ํ ์๊ฒ ๊ตฌ์ญ ์ง์
// ํ๋ก์ธ์ค3 wait ํธ์ถ, S = 0 ์ด๋ฏ๋ก ๋ฌดํํ ๋ฐ๋ณตํ๋ฉฐ Sํ์ธ
// ํ๋ก์ธ์ค1 ์๊ณ๊ตฌ์ญ ์์
์ข
๋ฃ -> signal() ํธ์ถ, S += 1
// ํ๋ก์ธ์ค3์ด S=1์์ ํ์ธ, -1ํ ํ ์๊ฒ ๊ตฌ์ญ ์ง์
// ๋ฌธ์ ๋ฐ์ ) ์ฌ์ฉ ๊ฐ๋ฅ ์์์ด ์์ ๊ฒฝ์ฐ ๋ฌดํ ๋ฐ๋ณตํ๋ฉฐ S ํ์ธ
// wait -> ์์์ด ์์ ๊ฒฝ์ฐ ํ๋ก์ธ์ค ์ํ๋ฅผ ๋๊ธฐ๋ก ๋ฐ๊พธ๊ณ ,
// ํด๋น PCB๋ฅผ ์ธ๋งํฌ๋ฅผ ์ํ ๋๊ธฐํ์ ๋ฃ์
wait()
{
while (S < 0)
add this process to Queue;
sleep();
}
signal()
{
S++
if (S <= 0){
remove a process a form Queue
wakeup(p)
}
}
// ํ๋ก์ธ์ค1 wait ํธ์ถ, S = 2 ์์ -1 ํ ํ ์๊ณ ๊ตฌ์ญ ์ง์
// ํ๋ก์ธ์ค2 wait ํธ์ถ, S = 1 ์์ -1 ํ ํ ์๊ฒ ๊ตฌ์ญ ์ง์
// ํ๋ก์ธ์ค3 wait ํธ์ถ, S = -1 ์ด๋ฏ๋ก ๋ณธ์ธ์ PCB๋ฅผ ๋๊ธฐ ํ์ ๋ฃ์ (๋๊ธฐ ์ํ ์ ํ)
// ํ๋ก์ธ์ค1 ์๊ณ ๊ตฌ์ญ ์ข
๋ฃ, signal() ํธ์ถ, S = 0, ํ๋ก์ธ์ค3์ ์ค๋นํ๋ก ์ฎ๊น
// ๊นจ์ด๋ ํ๋ก์ธ์ค3 ์๊ณ๊ตฌ์ญ์ง์
// ํ๋ก์ธ์ค2 ์๊ณ ์์
์ข
๋ฃ, signal() ํธ์ถ, S = 1
// ํ๋ก์ธ์ค3 ์๊ณ ์์
์ข
๋ฃ, signal() ํธ์ถ, S = 2
'๐ค Study > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[06] ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ (1) | 2024.03.28 |
---|---|
[05] ๊ต์ฐฉ ์ํ (0) | 2024.03.25 |
[03] CPU ์ค์ผ์ค๋ง (0) | 2024.03.19 |
[02] ํ๋ก์ธ์ค ๊ฐ์ (0) | 2024.03.15 |
[01] ์ด์์ฒด์ ์ ์์ (0) | 2024.03.13 |