๐Ÿ‘ฟ Race Condition, Critical Section

์ตœํ˜ธ๋นˆยท2025๋…„ 1์›” 8์ผ
0
post-thumbnail

๐Ÿง Race Condition์ด๋ž€?

Race Hazard๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” Race Condition๋Š” ์‹œ์Šคํ…œ์˜ ์‹ค์งˆ์ ์ธ ๋™์ž‘์ด ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๋‹ค๋ฅธ ์ด๋ฒคํŠธ์˜ ์ˆœ์„œ ๋˜๋Š” ํƒ€์ด๋ฐ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ ธ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋˜๋Š” ์ผ๊ด€๋˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜ ๊ณต์œ ํ•˜๋Š” ์ž์›(Ex) ๋ณ€์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ๋“ฑ)์— ๋™์‹œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ Race Condition์˜ ์ผ์ข…์ธ Data Race์ด๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ณต์œ  ์ž์›์ด ์‹œ์Šคํ…œ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€์ธ์ง€ ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ , ์ฝ”๋“œ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์— Lock์„ ๊ฑธ์–ด ์›์ž์„ฑ ์ž‘์—…์„ ์ ์šฉํ•˜๊ณ , ํ•œ ๋ฒˆ ์ƒ์„ฑํ•˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ถˆ๋ณ€ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต์œ  ์ž์›์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™๊ธฐํ™”๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋™๊ธฐํ™”๋ฅผ ๋„์™€์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์ด ์•Œ๊ณ  ์žˆ๋Š” ๋ฎคํ…์Šค(Mutex), ์„ธ๋งˆํฌ์–ด(Semaphore) ๋“ฑ์ด ์žˆ๋‹ค.





โ—๏ธ ๋™์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ๋ฌธ์ œ๋งŒ์ด Race Condition์€ ์•„๋‹ˆ๋‹ค.

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 ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋ฉด ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋ฎ์–ด์“ฐ์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ๊นจ์ง€๋ฏ€๋กœ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ์ถฉ๋Œํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฏ€๋กœ ๋ฎคํ…์Šค๋‚˜ ์„ธ๋งˆํฌ์–ด ๋“ฑ ๋™๊ธฐํ™” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.



๐Ÿช„ย Race Condition์ด ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ๋™์‹œ ์ ‘๊ทผํ•  ๋•Œ

ํ”„๋กœ์„ธ์ŠคA์™€ ํ”„๋กœ์„ธ์ŠคB๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ํŒŒ์ผ, ์ „์—ญ ๋ณ€์ˆ˜, ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์— ์ ‘๊ทผํ•˜์—ฌ ํŒŒ์ผ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ๋ณ€์ˆ˜ ๊ฐ’์„ ์ฝ๊ณ  ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ์ˆœ์„œ์— ๋”ฐ๋ผ ํŒŒ์ผ ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๋ณ€์ˆ˜ ๊ฐ’์ด ์˜๋„์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฎ์–ด์”Œ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ Lock์„ ๊ฑธ๊ณ  ์‚ฌ์šฉ์ด ์™„๋ฃŒ๋˜๋ฉด Lock์„ ํ•ด์ œํ•˜๋Š” ์‹์˜ ๋ฐฉ๋ฒ• ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

[์ปค๋„ ๋ชจ๋“œ]์—์„œ ์Šค์ผ€์ค„๋ง์— ์˜ํ•œ ๋ฌธ๋งฅ ๊ตํ™˜ or ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒ

ํ”„๋กœ์„ธ์Šค A๊ฐ€ ์ปค๋„ ๋ชจ๋“œ์—์„œ ๊ณต์œ  ์ž์›์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์ค‘ ์ •ํ•ด์ง„ ์ž‘์—… ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์–ด OS์˜ ์Šค์ผ€์ค„๋Ÿฌ์— ์˜ํ•ด CPU ์ œ์–ด๊ถŒ์ด ํ”„๋กœ์„ธ์Šค B๋กœ ๋„˜์–ด๊ฐ€ A์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด A์˜ ์ž‘์—… ๋‚ด์šฉ์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๋˜๋Š” ํ”„๋กœ์„ธ์Šค A๊ฐ€ ๊ณต์œ  ์ž์›์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์ค‘ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค B๋กœ ์ „ํ™˜๋˜๊ณ  ํ”„๋กœ์„ธ์Šค B๊ฐ€ A์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ๋’ค ๋‹ค์‹œ ํ”„๋กœ์„ธ์Šค A๋กœ ์ „ํ™˜๋œ๋‹ค๋ฉด ์ผ๊ด€์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ปค๋„ ๋ชจ๋“œ์—์„œ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‹œ๊ฐ„ ์ œํ•œ์„ ๋‘์ง€ ์•Š๊ฑฐ๋‚˜ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ž ์‹œ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ CPU ์ œ์–ด๊ถŒ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

์ด ์™ธ์—๋„ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŽ˜์ด์ง€ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ต์ฒด ๋Œ€์ƒ ํŽ˜์ด์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ์‹œ์Šคํ…œ ์ฝœ์„ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ํ˜ธ์ถœํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— I/O ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋ คํ•  ๋•Œ๋„ Race Condition์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.





๐Ÿง Critical Section์ด๋ž€?

์œ„์—์„œ ์‚ดํŽด๋ดค๋“ฏ์ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์— ๋™์‹œ ์ ‘๊ทผํ•˜๋ฉด Race Condition์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€๋ฅผ ๋ณดํ˜ธํ•˜์—ฌ ๋™์‹œ ์ ‘๊ทผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ณดํ˜ธ๋œ ์ฝ”๋“œ ์˜์—ญ์„ Critical Section(์ž„๊ณ„ ๊ตฌ์—ญ)์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด Critical Section์—๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๋Š” Critical Section์— ๋“ค์–ด๊ฐ„ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Critical Section์„ ๋„ˆ๋ฌด ๊ธธ๊ฒŒ ์œ ์ง€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ •๋ง ์ค‘์š”ํ•œ ๋ถ€๋ถ„์—๋งŒ ์ ์ ˆํžˆ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.



โšก๏ธ Critical Section์˜ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ 3๊ฐ€์ง€ ์กฐ๊ฑด

1. Mutual Exclusion(์ƒํ˜ธ ๋ฐฐ์ œ)

  • ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ Critical Section์— ๋“ค์–ด๊ฐ€๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” Critical Section์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๊ณ  ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค.

2. Bounded Waiting(์œ ํ•œ ๋Œ€๊ธฐ)

  • Critical Section์— ๋“ค์–ด๊ฐ€๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฌดํ•œ์œผ๋กœ ๋Œ€๊ธฐํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

3. Progress(์ง„ํ–‰์˜ ์œตํ†ต์„ฑ)

  • Critical Section๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด, ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ผ๋„ ๋“ค์–ด๊ฐ€์„œ ์ž์›์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ณต์œ  ์ž์›์„ ๋ฒˆ๊ฐˆ์•„ ์“ด๋‹ค๊ณ  ํ•  ๋•Œ ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํ•ด์„œ ๋น„์–ด์žˆ๋Š” Critical Section์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Critical Section ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์œ„์˜ 3๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ์•„๋ž˜์˜ ๋™๊ธฐํ™” ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.



1๏ธโƒฃ Mutual Exclusion (์ƒํ˜ธ ๋ฐฐ์ œ)๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๋Š” 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์ด ๋ฐœ์ƒํ•˜์—ฌ ์‹œ์Šคํ…œ ์ž์›์„ ๋‚ญ๋น„ํ•œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.





2๏ธโƒฃ Bounded 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(๊ต์ฐฉ ์ƒํƒœ)์— ๋น ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.





3๏ธโƒฃ Progress(์ง„ํ–‰์˜ ์œตํ†ต์„ฑ)๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

์ด ์˜ˆ์‹œ๋Š” 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(์ง„ํ–‰์˜ ์œตํ†ต์„ฑ)์„ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ๋ชจ๋‘ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.





์ฐธ๊ณ  ๋ฌธ์„œ

Race condition

What is a Race Condition?

Critical section

OS๋Š” ํ• ๊ป€๋ฐ ํ•ต์‹ฌ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. 8ํŽธ Critical section (์ž„๊ณ„ ๊ตฌ์—ญ)

[OS] 4. ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™” (Process Synchronization)

[์šด์˜์ฒด์ œ] ๊ฒฝ์Ÿ ์กฐ๊ฑด(Race Condition)๊ณผ ์ž„๊ณ„ ๊ตฌ์—ญ(Critical Section)

0๊ฐœ์˜ ๋Œ“๊ธ€