1์ฅ ๋ฉํฐ ์ค๋ ๋ฉ
10. ์ฑ๊ธ ์ค๋ ๋ ๊ฒ์ ์๋ฒ
๋ง์ ์์ฉ ๊ฒ์ ์๋ฒ๋ CPU๊ฐ ์ฌ๋ฌ ์ฝ์ด๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๋ฐ๋ผ์ ๊ฒ์ ์๋ฒ๋ฅผ ์ฑ๊ธ ์ค๋ ๋๋ก ๊ตฌ๋ํ๋ ๊ฒฝ์ฐ ์ฝ์ด ํ๋๋ง ์ฌ์ฉํ๊ฒ ๋๋ ๋นํจ์จ์ฑ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ๊ทธ๋์ ์ฑ๊ธ ์ค๋ ๋ ์๋ฒ๋ฅผ ๊ตฌ๋ํ๋ ๊ฒฝ์ฐ CPU ๊ฐ์๋งํผ ํ๋ก์ธ์ค๋ฅผ ๋์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- ๊ฐ ์๋ฒ ํ๋ก์ธ์ค๋ ๋ฐฉ์ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง๊ณ ๋ฐฉ์์๋ ํ๋ ์ด์ด ํ๋ ์ด์์ด ์ฑ๊ธ ํ๋ ์ด ํน์ ๋ฉํฐ ํ๋ ์ด๋ฅผ ํ๋ค.
- ํ๋ ์ด์ด ์ ๋ณด๋ฅผ ๋ก๋ฉํ ๋ ๋ฐ์ํ๋ ๋๋ฐ์ด์ค ํ์์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ํฐ ์๋ฆฌ์ผ ๋ณ๋ชฉ์ด ์ผ์ด๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ณ ์ ๋น๋๊ธฐ ํจ์๋ ์ฝ๋ฃจํด ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
- ๋ฐฉ ๊ฐ์๋งํผ ์ค๋ ๋๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ์ค๋ ๋๋ ํ๋ก์ธ์ค ๊ฐ ์ปจํ ์คํธ ์ค์์น์ ํ์๊ฐ ์ฆ๊ฐํ๋ค.
- ๊ฐ์ ๋์์ ์์๋ฅผ ์ฒ๋ฆฌํ๋ ์๋ฒ๋ผ๊ณ ํ๋๋ผ๋ ์ค์ ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋์์ ์์ ์๋ฅผ ํฌ๊ฒ ๋จ์ด๋จ๋ฆฐ๋ค.
11. ๋ฉํฐ ์ค๋ ๋ ๊ฒ์ ์๋ฒ
๋ฉํฐ ์ค๋ ๋๋ก ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ๋ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ๋ค.
- ์๋ฒ ํ๋ก์ธ์ค๋ฅผ ๋ง์ด ๋์ฐ๊ธฐ ๊ณค๋ํ ๋: ํ๋ก์ธ์ค๋น ๋ก๋ฉํด์ผ ํ๋ ๊ฒ์ ์ ๋ณด์ ์ฉ๋์ด ๋งค์ฐ ํด ๋
- ์๋ฒ ํ ๋์ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ CPU์ ์ฐ์ฐ๋์ ๋์ํด์ผ ํ ๋งํผ ๋ง์ ์ฐ์ฐ์ ํ ๋
- ์ฝ๋ฃจํด์ด๋ ๋น๋๊ธฐ ํจ์๋ฅผ ์ธ ์ ์๊ณ ๋๋ฐ์ด์ค ํ์์ด ๋ฐ์ํ ๋
- ์๋ฒ ์ธ์คํด์ค๋ฅผ ์๋ฒ ๊ธฐ๊ธฐ๋น ํ๋๋ง ๋์ด์ผ ํ ๋
- ์๋ก ๋ค๋ฅธ ๋ฐฉ์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ก์ธ์คํด์ผ ํ ๋
ํ ํ๋ก์ธ์ค์ ๋ฉํฐ ์ค๋ ๋๋ก ์๋ํ๋ ๊ฒ์ ์๋ฒ์ ๋ชจ๋ธ์ด๋ค.
์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ์๋์ ๊ฐ๋ค.
- ๊ฒ์ ์๋ฒ ๋ฉ์ธ์ ๋ฐฉ ๋ชฉ๋ก์ ๊ฐ์ง๋ฉฐ ๋ฐฉ ๋ชฉ๋ก์๋ ๊ฐ ๋ฐฉ์ด ๋ค์ด๊ฐ๋ค.
- ๊ฐ ๋ฐฉ์ ๋ฎคํ ์ค๋ฅผ ๊ฐ์ง๋ฉฐ ๋ ๊ฒ์ ์๋ฒ ๋ฉ์ธ ์์ฒด๋ ๋ฎคํ ์ค๋ฅผ ๊ฐ์ง๋ค.
- ํ๋ ์ด์ด ํ๋์ ๋ํ ์ฒ๋ฆฌ๋ ๊ฐ ๋ฐฉ์ ์ ๊ทผ ํ์ ํ๋ค.
- ๊ณตํต ๋ฐ์ดํฐ(๋ฐฉ ๋ชฉ๋ก ๋ฑ)๋ฅผ ์ ๊ทผ๋ค.
- ํ๋ ์ด์ด A๊ฐ ๋ค์ด ์๋ ๋ฐฉ์ ๋ฐฉ ๋ชฉ๋ก์์ ์ฐพ๋๋ค.
- ๊ณตํต ๋ฐ์ดํฐ๋ฅผ ์ ๊ธ ํด์ ํ๋ค.
- ์ฐพ์ ๋ฐฉ์ ์ ๊ทผ๋ค.
- ํ๋ ์ด์ด A์ ๋ฐฉ ์์์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ๋ฐฉ์ ์ ๊ธ ํด์ ํ๋ค.
MyGameServer.DoSomething(playerID)
{
lock(m_critSec);
room = m_roomList.find(player);
Unlock(m_critSec);
lock(room.m_critSec);
room.DoSomething(playerID);
Unlock(room.m_critSec);
}
12. ์ค๋ ๋ ํ๋ง
๋ฉํฐ ์ค๋ ๋ ๋ชจ๋ธ์ ๊ฒ์ ์๋ฒ๋ฅผ ๋ง๋ค ๋ ์ค๋ ๋๋ ๋ช ๊ฐ๋ฅผ ๋ง๋ค๊ณ ๊ฐ ์ค๋ ๋๋ ์ด๋ค ์ผ์ ํ๋ฉด ์ข์๊น?
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ํด๋ผ์ด์ธํธ๋ง๋ค ์ค๋ ๋๋ฅผ ๋ฐฐ์ ํด ์ฃผ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๊ฐ๋ฐ์ ์ฝ์ง๋ง ์ค๋ ๋ ๊ฐ์๊ฐ ๋งค์ฐ ๋ง์์ง๋ฏ๋ก ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ๊ฐ ์ค๋ ๋๋ ํธ์ถ ์คํ์ ๊ฐ์ง๋๋ฐ ์ด๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋งค์ฐ ์ปค์ง๋ค.
- ์ปจํ ์คํธ ์ค์์น ์ฐ์ฐ์ ๋ฌด๊ฑฐ์ด ์์ ์ธ๋ฐ ์ด๋ฅผ ๋งค์ฐ ์์ฃผํด์ผ ํ๋ค.
์์ ๋ฐฉ๋ฒ์ ๊ฑฐ์ ํ์ฉํ์ง ์๊ณ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ ๋ ํ๋ง์ด๋ค.
๊ณต์ค ํ์ฅ์ค์๋ ๋ฌธ์ด ์ฌ๋ฌ ๊ฐ๊ฐ ์๊ณ ๊ธฐ๋ค๋ฆฌ๋ ์ฌ๋๋ค์ ์ผ๋ ฌ๋ก ์ค์ ์์ ๊ธฐ๋ค๋ฆฐ๋ค. ์ฌ์ฉ ์ค์ด ์๋ ๋ฌธ์ด ํ๋๋ผ๋ ์์ผ๋ฉด ๋ค์ด๊ฐ๊ณ ๋ชจ๋ ๋ฌธ์ด ์ฌ์ฉ ์ค์ด๋ฉด ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ์ด๋ ๊ฐ ๋ฌธ์ ์ค๋ ๋์ด๊ณ ๊ธฐ๋ค๋ฆฌ๋ ์ฌ๋๋ค์ ์ด๋ฒคํธ์ด๋ค. ์ฌ๋ฌ ๋ฌธ์ ์งํฉ, ์ฆ ํ์ฅ์ค์ ์ค๋ ๋ ํ์ด๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ง์ ์์ ์ด๋ฒคํธ๋ฅผ ๋์์ ์ฌ๋ฌ ์ค๋ ๋์์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉด์ ๋๋ฌด ๋ง์ ์ค๋ ๋๋ฅผ ๋์์ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ๋ฐฉ์งํ ์ ์๋ค.
- ์ด๋ค ์๋ฒ์ ์ฃผ ์ญํ ์ด ๋๋ฐ์ด์ค ํ์์ด ์๊ณ CPU ์ฐ์ฐ๋ง ํ๋ ์ค๋ ๋๋ผ๋ฉด, ์ค๋ ๋ ํ์ ์ค๋ ๋ ๊ฐ์๋ CPU ๊ฐ์์ ๋์ผํ๊ฒ ์ก์๋ ์ถฉ๋ถํ๋ค.
- ์๋ฒ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์ผ ๋ฑ ๋ค๋ฅธ ๊ฒ์ ์ก์ธ์ค ํ๋ฉด์ ๋๋ฐ์ด์ค ํ์์ด ๋ฐ์ํ ๋ ์ค๋ ๋ ๊ฐ์๋ CPU ๊ฐ์๋ณด๋ค ๋ง์์ผ ํ๋ค.
13. ์ด๋ฒคํธ
๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ ๋ค๋ฅธ ๋๊ตฌ์ด๋ค.
์ด๋ฒคํธ๋ ์ ์๋ ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋ ๋๊ตฌ๋ก Reset(์ด๋ฒคํธ ์์, 0), Set(์ด๋ฒคํธ ์์, 1) ์ํ ๊ฐ์ ๊ฐ์ง๋ค.
Event event1;
void Thread1()
{
// ์ด๋ฒคํธ๊ฐ ์ ํธ๋ฅผ ์ผ์ผํฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
event1.Wait();
}
void Thread2()
{
// ์ด๋ฒคํธ์ ์ ํธ๋ฅผ ์ค๋ค.
event1.SetEvent();
}
- CreateEvent: ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ค.
- CloseHandle: ์ด๋ฒคํธ๋ฅผ ํ๊ดดํ๋ค.
- WaitForSingleObject: ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
- SetEvent: ์ด๋ฒคํธ์ ์ ํธ๋ฅผ ์ค๋ค.
์ด๋ฒคํธ๋ ์ค๋ ๋ ๊ฐ ์ํตํ๋ฉฐ ์ผ์ ์ฒ๋ฆฌํด์ผ ํ ๋ ์ ์ฉํ๋ค.
์๋ฅผ ๋ค์ด ์ค๋ ๋ 1์ ์ผ์ ๋ง์น ํ ์ค๋ ๋ 2์ ์๋ฆด ๋ ํ์ฉํ๋ค.
14. ์ธ๋งํฌ์ด
๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ ๋ค๋ฅธ ๋๊ตฌ์ด๋ค.
๋ฎคํ ์ค๋ ์๊ณ ์์ญ์ ์ค๋ก์ง ์ค๋ ๋ 1๊ฐ๋ง ์์์ ์ก์ธ์ค ํ ์ ์๊ฒ ํ๋ค.
ํ์ง๋ง ์ธ๋งํฌ์ด๋ ์ํ๋ ๊ฐ์์ ์ค๋ ๋๊ฐ ์์์ ์ก์ธ์ค ํ ์ ์๊ฒ ํ๋ค.
Semaphore sema1;
void Main()
{
// ์ค๋ ๋ 2๊ฐ๋ง ์์์ ์ก์ธ์คํ ์ ์๊ฒ ์ ํํ๋ค.
sema1 = new Semaphore(2);
}
void Thread1()
{
// ๋ฆฌ์์ค๋ฅผ ์ก์ธ์คํ ์ ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
sema1.Wait();
// ๋ฆฌ์์ค ์ก์ธ์ค๊ฐ ๋ค ๋๋ฌ์์ ์ธ๋งํฌ์ด์ ์๋ฆฐ๋ค.
sema1.Release();
}
void Thread2()
{
// ๋ฆฌ์์ค๋ฅผ ์ก์ธ์คํ ์ ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
sema1.Wait();
// ๋ฆฌ์์ค ์ก์ธ์ค๊ฐ ๋ค ๋๋ฌ์์ ์ธ๋งํฌ์ด์ ์๋ฆฐ๋ค.
sema1.Release();
}
void Thread3()
{
// ๋ฆฌ์์ค๋ฅผ ์ก์ธ์คํ ์ ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
sema1.Wait();
// ๋ฆฌ์์ค ์ก์ธ์ค๊ฐ ๋ค ๋๋ฌ์์ ์ธ๋งํฌ์ด์ ์๋ฆฐ๋ค.
sema1.Release();
}
- CreateSemaphore: ์ธ๋งํฌ์ด๋ฅผ ์์ฑํ๊ณ ์์์ ๋ช ๊ฐ ํ๋ฝํ๋์ง ์ค์ ํ๋ค.
- WaitForSingleObject: ์ธ๋งํฌ์ด๊ฐ ์์ ์ก์ธ์ค๋ฅผ ์์ฒญํ๊ณ , ํ๋ฝํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
- ReleaseSemaphore: ์ธ๋งํฌ์ด์ ์์ ์ก์ธ์ค๊ฐ ๋๋ฌ์์ ํต๋ณดํ๋ค.
- CloseHandle: ์ธ๋งํฌ์ด๋ฅผ ํ๊ดดํ๋ค.
์ธ๋งํฌ์ด๋ ์ํ ๊ฐ์ ๊ฐ๊ณ ์์ผ๋ฉฐ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๋ ์ต๋ ์ก์ธ์ค ๊ฐ๋ฅํ ์ค๋ ๋ ๊ฐ์์ด๋ค. ์ค๋ ๋๊ฐ ์ธ๋งํฌ์ด์ ์์ ์ก์ธ์ค๋ฅผ ์์ฒญํ๋ฉด ์ํ ๊ฐ์ 1 ๊ฐ์ํ๋ฉฐ ์์ ์ก์ธ์ค๊ฐ ๋๋ ํ์ 1 ์ฆ๊ฐํ๋ค. ์ธ๋งํฌ์ด์ ์ด๋ฒคํธ๋ ๋น์ทํ์ง๋ง ์ด๋ฒคํธ๋ ์ํ ๊ฐ์ด 0, 1๋ก ์ ํ๋์ง๋ง ์ธ๋งํฌ์ด๋ 0 ์ด์์ ๊ฐ์ด๋ ์ฐจ์ด๊ฐ ์๋ค.
15. ์์ ์กฐ์
๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ ๋ค๋ฅธ ๋๊ตฌ์ด๋ค.
์์ ์กฐ์์ ๋ฎคํ ์ค๋ ์๊ณ ์์ญ ์ ๊ธ ์์ด๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ๋์จ์ด ๊ธฐ๋ฅ์ด๋ฉฐ ๋๋ถ๋ถ์ ์ปดํ์ผ๋ฌ๋ ์์ ์กฐ์ ๊ธฐ๋ฅ์ ์ธ ์ ์๊ฒ ํ๋ค.
16. ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํํ ์ค์๋ค
1. ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋ชจ๋์ ์ ๊ธ ํ์ง ์๊ธฐ
๊ทธ๋ฅ ๊ฐ์ ์ฝ๊ณ ๋ง ์์ผ๋ฉด ์ ๊ธ์ ํ์ง ์๋๋ผ๋ ์์ ํ๋ค๋ ๋ง์ญํ ์๊ฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
ํฌ๋์๋ฅผ ์ผ์ผํค์ง๋ ์์ง๋ง a ๊ฐ์ด ์ด์ํ๊ฒ ์ถ๋ ฅ๋ ์ ์๋ค.
int a;
mutex a_mutex;
void func1()
{
// lock(a_mutex); ๋๋ฝ
print(a);
}
void func2()
{
lock(a_mutex);
a = a + 10;
}
2. ์ ๊ธ ์์ ๊ผฌ์
ํ๋ก๊ทธ๋จ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์ด ๊ท์น์ ์ค์ํ๊ธฐ๊ฐ ์๊ฐ๋ณด๋ค ์ด๋ ต๋ค.
์ ์ผ ์ข์ ๊ฒ์ ์ ๊ธ ์์ ๊ท์น์ ์ต๋ํ ์ ๊ฒ ์ ์งํ๋ ๊ฒ์ด๋ค.
3. ๋๋ฌด ์ข์ ์ ๊ธ ๋ฒ์
์ ๊ธ ๊ฐ์ฒด ๋ฒ์๊ฐ ๋๋ฌด ๋์ผ๋ฉด ์ปจํ ์คํธ ์ค์์น๊ฐ ๋ฐ์ํ ๋ ์ด์์ฒด์ ๊ฐ ํด์ผ ํ ์ผ์ด ๋ง์์ง๊ณ ๋ณ๋ ฌ์ฑ์ด ๋จ์ด์ง๋ค.
์ ๊ธ ๋ฒ์๋ฅผ ์ขํ๋ฉด ์ปจํ ์คํธ ์ค์์น์ ํ๋ฅ ์ด ๋จ์ด์ง๊ธฐ๋ ํ์ง๋ง ์๊ณ ์์ญ ์ ๊ธ์ด ๋ ๋ง์ ์ฒ๋ฆฌ ์๊ฐ์ ์ฐจ์งํ๋ค.
๋ฐ๋ผ์ ์๊ณ ์์ญ์ ์ ๋นํ ์์ค์์ ๋๋๋ฉด ์ข๋ค.
4. ๋๋ฐ์ด์ค ํ์์ด ์์ธ ์ ๊ธ
๋๋ฐ์ด์ค ํ์์ด ์์ ๋๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์์ฃผ ์ ๊ทผํ๋ ๋ฆฌ์์ค์ ๋ํ ์ ๊ธ์ ํ์ง ๋ง์์ผ ํ๋ค.
ํนํ ์์ฃผ ํ๋ ์ค์๋ ๋ก๊ทธ ์ถ๋ ฅ์ด๋ ์ฝ์ ์ถ๋ ฅ์ด๋ค.
๋์์ ์์๋ ๋ง์๋ฐ ๊ฒ์ ์๋ฒ์์ CPU ์ฌ์ฉ๋์ด ์ ๊ฒ ๋์ค๋ ๊ฒฝ์ฐ, ์ด ๋๋ฌธ์ธ ๊ฒฝ์ฐ๊ฐ ์๋ค.
5. ์ ๊ธ์ ์ ์ผ์ฑ์ผ๋ก ๋ฐ์ํ ์ค์
์ ๊ธ์ผ๋ก ๋ณดํธ๋๋ ๋ฆฌ์์ค์์ ์ป์ด ์จ ๊ฐ์ด๋ ํฌ์ธํฐ ์ฃผ์ ๊ฐ ๋ฑ์ด ๋ก์ปฌ ๋ณ์๋ก ์๋ ๊ฒฝ์ฐ์๋ ์ ๊ธ ์ํ๋ฅผ ๊ณ์ ์ ์งํด์ผ ํ ๋๊ฐ ์๋ค.
class A
{
int x;
int y;
};
mutex list_mutex;
List<A> list;
void func()
{
lock(list_mutex);
A* a = list.GetFirst();
unlock(list_mutex);
a->x++; // ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ
}
6. ์ ๊ธ๋ ๋ฎคํ ์ค๋ ์๊ณ ์์ญ ์ญ์
class A
{
mutex mutex;
int a;
};
void func()
{
A* a = new A();
lock(a->mutex);
delete a;
}
7. ์ผ๊ด์ฑ ๊ท์น ๊นจ๊ธฐ
์๋ ์ฝ๋์์ list์ listCount๋ ์ผ๊ด์ฑ์ด ์ ์ง๋์ด์ผ ํ๋๋ฐ, ์ ๊ธ ๊ฐ์ฒด๊ฐ 2๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ผ๊ด์ฑ์ด ์ ์ง๋์ง ๋ชปํ๋ค.
class Node
{
Node* next;
};
Node* list = null;
int listCount = 0;
mutex listMutex;
mutex listCountMutex;
void func()
{
lock(listMutex);
Node* newNode = new Node();
newNode->next = list;
list = newNode;
unlock(listMutex);
lock(listCountMutex);
listCount++;
unlock(listCountMutex);
}