
Race Hazard๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ Race Condition๋ ์์คํ ์ ์ค์ง์ ์ธ ๋์์ด ์ ์ดํ ์ ์๋ ๋ค๋ฅธ ์ด๋ฒคํธ์ ์์ ๋๋ ํ์ด๋ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ ธ ์์์น ๋ชปํ ๋๋ ์ผ๊ด๋์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ ์์คํ ์ ์ํ๋ฅผ ๋งํ๋ค.
์ฌ๋ฌ ํ๋ก์ธ์ค ๋๋ ์ค๋ ๋๊ฐ ์๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ๊ฑฐ๋ ๊ณต์ ํ๋ ์์(Ex) ๋ณ์, ๋ฉ๋ชจ๋ฆฌ ๋ฑ๋ฑ)์ ๋์์ ์ ๊ทผํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๊ฐ Race Condition์ ์ผ์ข ์ธ Data Race์ด๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๊ณต์ ์์์ด ์์คํ ๋๋ ํ๋ก์ธ์ค์ ์ผ๋ถ์ธ์ง ์ฝ๋๋ฅผ ๊ฒํ ํ๊ณ , ์ฝ๋์ ์ค์ํ ๋ถ๋ถ์ Lock์ ๊ฑธ์ด ์์์ฑ ์์ ์ ์ ์ฉํ๊ณ , ํ ๋ฒ ์์ฑํ๋ฉด ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต์ ์์์ ํ๋์ ํ๋ก์ธ์ค ๋๋ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๋๋ก ๋๊ธฐํ๋ฅผ ํด์ผ ํ๋ค. ์ด๋ฌํ ๋๊ธฐํ๋ฅผ ๋์์ฃผ๋ ๋ํ์ ์ธ ๋ฐฉ์์๋ ์ฐ๋ฆฌ๊ฐ ๋ง์ด ์๊ณ ์๋ ๋ฎคํ ์ค(Mutex), ์ธ๋งํฌ์ด(Semaphore) ๋ฑ์ด ์๋ค.
Data Race์ ์ ํํ ์ ์๋ ๋์์ฑ ๋ชจ๋ธ๋ง๋ค ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ด ๋ค๋ฅธ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ด ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ฐ๋ ๊ฒ๊ณผ ๋์์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ํฉ์ ์๋ฏธํ๋ค. ์ด๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๊ฐ ์์ ์ฐ์ฐ๋ง ์ฌ์ฉํ๋, ์ฆ Data Race์ด ์๋ ํ๋ก๊ทธ๋จ์์๋ ํ์ด๋ฐ์ผ๋ก ์ธํด ๊ฒฐ๊ณผ๋ฅผ ์์ํ์ง ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
Race Condition์ ์กฐ๊ธ ๋ ์ถ์์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
ํ๋ก๊ทธ๋จ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์คํ ์ค์ธ ์ฌ๋ฌ ํ๋ก์ธ์ค ๋๋ ์ค๋ ๋์ ์์๋ ํ์ด๋ฐ ์์กดํ ๋ ๋ฐ์ํ๋ฉฐ ์คํ๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ ๋ ผ๋ฆฌ์ ๋ฒ๊ทธ๋ฅผ ์๋ฏธํ๋ค.
bool ready = false;
void waitForReady() {
while (!ready) {
// ๊ธฐ๋ค๋ฆฌ๋ ์ค...
}
std::cout << "Ready!" << std::endl;
}
void setReady() {
ready = true;
}
int main() {
std::thread t1(waitForReady);
std::thread t2(setReady);
t1.join();
t2.join();
}
์ด ์์์์ t1๊ณผ t2์ค๋ ๋ ์ค ์ด๋ ์ค๋ ๋๊ฐ ๋จผ์ ์คํ๋ ์ง ๋ชจ๋ฅธ๋ค.
๋ง์ฝ t1 ์ค๋ ๋๊ฐ ๋จผ์ ์คํ๋๋ค๋ฉด ready๊ฐ ์ค์ ๋๊ธฐ ์ ์ด๋ฏ๋ก ๋ฌดํ๋ฃจํ์ ๋น ์ง ์ ์๋ค. ๋ฐ๋ผ์ ์ด ์ฝ๋์ ๊ฒฐ๊ณผ๋ Ready!๊ฐ ์ถ๋ ฅ๋๊ฑฐ๋ ๋ฌดํ๋ฃจํ๋ฅผ ๊ณ์ ๋๋ค๊ฐ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์์๋ฅผ ์ ์ดํ๊ฑฐ๋ ๋๊ธฐํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฑ์ผ๋ก ํด๊ฒฐํด์ผ ํ๋ค.
Data Race๋ ์ฌ๋ฌ ํ๋ก์ธ์ค ๋๋ ์ค๋ ๋๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ๋์์ ์ ๊ทผํ ๋ ์ ์ด๋ ํ๋์ ์ ๊ทผ์ด ์ฐ๊ธฐ ์์
์ด๊ณ , ์์
๋ค ๊ฐ์ ์์๊ฐ ์ ์๋์ง ์์์ ๋(์ฆ, happens-before ๊ด๊ณ๊ฐ ์์ ๋) ๋ฐ์ํ๋ค.
int counter = 0;
void increment() {
counter++;
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << counter << std::endl;
}
t1 ์ค๋ ๋์ t2์ค๋ ๋๊ฐ ๋์์ counter ๋ณ์์ ์ ๊ทผํ๋ฉด ๋ ์ค ํ๋์ ์์ ์ด ๋ฎ์ด์ฐ์ฌ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ฏ๋ก ์คํํ ๋๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์ฝ๊ธฐ์ ์ฐ๊ธฐ๊ฐ ์ถฉ๋ํ์ฌ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฏ๋ก ๋ฎคํ ์ค๋ ์ธ๋งํฌ์ด ๋ฑ ๋๊ธฐํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
์ฌ๋ฌ ํ๋ก์ธ์ค ๋๋ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋์ ์ ๊ทผํ ๋
ํ๋ก์ธ์คA์ ํ๋ก์ธ์คB๊ฐ ๋์์ ๊ฐ์ ํ์ผ, ์ ์ญ ๋ณ์, ํ ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ์ ๊ทผํ์ฌ ํ์ผ ๋ด์ฉ์ ์์ ํ๊ฑฐ๋, ๋ณ์ ๊ฐ์ ์ฝ๊ณ ์์ ํ๋ค๋ฉด ์์์ ๋ฐ๋ผ ํ์ผ ๋ด์ฉ์ด ๋ฌ๋ผ์ง๊ฑฐ๋ ๋ณ์ ๊ฐ์ด ์๋์๋ ๋ค๋ฅด๊ฒ ๋ฎ์ด์์์ง ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋๋ง๋ค ๊ทธ ๋ฐ์ดํฐ์ ๋ํด์ Lock์ ๊ฑธ๊ณ ์ฌ์ฉ์ด ์๋ฃ๋๋ฉด Lock์ ํด์ ํ๋ ์์ ๋ฐฉ๋ฒ ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
[์ปค๋ ๋ชจ๋]์์ ์ค์ผ์ค๋ง์ ์ํ ๋ฌธ๋งฅ ๊ตํ or ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์
ํ๋ก์ธ์ค A๊ฐ ์ปค๋ ๋ชจ๋์์ ๊ณต์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ์ค ์ ํด์ง ์์ ์๊ฐ์ด ์ด๊ณผ๋์ด OS์ ์ค์ผ์ค๋ฌ์ ์ํด CPU ์ ์ด๊ถ์ด ํ๋ก์ธ์ค B๋ก ๋์ด๊ฐ A์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ฒ ๋๋ค๋ฉด A์ ์์ ๋ด์ฉ์ด ๋ฐ์๋์ง ์์ ์ ์๋ค.
๋๋ ํ๋ก์ธ์ค A๊ฐ ๊ณต์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ์ค ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ฌ ํ๋ก์ธ์ค B๋ก ์ ํ๋๊ณ ํ๋ก์ธ์ค B๊ฐ A์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ค ๋ค์ ํ๋ก์ธ์ค A๋ก ์ ํ๋๋ค๋ฉด ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ํ๋ก์ธ์ค๊ฐ ์ปค๋ ๋ชจ๋์์ ์์ ์ ํ๋ ๊ฒฝ์ฐ์ ์๊ฐ ์ ํ์ ๋์ง ์๊ฑฐ๋ ์ธํฐ๋ฝํธ๋ฅผ ์ ์ ๋นํ์ฑํํ์ฌ CPU ์ ์ด๊ถ์ด ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ๋์ด๊ฐ์ง ์๋๋ก ํด์ผ ํ๋ค.
์ด ์ธ์๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ํ์ด์ง ๊ต์ฒด๋ฅผ ์ํํ ๋ ๊ต์ฒด ๋์ ํ์ด์ง๋ฅผ ๊ฒฐ์ ํ๊ณ ์ ๊ฑฐํ๊ธฐ ์ ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ฌ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋์ผํ ์์คํ ์ฝ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ํธ์ถํ๋ ๋ฑ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ I/O ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ คํ ๋๋ Race Condition์ด ๋ฐ์ํ ์ ์๋ค.

์์์ ์ดํด๋ดค๋ฏ์ด ์ฌ๋ฌ ์ค๋ ๋๋ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์์ ๋์ ์ ๊ทผํ๋ฉด Race Condition์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๊ณต์ ์์์ ์ ๊ทผํ๋ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ฅผ ๋ณดํธํ์ฌ ๋์ ์ ๊ทผ์ด ๋ฐ์ํ์ง ์๋๋ก ํด์ผ ํ๋ค. ์ด์ฒ๋ผ ๋ณดํธ๋ ์ฝ๋ ์์ญ์ Critical Section(์๊ณ ๊ตฌ์ญ)์ด๋ผ๊ณ ํ๋ค. ์ด Critical Section์๋ ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค ๋๋ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ค๋ ๋๋ Critical Section์ ๋ค์ด๊ฐ ์ค๋ ๋๊ฐ ๋์ฌ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ค. ๋ฐ๋ผ์ Critical Section์ ๋๋ฌด ๊ธธ๊ฒ ์ ์งํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ผ๋ฏ๋ก, ์ ๋ง ์ค์ํ ๋ถ๋ถ์๋ง ์ ์ ํ ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
1. Mutual Exclusion(์ํธ ๋ฐฐ์ )
- ํ ํ๋ก์ธ์ค๊ฐ Critical Section์ ๋ค์ด๊ฐ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ Critical Section์ ๋ค์ด๊ฐ ์ ์๊ณ ๋๊ธฐํด์ผ ํ๋ค.
2. Bounded Waiting(์ ํ ๋๊ธฐ)
- Critical Section์ ๋ค์ด๊ฐ๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๊ฐ ๋ฌดํ์ผ๋ก ๋๊ธฐํ์ง ์์์ผ ํ๋ค.
3. Progress(์งํ์ ์ตํต์ฑ)
- Critical Section๊ฐ ๋น์ด์๋ค๋ฉด, ์ด๋ค ํ๋ก์ธ์ค๋ผ๋ ๋ค์ด๊ฐ์ ์์์ ํ์ฉํ ์ ์๋ค. ์ฆ, ๊ณต์ ์์์ ๋ฒ๊ฐ์ ์ด๋ค๊ณ ํ ๋ ํ ํ๋ก์ธ์ค๊ฐ ์์ ์ ์ฐจ๋ก๊ฐ ์๋๋ผ๊ณ ํด์ ๋น์ด์๋ Critical Section์ ๋ค์ด๊ฐ์ง ์๊ณ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ํจ์จ์ ์ด์ง ๋ชปํ๋ค๋ ๊ฒ์ด๋ค.
Critical Section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์์ 3๊ฐ์ง๋ฅผ ๋ชจ๋ ๋ง์กฑํด์ผ ํ๋๋ฐ, ๊ทธ ์ด์ ๋ ์๋์ ๋๊ธฐํ ์์๋ฅผ ํตํด ์์๋ณด์.

์ฌ๊ธฐ์ ํฌ์ธํธ๋ lock์ด๋ค. ํ ํ๋ก์ธ์ค๊ฐ Critical Section์ ๋ค์ด๊ฐ๋ค๋ฉด lock์ ๊ฑธ์ด(lock์ true๋ก ๋ณ๊ฒฝํ์ฌ) ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ค์ด์ค์ง ๋ชปํ๋๋ก ํ๋ ๊ฒ์ด๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค๋ lock์ด ๊ฑธ์ด์ ธ ์์ผ๋ฏ๋ก ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ฉด์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ ๊ฒ์ด๋ค. Critical Section์ ๋ค์ด๊ฐ ํ๋ก์ธ์ค๊ฐ ์์ ์ ๋ชจ๋ ๋ง์น๊ณ ๋์ค๋ฉด lock์ ํด์ ํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ Critical Section์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค. ํ์ง๋ง ์ด ์์๋ Mutual Exclusion(์ํธ ๋ฐฐ์ )๋ฅผ ๋ง์กฑํ์ง ์๋๋ค.

ํ๋ก์ธ์ค A๊ฐ while(lock == true);ย ๋ฌธ์ ์คํํ๋ฉด ํ์ฌ Critical Section์ ํ๋ก์ธ์ค๊ฐ ๋ค์ด๊ฐ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ํต๊ณผํ๋ค. ์ด์ด์ ๋ค์ ์ฝ๋์ธ lock = true; ๋ฅผ ์คํํ๋ ค๋ ์๊ฐ ์ ํด์ง ์์
์๊ฐ์ด ์ด๊ณผ๋์ด ํ๋ก์ธ์ค A์๊ฒ ์ฃผ์ด์ง CPU ์ ์ด๊ถ์ด ํ๋ก์ธ์ค B์๊ฒ ๋์ด๊ฐ๋ค๋ฉด? ์์ง ๊ณต์ ๋ณ์ lock์ false์ธ ์ํ์ด๋ค.

๊ณต์ ๋ณ์ lock์ false์ธ ์ํ์ด๋ฏ๋ก ํ๋ก์ธ์ค B๊ฐ while(lock == true);ย ๋ฌธ์ ์คํํ๋ฉด ์๋ฌด๋ lock์ ๊ฑธ์ง ์์ ์ํ๋ผ๊ณ ๊ฐ์ฃผํ๊ฒ ๋๋ฏ๋ก ํต๊ณผํ๊ฒ ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ก์ธ์ค B๋ ๋ฌธ์ ์์ด Critical Section์ ์ง์
ํ ์ ์๊ฒ ๋๋ค. ์ด ์ํ์์ Context Switching์ด ๋ฐ์ํ๊ณ ํ๋ก์ธ์ค A์๊ฒ๋ก ์ ์ด๊ถ์ด ๋์ด๊ฐ๊ฒ ๋๋ฉด ํ๋ก์ธ์ค A๋ Critical Section์ ์ง์
ํ๊ฒ ๋๋ค. ์ฆ, ๋ ํ๋ก์ธ์ค๊ฐ Critical Section์ ์ง์
ํ๊ฒ ๋๊ณ ์ด๋ Mutual Exclusion(์ํธ ๋ฐฐ์ )์ ์๋ฐฐ๋๋ค.
๋ํ, lock์ด ํด์ ๋๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๊ณ์ํด์ ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ฉด์ lock์ ์ํ๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก lock์ด ํด์ ๋๊ธฐ ์ ๊น์งย busy waiting์ด ๋ฐ์ํ์ฌ ์์คํ
์์์ ๋ญ๋นํ๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค.
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ lock์ ๋จผ์ ๊ฑด๋ค๋ฉด ์ด๋จ๊น? lock์ ์ํ๋ฅผ ํ์ธํ ๋ค์์ lock์ ๊ฑธ์๊ธฐ ๋๋ฌธ์ Mutual Exclusion(์ํธ ๋ฐฐ์ )๊ฐ ์๋ฐฐ๋ ๊ฒ์ด๋ฏ๋ก ์์๋ฅผ ๋ฐ๊พผ๋ค๋ฉด ํด๊ฒฐ๋ ๊ฒ์ด๋ค.

lock์ ๋จผ์ ๊ฑธ๊ธฐ ์ํด์ ๊ฐ ํ๋ก์ธ์ค ๋ง๋ค์ lock์ด ํ์ํ๋ค. ํ๋์ lock๋ง ์กด์ฌํ๋ค๋ฉด while๋ฌธ์ ์ ๋ ํต๊ณผํ ์ ์์ผ๋ฏ๋ก ๋๊ธฐํ๊ฐ ์ฑ๋ฆฝ๋ ์ ์๋ค. (์ด๋ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ํ๋ก์ธ์ค๊ฐ ์ฆ๊ฐํ๋ค๋ฉด ๊ทธ๋งํผ lock์ ๊ฐ์๋ ์ฆ๊ฐํด์ผ ํ๋ค.)
์ด๋ ๊ฒ ํ๋ก์ธ์ค A์ B ๊ฐ๊ฐ์ lock์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ ๊ธ์ ์ค์ ํ๋์ง ํ์ธ ํ์ Critical Section์ ์ง์ ํ๊ฒ ๋๋ฏ๋ก ๋ฐ๋์ ํ๋์ ํ๋ก์ธ์ค๋ง Critical Section์ ์กด์ฌํ๊ฒ ๋๋ค. ์ฆ, Mutual Exclusion(์ํธ ๋ฐฐ์ )๋ฅผ ๋ง์กฑํ๋ค. ํ์ง๋ง, ์ด ์์๋ Bounded Waiting(์ ํ ๋๊ธฐ)๋ฅผ ๋ง์กฑํ์ง ๋ชปํ๋ค.

ํ๋ก์ธ์ค A๊ฐ lock1 = true; ๋ฅผ ์คํํ์ฌ ๊ณต์ ๋ณ์ lock1์ด true๋ก ๋ณ๊ฒฝ๋๋ค. ๊ทธ๋ฆฌ๊ณ CPU ์ ์ด๊ถ์ด ํ๋ก์ธ์ค B๋ก ๋์ด๊ฐ๋ค. ํ๋ก์ธ์ค B ๋ํ lock2 = true; ๋ฅผ ์คํํ์ฌ ๊ณต์ ๋ณ์ lock2๊ฐ true๋ก ๋ณ๊ฒฝ๋๋ค. ์ด๋, ๊ณต์ ๋ณ์ lock1 ๊ณผ lock2 ๋ ๋ชจ๋ true๊ฐ ๋๋ค.
๋ค์ CPU ์ ์ด๊ถ์ด ํ๋ก์ธ์ค A์๊ฒ ๋์ด๊ฐ ํ๋ก์ธ์ค A๊ฐ while(lock2 == true);ย ๋ฌธ์ ์คํํ๋ค. lock2๊ฐ true์ด๋ฏ๋ก ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ฉด์ lock2๊ฐ false๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค. ๊ทธ ๋ค์์ผ๋ก ํ๋ก์ธ์ค B ๋ํ while(lock1 == true);ย ๋ฌธ์ ์คํํ์ฌ ๋ฌดํ๋ฃจํ์ ๋น ์ง๊ฒ ๋๋ค.
์ด๋ ๊ฒ ํ๋ก์ธ์ค A, B ๋ชจ๋ Critical Section์ ์ง์ ํ์ง ๋ชปํ์ฌ Bounded Waiting(์ ํ ๋๊ธฐ)์ ๋ง์กฑํ์ง ๋ชปํ๊ณ , DeadLock(๊ต์ฐฉ ์ํ)์ ๋น ์ง๊ฒ ๋์๋ค.

์ด ์์๋ Mutual Exclusion(์ํธ ๋ฐฐ์ )์ Bounded Waiting(์ ํ ๋๊ธฐ)๋ฅผ ๋ชจ๋ ๋ง์กฑํ๋ค.
ํ๋์ ๊ณต์ ๋ณ์ lock๋ง์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ Critical Section์ ์ฌ์ฉ ์ค์ธ์ง ํ์ธํ๊ณ ์๋๋ผ๋ฉด ์ง์ ํ๋ค. ํ๋ก์ธ์ค A์ B ๊ฐ๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ lock์ ๊ฑธ์๋ค๋ฉด ํด๋น ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉ์ ๋๋ด๊ณ lock์ ํด์ ํ ๋๊น์ง ์ง์ ํ ์ ์๋ค.
ํ์ง๋ง, ์ด๋ 2๊ฐ์ง ๋ฌธ์ ์ ์ด ์๋ค. ํ ํ๋ก์ธ์ค๊ฐ ์ฐ์์ผ๋ก Critical Section์ ์ง์
ํ ์ ์๋ค. lock์ ํด์ ํ๋ ์ฝ๋๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํด์๋ง ์คํ๋๋ฏ๋ก ๋ฐ๋์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ Critical Section์ ์ง์
ํด์ผํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ํ๋ก์ธ์ค B๋ ํ๋ก์ธ์ค A๊ฐ Critical Section์ ์ง์
ํ ํ lock = 2; ๋ฅผ ์คํํด์ค์ผ๋ง ๋ฌดํ๋ฃจํ๋ฅผ ํ์ถํ์ฌ Critical Section์ ์ง์
ํ ์ ์๋ค. ์ด๋ฌํ ํ์์ ๊ฒฝ์ง๋ ๋๊ธฐํ(lockstep synchronization) ๋ผ๊ณ ํ๋ฉฐ, ์ด๋ Progress(์งํ์ ์ตํต์ฑ)๋ฅผ ๋ง์กฑํ์ง ๋ชปํ๋ค.
๋ํ, ์ง๊ธ์ ํ๋ก์ธ์ค๊ฐ 2๊ฐ์ด์ง๋ง ํ๋ก์ธ์ค๊ฐ ๋ ๋์ด๋๊ฒ ๋๋ค๋ฉด ์คํ ์์์ ๋ฐ๋ผ ๋๋ฆฌ๊ฒ ์คํ๋๊ฑฐ๋ ์ฌํ ๊ฒฝ์ฐ DeadLock(๊ต์ฐฉ ์ํ)์ ๋น ์ง ์ ์๋ค. ํ๋ก์ธ์ค๊ฐ ์ด 4๊ฐ๋ก ๋์ด๋ฌ๋ค๊ณ ํด๋ณด์. lock์ ํด์ ํ๋ ์ฝ๋๋ ๊ทธ ๋ค์ ํ๋ก์ธ์ค์ ์์๋ฅผ ์ ํด์ฃผ๋ ์ฝ๋์ ๋ง์ฐฌ๊ฐ์ง์ด๋ฏ๋ก ์์ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ค๋ฉด ์๊ณ๊ตฌ์ญ์ ์ง์
ํ ์ ์๋ ํ๋ก์ธ์ค์ ์์๋ A โ B โ C โ D โ A๊ฐ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง Context Switching์ด D โ C โ B โ A โ D ๋ก ์คํ๋๋ค๋ฉด D๋ C๊ฐ ๋จผ์ ์คํ๋์ง ์์์ผ๋ฏ๋ก ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ค C๋ก ๋์ด๊ฐ ๊ฒ์ด๊ณ , C๋ ๋ง์ฐฌ๊ฐ์ง๋ก B๊ฐ ๋จผ์ ์คํ๋์ง ์์์ผ๋ฏ๋ก ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ค B๋ก ์์๊ฐ ๋์ด๊ฐ ๊ฒ์ด๋ค. ๋งค์ฐ ๊ทน๋จ์ ์ธ ์์์ง๋ง ์ถฉ๋ถํ ๋ฐ์ํ ์ ์๋ ์ํฉ์ด๊ณ , ๊ต์ฐฉ์ํ๊ฐ ์๋๋๋ผ๋ ๋งค์ฐ ๋นํจ์จ์ ์ด๊ณ ๋๋ฆฌ๊ฒ ์คํ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
์์ ๋ฌธ์ ์ํฉ๋ค์ ํตํด Critical Section์ ๋๊ธฐํ๋ฅผ ์ํด์ Mutual Exclusion(์ํธ ๋ฐฐ์ ), Bounded Waiting(์ ํ ๋๊ธฐ), Progress(์งํ์ ์ตํต์ฑ)์ ๋ง์กฑํด์ผ ํ๋ ์ด์ ๋ฅผ ์ ์ ์์๋ค. ๋ค์ ํฌ์คํ ์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ๋ชจ๋ ํด๊ฒฐํ๋ ๋ฐฉ์๋ค์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
OS๋ ํ ๊ป๋ฐ ํต์ฌ๋ง ํฉ๋๋ค. 8ํธ Critical section (์๊ณ ๊ตฌ์ญ)
[OS] 4. ํ๋ก์ธ์ค ๋๊ธฐํ (Process Synchronization)
[์ด์์ฒด์ ] ๊ฒฝ์ ์กฐ๊ฑด(Race Condition)๊ณผ ์๊ณ ๊ตฌ์ญ(Critical Section)