인프런 커뮤니티 질문&답변

공부해보자님의 프로필 이미지
공부해보자

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

PacketSession

서버 흐름에 관하여 질문있습니다

해결된 질문

작성

·

261

1

안녕하세요 서버 흐름을 정리하다가 궁금한점이 생겨 질문드리게 되었습니다.

제가 정리한 바로는

1. Server프로젝트의 Program에서 Listener를 Init(주체 : main thread)

2. Listener Init 내부에서 AcceptAsync를 호출하고 Program의 무한루프 실행(주체 : main thread)

3. AcceptAsync가 완료되면 OnAcceptCompleted실행(주체 : AcceptAsync로 부터 나온 쓰레드 = a쓰레드)

4. OnAcceptCompleted 내부에서 Session 생성 및 해당 Session의 Start함수 호출(주체 : a쓰레드)

5. Start함수 내부에서 RegisterRecv함수 호출(주체 : a쓰레드)

6. RegisterRecv 내부에서 ReceiveAsync 호출(주체 : a 쓰레드)

7. OnConnected 및 RegisterAccept호출(주체 : a쓰레드)

8. ReceiveAsync는 클라이언트로부터 요청기다림(주체 : ReceiveAsync로 부터 나온 쓰레드 = b쓰레드)

이후 과정은 생략...

반복...

질문1 ) 위와 같은 과정이라고 정리했는데 맞나요?

질문2 ) 맞다면 각 세션(소켓)마다 Receive를 위한 쓰레드가 배정되어 있나요?(7,8번 과정의 반복의 결과)(세션 수 = Receive 쓰레드 수)

질문3 ) 찾아보니 Async는 쓰레드 풀을 이용하는 것 같은데 세션마다 Receive를 하기 위해 생성된 쓰레드가 요청 대기 중이고 풀에 돌아오지 못한 상태에서 접속자 수가 많아지면 쓰레드 풀(인력)이 부족해져 서버가 멈출 수 있나요?

전체적인 흐름에 대해서 질문드리다 보니 앞에서 배웠던 내용들을 합치는 과정에서 궁금한 점이 생겨 계속 비슷한 개념 내용으로 질문을 드리네요... 죄송합니다...

읽어주셔서 감사합니다!

답변 3

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

상황에 따라 다르고 현재 ThreadPool에 남은 쓰레드 상황에 따라 다르게 동작하기 때문에,
정확히 알 수 없습니다.

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1)
네 흐름을 잘 이해하셨습니다.

2)
Receive를 위한 '쓰레드'가 따로 배정되는 것은 아니구요.
비동기 IO 입출력 (ex. 네트워크 패킷 전송) 함수를 호출하면, 
운영체제 (커널)가 그 다음부터 관리를 해주게 됩니다.
우리가 요청한 일이 완료되면 커널이 우리한테 통지를 해주는데,
이 때 쓰레드 풀에 있는 쓰레드를 이용해서 실행해주는 것입니다.

요리사한테 요리를 해달라고 주문을 넣을 때

1주문 할때마다 1직원 고용하는 것은 아니겠죠.
요리가 끝나면, 요리사가 어떤 직원을 통해 우리한테 요리를 전달할텐데
그런 흐름이 생각하시면 됩니다.

참고로 언어에 따라, 함수에 따라 Polling 방식으로 비동기 입출력이 끝났는지를

유저 레벨에서 체크를 해야 하는 경우도 있습니다. (C++에서의 select 방식 등)

3)
2에서 말씀드린대로 AsyncReceive를 할때마다 쓰레드가 늘어나지는 않아 상관 없습니다.

0

답변 감사합니다. 덕분에 거의 다 이해가 되었습니다.

그렇다면  _listenerSocket.Listen(5); 로 설정하고

만약 순차적이 아닌

거의 동시에 5명이 접속을 시도하고 거의 동시에 5명 모두가 완료했을 경우에는

쓰레드 5개가 OnAcceptCompleted를 실행하나요? 

아니면 이 경우에도 한 쓰레드가 순차적으로 처리하나요?

순차적으로 처리한다면 앞사람이 접속이 지연되면 뒷사람들은 접속이 안되나요?

아니면 쓰레드풀의 쉬고있는 쓰레드 수에 따라 달라지나요?

공부해보자님의 프로필 이미지
공부해보자

작성한 질문수

질문하기