서버 프로그래밍

boost asio io_service(io_context)의 poll과 run의 활용

하늘흐늘 2021. 10. 27. 11:53
반응형

boost asio io_service(io_context)를 통하여 이벤트를 호출하는 방식은 크게 poll과 run으로 나눈다고 할 수 있습니다. 간단히 두 방식을 살펴보면 아래와 같습니다.
poll은 이름 그대로 poll방식으로 이전 poll 호출 후 쌓인 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽에 넘깁니다. 
run은 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽으로 넘기지 않고 다음 이벤트를 기다립니다. poll로 run을 구현한다고 한다면 아마 아래와 같은 코드가 될 것입니다.

while(true)
{
	poll();
}

서버에 연결하는 클라이언트에서 사용된다면 아마도 poll이 좋은 선택이 될 것입니다. 문제는 서버와 같은 경우는 이 두가지 중 어느 방식을 사용할지는 서버 처리 특성에 따라 달라질 것입니다.
일반적으로 단순히 패킷을 받아 처리하고 리턴하는 DB서버나 웹서버와 같은 형태라면 run() 방식으로 socket 이벤트를 받을 때 처리하고 다음 패킷을 기다리는 형태가 좋을 것입니다. 
만약 패킷처리 외에도 주기적으로 몬스터 A.I등을 처리하는 MMORPG 서버와 같은 경우는 poll 방식으로 socket의 이벤트를 처리하고 이벤트 처리 후에 몬스터 A.I등을 처리하는 형태가 좋을 것입니다.
슈도 코드로 본다면 아래와 같은 형태가 될 것입니다.

while(true)
{
	poll();			// socket event
	game_logic();	// game logic such as Monster A.I
}

추가적으로 poll이나 run과 관련하여 한번의 이벤트만 실행하거나 일정 시간만 실행하는 등 파생적인 여러 함수들이 있습니다. 이런 파생 함수들을 활용하면, poll() 이벤트와 같은 경우, 순간적으로 너무 많은 socket이벤트를 처리하여 이벤트 외의 로직이 처리되는 시간이 지연되는 것을 방지할 수 있습니다.
관련 함수들이 필요하면 boost asio io_service(io_context)의 공식 문서를 확인하면 됩니다.

반응형