[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
2014 CodeEngn Conference 10
MS 에게 속았어요
Windows 운영체제가 지원하는 디버거 지원 기능들과 브랜치 트레이서를 구현하기 위한 몇 가지 방법들을 소개하고, Windows 커널에 이미 구현되어있는 하드웨어 기반 브랜치 트레이서 코드 분석과 여기에 존재하는 의도된(?) 버그를 살펴본다.
http://codeengn.com/conference/10
http://codeengn.com/conference/archive
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안GangSeok Lee
2014 CodeEngn Conference 11
가상화와 보안의 합작
가상화 기술은 대상체를 추상화된 리소스로 가상화하여 활용할 수 있는 기술이다. 가상화 기술이 하드웨어 차원에서 지원되기 시작한 이후로 CPU가 제어하는 자원을 하드웨어 레벨에서 가상화 할 수 있게 되었다. CPU가 하드웨어 수준에서 가상화를 지원하기 위해 설계된 구조와 인터페이스가 존재하는 계층이 기존에 운영체제에서 사용하던 Ring 0~3 계층 상위에 추가되면서 이를 보안에서 활용하는 시도들이 있어왔으며 대표적으로 ARM TrustZone 아키텍처가 있다. TrustZone과 같은 아키텍처는 운영체제와는 다르게 오직 보안에 관련된 서비스와 기능만을 탑재한 보안전용운영체제를 먼저 상주시킨다. 운영체제가 특권/사용자 계층을 나누어 사용자 계층에서 하드웨어 자원에 접근하는 것을 막고 대신 요청을 받아 처리함으로서 하드웨어 자원을 보호했던 것과 유사하게 보안/일반 계층으로 나눠 보안이 필요한 동작시에 보안전용운영체제가 요청을 받아 처리하는 구조를 갖고, 일반 계층은 격리되어 보안 계층에 접근할 수 없으므로 보안성을 한층 높힌 구조이다. 본 발표는 가상화 기술에 대한 개괄적 설명과 이를 활용한 PS/2 키로거를 제작 I/O를 가로채는 과정을 살펴보고 운영체제 상위 권한이 어떤 의미를 갖는지 그리고 CPU하드웨어 레벨의 강력한 권한을 체험하는 것을 통해 가상화 기술의 특성을 파악해보자 한다.
http://codeengn.com/conference/11
http://codeengn.com/conference/archive
본 발표자료에서는 이더리움 플랫폼의 상세 아키텍쳐와 기반 기술, 그리고 스마트 컨트랙과 이를 기반한 Dapp의 개발 방안에 대해 소개한다. 이더리움은 블록체인 기반 기술하에 암호 화폐의 생성 , 전송 등 라이프사이클 관리외에 스마트 컨트랙을 지원한다. 스마트컨트랙은 서로 모르는 당사자간의 계약을 준수하도록 강제할 수 있는 응용 프로그램이다. 컨트랙 프로그램은 바이트코드로 컴파일된 후 블록체인을 통해 배포되고 , 로컬 로드상에서 실행되는 일종의 에이전트라 볼 수 있다. 이렇게 개바된 스마트컨트랙은 기존 웹 인터페이스를 통해 접근하고 활용할 수 있으며 이렇게 스마트 컨트랙 기반하에 개발된 응용 서비스를 Dapp이라 한다.
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
2014 CodeEngn Conference 10
MS 에게 속았어요
Windows 운영체제가 지원하는 디버거 지원 기능들과 브랜치 트레이서를 구현하기 위한 몇 가지 방법들을 소개하고, Windows 커널에 이미 구현되어있는 하드웨어 기반 브랜치 트레이서 코드 분석과 여기에 존재하는 의도된(?) 버그를 살펴본다.
http://codeengn.com/conference/10
http://codeengn.com/conference/archive
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안GangSeok Lee
2014 CodeEngn Conference 11
가상화와 보안의 합작
가상화 기술은 대상체를 추상화된 리소스로 가상화하여 활용할 수 있는 기술이다. 가상화 기술이 하드웨어 차원에서 지원되기 시작한 이후로 CPU가 제어하는 자원을 하드웨어 레벨에서 가상화 할 수 있게 되었다. CPU가 하드웨어 수준에서 가상화를 지원하기 위해 설계된 구조와 인터페이스가 존재하는 계층이 기존에 운영체제에서 사용하던 Ring 0~3 계층 상위에 추가되면서 이를 보안에서 활용하는 시도들이 있어왔으며 대표적으로 ARM TrustZone 아키텍처가 있다. TrustZone과 같은 아키텍처는 운영체제와는 다르게 오직 보안에 관련된 서비스와 기능만을 탑재한 보안전용운영체제를 먼저 상주시킨다. 운영체제가 특권/사용자 계층을 나누어 사용자 계층에서 하드웨어 자원에 접근하는 것을 막고 대신 요청을 받아 처리함으로서 하드웨어 자원을 보호했던 것과 유사하게 보안/일반 계층으로 나눠 보안이 필요한 동작시에 보안전용운영체제가 요청을 받아 처리하는 구조를 갖고, 일반 계층은 격리되어 보안 계층에 접근할 수 없으므로 보안성을 한층 높힌 구조이다. 본 발표는 가상화 기술에 대한 개괄적 설명과 이를 활용한 PS/2 키로거를 제작 I/O를 가로채는 과정을 살펴보고 운영체제 상위 권한이 어떤 의미를 갖는지 그리고 CPU하드웨어 레벨의 강력한 권한을 체험하는 것을 통해 가상화 기술의 특성을 파악해보자 한다.
http://codeengn.com/conference/11
http://codeengn.com/conference/archive
본 발표자료에서는 이더리움 플랫폼의 상세 아키텍쳐와 기반 기술, 그리고 스마트 컨트랙과 이를 기반한 Dapp의 개발 방안에 대해 소개한다. 이더리움은 블록체인 기반 기술하에 암호 화폐의 생성 , 전송 등 라이프사이클 관리외에 스마트 컨트랙을 지원한다. 스마트컨트랙은 서로 모르는 당사자간의 계약을 준수하도록 강제할 수 있는 응용 프로그램이다. 컨트랙 프로그램은 바이트코드로 컴파일된 후 블록체인을 통해 배포되고 , 로컬 로드상에서 실행되는 일종의 에이전트라 볼 수 있다. 이렇게 개바된 스마트컨트랙은 기존 웹 인터페이스를 통해 접근하고 활용할 수 있으며 이렇게 스마트 컨트랙 기반하에 개발된 응용 서비스를 Dapp이라 한다.
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
CloudBread
클라우드 기반 무료 오픈소스 프로젝트로, 모바일 게임과 모바일 앱에 최적화된 게임 서버 엔진입니다. 모든 서비스는 마이크로소프트의 클라우드 서비스인 Azure에 최적화되어 동작하며, 안정성과 확장성을 목표로 개발 중입니다.
기능
•PaaS / DaaS 서버 엔진•PaaS, DaaS 로 손쉬운 개발 및 서비스 즉시 배포
•Real Auto Scale - PaaS
•개발/테스트/배포 = 통합 환경
•서비스 규모에 따른 앱 변경 없음
글로벌 론칭 아키텍처
•글로벌 론칭+데이터 동기화
•설계 부터 클라우드에 최적화된 아키텍처 및 프레임워크로 개발
•오픈소스 프레임워크 활용 개발
보안, 관리, 기술교육
•저장/통신에 표준 암호화 기술 적용
•기본 관리자 서비스 및 커스터마이징
•분석/관리 배치 작업 추가 제작 가능
개발자 그룹
•페이스북 사용자 그룹 : https://www.facebook.com/groups/cloudBreadProject/
지원되는 모바일 & 클라이언트환경
•iOS, Android, Windows Phone, Windows 스토어앱, Xamarin, PhoneGap, Sencha 등
•Microsoft Azure Mobile Service가 지원하는 모바일 및 다양한 클라이언트 플랫폼 지원 : http://azure.microsoft.com/ko-kr/documentation/services/mobile-services/
설치
•Wiki의 튜토리얼 설치 참조
프로젝트 설명
•모바일게임과 모바일 앱에서 사용되는 사용자의 패턴과 액션을 기록해 기능들을 제공
•클라이언트 모바일 디바이스는 게임서버로 JSON 방식의 데이터를 요청하고 서버가 해당 데이터를 처리 후 응답
•약 100여개의 비즈니스 로직이 기본제공(Wiki 참조)
•클라이언트는 마이크로소프트가 오픈소스로 직접 만들어 제공하는 라이브러리를 통해 서버로 API를 호출
실행 예제와 API 리스트는 Wiki 참조
Contribute/질문/토론
•페이스북 사용자 그룹 : https://www.facebook.com/groups/cloudBreadProject/
오픈스택 커뮤니티 - 제1회 공개 SW 커뮤니티데이 (2017년 9월 정기 세미나 대체)
- 일시: 9월 22일 금요일
- 발표자: 장태희 (운영진, 스터디 매니저)
- 행사 정보: https://www.facebook.com/groups/openstack.kr/permalink/1826976907316452/
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?NAVER Engineering
안드로이드에서 코루틴은 어떻게 적용할 수 있을까?
: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
권태환
요기요 / 안드로이드 개발
6년차 안드로이드 개발자 권태환입니다. 저는 꿈 많은 개발자가되자라는 블로그를 운영하고있고 GDG Seoul의 운영진을 하고 있습니다. 현재는 RGP Korea에서 요기요앱을 개발하고있으며, 안드로이드 개발 패턴과 코틀린에 흥미를 가지고 실무에도 적용하고 있습니다.
2. CGCIICho sanghyun’s Game Classes II
실행처리
일반적인 Unix 기반 서버
Thread (1)
• Socket 당 하나의 Thread 의 물려 버린다 .
• 접속 수만큼 Thread 가 필요해 사실상 동접이 제한
• 극악의 비효율 ! (Thread 수 >>>Core 수 )
• 효율적으로 제작하기가 불가능 그 자체 !
• Apache MPM(Multi-Processing Modules) Prefork or Worker 와 같은 Unix 기반 서버
Thread Pool
Socket 당 Thread 를 1:1 로 물림
3. CGCIICho sanghyun’s Game Classes II
실행처리
비동기 I/O 싱글 쓰레드 기반 서버
Thread (2)
• 하나의 Thread 로 모든 Socket 을 처리 .
• 비동기 이벤트 방식 혹은 폴 방식 Socket I/O 를 사용 .
따라서 동시 접속 수는 거의 제한이 없으면 단일 쓰레드라 성능이 극히 떨어짐 .
• 효율적으로 제작하려면 추가적인 노력이 듬 .
• Node.js, Nginx 와 같은 류의 Unix 기반 서버류 혹은 AsyncSelect 등을 사용하는 Window 기반 서버류
모든 Socket 은 하나의 Thread 로…
4. CGCIICho sanghyun’s Game Classes II
실행처리
일반적인 IOCP 를 사용하는 Window 서버
Thread (3)
• 비동기식 처리기 때문에 접속자 제한이 없음 .
• 모든 Core 를 활용할 수 있음 .
• 국내외 IOCP 를 사용한 Windows 서버 엔진류
I/O Thread Pool
•일반적으로 IOCP 와 다중 Thread 로 구성
•기본적 Socket I/O 의 처리나 받은 메시지를 큐잉하는 역할만 수행
Work Thread
•단일 혹은 멀티 Thread 로 구성
•큐잉된 메시지를 꺼내와 실질적인 메시지의 처리
기타 Thread
•잡다한 처리를 할 Thread
•몇 개가 될지 대중 없다 .
• Core 에 비해 많은 Thread 수를 강요 .
• 복잡한 Thread 구조 .
• 완벽한 부하균형이 힘들어 과부하 시 I/O 와 Work 의 쏠
림 현상이 나타나 서버가 불안해지는 경우가 많음 .
5. CGCIICho sanghyun’s Game Classes II
실행처리
CGCII 는 하나의 Thread Pool 로 통해 로드 밸런싱 !
단일 Load Balancer 이므로 I/O 처리에 있어 쏠림 현상이 최소화된다 .
최적의 Core 대 Thread 수를 가질 수 있다 .
Thread (4)
통합 Thread Pool
Socket I/O, Work Thread 역할 , 기타 잡다한 처리 모두 하나의 Thread Pool 로 통
합 실행
Core 와 Thread 의 사용효율을 극대화 시킨다 .
Scheduler
•실행 예약된 것을 Executor 에 걸어주는 역할
•Priority Queue 로 최적화 .
6. IOCP(I/O Completion Port)
CGCIICho sanghyun’s Game Classes II
실행처리
IOCP 는 결론적으로 쓰레드풀을 위한 시스템
= Thread Pool
일반적으로 Socket I/O 처리에 Overlapped I/O 를 처리하기 위해 사용한다 .
IOCP (1)
7. CGCIICho sanghyun’s Game Classes II
실행처리
enum MY_IOTYPE
{
int IOTYPE_ACCEPT,
int IOTYPE_CONNECT,
int IOTYPE_DISCONNECT,
int IOTYPE_SEND,
int IOTYPE_RECEIVE
};
struct MY_OVERLAPED : public OVERLAPPED
{
MY_IOTYPE eIOType;
WSABUF sBuffer;
};
enum MY_IOTYPE
{
int IOTYPE_ACCEPT,
int IOTYPE_CONNECT,
int IOTYPE_DISCONNECT,
int IOTYPE_SEND,
int IOTYPE_RECEIVE
};
struct MY_OVERLAPED : public OVERLAPPED
{
MY_IOTYPE eIOType;
WSABUF sBuffer;
};
2. I/O Type 을 설정할 변수 추가
1. OVERLAPPED structure 를 상속받음 .
일반적인 IOCP 를 사용한 처리…
일단 OVERLAPPED 구조체를 상속받은 구조체를 정의한다 .
IOCP (2)
3. I/O Type
8. CGCIICho sanghyun’s Game Classes II
실행처리
일반적인 IOCP 를 사용한 처리…
// @) hSocket 은 접속된 소켓 ;
// 1) Overlapped 와 통보받을 Event 를 생성한다 .
g_pOverlapped = new MY_OVERLAPED;
// 2) MY_OVERLAPED 설정하기
ZermoMemory(g_pOverlapped, sizeof(WSAOVERLAPPED));
pOverlapped->eIOType = IOTYPE_RECEIVE;
pOverlapped->hEvent = NULL;
pOverlapped->sBuffer .buf = malloc(65536);
pOverlapped->sBuffer.len = 65536;
// 3) Receive 걸어 놓는다 .
DWORD dwByte;
DWORD dwFlag = 0;
WSARecv(hSocket, &pOverlapped->sBuffer, 1, &dwByte, &dwFlag, g_pOverlapped, NULL);
// @) hSocket 은 접속된 소켓 ;
// 1) Overlapped 와 통보받을 Event 를 생성한다 .
g_pOverlapped = new MY_OVERLAPED;
// 2) MY_OVERLAPED 설정하기
ZermoMemory(g_pOverlapped, sizeof(WSAOVERLAPPED));
pOverlapped->eIOType = IOTYPE_RECEIVE;
pOverlapped->hEvent = NULL;
pOverlapped->sBuffer .buf = malloc(65536);
pOverlapped->sBuffer.len = 65536;
// 3) Receive 걸어 놓는다 .
DWORD dwByte;
DWORD dwFlag = 0;
WSARecv(hSocket, &pOverlapped->sBuffer, 1, &dwByte, &dwFlag, g_pOverlapped, NULL);
1. MY_OVERLAPPED 객체를 동적 생성한다 .
2. I/O 타입을 설정한다 .
3. 이렇게 넘김 ~
IOCP (3)
9. CGCIICho sanghyun’s Game Classes II
실행처리
일반적인 IOCP 를 사용한 처리…
// @) I/O Thead
DWORD dwResult; // GetQueued…() 함수의 결과
DWORD dwTransfered; // 전송된 Byte 수를 저장할 변수
ULONG_PTR pPerHandelKey; // Per Handle Key 의 Pointer 를 받을 변수
MY_OVERLAPPED* pOverlapped; // Per I/Okey 를 받을 변수
// 1) Overlapped I/O 의 완료를 받는다 .
dwResult = GetQueuedCompletionStatus(g_hCompletionPort, dwTransfered, pPerHandelKey, pOverlapped, INFINITE);
// 2) I/O 타입에 따라 I/O 를 처리한다 .
switch(pOverlapped->eIOType)
{
case IOTYPE_ACCEPT:
// Accept 처리 ~
break;
case IOTYPE_CONNECT:
// Connect 처리 ~
break;
case IOTYPE_DISCONNECT:
// Disconnect 처리 ~
break;
case IOTYPE_SEND:
// Send 처리 ~
break;
case IOTYPE_RECEIVE:
// Receive 처리 ~
break;
};
// @) I/O Thead
DWORD dwResult; // GetQueued…() 함수의 결과
DWORD dwTransfered; // 전송된 Byte 수를 저장할 변수
ULONG_PTR pPerHandelKey; // Per Handle Key 의 Pointer 를 받을 변수
MY_OVERLAPPED* pOverlapped; // Per I/Okey 를 받을 변수
// 1) Overlapped I/O 의 완료를 받는다 .
dwResult = GetQueuedCompletionStatus(g_hCompletionPort, dwTransfered, pPerHandelKey, pOverlapped, INFINITE);
// 2) I/O 타입에 따라 I/O 를 처리한다 .
switch(pOverlapped->eIOType)
{
case IOTYPE_ACCEPT:
// Accept 처리 ~
break;
case IOTYPE_CONNECT:
// Connect 처리 ~
break;
case IOTYPE_DISCONNECT:
// Disconnect 처리 ~
break;
case IOTYPE_SEND:
// Send 처리 ~
break;
case IOTYPE_RECEIVE:
// Receive 처리 ~
break;
};
2. 처리할 내용은 eIOType 으로 결정한다 .
1. Overlapped 구조체의 포인터를 받는다 .
3. 해당 처리를 수행한다 .
IOCP (3)
10. CGCIICho sanghyun’s Game Classes II
실행처리 ICGExecutor 와 ICGExecutable (1)
CGCII 에서는 이와 같은 방법이 아니라 상속을 사용한다 .
CGCII 에서는 'ICGExecutor' 와 'ICGExecutable' 을 정의하여 사용한다 .
11. CGCIICho sanghyun’s Game Classes II
class ICGExecutable :
public OVERLAPPED
virtual public ICGReferenceCount
{
public:
virtual bool ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered) PURE;
};
class ICGExecutable :
public OVERLAPPED
virtual public ICGReferenceCount
{
public:
virtual bool ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered) PURE;
};
Executable 을 아래와 같이 정의한다 .
1. OVERLAPPED 객체를 상속받는다 .
2. ICGReferenceCount 를 상속받는다 .
3. 순수가상함수 실행할 내용을 작성할 함수 .
실행처리 ICGExecutor 와 ICGExecutable (2)
12. CGCIICho sanghyun’s Game Classes II
이것을 상속받아 여러 다양한 Socket I/O 용 Exectuable 을 뿐만 아니라 다양한
처리를 위한 Executable 을 만들 수 있다 .
실행처리 ICGExecutor 와 ICGExecutable (6)
13. CGCIICho sanghyun’s Game Classes II
bool CExecutableReceive TCP::ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered)
{
return true;
}
bool CExecutableReceive TCP::ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered)
{
return true;
}
ICGExecutable 을 상속받아 여러 Send 용과 Receive 용 Exectuable 을 정의한
다 .
Receive 완료 후 처리 내용
class CExecutableReceiveTCP :
virtual public ICGExecutable
{
public:
virtual bool ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered);
protected:
…
};
class CExecutableReceiveTCP :
virtual public ICGExecutable
{
public:
virtual bool ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered);
protected:
…
};
1. ICGExecutable 을 상속받는다 .
2. ProcessExecute 를 재정의한다 .
실행처리 ICGExecutor 와 ICGExecutable (3)
14. CGCIICho sanghyun’s Game Classes II
이것을 Overlapped I/O 에 건다 .
CGPTR<CExecutableReceiveTCP> pExecutable = NEW<CExecutableReceiveTCP>();
…
DWORD dwBytes;
DWORD dwFlag = 0;
pExecutable->AddRef();
WSARecv(m_hSocket, pWSABuffer, iBufferCount, &dwBytes, &dwFlag, pExecutable->get())
// Error 처리 생략…
CGPTR<CExecutableReceiveTCP> pExecutable = NEW<CExecutableReceiveTCP>();
…
DWORD dwBytes;
DWORD dwFlag = 0;
pExecutable->AddRef();
WSARecv(m_hSocket, pWSABuffer, iBufferCount, &dwBytes, &dwFlag, pExecutable->get())
// Error 처리 생략…
1. Executable 을 생성한다 .
2. OVERLAPPED 를 걸기 전 AddRef 한다 .
3. OVERLAPPED I/O 를 건다 .
실행처리 ICGExecutor 와 ICGExecutable (4)
15. void CExecutorIOCP::Execute(DWORD p_tickWait)
{
while(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)
{
while(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();
}
}
CGCIICho sanghyun’s Game Classes II
GetQueuedCompletionPort() 함수에서 아래 처럼 처리한다 .
이렇게 되면 IOCP 객체 쪽에서는 GetQueuedCompletionStatus() 의 처리 내용이 무엇인지 알
필요가 없다 !!!!
결합도가 낮아진다 .
6. OVERLAPPED 의 포인터를 얻는다 .
7. ICGExecutable 로 Casting 을 한다 .
8. ProcessExecute 를 호출한다 !
9. pExecutable 을 Release() 한다 .
실행처리 ICGExecutor 와 ICGExecutable (5)
16. CGCIICho sanghyun’s Game Classes II
bool CExecutableWORK ::ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered)
{
printf(“ 실행했음 !!!”);
return true;
}
bool CExecutableWORK ::ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered)
{
printf(“ 실행했음 !!!”);
return true;
}
WSARecv 나 WSASend 같은 Overlapped I/O 함수가 아니더라도 ICGExecutable 을 상속
받아 정의하기만 하면 어떠한 것도 IOCP Executor 에서 실행 가능하다 .
class CExecutableWORK :
virtual public ICGExecutable
{
public:
virtual bool ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered);
protected:
…
};
class CExecutableWORK :
virtual public ICGExecutable
{
public:
virtual bool ProcessExecute(DWORD p_dwReturn, DWORD p_dwTransfered);
protected:
…
};
1. ICGExecutable 을 상속받는다 .
2. ProcessExecute 를 재정의한다 .
CGPTR<CExecutableWORK> pExecutable = NEW<CExecutableWORK>();
…
pExecutable->AddRef();
PostQueuedCompletionStatus (m_hCP, 0, nullptr, pExecutable)
// Error 처리 생략…
CGPTR<CExecutableWORK> pExecutable = NEW<CExecutableWORK>();
…
pExecutable->AddRef();
PostQueuedCompletionStatus (m_hCP, 0, nullptr, pExecutable)
// Error 처리 생략…
3. PostQueuedCompletionStatus() 를 사용하면 된다 !
실행처리 ICGExecutor 와 ICGExecutable (7)
17. CGCIICho sanghyun’s Game Classes II
이렇게 되면 어떤 형태의 실행처리도 IOCP 에 걸어 통합 처리가 가능하다 .
.
.
.
PostExecute(ICGExecutable* , …)
실행처리 ICGExecutor 와 ICGExecutable (8)
18. CGCIICho sanghyun’s Game Classes II
범용적인 용도로 사용되는 다양한 Executable 도 정의할 수 있다 .
일정시간마다 ProcessExecute 를 실행함
.
(Schedule 에 의해 동작 )
특정 함수를 실행함 .
( 전역함수 , 멤버함수 , 람다함수 )
여러 Executable 을 모아서 실행하고 모두
완료 후 특정 작업을 실행 함 .
( 특정함수 실행 , 메시지 전송 , 블록킹 )
실행처리 ICGExecutor 와 ICGExecutable (9)
19. CGCIICho sanghyun’s Game Classes II
실행처리
간단하게 함수도 Executor 에 걸 수 있다 .
CGPTR<CGExecutor::CCompletionPortThread> g_pexecutorTest;
void fTest()
{
printf( "함수를 실행함 . n");
};
void main()
{
// 1) Executor 를 생성 .
g_pexecutorTest = NEW<CGExecutor::CCompletionPortThread>();
// 2) Thread 2 개를 시작한다 .
g_pexecutorTest ->Start(2);
// 3) Executable 객체를 생성한다 .
CGPTR<CGExecutable::CFunction> pExecutable = NEW<CGExecutable::CFunction>();
// 4) 함수를 설정한다 .
pExecutable->SetFunction(fTest);
// 5) 실행을 건다 .
g_pexecutorTest->PostExecute(pExecutable);
}
CGPTR<CGExecutor::CCompletionPortThread> g_pexecutorTest;
void fTest()
{
printf( "함수를 실행함 . n");
};
void main()
{
// 1) Executor 를 생성 .
g_pexecutorTest = NEW<CGExecutor::CCompletionPortThread>();
// 2) Thread 2 개를 시작한다 .
g_pexecutorTest ->Start(2);
// 3) Executable 객체를 생성한다 .
CGPTR<CGExecutable::CFunction> pExecutable = NEW<CGExecutable::CFunction>();
// 4) 함수를 설정한다 .
pExecutable->SetFunction(fTest);
// 5) 실행을 건다 .
g_pexecutorTest->PostExecute(pExecutable);
}
1. 함수를 정의함 .
2. Executable 객체 생성
4. Executor 에 실행 요청
3. Executable 에 함수 설정
ICGExecutor 와 ICGExecutable (11)
20. CGCIICho sanghyun’s Game Classes II
실행처리
더 간단하게 람다 (Lambda) 함수로도 설정 가능하다 .
// 1) Executable 객체를 생성한다 .
CGPTR<CGExecutable::CLambda> pExecutable = NEW<CGExecutable::CLambda>();
// 2) 함수를 설정한다 .
pExecutable->SetFunction([]()
{
printf( "함수를 실행함 . n");
});
// 3) 실행을 건다 .
g_pexecutorTest->PostExecute(pExecutable);
// 1) Executable 객체를 생성한다 .
CGPTR<CGExecutable::CLambda> pExecutable = NEW<CGExecutable::CLambda>();
// 2) 함수를 설정한다 .
pExecutable->SetFunction([]()
{
printf( "함수를 실행함 . n");
});
// 3) 실행을 건다 .
g_pexecutorTest->PostExecute(pExecutable);
1. Executable 객체 생성
3. Executor 에 실행 요청
2. Executable 에 람다함수 설정
TickCount 로 시간을 정해 실행시킬 수도 있다 . (Schedule 에 의한 실행 )
// 3) 현재부터 6 초 후에 실행한다 .
g_pexecutorTest->PostExecute(pExecutable, GET_TICKCOUNT()+6000);
// 3) 현재부터 6 초 후에 실행한다 .
g_pexecutorTest->PostExecute(pExecutable, GET_TICKCOUNT()+6000);
실행 시간 설정 : 현재 TICK+6 초
ICGExecutor 와 ICGExecutable (12)
21. Batch ExecutionCGCIICho sanghyun’s Game Classes II
실행처리
일괄 처리를 수행할 수도 있다 .
// 1) Executable 객체를 생성한다 .
CGPTR<CGExecutable::CBatchWait> pexecutableBatch = NEW<CGExecutable::CBatchWait>();
// 2) 실행할 Executable 을 추가한다 .
for(int i=0; i<10; ++i)
{
CGPTR<CTestExecutable> pexecutable = NEW<CTestExecutable>();
pexecutableBatch->QueueExecutable(pexecutable);
}
// 3) 실행을 건다 .
pexecutableBatch->RequestExecute(g_pexecutorTest);
// 4) 완료를 기다린다 .
pexecutableBatch->WaitExecuteCompletion();
// 1) Executable 객체를 생성한다 .
CGPTR<CGExecutable::CBatchWait> pexecutableBatch = NEW<CGExecutable::CBatchWait>();
// 2) 실행할 Executable 을 추가한다 .
for(int i=0; i<10; ++i)
{
CGPTR<CTestExecutable> pexecutable = NEW<CTestExecutable>();
pexecutableBatch->QueueExecutable(pexecutable);
}
// 3) 실행을 건다 .
pexecutableBatch->RequestExecute(g_pexecutorTest);
// 4) 완료를 기다린다 .
pexecutableBatch->WaitExecuteCompletion();
1. Batch Executable 객체 생성
3. 일괄 처리를 요청한다 .
2. 일괄 실행할 Executable 을 추가한다 .
4. 완료를 대기한다 .
( 모두 완료될 때까지 블록킹된다 .)
22. CGCIICho sanghyun’s Game Classes II
실행처리
기본 (Default) Executor 를 사용한다면 더 간단해 진다 .
// 1) 일반 함수를 실행할 경우 ..
POST_EXECUTE(fTest);
// 2) 람다로 실행함수를 설정한다 .
POST_EXECUTE([]()
{
printf( "함수를 실행함 . n");
});
// 1) 일반 함수를 실행할 경우 ..
POST_EXECUTE(fTest);
// 2) 람다로 실행함수를 설정한다 .
POST_EXECUTE([]()
{
printf( "함수를 실행함 . n");
});
void fTest()
{
printf( "함수를 실행함 . n");
};
void fTest()
{
printf( "함수를 실행함 . n");
};
Default Executor
23. CGCIICho sanghyun’s Game Classes II
실행처리
모든 처리는 최대한 하나의 Thread-Pool 에 의해 관리한다 .
결론
Thread-Pool 역할을 할 ICGExecutor 클래스를 정의하여 IOCP 로 구현한다 .
I/O 처리뿐만 아니라 모든 처리를 ICGExcutable 을 상속받아 정의하기만 하면 하나의
Thread-Pool 에서 관리가 가능해진다 .