SlideShare a Scribd company logo
Executor with ExceptionCGCIICho sanghyun’s Game Classes II
CGCIICho sanghyun’s Game Classes II
SEH 란 ?
 SEH(Structured Exception Handling) 은 윈도즈 O/S 차원의 예외 처리 시스템이다 .
 SEH 는 C++ Exception 과 별개이며 언어 중립적이다 .
(C++ 의 try, catch 에는 잡히지 않는다 .)
 일반적으로 ‘뻑 !’ 났을 때 덤프 남기는 용도로 많이 사용한다 !!
 보통 SEH 의 사용은 여기까지다 .
덤프 남기는 것만으로도 감사 감사 ~
Structured Exception Handling
예외처리
(Divide by zero, Access Violation at …! 등등 )
try
throw
catch
__try
__ exception
__finally
C++ Exception SEH
CGCIICho sanghyun’s Game Classes II
SHE 란 ?예외처리
하지만 C++ Exception 보장 처리와 SEH 를 연동 처리
하면 뻑이 나도 다운되지 않고 안전하게 동작 가능한 서버를
만들 수 있다 .
그렇다면 !
SEH 로 Windows System Exception 만
무모화 시킨다면 다운 없는 서버 !!!?
오히려 더 큰일난다 !
→ 예외 중립 훼손
( 즉 뻑 ! 났는지도 모르고 아무런 처리도 없이 그냥 넘기면 더 큰일남 )
CGCIICho sanghyun’s Game Classes II
SEH 와 C++ Exception 의 결합
 Visual C++ 의 Project 의 Property 에서 /EHa 옵션을 설정한다 .
즉 C++ Exception 과 SEH 가 연동될 수 있도록 옵션을 설정한다 .
예외처리
CGCIICho sanghyun’s Game Classes II
SEH 사용 (1)
 보통 뻑이 나면 Mini-Dump 를 남기는 용도로만 사용한다 .
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
…
CreateDump(p_pException);
…
printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”);
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
// 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !)
*(int*)0 = 10;
}
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
…
CreateDump(p_pException);
…
printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”);
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
// 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !)
*(int*)0 = 10;
}
예외처리
CGCIICho sanghyun’s Game Classes II
SEH 와 C++ 예외의 결합
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
CreateDump(p_pException);
throw std::exception();
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
try
{
// 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!)
*(int*)0 = 10;
}
catch(…)
{
printf(“ 뻑났음 !”);
}
}
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
CreateDump(p_pException);
throw std::exception();
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
try
{
// 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!)
*(int*)0 = 10;
}
catch(…)
{
printf(“ 뻑났음 !”);
}
}
2. C++ Exception 을 던진다 !!!!
3. 그럼 C++ Exception 이 여기서 튀어나온다 !!
4. 당연히 C++ Exception 은 여기에서 잡힌다 !
1. 여기서 ‘뻑’난다 !!!
( 이 순간 C++ Exception 이 발생하지 않고 SEH 에 의해 ...)
예외처리
 C++ Exception 과 함께 사용하면 좀더 다른 처리가 가능하다 .
CGCIICho sanghyun’s Game Classes II
CGCII 예외 시스템
void CExecutorIOCP::Execute(DWORD p_tickWait)
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
while(m_bDone)
{
DWORD dwResult;
DWORD dwBytes;
ULONG_PTR pHKey;
LPOVERLAPPED pOverlapped;
dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait);
ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped);
pExecutable->ProcessExecute(dwResult, dwBytes);
pExecutable->Release();
}
}
void CExecutorIOCP::Execute(DWORD p_tickWait)
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
while(m_bDone)
{
DWORD dwResult;
DWORD dwBytes;
ULONG_PTR pHKey;
LPOVERLAPPED pOverlapped;
dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait);
ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped);
pExecutable->ProcessExecute(dwResult, dwBytes);
pExecutable->Release();
}
}
 SEH 와 C++ Exception 이 결합한다면 ?
 IOCP Executor 의 처리를 try-catch 문으로 처리한다 .
try
{
pExecutable->ProcessExecute(dwResult, dwBytes);
}
catch(…)
{
}
참고 ) 성능을 위해 while 문에 try-catch 문은 최대한 빼도록 구현함 . try-catch 문을 밖으로 빼고 이중 while 문을 쓰는 것이 일반적임 .
예외처리
만약 , 이 함수 실행 중 ‘뻑’이 났다면…
이 ProcessExecute() 함수가 Strong Exception Guarantee 를 제공
하는 함수라면…
try-catch 블록으로 감싼다 .
CGCIICho sanghyun’s Game Classes II
CGCII 예외 시스템
 CGCII 의 모든 Engine 시스템의 실행 처리는 CGCII 의 Execute System 하에서
동작을 하며 완벽한 Strong Exception Guarantee 를 보장한다 .
 쉽게 말해서 아래와 같이 동작한다 .
1. 예외발생 정보 저장 .
2. Mini Dump 남김 .
3. 예외 알림 .
예외처리
CGCIICho sanghyun’s Game Classes II
CGCII 예외 처리
 Pairing 처리를 해주어야 하는 것 !! 들
예외처리
예를 들어 접속 처리 과정에서 OnConnect() 가 정상적으로 호출되었다면 반드시
OnDisconnect() 가 호출되어야 한다 .
OnEnter() 함수가 호출되었으면 반드시 OnLeave() 함수가 호출되어야 한다 .
 객체에 예외처리 전달
- Message 의 처리 과정에서 Message 처리 도중 전달되는 객체에도 예외처리 권한이
주어져야 한다 .
 기타 등등…
원하는 시기에 원하는 대상에 원하는 내용의 예외를 처리할 수 있는 구조를 지원해주어야 한다
.
CGCIICho sanghyun’s Game Classes II
강제 예외 발생
 강제 예외 발생 (Force Rasing Exception) 이란 강제로 예외를 발생 시키는 것 .
 ‘ 데드락’이나 ‘무한루프’에 빠진 쓰레드에 강제로 예외를 발생시켜 해결할 수 있다 .
다만 ! 예외 안전이 처리되었을 때만 제대로 처리 가능하다 . 그렇지 않다면 예외 발생시켜봐
야 어차피 엉망진창된다 .
 Managed C++ 에는 이런 기능 있지만 Native C++ 에서는 직접 만들어야 된다 .
 강제 예외 발생 구현은 시간 및 공간 제한 상 생략 ~
예외처리
CGCIICho sanghyun’s Game Classes II
질문 ?예외처리
질문 ?
sangducks@gmail.com

More Related Content

What's hot

오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
Amazon Web Services Korea
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
Xionglong Jin
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
Seungmo Koo
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
Seungmo Koo
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
Heungsub Lee
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
승명 양
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
강 민우
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
Jongwon Kim
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
MinGeun Park
 
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
Youngtaek Oh
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
Seungmo Koo
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자KyeongWon Koo
 

What's hot (20)

오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
 
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 

Viewers also liked

GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple InhertanceGCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group SystemGCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
상현 조
 
Sencha architect
Sencha architectSencha architect
Sencha architectkiller31z
 
인터렉 리서치
인터렉 리서치인터렉 리서치
인터렉 리서치Jung Mieseul
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Nam Hyeonuk
 
서울우유 이벤트프로모션
서울우유 이벤트프로모션서울우유 이벤트프로모션
서울우유 이벤트프로모션Eunkyou Kim
 
[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template
Seok-joon Yun
 
Barista mobile m2c07
Barista mobile m2c07Barista mobile m2c07
Barista mobile m2c07
hyungjoo park
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
Jaeseung Ha
 

Viewers also liked (12)

GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple InhertanceGCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
 
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
 
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group SystemGCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
 
Sencha architect
Sencha architectSencha architect
Sencha architect
 
인터렉 리서치
인터렉 리서치인터렉 리서치
인터렉 리서치
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
서울우유 이벤트프로모션
서울우유 이벤트프로모션서울우유 이벤트프로모션
서울우유 이벤트프로모션
 
[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template
 
Barista mobile m2c07
Barista mobile m2c07Barista mobile m2c07
Barista mobile m2c07
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 

Similar to GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception

Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프OnGameServer
 
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
Seok-joon Yun
 
Exception&log
Exception&logException&log
Exception&log
Nam Hyeonuk
 
예외처리가이드
예외처리가이드예외처리가이드
예외처리가이드
도형 임
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
Jae-yeol Lee
 
Tcpl 14장 예외처리
Tcpl 14장 예외처리Tcpl 14장 예외처리
Tcpl 14장 예외처리
재정 이
 
M3 4 1
M3 4 1M3 4 1
M3 4 1nexthw
 
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
주항 박
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Dong Chan Shin
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
Dong Chan Shin
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
Ryan Park
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
Ryan Park
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
Lusain Kim
 
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
GangSeok Lee
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Circulus
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 
프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가홍준 김
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
흥배 최
 

Similar to GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception (20)

Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프
 
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
 
Exception&log
Exception&logException&log
Exception&log
 
예외처리가이드
예외처리가이드예외처리가이드
예외처리가이드
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
Tcpl 14장 예외처리
Tcpl 14장 예외처리Tcpl 14장 예외처리
Tcpl 14장 예외처리
 
M3 4 1
M3 4 1M3 4 1
M3 4 1
 
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가프로그램은 왜 실패 하는가
프로그램은 왜 실패 하는가
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 

GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception

  • 1. Executor with ExceptionCGCIICho sanghyun’s Game Classes II
  • 2. CGCIICho sanghyun’s Game Classes II SEH 란 ?  SEH(Structured Exception Handling) 은 윈도즈 O/S 차원의 예외 처리 시스템이다 .  SEH 는 C++ Exception 과 별개이며 언어 중립적이다 . (C++ 의 try, catch 에는 잡히지 않는다 .)  일반적으로 ‘뻑 !’ 났을 때 덤프 남기는 용도로 많이 사용한다 !!  보통 SEH 의 사용은 여기까지다 . 덤프 남기는 것만으로도 감사 감사 ~ Structured Exception Handling 예외처리 (Divide by zero, Access Violation at …! 등등 ) try throw catch __try __ exception __finally C++ Exception SEH
  • 3. CGCIICho sanghyun’s Game Classes II SHE 란 ?예외처리 하지만 C++ Exception 보장 처리와 SEH 를 연동 처리 하면 뻑이 나도 다운되지 않고 안전하게 동작 가능한 서버를 만들 수 있다 . 그렇다면 ! SEH 로 Windows System Exception 만 무모화 시킨다면 다운 없는 서버 !!!? 오히려 더 큰일난다 ! → 예외 중립 훼손 ( 즉 뻑 ! 났는지도 모르고 아무런 처리도 없이 그냥 넘기면 더 큰일남 )
  • 4. CGCIICho sanghyun’s Game Classes II SEH 와 C++ Exception 의 결합  Visual C++ 의 Project 의 Property 에서 /EHa 옵션을 설정한다 . 즉 C++ Exception 과 SEH 가 연동될 수 있도록 옵션을 설정한다 . 예외처리
  • 5. CGCIICho sanghyun’s Game Classes II SEH 사용 (1)  보통 뻑이 나면 Mini-Dump 를 남기는 용도로만 사용한다 . void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { … CreateDump(p_pException); … printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … // 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !) *(int*)0 = 10; } void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { … CreateDump(p_pException); … printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … // 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !) *(int*)0 = 10; } 예외처리
  • 6. CGCIICho sanghyun’s Game Classes II SEH 와 C++ 예외의 결합 void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { CreateDump(p_pException); throw std::exception(); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … try { // 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!) *(int*)0 = 10; } catch(…) { printf(“ 뻑났음 !”); } } void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { CreateDump(p_pException); throw std::exception(); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … try { // 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!) *(int*)0 = 10; } catch(…) { printf(“ 뻑났음 !”); } } 2. C++ Exception 을 던진다 !!!! 3. 그럼 C++ Exception 이 여기서 튀어나온다 !! 4. 당연히 C++ Exception 은 여기에서 잡힌다 ! 1. 여기서 ‘뻑’난다 !!! ( 이 순간 C++ Exception 이 발생하지 않고 SEH 에 의해 ...) 예외처리  C++ Exception 과 함께 사용하면 좀더 다른 처리가 가능하다 .
  • 7. CGCIICho sanghyun’s Game Classes II CGCII 예외 시스템 void CExecutorIOCP::Execute(DWORD p_tickWait) { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); while(m_bDone) { DWORD dwResult; DWORD dwBytes; ULONG_PTR pHKey; LPOVERLAPPED pOverlapped; dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait); ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped); pExecutable->ProcessExecute(dwResult, dwBytes); pExecutable->Release(); } } void CExecutorIOCP::Execute(DWORD p_tickWait) { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); while(m_bDone) { DWORD dwResult; DWORD dwBytes; ULONG_PTR pHKey; LPOVERLAPPED pOverlapped; dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait); ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped); pExecutable->ProcessExecute(dwResult, dwBytes); pExecutable->Release(); } }  SEH 와 C++ Exception 이 결합한다면 ?  IOCP Executor 의 처리를 try-catch 문으로 처리한다 . try { pExecutable->ProcessExecute(dwResult, dwBytes); } catch(…) { } 참고 ) 성능을 위해 while 문에 try-catch 문은 최대한 빼도록 구현함 . try-catch 문을 밖으로 빼고 이중 while 문을 쓰는 것이 일반적임 . 예외처리 만약 , 이 함수 실행 중 ‘뻑’이 났다면… 이 ProcessExecute() 함수가 Strong Exception Guarantee 를 제공 하는 함수라면… try-catch 블록으로 감싼다 .
  • 8. CGCIICho sanghyun’s Game Classes II CGCII 예외 시스템  CGCII 의 모든 Engine 시스템의 실행 처리는 CGCII 의 Execute System 하에서 동작을 하며 완벽한 Strong Exception Guarantee 를 보장한다 .  쉽게 말해서 아래와 같이 동작한다 . 1. 예외발생 정보 저장 . 2. Mini Dump 남김 . 3. 예외 알림 . 예외처리
  • 9. CGCIICho sanghyun’s Game Classes II CGCII 예외 처리  Pairing 처리를 해주어야 하는 것 !! 들 예외처리 예를 들어 접속 처리 과정에서 OnConnect() 가 정상적으로 호출되었다면 반드시 OnDisconnect() 가 호출되어야 한다 . OnEnter() 함수가 호출되었으면 반드시 OnLeave() 함수가 호출되어야 한다 .  객체에 예외처리 전달 - Message 의 처리 과정에서 Message 처리 도중 전달되는 객체에도 예외처리 권한이 주어져야 한다 .  기타 등등… 원하는 시기에 원하는 대상에 원하는 내용의 예외를 처리할 수 있는 구조를 지원해주어야 한다 .
  • 10. CGCIICho sanghyun’s Game Classes II 강제 예외 발생  강제 예외 발생 (Force Rasing Exception) 이란 강제로 예외를 발생 시키는 것 .  ‘ 데드락’이나 ‘무한루프’에 빠진 쓰레드에 강제로 예외를 발생시켜 해결할 수 있다 . 다만 ! 예외 안전이 처리되었을 때만 제대로 처리 가능하다 . 그렇지 않다면 예외 발생시켜봐 야 어차피 엉망진창된다 .  Managed C++ 에는 이런 기능 있지만 Native C++ 에서는 직접 만들어야 된다 .  강제 예외 발생 구현은 시간 및 공간 제한 상 생략 ~ 예외처리
  • 11. CGCIICho sanghyun’s Game Classes II 질문 ?예외처리 질문 ? sangducks@gmail.com

Editor's Notes

  1. TLS를 사용하여 성능을 향상시킬 수 있다!! 아무리 Lock-Free라 해도 그냥 값을 복사하는 것보다는 성능이 확실히 떨어진다. 그래서 Lock의 최소화를 위해 TLS를 사용한다.
  2. 생성하려는 객체는 반드시 ICGPoolable&amp;lt;T&amp;gt;를 상속받아야 한다. 사용할 때는 그냥 Alloc()함수를 호출하면 되고… 사용이 끝나게 되면 Free()함수를 호출하면 되는데 일반적으로 OnFinalRelease()함수에서 해준다.
  3. Windows의 기본 할당자와 CGPool의 성능을 비교한다.(Windows는 기본적으로 16Kbyte까지 LFH가 적용된다.)
  4. Object Pool은 객체의 할당을 위한 Pool이다. 사용방법은 매우 간단하다!!! 첫째 CGPool::CObject&amp;lt;T&amp;gt; 라고 하면 된다~~ 그러면 그냥 Alloc(), Free()함수를 사용하여 객체의 할당과 할당해제를 수행할 수 있다 Pool 객체의 대상이 되는 객체는 무조건 ICGPoolable&amp;lt;T&amp;gt;을 상속받아야만 한다!!! 그리고 참조계수로 관리되므로 OnFinalRelease에 delete this가 아니라 Free(this)가 호출되어야 한다. 즉 다 사용되면 지워지는 것이 아니라 풀로 되돌려지는 것이다.
  5. 생성하려는 객체는 반드시 ICGPoolable&amp;lt;T&amp;gt;를 상속받아야 한다. 사용할 때는 그냥 Alloc()함수를 호출하면 되고… 사용이 끝나게 되면 Free()함수를 호출하면 되는데 일반적으로 OnFinalRelease()함수에서 해준다.
  6. Alloc()/Free()를 사용하고 또 매번 OnFinalRelease()를 호출하도록 하려면 귀찬다. 따라서 NCGPoolable을 지원해준다.
  7. 또 NCGPoolable&amp;lt;T&amp;gt;만 상속받았으면 NEW&amp;lt;T&amp;gt;로 생성한다면 자동으로 Pool에서 할당을 해준다.
  8. 또 NCGPoolable&amp;lt;T&amp;gt;만 상속받았으면 NEW&amp;lt;T&amp;gt;로 생성한다면 자동으로 Pool에서 할당을 해준다.