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

shef님의 프로필 이미지
shef

작성한 질문수

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

Session #1

receiveasync 질문입니다.

작성

·

482

0

제가 이해한 바로는 receiveasync를 쓰게 되면 쓰레드풀에서 쓰레드를 하나 끌어와서 그 안에서 루프를 돌면서 데이터가 오는지 안오는지 체크하다가 온게 확인되면 args.Completed 를 invoke 시켜준다고 이해했는데요.

그럼 만약에 동접 10000명이 있는데 이들이 처음에 소켓에 연결하고 receiveasync 함수를 호출하면 쓰레드가 10000개가 생성되는 것 아닌가요?

그리고 만약 이 10000명이 send를 보내주기 전까지는 각각의 10000개의 쓰레드가 루프 안에서 블락되어 있는 상태 아닌가요?

답변 3

2

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

그럼 예를 들어서 한명의 클라이언트만 존재한다고 했을 때 맨 처음 코드부터 receiveasync코드를 호출하고 또 더 나아가서 실제로 recv가 완료되기 전까지는 메인쓰레드 하나만 진행되고 있다가 recv가 완료되면 그 때 쓰레드풀에서 쓰레드가 잠깐 개입해서 args.Completed를 invoke 해주고 빠져주는 건가요??

-> 네 그렇습니다.

근데 궁금한 것은 어떻게 메인쓰레드 혼자 로직을 진행하고 있는데 중간에 어떤 일이 완료된 것에 대해서 알림을 받을 수 있는 건가요?? 그게 따로 쓰레드로 빼서 처리되고 있던 것도 아닌데...
혹시 ReceiveAsync함수가 내부적으로 어떻게 돌아가는지 알 수 있는 방법이 없나요??

-> 운영체제가 해줍니다. 메인쓰레드 혼자 로직을 실행한다고는 하나
주기적으로 커널 모드로 돌아가서 Windows 운영체제가 관리를 해주고 있죠.

2

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

제가 이해한 바로는 receiveasync를 쓰게 되면 쓰레드풀에서 쓰레드를 하나 끌어와서 그 안에서 루프를 돌면서 데이터가 오는지 안오는지 체크하다가 온게 확인되면 args.Completed 를 invoke 시켜준다고 이해했는데요.

-> 그게 아니고 실제 recv가 실제로 완료되면, 그 때 쓰레드풀에서 쓰레드가 개입해서 args.Completed를 invoke합니다. 경우에 따라 바로 완료되면 (pending == false) 그냥 이어서 처리를 해야 하구요.

그럼 만약에 동접 10000명이 있는데 이들이 처음에 소켓에 연결하고 receiveasync 함수를 호출하면 쓰레드가 10000개가 생성되는 것 아닌가요?

-> 아닙니다.

그리고 만약 이 10000명이 send를 보내주기 전까지는 각각의 10000개의 쓰레드가 루프 안에서 블락되어 있는 상태 아닌가요?


-> 아닙니다. 블락된건 Blocking 계열 함수고 Async는 비동기라서 예약을 하고 완료 통지를 따로 받는 겁니다.

0

shef님의 프로필 이미지
shef
질문자

그럼 예를 들어서 한명의 클라이언트만 존재한다고 했을 때 맨 처음 코드부터 receiveasync코드를 호출하고 또 더 나아가서 실제로 recv가 완료되기 전까지는 메인쓰레드 하나만 진행되고 있다가 recv가 완료되면 그 때 쓰레드풀에서 쓰레드가 잠깐 개입해서 args.Completed를 invoke 해주고 빠져주는 건가요??
근데 궁금한 것은 어떻게 메인쓰레드 혼자 로직을 진행하고 있는데 중간에 어떤 일이 완료된 것에 대해서 알림을 받을 수 있는 건가요?? 그게 따로 쓰레드로 빼서 처리되고 있던 것도 아닌데...
혹시 ReceiveAsync함수가 내부적으로 어떻게 돌아가는지 알 수 있는 방법이 없나요??

shef님의 프로필 이미지
shef

작성한 질문수

질문하기