더북(TheBook)

3.6 블로킹 I/O와 논블로킹 I/O

 

소켓 관련 함수는 대부분 블로킹(blocking) 호출이다. 받을 데이터가 없을 때 스레드가 블로킹되어 데이터가 수신될 때까지 기다려야 한다. send(), accept(), connect() 함수 모두 블로킹 호출이다. 메인 스레드에서 패킷을 처리하려 한다면 이는 바람직하지 않다. 게임과 같은 실시간 응용프로그램에서 이렇게 블로킹되는 호출은 문제를 야기하는데, 프레임 레이트를 유지한 채로 네트워크를 처리할 수 없기 때문이다. 다섯 클라이언트가 TCP로 접속된 게임 서버를 상상해 보자. 서버가 소켓 중 하나에 recv()를 호출하고 해당 클라이언트가 새로 데이터를 보냈는지 체크하려면, 서버 스레드는 클라이언트가 진짜로 데이터를 보내기 전까지 멈추어 있어야 한다. 그동안 다른 소켓을 검사할 수도 없고, 리스닝 소켓에서 연결을 받을 수도 없으며, 게임 시뮬레이션을 진행할 수도 없다. 게임 서버가 이런 식이어서는 곤란할 것이다. 다행히도 세 가지 방법으로 이 문제를 해결할 수 있다. 바로 멀티스레딩, 논블로킹 I/O, select() 함수가 그것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.