컴퓨터 내부를 들여다보면 아주 빠른 CPU와 상대적으로 느린 RAM이 있습니다. 이 둘 사이의 속도 차이를 그대로 두면 문제가 생깁니다. CPU는 이미 계산할 준비를 마쳤는데도 데이터를 받지 못해 기다려야 하기 때문입니다. 이럴 때 필요한 것이 바로 캐시 메모리(Cache Memory)입니다.
캐시는 CPU와 RAM 사이에 놓인 완충 지대라고 볼 수 있습니다. 자주 쓰일 것 같은 데이터를 미리 가까운 곳에 저장해 두는 역할을 하죠. 덕분에 CPU가 멈춰 서지 않고 계속해서 연산을 수행할 수 있게 도와줍니다.
캐시가 똑똑하게 동작하는 원리
처음에는 어떻게 미래에 쓸 데이터를 미리 알 수 있는지 궁금하실 겁니다. 그 비결은 지역성(locality)이라는 성질에 있습니다. 프로그래머가 작성하는 코드에는 데이터 사용에 관한 일정한 패턴이 존재합니다.

캐시는 이러한 경험적 원리를 이용하여 효율을 높입니다. 무작위로 데이터를 저장하는 것이 아니라 규칙에 따라 움직이는 것이죠. 이 원리를 이해하면 성능 최적화에 대한 감각을 키울 수 있습니다.
시간 지역성, 방금 쓴 데이터 다시 쓰기
지역성에는 크게 두 가지 종류가 있습니다. 먼저 시간 지역성(temporal locality)에 대해 이야기해 보겠습니다. 이는 방금 사용한 데이터가 가까운 미래에 다시 사용될 가능성이 높다는 원리입니다.
게임 안에서 플레이어의 위치를 계산하는 상황을 떠올려 보세요. 위치 정보는 매 프레임마다 반복해서 필요합니다. 캐시는 이렇게 방금 쓰인 데이터를 기억해 두었다가 CPU가 다시 찾을 때 즉시 건네줍니다.
공간 지역성, 주변 데이터도 함께 챙기기
또 다른 하나는 공간 지역성(spatial locality)입니다. 어떤 데이터를 사용했다면 그 주변에 있는 데이터도 곧 필요해질 거라는 생각입니다. 배열을 순서대로 처리하는 경우를 예로 들면 이해가 쉽습니다.
첫 번째 칸을 읽었다면 바로 다음 칸을 읽을 확률이 매우 높습니다. 그래서 캐시는 요청받은 데이터 하나만 가져오지 않습니다. 그 주변의 데이터 덩어리까지 함께 가져와서 저장해 둡니다.
캐시 미스가 발생하면 생기는 일
하지만 필요한 데이터가 캐시에 없을 때도 있습니다. 이를 캐시 미스(cache miss)라고 부르는데 성능에 큰 영향을 줍니다. 이때 CPU는 어쩔 수 없이 느린 RAM까지 직접 다녀와야 합니다.
RAM에 다녀오는 시간은 캐시를 조회하는 시간보다 훨씬 오래 걸립니다. 게임처럼 빠른 반응이 필요한 시스템에서는 이런 지연이 치명적입니다. 캐시 미스가 반복되면 화면이 끊기는 프레임 드랍 현상으로 이어질 수도 있습니다.
좋은 성능을 위한 데이터 배치 전략
그래서 캐시는 있어도 그만 없으면 아쉬운 부품 정도가 아닙니다. 여러분이 설계한 데이터 배치가 성능을 좌우하는 결정적인 요인이 되기 때문입니다. 프로그래머들이 데이터 배치를 고민하는 이유가 바로 여기에 있습니다.
캐시의 동작 원리를 알면 왜 어떤 코드는 빠르고 어떤 코드는 느린지 이해하게 됩니다. 이를 바탕으로 캐시 친화적인 코드를 작성해 보세요. 여러분의 프로그램이 한 단계 더 빨라지는 경험을 하게 될 겁니다.