UDP 소켓의 송신 버퍼에 1바이트라도 비어 있으면 I/O 가능입니다. 그런데 보내려는 데이터가 5바이트인데 송신 버퍼 빈 공간이 1바이트라면, 넣을 수 있는 크기를 넘어섭니다. TCP와 달리 UDP는 일부만 보낼 수 없으므로 would block이 발생합니다. ‘헛발질’이 발생한 셈입니다. I/O 가능이라 재시도는 했는데, 여전히 would block입니다. 이 상태로라면 UDP send()를 하지 못한 채 계속 헛발질만 반복합니다. 이는 결국 CPU 낭비로 이어집니다.
논블록 소켓은 소켓 함수 내부의 데이터 복사 부하라는 또 다른 단점이 있습니다.
소켓 송수신 함수에 들어가는 데이터 블록 인자를 성공적으로 실행하면 다음과 같이 메모리 복사 연산이 발생합니다.
▲ 그림 3-16 메모리 복사 연산 발생