์์ฑ์ : ๋ฐ์ฌ์ฉ
๋ณธ ์๋ฃ๋ ์์ฑ์์ธ '๋ฐ์ฌ์ฉ'์ ๊ฐ์ธ Repository์ ๊ธ์ ์ฌ๊ตฌ์ฑํ์ฌ ์์ฑ๋์์ต๋๋ค.
์๋ฃ๋ฅผ ๊ณต๋ถํ๊ธฐ ์ด์ ์ ์ตํ๋์ด์ผ ํ๋ ๋๊ฐ์ง ๊ธฐ์ ์ ๋จผ์ ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
- ํ๋ก์ธ์ค์ ์ค๋ ๋๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๊ธฐ
- ์ค๋ ๋์ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ๋ถํด๋ณด๊ธฐ
Table of Contents
์ด์์ฒด์ ๊ฐ ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋จ์ ๋จ์
์คํํ์ผ์ ์คํํ๋ ๊ฒ์ด ๊ณง ํ๋ก์ธ์ค๋ฅผ ๋ง๋๋ ๊ฒ. ์คํํ์ผ์ ์คํ์ ์ด์์ฒด์ ๊ฐ ํ์ผ์ ์ฝ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณต์ฌํด๋๊ณ ์์ ์ฃผ์๋ก ์ ํํ๋ ๊ฒ. ๋ฉํฐ์ฝ์ด๊ฐ ์๋๋๋ผ๋ ์ฌ๋ฌ๊ฐ์ ํ๋ก๊ทธ๋จ์ด ๋์์ ์คํ๋๋ค.
ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
- Code : ์คํ๋ ๋ช ๋ น์ด๊ฐ ๋ค์ด๊ฐ๋ ๊ตฌ์ญ
- Data : ์ ์ญ ๋ณ์๊ฐ ๋ค์ด๊ฐ๋ ๊ตฌ์ญ
- Stack : ์ง์ญ๋ณ์์ ํจ์ ๋ฆฌํด ์ฃผ์๊ฐ ๋ค์ด๊ฐ๋ ๊ตฌ์ญ
- Heap : malloc์ด๋ New๋ก ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค์ด๊ฐ๋ ๊ตฌ์ญ
- PCB : Process Control Block
ํ๋ก์ธ์ค๋ ๋ด๋ถ์ ์ผ๋ก ์ฑ๊ฒฉ์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋์ด์ ๊ด๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ ์ธ๊ทธ๋จผํธ๋ผ ํ๋ค.
ํ๋ก๊ทธ๋จ ๋ด์์์ ์คํ๋๋ ํ๋ฆ์ ๋จ์
ํ๋ก์ธ์ค์ ๋ถ๋ถ์งํฉ์ด๋ค. ๋ชจ๋ ์ค๋ ๋๋ ์์ ๊ณ ์ ์ ์คํ์ ๊ฐ์ง๊ณ ์๊ณ Data, Heap, Code ์์ญ์ ๋ค๋ฅธ ์ค๋ ๋์ ๊ณต์ ํ๊ฒ ๋๋ค.
ํ ํ๋ก๊ทธ๋จ์์์ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฝ๋์ ๋ฐ์ดํฐ ํ ์์ญ์ ์ค๋ ๋๊ฐ ๊ณต์ ๊ฐ ๋๋ค. ๋๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๊ณ ํ ์ฅ์์ ์๋ ๊ฒ์ ์์๊ณผ ๋ถ๋ชจ๊ฐ ๊ฐ์ด ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ์คํ์์ญ๋ง ์๋ก ํ๋ ํ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๋ ์์ฑ ์ overhead๊ฐ ํ๋ก์ธ์ค๋ณด๋ค ์๋ค.
- ์บ์ ๋ฏธ์ค๊ฐ ๋น๊ต์ ์ ๊ฒ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๋ Context Switching ๋น์ฉ์ overhead๊ฐ ํ๋ก์ธ์ค๋ณด๋ค ์ ๋ค.
- ์ค๋ ๋๊ฐ์ ํต์ ์ด ํ๋ก์ธ์ค๊ฐ์ ํต์ ๋ณด๋ค ๊ฐ๋จํ๋ค. ํ๋ก์ธ์ค๊ฐ์ ํต์ ์ overhead๊ฐ ํผ
- ํ๋์ ์ค๋ ๋์์ ๋ฐ์ํ ๋ฌธ์ ๊ฐ ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ๋ฉ์ถ๊ฒ ํ๋ค.
- ํ๋์ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ๊ตฐ๋ฐ๊ฐ ๋์์ ์คํ๋๋ฏ๋ก ์ค๋ ๋์ ๊ฒฝ์ฐ ๋๋ฒ๊น ์ด ๋๋ฌด๋๋ ์ด๋ ต๋ค.
- ๋ฉํฐ์ฝ์ด CPU์์์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ํฅ์์ ์ํ์ฌ
- ๋ฉํฐ CPU ์ปดํจํฐ, ๋ณ๋ ฌ์ปดํจํฐ์์์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ํฅ์์ ์ํ์ฌ
ํ๋์ ํ๋ก๊ทธ๋จ์ ๋ ๋น ๋ฅด๊ฒ ๋๋ฆฌ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
10 FPS ๊ฒ์์ 20 FPS๋ก ์ฌ๋ฆฌ๊ณ ์ถ์ ๋, ์ฒ๋ฆฌ๋์ ๋์ด๊ธฐ ์ํ์ฌ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค.
- ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ผํ ๊ตฌํ ์๋จ
- ํ๋์ ํ๋ก์ธ์ค ์์์ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๋ฅผ ์คํ์์ผ ๋ณ๋ ฌ์ฑ์ ์ป๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ
์ ๋ต์ ์๋๋ค. ๊ฒ์์ ์ฑ๋ฅ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์ ์๊ด์ ์์ง๋ง ๊ฒ์์ด ๋๋ฆฌ๊ฑฐ๋, ํ๋ก๊ทธ๋จ์ด ๋๋ฆฌ๋ค๋ฉด ์ฑ๋ฅ ๊ฐ์ ์ด ์ฐ์ ์ ๋์ด์ผ ํ๋ค. ๋ค์ํ ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด์ ์ฑ๋ฅ๊ฐ์ ์ ์งํํด์ผ ํ๊ณ ์ตํ์ ๋ณด๋ฃจ๋ก ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์งํํ์ฌ์ผ ํ๋ค.
์ฃผ์ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด ๋ ๋๋ ค์ง์ง๋ ๋ชจ๋ฅธ๋ค.
๋งค๋ฒ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํจ์๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋๋ฐํด์ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฉด ๊ณ์ ๊ฐ์ ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํ๋๋ฐ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ด ๋งค๋ฒ ๋ค๋ฅด๋ค. ์ด๊ฒ์ ์๋ชป ๋ง๋ ํ๋ก๊ทธ๋จ์ผ๋ก ๋๋ฒ๊น ์ด ์ฝ์ง ์๊ณ Data Race์ ๋ถ๋ชํ ์ ์๋ค. Data Race๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ์ฝ๊ณ ์ฐ๊ณ ํ ๋์ ๋ชจ๋ ์ ์ญ ๋ณ์๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ด๋ฏ๋ก ์ฝ๊ณ ์ฐ๋ ์์์ ๋ฐ๋ผ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ณ ์ด ์ํ๋ฅผ ๊ฒฝ์ ์ํ๋ผ๊ณ ํ๋ค. ํ์ง๋ง C++11์์ lock๊ณผ unlock์ ์ง์ํด์ฃผ๋ฏ๋ก ๋ณต์๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋๋ก ์ฝ๋ฉ์ ์งํํ์ฌ์ผ ํ๋ค.
#include <thread>
#include <iostream>
#include <mutex>
std::mutex mtx_lock;
int main(){
std::thread Threads1([&] (){
for(int i=0;i<5;++i){
mtx_lock.lock();
std::cout << "Thread Num : " << i << std::endl;
mtx_lock.unlock();
}
});
std::thread Threads2;
Threads2 = std::thread([&](){
for(int i=10;i<15;++i){
mtx_lock.lock();
std::cout << "Thread Num : " << i << std::endl;
mtx_lock.unlock();
}
}
return 0;
}
๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ mutex ๊ฐ์ฒด๋ ์ ์ญ ๋ณ์๋ก ์ฝ๋ฉํ์ฌ์ผ ํ๊ณ ๊ฐ์ ๊ฐ์ฒด ์ฌ์ด์์๋ง lock๊ณผ unlock์ด ๋์ํ๋ ๊ฒ์ ์ฃผ์ํ์ฌ์ผ ํ๋ค. ์๋ก ๋์์ ์คํ๋์ด๋ ๊ด์ฐฎ์ Critical Section (lot reader, 0 writer)์์๋ ๋ค๋ฅธ mutex ๊ฐ์ฒด๋ก ๋ณดํธํ๋๊ฒ์ด ์ฑ๋ฅ์ ์ข๋ค.
ํ ๊ฐ ์ด์์ ์ฝ์ด๋ก ๊ตฌ์ฑ๋ CPU. i3, i5, i7
2021๋
ํ์ฌ๋ ๋ชจ๋ ๊ฒ์ด ๋ค ๋ฉํฐ์ฝ์ด ex) Xbox, ๋ํ
๋ ์ค์์น
๊ณผ๊ฑฐ์ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ: Window์์๋ Win32 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ง์๋๋ API ์ฌ์ฉํ์๊ณ , ์๋์ฐ๋ ๋ฉํฐ์ค๋ ๋์ ํนํ๋ OS์ด๊ณ ๋ฆฌ๋ ์ค๋ pthread API๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค.
Windows์์์ thread =>
ํ๋ก์ธ์ค์ ํ์ ๊ฐ๋
ํ๋ก์ธ์ค๋ ์ฒ์ ์์ ์ ํ๊ฐ์ ์ค๋ ๋๋ฅผ ๊ฐ๊ณ ์์๋๊ณ ์ด์์ฒด์ ๊ฐ ์ง์ ์ค์ผ์ฅด๋งํ๊ฒ ๋๋ค.
๋ณ๋ ฌ ํ๋ก๊ทธ๋จ์ ํน์ง
- ์คํ๋ ํ๋ก์ธ์ค ๋ด๋ถ์ ์ฌ๋ฌ๊ณณ์ด ๋์์ ์คํ๋๋ค.
- ๋ณ๋ ฌ๋ก ์คํ๋๋ ๊ฐ์ฒด ์ฌ์ด์ ๋๊ธฐํ๊ฐ ํ์์ด๋ค. (synchronization)
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ๋ฉ์ธ์งํจ์ฑ ๋ชจ๋ธ์ด ์๋ค.
- ์ ํ์ฑ : ๋ค์ํ ํ๋ฆ์์ ๋์๋ค๋ฐ์ ์ผ๋ก ํธ์ถํด๋ ๋ฌธ์ ์์ด ์คํ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด ํ์
- ์ฑ๋ฅ : Context ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ํฅ์์ด ๋์์ผ ํจ
- ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์๋ฅผ ๋ง๋๋ ์ด์ ?
CPU์ ์ฑ๋ฅ์ ์ฌ๋ ค์ผํ๊ณ , ํด๋ญ ์๋๋ฅผ ๋์ฌ์ผ ํ๋ค. ํ์ง๋ง ํด๋ญ ์๋๋ฅผ ๋์ผ ์ ์์. ํ๊ณ๊ฐ ์ ํด์ ธ ์๋ค. => ํด๋ญ ์๋๊ฐ 4GHz๊ฐ ๋๋ฉด ์ปดํจํฐ๊ฐ ๋ถ์ ํ๊ฒ ๋๋ค. ์ฐ์ฃผ๊ฐ ๊ทธ๋ ๊ฒ ์ค๊ณ๋์ด ์์. 4Ghz์ ๋ฒฝ์ด๋ผ๊ณ ๋ ํ๋ค. ์ฌ์ฉํ๋ ค๋ฉด ์ค์๊ฐ์ผ๋ก ์ก์ฒด์ง์๋ฅผ ๋ค์ด๋ถ์ด์ผ ํจ. ๋จ์ ๊ฒ์ ๋ฉํฐ์ฝ์ด ๋ฟ์ด์๊ณ , ์ฑ๊ธ๋ก๋ ๋์ ํ ์๋๋๊น ์ฝ์ด ๊ฐ์๋ก ์ธ์ฐ๊ณ ์๋ค. ๋์ผ์ฝ์ด CPU 2๊ฐ, ์ฟผ๋์ฝ์ด CPU 1๊ฐ ์ฐจ์ด๋ ํฌ์ง ์๋ค. ์ฌ๋ฌ ์ฝ์ด๊ฐ ๋ฆ๊ฒ ๊ฐ๋ฐ๋ ์ด์ ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ ์ง์ผํ๋ ๋ฒ๊ฑฐ๋ก์๋ฟ๋ง ์๋๋ผ ๋๋ฒ๊น ๋ ์ด๋ ต๊ณ ์ด๋ฏธ ์์ฑํ ์๊ณ ๋ฆฌ์ฆ๋ ์ฌ์ฉํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ค๋ ๋์ ๊ฐ์์ ์ฝ์ด์ ๊ฐ์๋ ์ผ์นํ์ง ์์๋ ์๊ด์ด ์๋ ์ด์ ?
ํ๋ก์ธ์ค๊ฐ ์๋ถํ ๋ก ๋์๊ฐ๋ฉด์ ์คํ๋๋ฏ ์ค๋ ๋๋ ์๋ถํ ๋ก ์ด์๋์ด ์ค๊ฐ์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์คํ๋ ์ ์๋ค. ์ฝ๊ฒ ์ฝ์ด์ ๊ฐ์๋ CPU ๋ด ๋ฌผ๋ฆฌ์ ์ฐ์ฐ๋ถ์ ๊ฐ์์ด๊ณ , ์ค๋ ๋๋ ์์ ๋จ์์ด๋ฏ๋ก ์ผ์นํ์ง ์์๋ ๋๋ค.
- ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์งํํ์ ๋ ์ฑ๊ธ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ๋ณด๋ค ๋๋ ค์ก๋ค. ๊ทธ ์ด์ ๋ ๋ฌด์์ผ๊น?
์ฌ์ฉํ๋ ์ค๋ ๋๊ฐ ๋ง์์ง๋ฉด ๋ง์์ง์๋ก bottleneck์ ๊ฐ๋ฅ์ฑ๊ณผ ์ฐ๋ ๋๋ง๋ค ์ฐธ์กฐํ๋ ์บ์๊ฐ ๋ค๋ฅด๋ฏ๋ก ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฑฐ๋ ์ค๋ ๋ ํ๋๋ง์ผ๋ก๋ ์งํํ ์ ์๋ ๊ฐ๋จํ ์ฝ๋๋ฅผ ์ฌ๋ฌ ์ค๋ ๋๋ก ์งํ์์ผ๋ race condition์ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด ์๊ฐ์ด ์ฌ์ฉ๋๊ณค ํ๋ค. ์ ์ฌ์ ์์ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.