yeolyi.com성열의 컴퓨터공학

캐시

CPU와 메모리 사이에는 수백 배의 속도 차이가 있어 CPU가 아무리 빨라도 메모리를 기다리는 시간이 병목이 됩니다. 다행히 프로그램은 메모리 전체를 골고루 쓰지 않고 특정 영역에 몰려 접근합니다. 그렇다면 자주 쓰는 데이터를 CPU 가까이에 두는 작고 빠른 저장소를 만들면 어떨까요?

캐시

캐시(cache)는 CPU와 RAM 사이에 위치한 소용량 고속 메모리입니다. CPU가 데이터를 요청하면 먼저 캐시를 확인합니다.

메모리 주소, 눌러서 접근
캐시
····
RAM
모든 주소 보유

다음 순서대로 조작해봅시다:

  1. 메모리 주소를 하나 클릭합니다. 처음에는 캐시가 비어 있으니 미스가 발생합니다.
  2. 같은 주소를 다시 클릭합니다. 이번에는 캐시에 있으므로 히트가 발생합니다.
  3. 서로 다른 주소를 5개 이상 클릭합니다. 캐시가 4칸뿐이라 가장 오래전에 접근한 데이터가 밀려납니다.

캐시가 가득 차면 가장 오래전에 사용된 데이터를 내보내고 새 데이터를 넣습니다. 전체 접근 중 히트의 비율을 적중률(hit rate)이라 합니다. 적중률이 높을수록 CPU가 RAM을 기다리는 시간이 줄어듭니다.

그렇다면 지역성이 있는 패턴과 없는 패턴은 적중률이 얼마나 다를까요?

지역성과 적중률

캐시 크기가 4인 상황에서 두 패턴을 비교해 봅시다.

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
히트미스
적중률 -%
  1. “순차 접근” 버튼을 누릅니다. 0-3을 두 번 반복하고 4-7을 두 번 반복하는 패턴입니다. 두 번째 반복부터 히트가 발생하며 적중률이 높습니다.
  2. “랜덤 접근” 버튼을 누릅니다. 같은 횟수지만 무작위 주소에 접근합니다. 적중률이 크게 떨어집니다. 여러 번 눌러서 비교해 봅시다.

캐시가 효과적인 이유는 지역성 덕분입니다. 프로그램이 데이터에 접근하는 패턴에 지역성이 있기 때문에, 작은 캐시만으로도 높은 적중률을 달성할 수 있습니다. 랜덤 접근처럼 지역성이 없으면 캐시의 효과는 사라집니다.

그런데 캐시를 크게 만들면 속도가 느려집니다. 크기와 속도를 동시에 만족시킬 수 없으니, 단계를 나누면 어떨까요? 다음 글에서 살펴봅시다.