๐ race condition ์ด๋ deadlock์ ๋ฐฉ์งํ๊ธฐ ์ํด
๐ spinlock, semaphore, mutex, monitor ๋ฑ
๐ ๋ ์ค๋ ๋๊ฐ ํ๋์ ์๊ณ์์ญ์ ์ ๊ทผํ ๋, ํ๋๋ง ์ ๊ทผ ๊ฐ๋ฅํ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ์
Thread 0์ด ์๊ณ์์ญ์ ์ ์ ์ค์ด๊ณ lock์ ๊ฑธ์ด๋์ ์ํ์ผ๋, Thread 1์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ณ ๋ฌดํ์ ๊ธฐ๋ค๋ ค์ผํ๋ค
๋ค๋ง spinlock์์๋ busy waiting์ด๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ฐ, Thread 0์ด ์๊ณ์์ญ์ ๋ค ์ฌ์ฉํ๋์ง์ ์ฌ๋ถ๋ฅผ Thread 1์ด ๊ณ์ ํ์ธํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค
Busy waiting์ ์ฝ๋์์์ while ๋ฌธ์ผ๋ก ๋๊ธฐ๋ฅผ ํ๋ ๊ฒ์ด๋ฏ๋ก ์ปดํจํฐ ๋ฆฌ์์ค๊ฐ ํฌ๊ฒ ๋ญ๋น๋๋ค๋ ๋จ์ ์ด ์๋ค
๐ ์ธ๋งํฌ์ด๋ spinlock์ ๋จ์ ์ธ busy waiting์ ๊ทน๋ณตํ๊ธฐ ์ํด wait()์ signal() ๋ฉ์๋๋ฅผ ํ์ฉํ๋ค
Wait ์ํ์ธ ์ค๋ ๋๋ ๋๊ธฐ ํ์ ๋ค์ด๊ฐ์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ while ๋ฌธ์ ๋ฐ๋ณต ์คํํ์ง ์์ผ๋ฏ๋ก ๋ฆฌ์์ค ๋ญ๋น๊ฐ ์๋ค
์๊ณ์์ญ์ ์ ์ ์ค์ด๋ ์ค๋ ๋๋ ์์ ์ด ๋๋๋๋๋ก signal()์ ํตํด lock์ ๋ฐํํ๋ฏ๋ก์จ ๋๊ธฐ ํ์ ์กด์ฌํ๋ ์ค๋ ๋๋ฅผ ๊นจ์ ์ค๋น ํ๋ก ์ด๋์ํจ๋ค
ํฌ๊ฒ binary semaphore์ counting semaphore ๋๊ฐ์ง๋ก ๊ตฌ๋ถ๋๋ค
๐ 0 ๊ณผ 1 ๋๊ฐ์ง์ ๊ฐ๋ง ์กด์ฌํ๋ค
๋ฐ๋ผ์ ํ๋์ ์๊ณ์์ญ์ ํ๋์ ์ค๋ ๋๋ง์ด ์ ์ ๊ฐ๋ฅํ๋ค
๐ ์ด๋ ํ ์์ ์ ์ ๊ฐ์ด ์กด์ฌํ๋ค
์ด ์ ์ ๊ฐ๋งํผ์ ์ค๋ ๋๋ค์ด ๋์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค
์ด์ฏค์์ spinlock๊ณผ semaphore์ ์ฐจ์ด์ ๋ํด ์์๋ณด์
spinlock์ loop๋ฅผ ํตํด ์ค๋ ๋๋ก ํ์ฌ๊ธ ๋์์์ด ์๊ณ์์ญ์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ๋๋ก ๊ฐ์ ํฉ๋๋ค
๋ฐ๋ฉด, semaphore๋ ๋ฐ๋ก ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ ์ค๋ ๋๋ sleep ์ํค๊ณ ์ฌ์ฉ๊ฐ๋ฅํ ์ํฉ์ผ๋ awaken up ์์ผ์ค๋๋ค.
์ด๋ฅผ ํตํด, semaphore์์๋ ๋ฆฌ์์ค์ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ต๋๋ค๋ํ, spinlock์ ๊ตฌํ์ด ๋งค์ฐ ๊ฐ๋จํด์ ํ๋์ ์์๋ณด๊ธฐ ์ฌ์ฐ๋ฉฐ lock์ ์งง์ ์๊ฐ๋์๋ง ์ ์ ํ ๊ฒฝ์ฐ์๋ ์คํ๋ ค ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค
๋ฐ๋ฉด, semaphore๋ ๊ตฌํ์ด ์ด๋ ต์ง๋ง ์ค๋ ์๊ฐ์ ๋๊ธฐํด์ผํ๋ ์ํฉ์์ ํจ์จ์ ์ ๋๋ค
spinlock๊ณผ binary semaphore๋ ํ๋์ ์ค๋ ๋๋ง lock์ ์ ๊ทผ๊ฐ๋ฅํด์ ์ํธ ๋ฐฐ์ ๋ฅผ ์ ๊ณตํ ์ ์์ง๋ง, counting semaphore๋ ์ฌ๋ฌ ์ค๋ ๋์ ์ ๊ทผ ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ค
๐ ๋์์ฑ ๋ฌธ์ ๋ฅผ ์ง๋ ์คํ์ ์์ด์ ๊ฐ์ฅ ๊ฐ๋จํ ํด๊ฒฐ๋ฐฉ๋ฒ ์ค์ ํ๋
Mutual Exclusion ์ ์ค์๋ง๋ก ์ํธ ๋ฐฐ์ ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค
๋ฎคํ ์ค๋ lock์ด๋ค! ์คํํ ๋ ์ ๊ถ๋ค๊ฐ ๋ค ์ฐ๊ณ ๋๋ฉด ์ด์ด๋๋ค!
์๋ชป ์ค๊ณํ ๊ฒฝ์ฐ lock ๊ถํ์ ๊ฐ์ง ์ค๋ ๋๊ฐ ํญ์ ์ ์ ํด๋ฒ๋ฆฌ๋ฏ๋ก starvation ๋ฌธ์ ๊ฐ ์ผ์ด๋ ์ ์์ผ๋ฏ๋ก ์กฐ์ฌํ์
๋ง์ lock์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ, deadlock ๋ฐ์๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค
binary semaphore์ mutex์ ์ฐจ์ด์ ๋ํด ์์๋ณด์
binary semaphore๋ signaling mechanism ์ด๊ณ mutex๋ locking mechanism์ด๋ค
๐ ์ค๋ ๋๊ฐ ์ํธ ๋ฐฐ์ ์ ํ๋์ฑ์ ๊ฐ์ง ์ ์๋๋ก ํ๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ
mutual exclusion - lock์ ์ฌ์ฉํ์ฌ ํ ์๊ฐ์ ํน์ ์ค๋ ๋๋ง ์๊ณ ์์ญ ์ ๊ทผ ๊ฐ๋ฅ
cooperation - wait set์ ์ด์ฉํ์ฌ ํน์ ์กฐ๊ฑด์ด ๋ ๋๊น์ง ์ค๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ฉฐ, ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋ค๋ฅธ ์ค๋ ๋์ ์๋ ค์ค ์ ์์
์ค๋ ๋๊ฐ ์ด๋ป๊ฒ ์์์ ์ ๊ทผํ๋์ง ๊ฐ์ํ๊ธฐ ๋๋ฌธ
synchronized methods : ๊ฐ๋จํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
public synchronized void method() {
// ์ด๋ฐ์์ผ๋ก ์ฌ์ฉ๋จ
}
synchronized statements : ๋ณด์ ์ธก๋ฉด์์ ๋ซ๋ค
public void method() {
// ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ฌ์ฉ๋์ด๋ ๊ด์ฐฎ์ ์์ญ
//์ฌ๊ธฐ๋ถํฐ๋ ์๊ณ ์์ญ
synchronized(๊ณต์ ๊ฐ์ฒด) {
} // ์๊ณ ์์ญ ๋
// ๋ค์ ์ฌ๋ฌ ์ค๋ ๋ ์ฌ์ฉ ๊ฐ๋ฅ
}
JVM์ ์ค์ผ์ค๋ฌ๋ ์ฐ์ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค
๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ์๋ FIFO ์ค์ผ์ค๋ง์ผ๋ก ํด๊ฒฐํ๋ค