• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Send의 sendQueue.Enque와 OnSendCompleted에서의 sendQueud.Count

22.08.02 18:10 작성 조회수 167

1

안녕하세요

강의를 통해 저희가 작성한 코드에 따르면 OnSendCompleted에서 RegisterSend에서 OnCompleted함수 간의 미끼를 던지고 낚는 반복적인 관계를 탈출하는 조건은 sendQueue에 더 이상 전송할 내용이 없을 때 입니다.

하지만 Send할 내용이 산더미라 위의 미끼를 던지고 낚는 반복 행위를 탈출할 수 없다면 멀티 쓰레드 환경일 경우 하나의 쓰레드만 계속 해당 session의 send를 점유하고 있어 정상 작동을 못할 것 같은대요

이러한 상황이 강의 말미에 말씀해주신 비정상적인 상황을 탐지하여 disconnect하는 경우일까요?

일반적인 상황이어도 유저가 많거나 하는 경우? 위의 사이클을 탈출하지 못할 것 같은데 일반적 상황이라면 이러한 문제가 발생하지 않는지 궁금합니다.

감사합니다

답변 1

답변을 작성해보세요.

2

네 아주 예리한 질문입니다.
아무리 Job 방식으로 관리한다 하더라도,
한쪽이 너무 실행을 오래 잡고 있진 않도록
시간을 재서 할당량을 초과하면
다른 JobQueue을 비우러 이동하게 만들기도 합니다. (실제로 테라에서 그랬음)
물론 그럴 경우 비우다 말고 버린 JobQueue의 일감은 밀릴테고
해당 유저는 조금씩 반응속도가 늦어지는 렉을 느끼겠죠.
특히 MMO에서 500명 이상의 아주 많은 유저가 동일한 장소에 뭉치면 이런 현상이 일어날 수 있습니다.
그런데 이건 결국 MMO 태생적인 문제라 Lock 방식을 채택하든, Job 방식을 채택하든
동일하게 발생하는 문제입니다 (CPU 연산 속도가 해당 구역의 일감 처리를 못 따라가는 상황)

그 외에 패킷 recv를 할 때 트래픽량을 계산해서
너무 말도 안 되게 패킷을 쏴대는 클라는
적당히 disconnect 처리를 하는게 좋습니다.

namk님의 프로필

namk

질문자

2022.08.02

분명 사양 문제는 아닌 것 같은데 MMO 플레이시 유저가 한 장소에 몰릴 경우 버벅이던 경험이 이런 이유였을 수 있겠네요

답변 감사합니다!