ยซ   2025/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Recent Posts
07-02 00:01

Today
Total

Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

์—ฐ์˜ ๊ธฐ๋ก ๐Ÿช

๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด, ๋ชจ๋‹ˆํ„ฐ ๋ณธ๋ฌธ

Computer Science/์šด์˜์ฒด์ œ

๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด, ๋ชจ๋‹ˆํ„ฐ

kite707 2025. 6. 25. 23:51

์•ž์„œ ๊ธ€์—์„œ ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ž„๊ณ„๊ตฌ์—ญ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ ˆ์ด์Šค ์ปจ๋””์…˜์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด, ๋ชจ๋‹ˆํ„ฐ ๋“ฑ์ด ์žˆ๋‹ค. ์ด๋“ค์— ๋Œ€ํ•ด ํ•˜๋‚˜ํ•˜๋‚˜ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

 

๋ฎคํ…์Šค(MUTEX, MUTual EXclusion)

๋ฎคํ…์Šค๋ž€ ์ž„๊ณ„๊ตฌ์—ญ์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋ฝ(Lock)์„ ํš๋“ํ•ด์•ผ ํ•˜๊ณ , ์ž‘์—…์ด ๋๋‚˜๋ฉด ๋ฝ์„ ํ•ด์ œ(Release)ํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ๋™์‹œ์— ์ž„๊ณ„๊ตฌ์—ญ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

์ฐธ๊ณ ๋กœ ํŒŒ์ด์ฌ์ด๋‚˜ C/C++์€ ๋ฎคํ…์Šค ๋ฝ์„ ์ง€์›ํ•˜๊ณ , Java์—ญ์‹œ ๋ฝ์„ ์ง€์›ํ•œ๋‹ค. C++์—์„œ ๋ฎคํ…์Šค ๋ฝ์„ ํ™œ์šฉํ•˜๋Š” ์˜ˆ์ œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

int counter = 0;
mutex m; //๋ฎคํ…์Šค ์„ ์–ธ

void increment() {
    for (int i = 0; i < 10000; ++i) {
        m.lock(); //๊ณต์œ ์ž์› ์ ‘๊ทผ ์ „ ๋ฝ ํš๋“
        ++counter;
        m.unlock(); //์ž‘์—… ํ›„ ๋ฝ ํ•ด์ œ
    }
}

void decrement() {
    for (int i = 0; i < 10000; ++i) {
        m.lock();
        --counter;
        m.unlock();
    }
}

int main() {
    thread t1(increment);
    thread t2(decrement);

    t1.join();
    t2.join();

    cout << "Final counter value: " << counter << endl;

    return 0;
}

 

์„ธ๋งˆํฌ์–ด(Semaphore)

์„ธ๋งˆํฌ์–ด๋Š” ๋ฎคํ…์Šค์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์ด์ง€๋งŒ ๋ฎคํ…์Šค๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ์ ‘๊ทผํ–ˆ๋˜ ๊ฒƒ์— ๋ฐ˜ํ•ด, ์„ธ๋งˆํฌ์–ด๋Š” S๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งŒ์•ฝ S๊ฐ€ 2๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

์ฐธ๊ณ ๋กœ ์„ธ๋งˆํฌ์–ด๋Š” ์ด์ง„ ์„ธ๋งˆํฌ์–ด(binary semaphore)์™€ ์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด(counting semaphore)๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋Š” S๊ฐ€ 0 ๋˜๋Š” 1, ์ฆ‰ ๋ฎคํ…์Šค๋ฅผ ์˜๋ฏธํ•˜๊ณ  S๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์„ธ๋งˆํฌ์–ด๋ผ๊ณ  ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

๋ชจ๋‹ˆํ„ฐ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋Š” ๊ณต์œ ์ž์›๊ณผ ๊ทธ ๊ณต์œ ์ž์›์„ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜(์ธํ„ฐํŽ˜์ด์Šค)๋กœ ๊ตฌ์„ฑ๋œ ๋™๊ธฐํ™” ๋„๊ตฌ์ด๋‹ค. ์•ž์„œ ๋ณธ ์„ธ๋งˆํฌ์–ด๋‚˜ ๋ฎคํ…์Šค์™€ ๋‹ค๋ฅธ ์ ์€ ์ƒํ˜ธ๋ฐฐ์ œ์— ๋”ํ•ด ์‹คํ–‰์ˆœ์„œ ์ œ์–ด๊นŒ์ง€๋„ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋จผ์ € ์กฐ๊ฑด๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์กฐ๊ฑด๋ณ€์ˆ˜๋ž€ ์‹คํ–‰ ์ˆœ์„œ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™” ๋„๊ตฌ๋กœ, ํŠน์ • ์กฐ๊ฑด์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰/์ค‘๋‹จํ•จ์œผ๋กœ์จ ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์กฐ๊ฑด ๋ณ€์ˆ˜์—๋Š” wait, signalํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ(์„ ํ–‰์กฐ๊ฑด ๋ถˆ์ถฉ์กฑ)์—๋Š” wait์„, ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ(์„ ํ–‰์กฐ๊ฑด ์ถฉ์กฑ)์—๋Š” signal์„ ํ†ตํ•ด ์‹คํ–‰์„ ์žฌ๊ฐœํ•œ๋‹ค.

๋ชจ๋‹ˆํ„ฐ์˜ ์ž‘๋™ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ”„๋กœ์„ธ์Šค ๋ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ ๊ณต์œ  ์ž์› ์—ฐ์‚ฐ(๋ชจ๋‹ˆํ„ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค)์„ ํ†ตํ•ด ๋ชจ๋‹ˆํ„ฐ ๋‚ด๋กœ ์ง„์ž…ํ•ด์•ผํ•œ๋‹ค.

๋ชจ๋‹ˆํ„ฐ ์•ˆ์— ์ง„์ž…ํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค ๋ฐ ์“ฐ๋ ˆ๋“œ๋Š” ํ•ญ์ƒ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

๋งŒ์ผ ์ด๋ฏธ ๋ชจ๋‹ˆํ„ฐ ๋‚ด์— ์ง„์ž…ํ•˜์—ฌ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ์—์„œ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค.

์กฐ๊ฑด ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด ์•„์ง ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ์ƒํƒœ๋กœ ์ ‘์–ด๋“ค๊ฒŒ ํ•œ๋‹ค.

์‹ค์ œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋„๋ก ํ•˜์ž.

๋งŒ์ผ A→B์ˆœ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด B๊ฐ€ ํ์˜ ์•ž์ชฝ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

๊ทธ๋Ÿผ B๋Š” A๊ฐ€ ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์•˜์œผ๋‹ˆ ๋Œ€๊ธฐ์ƒํƒœ์— ์ ‘์–ด๋“ค๊ณ , A๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

์ดํ›„ A์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด signal์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ , B๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์กฐ๊ฑด ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‹ˆํ„ฐ๋Š” ์ƒํ˜ธ๋ฐฐ์ œ์™€ ์‹คํ–‰์ˆœ์„œ์ œ์–ด๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ฐธ๊ณ ๋กœ ์ž๋ฐ”์˜ synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ด๋‹ค. synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋ฐ ์“ฐ๋ ˆ๋“œ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์“ฐ๋ ˆ๋“œ ์•ˆ์ „(Thread Safe)

์•ž์„œ์™€ ๊ฐ™์ด ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜, ๊ฐ์ฒด์— ๋™์‹œ ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ ธ๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์ƒํƒœ๋ฅผ ์“ฐ๋ ˆ๋“œ ์•ˆ์ „(thread safe)ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. ๋™์‹œ ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ ธ๋„ ๋ ˆ์ด์Šค ์ปจ๋””์…˜์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค.

์ž๋ฐ”์—์„œ Vectorํด๋ž˜์Šค์˜ add ๋ฉ”์„œ๋“œ๋Š” ์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜์–ด์žˆ๋‹ค. add๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ synchronized ํ‚ค์›Œ๋“œ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜๋ฉด ArrayListํด๋ž˜์Šค์˜ add ๋ฉ”์„œ๋“œ๋Š” ์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.