더북(TheBook)

이 예시 코드를 실제로 구동하면 해당 스레드는 소켓이 would block인 상태에서는 계속해서 루프를 돕니다. 게다가 이 루프는 CPU를 쉬지 못하는 바쁜 상태로 만듭니다. 즉, CPU 코어 하나가 100% 사용량을 차지합니다. 게임 클라이언트를 만들 때는 이것이 그다지 문제가 되지 않습니다. 어차피 CPU가 쉬지 않으며 게임 업데이트와 렌더링을 담당하는 메인 스레드가 있고, 그 메인 스레드에서 이 일도 같이 하면 되기 때문입니다. 하지만 서버는 그러한 렌더링 루프가 없기 때문에 특별히 할 일이 없는 한 서버의 CPU는 최대한 놀고 있는 상태여야 합니다. 다른 일을 할 수 있는 여유를 두기 위해서입니다.

List<Socket> sockets;
 
void NonBlockSocketOperation()
{
  while (true)
  {
      foreach(s in sockets)
      {
          // 논블록 수신 ➊
          (result, data) = s.receive();
          if (data.length > 0)
          {
              print(data);
          }
          else if (result != EWOULDBLOCK)
          {
              // 소켓 오류 처리를 한다.
          }
      }
      // ➋
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.