728x90
๋๊ธฐํ ๊ธฐ๋ฒ ์ค ๋ฎคํ ์ค ๋ฝ, ์ธ๋งํฌ, ๋ชจ๋ํฐ์ ๋ํ์ฌ ์์๋ด ๋๋ค.
1. ๋ฎคํ ์ค ๋ฝ
- ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ ๋๊ตฌ(์๋ฌผ์ ์ญํ ), ๋ฎคํ ์ค ๋ฝ
- ๋ฎคํ
์ค ๋ฝ์ ๋จ์ํ ํํ: ์ ์ญ ๋ณ์ ํ๋, ํจ์ ๋ ๊ฐ
- ์๋ฌผ์ ์ญํ : ํ๋ก์ธ์ค๋ค์ด ๊ณต์ ํ๋ ์ ์ญ ๋ณ์ lock
- ์๊ณ ๊ตฌ์ญ์ ์ ๊ทธ๋ ์ญํ : acquire ํจ์
- ์๊ณ ๊ตฌ์ญ์ ์ ๊ธ์ ํด์ ํ๋ ์ญํ : release ํจ์
- acquire ํจ์
- ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๊ธฐ ์ ์ ํธ์ถ
- ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋ค๋ฉด >> ์๊ณ ๊ตฌ์ญ์ด ์ด๋ฆด ๋๊น์ง(lock์ด false๊ฐ ๋ ๋๊น์ง) ์๊ณ ๊ตฌ์ญ์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ
- ์๊ณ ๊ตฌ์ญ์ด ์ด๋ ค ์๋ค๋ฉด >> ์๊ณ ๊ตฌ์ญ์ ์ ๊ทธ๊ธฐ(lock์ true๋ก ๋ฐ๊พธ๊ธฐ)
- release ํจ์
- ์๊ณ ๊ตฌ์ญ์์์ ์์ ์ด ๋๋๊ณ ํธ์ถ
- ํ์ฌ ์ ๊ธด ์๊ณ ๊ตฌ์ญ์ ์ด๊ธฐ(lock์ false๋ก ๋ฐ๊พธ๊ธฐ)
acquire(); // ์๋ฌผ์ ์ ๊ฒจ ์๋์ง ํ์ธ, ์ ๊ฒจ ์์ง ์๋ค๋ฉด ์ ๊ทธ๊ณ ๋ค์ด๊ฐ๊ธฐ
// ์๊ณ ๊ตฌ์ญ // ์๊ณ ๊ตฌ์ญ์์์ ์์
์งํ
release(); // ์๋ฌผ์ ๋ฐํ
acquire() {
while (lock == true) // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋ค๋ฉด
; // ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋์ง๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ
lock = true; // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์์ง ์๋ค๋ฉด ์๊ณ ๊ตฌ์ญ ์ ๊ธ
}
release() {
lock = false; // ์๊ณ ๊ตฌ์ญ ์์
์ด ๋๋ฌ์ผ๋ ์ ๊ธ ํด์
}
2. ์ธ๋งํฌ
- ์ข ๋ ์ผ๋ฐํ๋ ๋ฐฉ์์ ๋๊ธฐํ ๋๊ตฌ
- ๊ณต์ ์์์ด ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ ์ฉ ๊ฐ๋ฅ
- ์ธ๋งํฌ์ ์ข ๋ฅ(์ด์ง ์ธ๋งํฌ, ์นด์ดํ ์ธ๋งํฌ) ์ค ์นด์ดํ ์ธ๋งํฌ๋ฅผ ๋ค๋ฃน๋๋ค
- ์๊ณ ๊ตฌ์ญ ์์์ ๋ฉ์ถค ์ ํธ๋ฅผ ๋ฐ์ผ๋ฉด ์ ์ ๊ธฐ๋ค๋ฆฌ๊ธฐ โ ์๊ณ ๊ตฌ์ญ ์์์ ๊ฐ๋ ์ข๋ค๋ ์ ํธ๋ฅผ ๋ฐ์ผ๋ฉด ์๊ณ ๊ตฌ์ญ ์ง์
- ์ธ๋งํฌ์ ๋จ์ํ ํํ: ์ ์ญ ๋ณ์ ํ๋, ํจ์ ๋๊ฐ
- ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค์ ๊ฐ์(์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์)๋ฅผ ๋ํ๋ด๋ ์ ์ญ ๋ณ์ S
- ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ๋ ์ข์์ง, ๊ธฐ๋ค๋ ค์ผํ ์ง๋ฅผ ์๋ ค์ฃผ๋ wait ํจ์
- ์๊ณ ๊ตฌ์ญ ์์์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค์ โ์ด์ ๊ฐ๋ ์ข๋คโ๊ณ ์ ํธ๋ฅผ ์ฃผ๋ signal ํจ์
wait() // ์๊ณ ๊ตฌ์ญ signal() wait() { while ( S <= 0) // ๋ง์ผ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค ๊ฐ์๊ฐ 0 ์ดํ๋ผ๋ฉด // ๋ฐ์ ๋๊ธฐ ; // ์ฌ์ฉํ ์ ์๋ ์์์ด ์๋์ง ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ S--; // ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค ๊ฐ์๊ฐ ํ๋ ์ด์์ด๋ฉด S๋ฅผ 1 ๊ฐ์์ํค๊ณ ์๊ณ ๊ตฌ์ญ ์ง์ } signal() { S++; // ์๊ณ ๊ตฌ์ญ์์์ ์์ ์ ๋ง์น ๋ค S๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค }
3. ๋ฐ์ ๋๊ธฐ(busy waiting)
while (lock == true) // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋ค๋ฉด
; // ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋์ง๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ
- ๋ง์น ํ์์ค ๋ฌธ์ด ์ด๋ ธ๋์ง/๋ซํ๋์ง ๋ฐ๋ณต์ ์ผ๋ก ํ์ธํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. โ CPU ์ฌ์ดํด ๋ญ๋น!!
- ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ฌ์ฉํ ์ ์๋ ์์์ด ์์ ๊ฒฝ์ฐ ๋๊ธฐ ์ํ๋ก ๋ง๋ฆ (ํด๋น ํ๋ก์ธ์ค์ PCB๋ฅผ ๋๊ธฐ ํ์ ์ฝ์ )
- ์ฌ์ฉํ ์ ์๋ ์์์ด ์๊ฒผ์ ๊ฒฝ์ฐ ๋๊ธฐ ํ์ ํ๋ก์ธ์ค๋ฅผ ์ค๋น ์ํ๋ก ๋ง๋ฆ (ํด๋น ํ๋ก์ธ์ค์ PCB๋ฅผ ๋๊ธฐ ํ์์ ๊บผ๋ด ์ค๋น ํ์ ์ฝ์ )
3-1. ๋ฐ์๋๊ธฐ๋ฅผ ํด๊ฒฐํ ์ธ๋งํฌ
wait() {
S--;
if ( S <= 0 ) {
add this process to Queue; // ํด๋น ํ๋ก์ธ์ค PCB๋ฅผ ๋๊ธฐ ํ์ ์ฝ์
ํ๋ค
sleep(); // ๋๊ธฐ ์ํ๋ก ์ ์ด๋ ๋ค
}
}
signal() {
S++;
if ( S <= 0 ) {
remove a process p from Queue; // ๋๊ธฐ ํ์ ์๋ ํ๋ก์ธ์ค p๋ฅผ ์ ๊ฑฐํ๋ค
wakeup(p); // ํ๋ก์ธ์ค p๋ฅผ ๋๊ธฐ ์ํ์์ ์ค๋น ์ํ๋ก ๋ง๋ ๋ค
}
3-2. ์ธ๋งํฌ๋ฅผ ํ์ฉํ ์คํ ์์ ๋๊ธฐํ
- ์ธ๋งํฌ๋ฅผ ํ์ฉํด์ ์คํ์์๋ฅผ ๋ณด์ฅํด์ค
- ๋ฐฉ๋ฒ
- ์ธ๋งํฌ์ ๋ณ์ S๋ฅผ 0์ผ๋ก ๋๊ณ , ๋จผ์ ์คํํ ํ๋ก์ธ์ค ๋ค์ signal ํจ์, ๋ค์์ ์คํํ ํ๋ก์ธ์ค ์์ wait ํจ์๋ฅผ ๋ถ์ด๋ฉด ๋จ
- ๋ณด์ฅ์ด ๊ฐ๋ฅํ ์ด์
- P1์ด ๋จผ์ ์คํ, P2๊ฐ ๋์ค์ ์คํ๋์ด์ผ ํ๋ค ํ์ ๋ P1 โ singnal() ์์, wait() โ P2 ์์์ด๋ค.
- ๋ง์ฝ P1์ด ๋จผ์ ์คํ๋๋ค๋ฉด P1์ด ๋จผ์ ์คํ, P2๊ฐ ๋์ค์ ์คํ ์ด๊ฒ์ด ๋ณด์ฅ๋๋ฉฐ
- ๋ง์ฝ P2๊ฐ ๋จผ์ ์คํ๋๋ค๋ฉด wait()ํจ์ ๋๋ฌธ์ ๋๊ธฐ์ํ๋ก ์ ์ด๋ค๊ธฐ ๋๋ฌธ์ P1์ด ๋จผ์ ์คํ๋๋ค.
3-3. ๋ชจ๋ํฐ
- ๋งค๋ฒ ์๊ณ ๊ตฌ์ญ ์๋ค๋ก wait(), signal()์ ํธ์ถํด์ผ ํ๋? ๊ทธ๋ฌ๋ ์ค์๋ผ๋ ํ๋ฉด? โ ์ธ๋งํฌ์ด๋ ์ฌ์ฉ์ ์ ์ฅ์์ ์ฌ์ฉํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๋ค๋ ๋จ์ ์กด์ฌ
- ๊ทธ๋์ ๋ฑ์ฅํ ๋๊ตฌ๊ฐ โ๋ชจ๋ํฐโ
- ๋ชจ๋ํฐ๋ ์ํธ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ์ ์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ ๋ฐฉ์ 2๊ฐ์ง๋ฅผ ๋ชจ๋ ์ ๊ณตํด์ฃผ๋ ๋๊ธฐํ ๋๊ตฌ
- ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ
- ์ธํฐํ์ด์ค๋ฅผ ์ํ ํ
- ๊ณต์ ์์์ ์ ๊ทผํ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ (์ธํฐํ์ด์ค๋ฅผ ์ํ) ํ์ ์ฝ์
- ํ์ ์ฝ์ ๋ ์์๋๋ก (ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง) ๋ชจ๋ํฐ์ ์ง์ ํด์ ๊ณต์ ์์ ์ด์ฉ
- ์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ
- ์กฐ๊ฑด ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์คํ ์์ ์ ์ด
- ์กฐ๊ฑด ๋ณ์: ํ๋ก์ธ์ค๋ ์ค๋ ๋์ ์คํ ์์๋ฅผ ์ ์ดํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํน๋ณํ ๋ณ์
- ์กฐ๊ฑด๋ณ์.wait(): ๋๊ธฐ ์ํ๋ก ๋ณ๊ฒฝ, ์กฐ๊ฑด ๋ณ์์ ๋ํ ํ์ ์ฝ์
- ์กฐ๊ฑด๋ณ์.signal(): wait()์ผ๋ก ๋๊ธฐ ์ํ๋ก ์ ์ด๋ ์กฐ๊ฑด ๋ณ์๋ฅผ ์คํ ์ํ๋ก ๋ณ๊ฒฝ์กฐ๊ฑด ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์คํ ์์ ์ ์ด
- ๋ชจ๋ํฐ ์์๋ ํ๋์ ํ๋ก์ธ์ค๋ง์ด ์์ ์ ์๋ค
- ๋๊ฐ์ง ๋ฐฉ์์ด ์์
- wait()๋ฅผ ํธ์ถํ๋ ํ๋ก์ธ์ค๋ signal()์ ํธ์ถํ ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ํฐ๋ฅผ ๋ ๋ ๋ค์ ์ํ์ ์ฌ๊ฐ
- signal()์ ํธ์ถํ ํ๋ก์ธ์ค์ ์คํ์ ์ผ์ ์ค๋จํ๊ณ ์์ ์ด ์คํ๋ ๋ค ๋ค์ signal()์ ํธ์ถํ ํ๋ก์ธ์ค์ ์ํ์ ์ฌ๊ฐ
- ๋๊ฐ์ง ๋ฐฉ์์ด ์์
- ํต์ฌ์ ๋ค์๊ณผ ๊ฐ์
- ํน์ ํ๋ก์ธ์ค๊ฐ ์์ง ์คํ๋ ์กฐ๊ฑด์ด ๋์ง ์์์ ๋์๋ wait๋ฅผ ํตํด ์คํ์ ์ค๋จํ๋ค
- ํน์ ํ๋ก์ธ์ค๊ฐ ์คํ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์์ ๋์๋ signal์ ํตํด ์คํ์ ์ฌ๊ฐํ๋ค
- ์กฐ๊ฑด ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์คํ ์์ ์ ์ด
- ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ
ใํผ์ ๊ณต๋ถํ๋ ์ปดํจํฐ ๊ตฌ์กฐ+์ด์์ฒด์ ใ ๊ฐ์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ๊ธ์ ๋๋ค
728x90
'๐ ๏ธ OS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[OS] 11. ๊ต์ฐฉ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ | ์๋ฐฉ | ํํผ | ๊ฒ์ถ ํ ํ๋ณต (0) | 2024.02.29 |
---|---|
[OS] 10. ๊ต์ฐฉ ์ํ | ๋ฐ๋๋ฝ (0) | 2024.02.28 |
[OS] 8. ํ๋ก์ธ์ค ๋๊ธฐํ (0) | 2024.02.23 |
[OS] 7. CPU ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ (0) | 2024.02.19 |
[OS] 6. CPU ์ค์ผ์ค๋ง | ์ค์ผ์ค๋ง ํ | ์ ์ ํ ์ค์ผ์ค๋ง | ๋น์ ์ ํ ์ค์ผ์ค๋ง (0) | 2024.02.18 |
728x90
๋๊ธฐํ ๊ธฐ๋ฒ ์ค ๋ฎคํ ์ค ๋ฝ, ์ธ๋งํฌ, ๋ชจ๋ํฐ์ ๋ํ์ฌ ์์๋ด ๋๋ค.
1. ๋ฎคํ ์ค ๋ฝ
- ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ ๋๊ตฌ(์๋ฌผ์ ์ญํ ), ๋ฎคํ ์ค ๋ฝ
- ๋ฎคํ
์ค ๋ฝ์ ๋จ์ํ ํํ: ์ ์ญ ๋ณ์ ํ๋, ํจ์ ๋ ๊ฐ
- ์๋ฌผ์ ์ญํ : ํ๋ก์ธ์ค๋ค์ด ๊ณต์ ํ๋ ์ ์ญ ๋ณ์ lock
- ์๊ณ ๊ตฌ์ญ์ ์ ๊ทธ๋ ์ญํ : acquire ํจ์
- ์๊ณ ๊ตฌ์ญ์ ์ ๊ธ์ ํด์ ํ๋ ์ญํ : release ํจ์
- acquire ํจ์
- ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๊ธฐ ์ ์ ํธ์ถ
- ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋ค๋ฉด >> ์๊ณ ๊ตฌ์ญ์ด ์ด๋ฆด ๋๊น์ง(lock์ด false๊ฐ ๋ ๋๊น์ง) ์๊ณ ๊ตฌ์ญ์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ
- ์๊ณ ๊ตฌ์ญ์ด ์ด๋ ค ์๋ค๋ฉด >> ์๊ณ ๊ตฌ์ญ์ ์ ๊ทธ๊ธฐ(lock์ true๋ก ๋ฐ๊พธ๊ธฐ)
- release ํจ์
- ์๊ณ ๊ตฌ์ญ์์์ ์์ ์ด ๋๋๊ณ ํธ์ถ
- ํ์ฌ ์ ๊ธด ์๊ณ ๊ตฌ์ญ์ ์ด๊ธฐ(lock์ false๋ก ๋ฐ๊พธ๊ธฐ)
acquire(); // ์๋ฌผ์ ์ ๊ฒจ ์๋์ง ํ์ธ, ์ ๊ฒจ ์์ง ์๋ค๋ฉด ์ ๊ทธ๊ณ ๋ค์ด๊ฐ๊ธฐ
// ์๊ณ ๊ตฌ์ญ // ์๊ณ ๊ตฌ์ญ์์์ ์์
์งํ
release(); // ์๋ฌผ์ ๋ฐํ
acquire() {
while (lock == true) // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋ค๋ฉด
; // ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋์ง๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ
lock = true; // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์์ง ์๋ค๋ฉด ์๊ณ ๊ตฌ์ญ ์ ๊ธ
}
release() {
lock = false; // ์๊ณ ๊ตฌ์ญ ์์
์ด ๋๋ฌ์ผ๋ ์ ๊ธ ํด์
}
2. ์ธ๋งํฌ
- ์ข ๋ ์ผ๋ฐํ๋ ๋ฐฉ์์ ๋๊ธฐํ ๋๊ตฌ
- ๊ณต์ ์์์ด ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ ์ฉ ๊ฐ๋ฅ
- ์ธ๋งํฌ์ ์ข ๋ฅ(์ด์ง ์ธ๋งํฌ, ์นด์ดํ ์ธ๋งํฌ) ์ค ์นด์ดํ ์ธ๋งํฌ๋ฅผ ๋ค๋ฃน๋๋ค
- ์๊ณ ๊ตฌ์ญ ์์์ ๋ฉ์ถค ์ ํธ๋ฅผ ๋ฐ์ผ๋ฉด ์ ์ ๊ธฐ๋ค๋ฆฌ๊ธฐ โ ์๊ณ ๊ตฌ์ญ ์์์ ๊ฐ๋ ์ข๋ค๋ ์ ํธ๋ฅผ ๋ฐ์ผ๋ฉด ์๊ณ ๊ตฌ์ญ ์ง์
- ์ธ๋งํฌ์ ๋จ์ํ ํํ: ์ ์ญ ๋ณ์ ํ๋, ํจ์ ๋๊ฐ
- ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค์ ๊ฐ์(์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ์์์ ๊ฐ์)๋ฅผ ๋ํ๋ด๋ ์ ์ญ ๋ณ์ S
- ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ๋ ์ข์์ง, ๊ธฐ๋ค๋ ค์ผํ ์ง๋ฅผ ์๋ ค์ฃผ๋ wait ํจ์
- ์๊ณ ๊ตฌ์ญ ์์์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค์ โ์ด์ ๊ฐ๋ ์ข๋คโ๊ณ ์ ํธ๋ฅผ ์ฃผ๋ signal ํจ์
wait() // ์๊ณ ๊ตฌ์ญ signal() wait() { while ( S <= 0) // ๋ง์ผ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค ๊ฐ์๊ฐ 0 ์ดํ๋ผ๋ฉด // ๋ฐ์ ๋๊ธฐ ; // ์ฌ์ฉํ ์ ์๋ ์์์ด ์๋์ง ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ S--; // ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค ๊ฐ์๊ฐ ํ๋ ์ด์์ด๋ฉด S๋ฅผ 1 ๊ฐ์์ํค๊ณ ์๊ณ ๊ตฌ์ญ ์ง์ } signal() { S++; // ์๊ณ ๊ตฌ์ญ์์์ ์์ ์ ๋ง์น ๋ค S๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค }
3. ๋ฐ์ ๋๊ธฐ(busy waiting)
while (lock == true) // ๋ง์ฝ ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋ค๋ฉด
; // ์๊ณ ๊ตฌ์ญ์ด ์ ๊ฒจ ์๋์ง๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ
- ๋ง์น ํ์์ค ๋ฌธ์ด ์ด๋ ธ๋์ง/๋ซํ๋์ง ๋ฐ๋ณต์ ์ผ๋ก ํ์ธํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. โ CPU ์ฌ์ดํด ๋ญ๋น!!
- ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ฌ์ฉํ ์ ์๋ ์์์ด ์์ ๊ฒฝ์ฐ ๋๊ธฐ ์ํ๋ก ๋ง๋ฆ (ํด๋น ํ๋ก์ธ์ค์ PCB๋ฅผ ๋๊ธฐ ํ์ ์ฝ์ )
- ์ฌ์ฉํ ์ ์๋ ์์์ด ์๊ฒผ์ ๊ฒฝ์ฐ ๋๊ธฐ ํ์ ํ๋ก์ธ์ค๋ฅผ ์ค๋น ์ํ๋ก ๋ง๋ฆ (ํด๋น ํ๋ก์ธ์ค์ PCB๋ฅผ ๋๊ธฐ ํ์์ ๊บผ๋ด ์ค๋น ํ์ ์ฝ์ )
3-1. ๋ฐ์๋๊ธฐ๋ฅผ ํด๊ฒฐํ ์ธ๋งํฌ
wait() {
S--;
if ( S <= 0 ) {
add this process to Queue; // ํด๋น ํ๋ก์ธ์ค PCB๋ฅผ ๋๊ธฐ ํ์ ์ฝ์
ํ๋ค
sleep(); // ๋๊ธฐ ์ํ๋ก ์ ์ด๋ ๋ค
}
}
signal() {
S++;
if ( S <= 0 ) {
remove a process p from Queue; // ๋๊ธฐ ํ์ ์๋ ํ๋ก์ธ์ค p๋ฅผ ์ ๊ฑฐํ๋ค
wakeup(p); // ํ๋ก์ธ์ค p๋ฅผ ๋๊ธฐ ์ํ์์ ์ค๋น ์ํ๋ก ๋ง๋ ๋ค
}
3-2. ์ธ๋งํฌ๋ฅผ ํ์ฉํ ์คํ ์์ ๋๊ธฐํ
- ์ธ๋งํฌ๋ฅผ ํ์ฉํด์ ์คํ์์๋ฅผ ๋ณด์ฅํด์ค
- ๋ฐฉ๋ฒ
- ์ธ๋งํฌ์ ๋ณ์ S๋ฅผ 0์ผ๋ก ๋๊ณ , ๋จผ์ ์คํํ ํ๋ก์ธ์ค ๋ค์ signal ํจ์, ๋ค์์ ์คํํ ํ๋ก์ธ์ค ์์ wait ํจ์๋ฅผ ๋ถ์ด๋ฉด ๋จ
- ๋ณด์ฅ์ด ๊ฐ๋ฅํ ์ด์
- P1์ด ๋จผ์ ์คํ, P2๊ฐ ๋์ค์ ์คํ๋์ด์ผ ํ๋ค ํ์ ๋ P1 โ singnal() ์์, wait() โ P2 ์์์ด๋ค.
- ๋ง์ฝ P1์ด ๋จผ์ ์คํ๋๋ค๋ฉด P1์ด ๋จผ์ ์คํ, P2๊ฐ ๋์ค์ ์คํ ์ด๊ฒ์ด ๋ณด์ฅ๋๋ฉฐ
- ๋ง์ฝ P2๊ฐ ๋จผ์ ์คํ๋๋ค๋ฉด wait()ํจ์ ๋๋ฌธ์ ๋๊ธฐ์ํ๋ก ์ ์ด๋ค๊ธฐ ๋๋ฌธ์ P1์ด ๋จผ์ ์คํ๋๋ค.
3-3. ๋ชจ๋ํฐ
- ๋งค๋ฒ ์๊ณ ๊ตฌ์ญ ์๋ค๋ก wait(), signal()์ ํธ์ถํด์ผ ํ๋? ๊ทธ๋ฌ๋ ์ค์๋ผ๋ ํ๋ฉด? โ ์ธ๋งํฌ์ด๋ ์ฌ์ฉ์ ์ ์ฅ์์ ์ฌ์ฉํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๋ค๋ ๋จ์ ์กด์ฌ
- ๊ทธ๋์ ๋ฑ์ฅํ ๋๊ตฌ๊ฐ โ๋ชจ๋ํฐโ
- ๋ชจ๋ํฐ๋ ์ํธ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ์ ์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ ๋ฐฉ์ 2๊ฐ์ง๋ฅผ ๋ชจ๋ ์ ๊ณตํด์ฃผ๋ ๋๊ธฐํ ๋๊ตฌ
- ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ
- ์ธํฐํ์ด์ค๋ฅผ ์ํ ํ
- ๊ณต์ ์์์ ์ ๊ทผํ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ (์ธํฐํ์ด์ค๋ฅผ ์ํ) ํ์ ์ฝ์
- ํ์ ์ฝ์ ๋ ์์๋๋ก (ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง) ๋ชจ๋ํฐ์ ์ง์ ํด์ ๊ณต์ ์์ ์ด์ฉ
- ์คํ ์์ ์ ์ด๋ฅผ ์ํ ๋๊ธฐํ
- ์กฐ๊ฑด ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์คํ ์์ ์ ์ด
- ์กฐ๊ฑด ๋ณ์: ํ๋ก์ธ์ค๋ ์ค๋ ๋์ ์คํ ์์๋ฅผ ์ ์ดํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํน๋ณํ ๋ณ์
- ์กฐ๊ฑด๋ณ์.wait(): ๋๊ธฐ ์ํ๋ก ๋ณ๊ฒฝ, ์กฐ๊ฑด ๋ณ์์ ๋ํ ํ์ ์ฝ์
- ์กฐ๊ฑด๋ณ์.signal(): wait()์ผ๋ก ๋๊ธฐ ์ํ๋ก ์ ์ด๋ ์กฐ๊ฑด ๋ณ์๋ฅผ ์คํ ์ํ๋ก ๋ณ๊ฒฝ์กฐ๊ฑด ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์คํ ์์ ์ ์ด
- ๋ชจ๋ํฐ ์์๋ ํ๋์ ํ๋ก์ธ์ค๋ง์ด ์์ ์ ์๋ค
- ๋๊ฐ์ง ๋ฐฉ์์ด ์์
- wait()๋ฅผ ํธ์ถํ๋ ํ๋ก์ธ์ค๋ signal()์ ํธ์ถํ ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ํฐ๋ฅผ ๋ ๋ ๋ค์ ์ํ์ ์ฌ๊ฐ
- signal()์ ํธ์ถํ ํ๋ก์ธ์ค์ ์คํ์ ์ผ์ ์ค๋จํ๊ณ ์์ ์ด ์คํ๋ ๋ค ๋ค์ signal()์ ํธ์ถํ ํ๋ก์ธ์ค์ ์ํ์ ์ฌ๊ฐ
- ๋๊ฐ์ง ๋ฐฉ์์ด ์์
- ํต์ฌ์ ๋ค์๊ณผ ๊ฐ์
- ํน์ ํ๋ก์ธ์ค๊ฐ ์์ง ์คํ๋ ์กฐ๊ฑด์ด ๋์ง ์์์ ๋์๋ wait๋ฅผ ํตํด ์คํ์ ์ค๋จํ๋ค
- ํน์ ํ๋ก์ธ์ค๊ฐ ์คํ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์์ ๋์๋ signal์ ํตํด ์คํ์ ์ฌ๊ฐํ๋ค
- ์กฐ๊ฑด ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์คํ ์์ ์ ์ด
- ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ๋๊ธฐํ
ใํผ์ ๊ณต๋ถํ๋ ์ปดํจํฐ ๊ตฌ์กฐ+์ด์์ฒด์ ใ ๊ฐ์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ๊ธ์ ๋๋ค
728x90
'๐ ๏ธ OS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[OS] 11. ๊ต์ฐฉ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ | ์๋ฐฉ | ํํผ | ๊ฒ์ถ ํ ํ๋ณต (0) | 2024.02.29 |
---|---|
[OS] 10. ๊ต์ฐฉ ์ํ | ๋ฐ๋๋ฝ (0) | 2024.02.28 |
[OS] 8. ํ๋ก์ธ์ค ๋๊ธฐํ (0) | 2024.02.23 |
[OS] 7. CPU ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ (0) | 2024.02.19 |
[OS] 6. CPU ์ค์ผ์ค๋ง | ์ค์ผ์ค๋ง ํ | ์ ์ ํ ์ค์ผ์ค๋ง | ๋น์ ์ ํ ์ค์ผ์ค๋ง (0) | 2024.02.18 |