1.3.2 어떤 긴 처리를 진행하는 동안 다른 짧은 일을 처리해야 할 때
게임 서버 개발에서도 이 경우가 필요할 때가 있습니다. 플레이어 정보를 읽거나 쓰려고 디스크를 액세스하는 경우입니다. 디스크를 액세스하는 스레드는 디스크의 처리 결과가 끝날 때까지 기다려야 하는데, 이 시간 동안 CPU는 놉니다.3 이 노는 시간을 다른 플레이어에게 분배하면 서버의 실행 성능을 개선할 수 있습니다.
플레이어 정보를 디스크에 기록하는 시간은 1만분의 1초 정도입니다. 매우 짧은 시간이지만, 상용 게임 서버 입장에서는 엄청난 시간 낭비입니다.
디스크는 모터로 구성된 기계 장치입니다. 따라서 전자 회로보다 일을 훨씬 느리게 합니다. 물론 최근에는 SSD 디스크를 많이 사용하지만, SSD라고 해도 하드디스크보다 상대적으로 빠를 뿐 RAM이나 CPU 안의 캐시(cache) 메모리와 비교했을 때는 훨씬 느립니다.
하드디스크에 플레이어 정보를 액세스하는 데 1만분의 1초라는 의미는 그 처리를 하는 데 1초에 1만 번 이상은 할 수 없다는 것입니다. 일인칭 슈팅(First-Person Shooter, FPS) 게임은 클라이언트 하나에 초당 30번의 요청을 처리해야 합니다. 이러한 클라이언트가 서버 기기에 1만 개 접속한다고 생각해 보세요. 이 서버는 초당 30 * 10,000 = 30만 번의 처리를 해야 합니다.
서비스를 오픈한 직후 플레이어들이 순식간에 우르르 게임에 접속한다면 어떻게 될까요? 즉, 1만분의 1초가 걸리는 일이 엄청나게 몰리는 상황입니다. 최악의 경우 30만 번을 처리해야 할 서버가 초당 1만 번밖에 처리하지 못하는 상황까지 이릅니다.
따라서 1만분의 1초라는 매우 긴 시간을 효율적으로 활용하려면 멀티스레딩을 하든지 비동기 프로그래밍을 해야 합니다(비동기 프로그래밍은 뒤에서 다시 설명하겠습니다).
3 뒤에서 설명하겠지만, 대부분 게임에서는 서버 기기 자체가 가진 파일에 플레이어 정보를 저장하지 않습니다. 그 대신 다른 기기에 있는 데이터베이스에 정보를 저장합니다.