더북(TheBook)

왼쪽 서버에서 오른쪽 서버로 메시지를 보내면, 우리가 할 일은 그저 소켓의 송신 함수(send() 또는 sendTo())를 호출하는 것뿐입니다. 우리는 편하게 소켓 함수를 한 번 호출했을 뿐이지만, 이 단순한 함수를 위해서 서버의 운영체제는 많은 일을 합니다.

소켓의 send() 함수 호출은 운영체제의 파일 시스템에 할 작업을 추가하는 것으로 이어집니다. 운영체제는 이 일을 처리하는 과정에서 파일 시스템, 네트워크 드라이버를 거쳐 장치에 명령을 내리는데, 이 과정에서 기계어 명령어 수천 개가 운영체제 안에서 실행됩니다.

이 과정을 거친 후에는 네트워크 기기에 데이터가 전송됩니다. 네트워크 기기는 결국 펌웨어 소프트웨어와 하드웨어로 구성된 컴퓨터입니다. 여기에서도 필요한 처리, 예를 들어 패킷이 어디로 가야 하는지를 판단하여 송출할 단자를 찾는 과정이 이루어집니다.

그리고 최종적으로 오른쪽 서버에서는 네트워크 하드웨어를 이용하여 패킷을 받을 것입니다. 반응 패킷은 운영체제의 네트워크 드라이버, 파일 시스템을 거칩니다. 이 과정에서도 왼쪽 서버처럼 기계어 명령어 수천 개가 운영체제 안에서 실행됩니다. 그러고 나서 게임 서버 프로세스가 메시지를 받아 처리하기 시작합니다. 소켓의 수신 함수(recv 또는 recvfrom 호출하기 혹은 WSARecv 또는 WSARecvFrom을 호출한 것에 대한 I/O Completion 이벤트)를 써서 말이죠.

여기서 주목할 것은 양쪽 서버 안에서 운영체제가 처리하는 양입니다. 몬스터 사냥 로직은 비교 연산, 산술 연산, 메모리 데이터 읽기, 쓰기 연산 몇 개로 구성된 간단한 로직입니다. 기계어 명령어 개수로 환산하면 수십~수백 개에 불과합니다.

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