작성
·
462
0
강의 잘 듣고 있습니다. 항상 좋은 강의 감사합니다.
게임 클라이언트 프로그래머를 목표로 준비하고 있는 취준생입니다. 근래 업계에서 풀스택 혹은 클라이언트 작업을 진행하면서도 서버 쪽 기초 지식을 보유하고 있는 개발자를 높이 평가하고 있다고 느껴 서버 강의도 수강하게 되었습니다.
지금까지 포폴을 준비하면서 동기 방식 혹은 비동기 방식을 구성할 때는 코루틴으로만 코드를 작성했다보니 비동기(Async) 방식을 보면서 좀 헷갈리는 부분들이 있어 복습하면서 정리해봤는데 정리한 개념이 맞는지 궁금해서 질문 남겨봅니다.
질문으로는
일단 Async로 구현한 이유는 강사님께서 중간에 설명해주신 일반 Send와 Receive 함수는 블로킹 계열이라 흐름을 막는다는 점 때문에 사용한 것으로 이해했습니다. 이 때 Resister(Send/Recv) 와 On(Send/Recv)Completed를 순환적으로 구성하여 작성한 이유가 쓰레드 환경에서 쓰레드가 하던 일을 교체할 때(Context Switching) 야기하는 오버헤드(교체할 때 발생하는 비용)를 감소하여 효율을 높이기 위해 일거리가 남아있다면 계속 그 일을 잡게하기 위한 작업이 맞는건가요 ?
저렇게 순환적으로 구성했을 때 혹시 한 쓰레드만 해당 작업을 진행하게 되어 오히려 효율적으로 떨어질 수도 있을 것 같다는 생각을 하게 되었는데, 유저수가 많은 MMORPG 서버에서도 저런식으로 작업을 진행하는지 궁금합니다.
답변 1
0
사실 블로킹vs논블로킹과 동기vs비동기는 살짝 다른 얘기지만, 뭐 기본적으로 블로킹+동기 vs 논블로킹+비동기 조합이라 가정하고 말씀을 드리자면. 게임을 만들 때 블로킹 함수를 이용하면 이벤트가 완료되기 전까지는 함수가 리턴을 하지 않아 게임이 먹통이 됩니다. Async 계열의 함수를 이용하면 논블로킹+비동기 방식으로 처리가 되고 추후 IO 이벤트가 완료가 되면 통지 (콜백 함수를 통해)가 오게 됩니다. Context Switching의 문제가 아니라 순전히 함수가 막히는 문제 때문입니다.
그렇지는 않구요. 애당초 Thread Pool에서 쓰레드 하나를 깨워서 작업하게 되어 있고 C++ 서버라고 해도 비슷하게 WorkerThread를 만들어서 작업을 하게 됩니다. (즉 한 쓰레드만 개입하지 않습니다)
이해 됐습니다. 답변 감사합니다!