CPU와 메모리 사이에는 수백 배의 속도 차이가 있어 CPU가 아무리 빨라도 메모리를 기다리는 시간이 병목이 됩니다. 다행히 프로그램은 메모리 전체를 골고루 쓰지 않고 특정 영역에 몰려 접근합니다. 그렇다면 자주 쓰는 데이터를 CPU 가까이에 두는 작고 빠른 저장소를 만들면 어떨까요?
캐시(cache)는 CPU와 RAM 사이에 위치한 소용량 고속 메모리입니다. CPU가 데이터를 요청하면 먼저 캐시를 확인합니다.
다음 순서대로 조작해봅시다:
캐시가 가득 차면 가장 오래전에 사용된 데이터를 내보내고 새 데이터를 넣습니다. 전체 접근 중 히트의 비율을 적중률(hit rate)이라 합니다. 적중률이 높을수록 CPU가 RAM을 기다리는 시간이 줄어듭니다.
그렇다면 지역성이 있는 패턴과 없는 패턴은 적중률이 얼마나 다를까요?
캐시 크기가 4인 상황에서 두 패턴을 비교해 봅시다.
캐시가 효과적인 이유는 지역성 덕분입니다. 프로그램이 데이터에 접근하는 패턴에 지역성이 있기 때문에, 작은 캐시만으로도 높은 적중률을 달성할 수 있습니다. 랜덤 접근처럼 지역성이 없으면 캐시의 효과는 사라집니다.
그런데 캐시를 크게 만들면 속도가 느려집니다. 크기와 속도를 동시에 만족시킬 수 없으니, 단계를 나누면 어떨까요? 다음 글에서 살펴봅시다.