작성
·
482
0
제가 이해한 바로는 receiveasync를 쓰게 되면 쓰레드풀에서 쓰레드를 하나 끌어와서 그 안에서 루프를 돌면서 데이터가 오는지 안오는지 체크하다가 온게 확인되면 args.Completed 를 invoke 시켜준다고 이해했는데요.
그럼 만약에 동접 10000명이 있는데 이들이 처음에 소켓에 연결하고 receiveasync 함수를 호출하면 쓰레드가 10000개가 생성되는 것 아닌가요?
그리고 만약 이 10000명이 send를 보내주기 전까지는 각각의 10000개의 쓰레드가 루프 안에서 블락되어 있는 상태 아닌가요?
답변 3
2
그럼 예를 들어서 한명의 클라이언트만 존재한다고 했을 때 맨 처음 코드부터 receiveasync코드를 호출하고 또 더 나아가서 실제로 recv가 완료되기 전까지는 메인쓰레드 하나만 진행되고 있다가 recv가 완료되면 그 때 쓰레드풀에서 쓰레드가 잠깐 개입해서 args.Completed를 invoke 해주고 빠져주는 건가요??
-> 네 그렇습니다.
근데 궁금한 것은 어떻게 메인쓰레드 혼자 로직을 진행하고 있는데 중간에 어떤 일이 완료된 것에 대해서 알림을 받을 수 있는 건가요?? 그게 따로 쓰레드로 빼서 처리되고 있던 것도 아닌데...
혹시 ReceiveAsync함수가 내부적으로 어떻게 돌아가는지 알 수 있는 방법이 없나요??
-> 운영체제가 해줍니다. 메인쓰레드 혼자 로직을 실행한다고는 하나
주기적으로 커널 모드로 돌아가서 Windows 운영체제가 관리를 해주고 있죠.
2
제가 이해한 바로는 receiveasync를 쓰게 되면 쓰레드풀에서 쓰레드를 하나 끌어와서 그 안에서 루프를 돌면서 데이터가 오는지 안오는지 체크하다가 온게 확인되면 args.Completed 를 invoke 시켜준다고 이해했는데요.
-> 그게 아니고 실제 recv가 실제로 완료되면, 그 때 쓰레드풀에서 쓰레드가 개입해서 args.Completed를 invoke합니다. 경우에 따라 바로 완료되면 (pending == false) 그냥 이어서 처리를 해야 하구요.
그럼 만약에 동접 10000명이 있는데 이들이 처음에 소켓에 연결하고 receiveasync 함수를 호출하면 쓰레드가 10000개가 생성되는 것 아닌가요?
-> 아닙니다.
그리고 만약 이 10000명이 send를 보내주기 전까지는 각각의 10000개의 쓰레드가 루프 안에서 블락되어 있는 상태 아닌가요?
-> 아닙니다. 블락된건 Blocking 계열 함수고 Async는 비동기라서 예약을 하고 완료 통지를 따로 받는 겁니다.
0
그럼 예를 들어서 한명의 클라이언트만 존재한다고 했을 때 맨 처음 코드부터 receiveasync코드를 호출하고 또 더 나아가서 실제로 recv가 완료되기 전까지는 메인쓰레드 하나만 진행되고 있다가 recv가 완료되면 그 때 쓰레드풀에서 쓰레드가 잠깐 개입해서 args.Completed를 invoke 해주고 빠져주는 건가요??
근데 궁금한 것은 어떻게 메인쓰레드 혼자 로직을 진행하고 있는데 중간에 어떤 일이 완료된 것에 대해서 알림을 받을 수 있는 건가요?? 그게 따로 쓰레드로 빼서 처리되고 있던 것도 아닌데...
혹시 ReceiveAsync함수가 내부적으로 어떻게 돌아가는지 알 수 있는 방법이 없나요??