1. ๊ฒฝ์์กฐ๊ฑด์ด๋?
๋ ๊ฐ ์ด์์ ์ฐ๋ ๋๊ฐ ๊ณต์ ์์(์: ๋ณ์, ๋ฆฌ์คํธ ๋ฑ)์ ๋์์ ์ ๊ทผํ๋ ค ํ ๋, ์คํ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๋ฌธ์
์์
int counter = 0;
Thread t1 = new Thread(()=> {
for(int i=0; i<1000; i++) counter++;
});
Thread t2 = new Thread(()=> {
for(int i=0; i<1000; i++) counter++;
});
t1.Start();
t2.Start();
๊ธฐ๋๊ฐ์ 2000์ด์ง๋ง, ์ค์ ๋ก๋ 1500 ~ 2000 ์ฌ์ด์ ๊ฐ์ด ๋์ฌ ์๋ ์์
์์์ (atomic) ์ฐ์ฐ์ด ์๋๊ธฐ ๋๋ฌธ
์์์ (atomic) ์ฐ์ฐ์ด๋?
ํ๋์ ์ฐ์ฐ์ด โ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ๋จ์โ๋ก ์ํ๋๋ ๊ฒ
- ์คํ ์ค ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๋ผ์ด๋ค ์ ์๊ณ ,
- ๋ฐ๋์ ์ ๋ถ ์ฑ๊ณตํ๊ฑฐ๋, ์ ๋ถ ์คํจํจ. ์ค๊ฐ ์ํ๊ฐ ์์
์ฆ, โํ ๋ฒ์ ๋ฑ ์ฒ๋ฆฌ๋๋คโ ๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ
์ counter++๋ ์์์ ์ด์ง ์์๊ฐ?
counter++๋ 3๋จ๊ณ๋ก ๋๋๋ ์ฐ์ฐ์
1. counter ๊ฐ์ ์ฝ์ (read)
2. ๊ฐ์ 1์ ๋ํจ (add)
3. ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ ์ฅํจ (write)
-> ์ด ์ค๊ฐ์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ counter ๊ฐ์ ๋ฐ๊ฟ๋ฒ๋ฆด ์ ์์
-> ๊ทธ๋์ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ์๋ํ ๊ฐ์ด ๋์ค์ง ์์ ์ ์์
2. ํฌ๋ฆฌํฐ์ปฌ ์น์ (Critical Section)
์ ์
๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐ์ํ ์ ์๋ ์ฝ๋ ๋ธ๋ญ
-> ๋ฐ๋์ ํ๋์ ์ฐ๋ ๋๋ง ์คํํด์ผ ์์ ํจ
3. ๋๊ธฐํ ๊ธฐ๋ฒ๋ค
3-1. Mutex (Mutual Exclusion)
- ํ๋ก์ธ์ค ๊ฐ ๋๋ ์ฐ๋ ๋ ๊ฐ ๋ฝ์ ๊ฑธ๊ธฐ ์ํ ๋ฐฉ์
- ํ ๋ฒ์ ํ๋์ ์ฐ๋ ๋๋ง ๋ฎคํ
์ค๋ฅผ ์์ ๊ฐ๋ฅ
3-2. Monitor / lock (C#์์ ๊ฐ์ฅ ํํจ)
- ๋ด๋ถ์ ์ผ๋ก๋ Monitor.Enter/Exit ๊ธฐ๋ฐ
- lock์ ์ฐ๊ธฐ ํธํ๊ณ ์ค์ฝํ ๊ธฐ๋ฐ ํด์ ๊ฐ ๋ณด์ฅ๋ผ์ ์์ ํจ
class Counter
{
private int _count = 0;
private readonly object _lock = new object();
public void Increment()
{
lock (_lock)
{
_count++;
}
}
public int GetValue()
{
lock (_lock)
{
return _count;
}
}
}
3-3. Semaphore
- ๋ฎคํ
์ค๋ ํ ๋ฒ์ 1๊ฐ ์ฐ๋ ๋๋ง ๋ค์ด์ฌ ์ ์์ง๋ง,
- ์ธ๋งํฌ์ด๋ ๋์ ํ์ฉ ์ ์ ํ์ด ์์ (์: ๋์์ 3๊ฐ๊น์ง ์ง์
ํ์ฉ)
3-4. SpinLock
- Lock์ ๊ฑธ ๋, ์ค๋ ๋๊ฐ ๋๊ธฐ ์ํ๋ก ๋ฉ์ถ๋ ๋์ ๊ณ์ ๋ฃจํ๋ฅผ ๋๋ฉด์ ํ์ธํ๋ ๋ฐฉ์
- CPU ๋ญ๋น๊ฐ ์์ง๋ง, ์งง์ ๋ฝ ๊ตฌ๊ฐ์์ ๋น ๋ฅธ ๋ฐ์์ฑ์ด ์์
4. ๋ฐ๋๋ฝ(Deadlock)์ด๋?
๋ ๊ฐ ์ด์์ ์ฐ๋ ๋๊ฐ ์๋ก ์๋๋ฐฉ์ ๋ฝ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ์์ ๋น ์ ธ๋์ค์ง ๋ชปํ๋ ๋ฌธ์
์์
- Thread A๊ฐ Lock1์ ์ก๊ณ Lock2๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ,
- Thread B๊ฐ Lock2๋ฅผ ์ก๊ณ Lock1์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝ์ฐ -> ๋ ๋ค ๋ฉ์ถค
์๋ฐฉ ๋ฐฉ๋ฒ:
- ํญ์ ๋ฝ์ ๊ณ ์ ๋ ์์๋ก ํ๋
- ํ์์์ ์ค์ ์ผ๋ก ํ์ถ ๊ฐ๋ฅํ๊ฒ ์ค๊ณ
5. Unity์์๋?
Unity๋ ๋ฉ์ธ ์ค๋ ๋ ์ค์ฌ ๊ตฌ์กฐ์ด์ง๋ง,
- Job System + Burst๋ฅผ ์ฐ๊ฑฐ๋
- Task, ThreadPool, BackgroundWorker ๋ฑ์ ์ฌ์ฉํ ๋๋ ๊ฒฝ์ ์กฐ๊ฑด ์ฃผ์ ํ์
Unity์ NativeArray๋ ์ค๋ ๋ ์์ ํ์ง ์์ -> NativeQueue ๊ฐ์ ๊ตฌ์กธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Job System ๋ด์์๋ง ์ ๊ทผํด์ผ ํจ