Server

Socket 처리 방법들 : IOCP와 ASIO 방식 등등

Sweetmeats_boy 2021. 6. 20. 21:30
반응형

Winsock 관련하여 Socket을 처리하는 방법들을 여러가지가 있다. 

그중 대표적인 몆가지 방법들에 대해서 개념적으로 알아보자.

 

우선 소켓의 처리방식은 Proactor / Reactor 방식으로 구분된다.

. Proactor : 이벤트가 발생 시 특정 함수를 호출하는 방식

 -> 밑의 ASIO, IOCP 방식이 해당

. Reactor : loop를 돌면서 이벤트가 발생했는지 일일히 확인하는 방식

 -> Select , epoll 방식

 

 

Select 방식

. SingleThread 기반의 다중 I/O 처리 방법

. 송신, 수신, 예외 이벤트가 발생한 소켓들을 관리하는 3가지의 "Set"으로 구분한다.

. 각각의 Set을 매 순간 확인하여 해당 이벤트가 발생한 소켓을 목록으로 얻어온다.

. 소켓목록을 순회하며 송신, 수신, 예외에 따른 처리를 수행한다.

. 단, 최대 관리할 수 있는 소켓의 갯수는 1024개로 제한된다.

 

epoll 방식

. Select 방식의 단점을 보완한 리눅스에서 사용이 가능한 I/O 방식

. Select와 같은 동기형 통지방식을 따르며 FD_SET을 운영체제가 직접 관리한다.

. non blocking, blocking을 설정이 가능하다.

 

IOCP 방식

. c++ 게임 서버 개발자라면 필히 공부해야 하는 것.

. In/Out Completion  Port의 약자

. 기본적으로 Overlapped I/O Callback 방식을 따른다.

. IOCP 내부의 Thread Pool을 사용하여 소켓의 송수신을 관리한다.

. 따라서 적은 수의 Thread 로 소켓관리가 가능하며, 별도의 Thread 생성, 제거를 할 필요가 없음.

 -> Callback 함수들을 해당 Thread들을 통해 호출한다.

 . 주의할 점으론 I/O가 완료된 Overllaped 구조체에 접근해야 한다는 것이다.

 -> I/O 가 미완료된 Handle에 접근하면 안됨.

 

ASIO 방식

. Boost lib에 존재하는 방식.

. 아마도 C++ 20에 들어갈 예정이라고 한다...

. Asynchronous IO의 약자.

반응형