2. 1. Worker Thread와 Logic Thread의 운용
일반적으로 접속 혹은 접속종료를 감지하거나 패킷을 받는 일을 하는 스레드를
워커스레드라고 하고 받은 패킷을 처리하는 일을 하는 스레드를 로직스레드라
고 한다.
게임의 설계에 따라서 워커스레드가 로직처리까지 한다거나 로직스레드를 하나
만 둔다거나 로직스레드를 다수로 운용하거나 하는 여러가지 방법이 있다.
3. Model 1
Worker Thread Queue Logic Thread
로직스레드없이 워커스레드에서 로직까지 처리하는 방법.
컨텍스트 스위칭이 적어서 잘 구성하면 최고의 성능을 낼수 있지만
네트워크 처리와 로직 처리에 대한 구분을 할 수 없어서 모듈화에는
좋지 않다.
4. Model 2
Worker Thread Queue Logic Thread
로직스레드 하나로 처리하는 방법.
로직 처리시에 따로 lock을 걸지 않아도 되기 때문에
협업에 유리한 구조
5. Model 3
Worker Thread Queue Logic Thread
로직스레드 다수로 처리하는 방법. 로직스레드가 다수 이므로
lock정책을 잘 수립해야 한다.
8. “ Model 1 + Model 3 ”
Model 1 : 처리 시간이 적은 것은 워커스레드에서 바로 처리(Common TR)
Model 3 : 처리시간이 느린 것은 큐를 통해 로직스레드에서 처리(Non-Common TR)
데드락의 위험성은 존재하지만 시스템에 맞게 적절한 튜닝(스레드 개수 조절)을 통한
성능 향상을 할 수 있다.
9. TR 처리
Worker
IOCP CTroc Queue DB Thread
Thread
Accept
TR송신 [Common TR]
[Non-Common TR]
10. 2. 병렬 프로그래밍 활용
멀티 코어 CPU가 발전하는 만큼 이를 쉽게 사용할 수 있게 해주는 라이브러리
들도 발전하고 있다.
OpenMP TBB PPL
이들 라이브러리를 이용하면 직접 스레드를 관리하거나 분배하는 수고 없이
수월하게 병렬 처리를 할수 있도록 도와준다.
“ R2프로젝트에 적용해보자 ”
11. OpenMP 적용 – BMP파일 병렬로드
OpenMP는 컴파일러 지시자만으로서 블록을 멀티 스레드로 작동하게 할 수 있다.
#pragma omp parallel
물리적 CPU개수만큼 스레드를 만든다.
12. OpenMP 적용 – BMP파일 병렬로드
단위(초)
디버그 릴리즈
OpenMP 적용 75 4
기존 213 11
13. TBB Container 성능비교
현재 프로젝트에서 사용하는 FnlApi::CQueue 와 성능비교
성능 테스트 방법은 N개의 스레드에서 동시적인 push와 N개의 스레드에서 동
시적인 pop으로 동시성 위주의 테스트
tbb::concurrent_bounded_queue
- 최대 크기가 정해져 있는 큐
- push 함수는 큐가 꽉 찬 경우, 블로킹된다.
- try_pop 말고도 블로킹되는 pop 함수가 있다.
- size 함수가 음수를 리턴할 수 있으며, 이는 대기 중인 pop 함수 호출의 갯수
를 의미한다.
- abort 함수를 통해 대기 중인 push, pop 함수를 취소시킬 수 있다. (예외 발
생)