SlideShare a Scribd company logo
1 of 24
Executing SystemCGCIICho sanghyun’s Game Classes II
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 로 물림
CGCIICho sanghyun’s Game Classes II
실행처리
 비동기 I/O 싱글 쓰레드 기반 서버
Thread (2)
• 하나의 Thread 로 모든 Socket 을 처리 .
• 비동기 이벤트 방식 혹은 폴 방식 Socket I/O 를 사용 .
따라서 동시 접속 수는 거의 제한이 없으면 단일 쓰레드라 성능이 극히 떨어짐 .
• 효율적으로 제작하려면 추가적인 노력이 듬 .
• Node.js, Nginx 와 같은 류의 Unix 기반 서버류 혹은 AsyncSelect 등을 사용하는 Window 기반 서버류
모든 Socket 은 하나의 Thread 로…
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 의 쏠
림 현상이 나타나 서버가 불안해지는 경우가 많음 .
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 로 최적화 .
IOCP(I/O Completion Port)
CGCIICho sanghyun’s Game Classes II
실행처리
IOCP 는 결론적으로 쓰레드풀을 위한 시스템
= Thread Pool
 일반적으로 Socket I/O 처리에 Overlapped I/O 를 처리하기 위해 사용한다 .
IOCP (1)
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
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)
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)
CGCIICho sanghyun’s Game Classes II
실행처리 ICGExecutor 와 ICGExecutable (1)
 CGCII 에서는 이와 같은 방법이 아니라 상속을 사용한다 .
 CGCII 에서는 'ICGExecutor' 와 'ICGExecutable' 을 정의하여 사용한다 .
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)
CGCIICho sanghyun’s Game Classes II
 이것을 상속받아 여러 다양한 Socket I/O 용 Exectuable 을 뿐만 아니라 다양한
처리를 위한 Executable 을 만들 수 있다 .
실행처리 ICGExecutor 와 ICGExecutable (6)
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)
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)
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)
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)
CGCIICho sanghyun’s Game Classes II
 이렇게 되면 어떤 형태의 실행처리도 IOCP 에 걸어 통합 처리가 가능하다 .
.
.
.
PostExecute(ICGExecutable* , …)
실행처리 ICGExecutor 와 ICGExecutable (8)
CGCIICho sanghyun’s Game Classes II
 범용적인 용도로 사용되는 다양한 Executable 도 정의할 수 있다 .
일정시간마다 ProcessExecute 를 실행함
.
(Schedule 에 의해 동작 )
특정 함수를 실행함 .
( 전역함수 , 멤버함수 , 람다함수 )
여러 Executable 을 모아서 실행하고 모두
완료 후 특정 작업을 실행 함 .
( 특정함수 실행 , 메시지 전송 , 블록킹 )
실행처리 ICGExecutor 와 ICGExecutable (9)
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)
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)
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. 완료를 대기한다 .
( 모두 완료될 때까지 블록킹된다 .)
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
CGCIICho sanghyun’s Game Classes II
실행처리
 모든 처리는 최대한 하나의 Thread-Pool 에 의해 관리한다 .
결론
 Thread-Pool 역할을 할 ICGExecutor 클래스를 정의하여 IOCP 로 구현한다 .
 I/O 처리뿐만 아니라 모든 처리를 ICGExcutable 을 상속받아 정의하기만 하면 하나의
Thread-Pool 에서 관리가 가능해진다 .
CGCIICho sanghyun’s Game Classes II
질문 ?예외처리
질문 ?
sangducks@gmail.com

More Related Content

What's hot

Blockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingBlockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingihpark92
 
Blockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreBlockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreihpark92
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programmingihpark92
 
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현NAVER D2
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요NAVER D2
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발Jay JH Park
 
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Fermat Jade
 
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안GangSeok Lee
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractFermat Jade
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 Younghoon Moon
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platformJay JH Park
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화Jay JH Park
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발정석 양
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용noerror
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요? 내훈 정
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝Jay JH Park
 
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍Jay JH Park
 
242 naver-2
242 naver-2242 naver-2
242 naver-2NAVER D2
 
코어 이더리움
코어 이더리움 코어 이더리움
코어 이더리움 Jay JH Park
 

What's hot (20)

Blockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingBlockchain 3rd smart contract programming
Blockchain 3rd smart contract programming
 
Blockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreBlockchain 1st bitcoin_core
Blockchain 1st bitcoin_core
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programming
 
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발
 
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)
 
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart Contract
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platform
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝
 
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
 
242 naver-2
242 naver-2242 naver-2
242 naver-2
 
코어 이더리움
코어 이더리움 코어 이더리움
코어 이더리움
 

Viewers also liked

[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - templateSeok-joon Yun
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화Jaeseung Ha
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발주항 박
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉iFunFactory Inc.
 
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 IOCPSeungmo Koo
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git민태 김
 

Viewers also liked (8)

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
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
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
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
 

Similar to GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System

Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Kwen Won Lee
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401guest91f89d83
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성HyeonSeok Choi
 
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기zupet
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02정출 김
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안Jeongsang Baek
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기John Kim
 
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?NAVER Engineering
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍NAVER D2
 
Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10iluvs
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 

Similar to GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System (20)

Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
 
OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
 
Init to systemd
Init to systemdInit to systemd
Init to systemd
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
 
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
Ndc12 2
Ndc12 2Ndc12 2
Ndc12 2
 
Node.js at OKJSP
Node.js at OKJSPNode.js at OKJSP
Node.js at OKJSP
 

GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System

  • 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 에서 관리가 가능해진다 .
  • 24. CGCIICho sanghyun’s Game Classes II 질문 ?예외처리 질문 ? sangducks@gmail.com

Editor's Notes

  1. TLS를 사용하여 성능을 향상시킬 수 있다!! 아무리 Lock-Free라 해도 그냥 값을 복사하는 것보다는 성능이 확실히 떨어진다. 그래서 Lock의 최소화를 위해 TLS를 사용한다.