3.6 논블록 소켓
지금까지 소켓을 이용해서 네트워크 데이터를 송신하거나 수신하는 과정을 살펴보았습니다. 지금까지 알아본 것은 블로킹 소켓입니다.
일대일 네트워킹 프로그램을 개발할 때는 지금까지 알아본 방법으로 개발을 해도 별 문제가 없습니다. 그러나 네트워킹을 해야 하는 대상이 여럿이라면 어떻게 할까요?
가장 먼저 생각나는 방법은 네트워킹 대상 개수만큼 스레드를 만드는 것입니다. 그리고 각 스레드는 각각의 네트워킹 대상과 데이터를 주고받으면 됩니다.
네트워킹 대상이 많지 않을 때는 별 문제가 없습니다. 그러나 수백 개, 수천 개라면 어떻게 될까요? 스레드 개수가 1000개면 각 스레드가 차지하는 호출 스택이 1메가바이트씩이므로 총 1기가바이트가 필요합니다. 게다가 각 스레드가 데이터 송수신 처리를 하려면 번번히 자다 깨다 할 텐데, 이 과정에서 스레드 간에 컨텍스트 스위치가 대량 발생합니다. 결국 자원 낭비로 이어집니다.
다음 예시 코드는 블로킹 소켓을 갖고 데이터를 보냅니다.
void BlockSocketOperation() { s = socket(TCP); ...; s.connect(...); ...; while (true) { s.send(data); } }