인프런 커뮤니티 질문&답변
서버 흐름에 있어서 궁금한점이 있습니다
해결된 질문
작성
·
478
0
안녕하세요 SendBuffer까지 따라 해보고
전체적인 흐름을 그려보는 도중 궁금한 점이 생겨 질문드리게 되었습니다.
Listener 소켓에서 OnAcceptCompleted 함수의 마지막에서 다시 등록(RegisterAccept)을 해주는데요.
이 부분에 무한 루프를 넣어서 다시 등록하는 과정을 거치지 않도록 해보았습니다.
따라서 더미 클라이언트 한 명이 OnAcceptCompleted에서 RegisterAccept를 호출하지 못하기 때문에
더미 클라이언트를 하나 더 실행했을 때 동시 접속이 안되어야 할 것 같은데 접속이 되더군요.
질문1) 위와 같은 상황은 _listenerSocket.Listen 때문이 맞나요? 이 부분을 1로 수정하니 정상적으로 동시 접속이 안되더군요.
질문2) 만약 맞다면 Listen 함수를 통해 동시 접속자 수를 컨트롤하나요?
질문3) Listen(10)을 넣어 10명의 동시 접속자가 있다면 최소 필요 쓰레드의 수는 10개인가요? 즉, 쓰레드의 최소 필요 개수 = 접속자 수 = 세션 수 인가요?
질문4) 윗 내용이 맞다면 많은 수의 쓰레드가 존재하여도 문제없나요?(예를들어 동시접속자가 1000명이라면 최소 1000쓰레드 이상)
읽어주셔서 감사합니다.
답변 1
1
질문1) 위와 같은 상황은 _listenerSocket.Listen 때문이 맞나요? 이 부분을 1로 수정하니 정상적으로 동시 접속이 안되더군요.
네 Listen 걸어놓은 횟수에 연관이 있습니다.
질문2) 만약 맞다면 Listen 함수를 통해 동시 접속자 수를 컨트롤하나요?
동시 접속자 수라기 보다는 [거~의 동시에] 입장할 수 있는 접속자와 연관이 있습니다.
서버가 오픈하자 마자 유저들이 막 몰리는 상황이라면,
일부 유저는 접속을 실패하겠죠.
질문3) Listen(10)을 넣어 10명의 동시 접속자가 있다면 최소 필요 쓰레드의 수는 10개인가요? 즉, 쓰레드의 최소 필요 개수 = 접속자 수 = 세션 수 인가요?
아닙니다.
질문4) 윗 내용이 맞다면 많은 수의 쓰레드가 존재하여도 문제없나요?(예를들어 동시접속자가 1000명이라면 최소 1000쓰레드 이상)
동접 = Listen 수가 아닙니다.
Listen 걸어준 개수는 안내를 하는 직원 수라고 생각하시면 됩니다.
식당에서 100명 입장한다고 직원이 100명일 필요는 없죠.
그렇다고 안내원이 1명이라면, 손님이 한 번에 100명 입장하는 상황에서 곤란하긴 할겁니다.






1) 비동기 함수들 중에서 하드웨어를 다루는 (네트워크, 파일 입출력 등) 애들은
유저 레벨에서 처리가 불가능하고 커널 모드로 가서 처리 해야 합니다.
따라서 문맥 교환은 필연적으로 일어납니다.
비동기 함수 = Task는 아니고,
Task가 혼동되신다면 그냥 잊으시고 모든걸 쓰레드 단위로 생각하시고,
Task는 내부적으로 특정 쓰레드에 의해 실행되는 일감 정도로 이해하면 됩니다.
그리고 운영체제 관련 이론서를 하나 보시면 도움이 됩니다.
2) 쓰레드입니다