CPU는 프로그램 실행 과정에서 빈번히 메모리에 접근해야만 합니다. 하지만 CPU가 메모리에 접근하는 속도는 CPU가 레지스터에 접근하는 속도보다 느리기 때문에 CPU의 연산 속도가 아무리 빨라도 메모리에 접근하는 속도가 느리면 CPU의 빠른 연산 속도는 아무 효용이 없습니다. 그래서 등장한 것이 캐시 메모리입니다.

Cache Memory

캐시 메모리는 CPU의 연산 속도와 메모리 접근 속도의 차이를 줄이기 위한 SRAM 기반의 메모리이며, CPU와 메모리 사이에 위치합니다.

CPU가 매번 메모리에 왔다 갔다하는 시간이 오래걸리므로 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가져와 활용합니다.

Cache Memory 종류

컴퓨터 내부에는 여러 캐시 메모리가 있습니다. 이중 가장 가까운 캐시 메모리를 L1캐시(Level 1 Cache), 그 다음으로 가까운 캐시 메모리를 L2캐시(Level 2 Cache), 그 다음으로 가까운 L3캐시(Level 3 Cache)가 있습니다.

  • 일반적으로 L1 & L2 Cache 는 CPU 코어 내부에, L3 Cache 는 CPU 코어 외부에 위치합니다.
  • 캐시 메모리의 크기는 L1 < L2 < L3 순으로 큽니다.
  • 캐시 메모리의 속도는 L3 < L2 < L1 순으로 빠릅니다.

CPU가 메모리 내에 데이터가 필요하다고 판단하면 L1 캐시에 해당 데이터가 있는지 알아보고, 없다면 L2, L3 캐시 순으로 데이터를 조회합니다.

Cache Hit & Miss

캐시 메모리는 메모리보다 용량이 작기 때문에 메모리에 있는 모든 내용을 캐시 메모리에 가져와 저장할 수 없습니다. 메모리가 보조기억장치의 일부를 복사하여 저장하는 것처럼 캐시 메모리도 메모리의 일부를 복사하여 저장합니다.

보조기억장치가 전원이 꺼져도 보관할 것을 저장하고, 메모리가 실행 중인 것을 저장한다면, 캐시 메모리는 CPU가 사용할 법한 것을 저장합니다.

  • Cache Hit : 캐시 메모리가 예측하여 저장한 데이터가 CPU에 의해 실제로 사용되는 경우를 말합니다.
  • Cache Miss : 자주 사용될 것으로 예측하여 캐시 메모리에 저장했지만, 틀린 예측으로 인해 CPU가 메모리로부터 필요한 데이터를 직접 가져와하는 경우를 말합니다. 당연히 성능이 떨어집니다.

Cache Hit Rate

캐시 적중률(Cache Hit Rate)는 캐시가 히트되는 비율을 말하며, 캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수) 로 계산합니다. 범용적으로 사용되는 컴퓨터의 캐시 적중률은 85 ~ 95% 이상압니다.

Locality

캐시 메모리는 참조 지역성의 원리(Locality of Reference)에 기반하여 어떤 데이터를 메모리에서 읽어와 저장할지 결정합니다. 이 원리는 CPU가 메모리에 접근할 때 나타나는 주된 경향 의미하며, 주로 다음 두 가지 형태로 나뉩니다.

  • 시간 지역성(Temporal Locality) : 최근에 접근한 데이터는 가까운 미래에도 다시 접근될 가능성이 높습니다. (ex: 변수)
  • 공간 지역성(Spatial Locality) : 현재 접근한 메모리 주소와 인접한 주소들도 곧 접근될 가능성이 높습니다. (ex: 배열)

요약하자면, CPU는 최근 사용했거나, 근처에서 사용된 데이터를 다시 사용할 확률이 높기 때문에, 캐시는 이러한 경향에 따라 데이터를 미리 불러와 저장합니다.

Write Policy

CPU가 캐시 메모리에 데이터를 저장(write)할 때는, 캐시에 저장된 데이터와 메인 메모리(RAM)에 있는 데이터 간의 일관성(Coherency)이 유지되어야 합니다.

예를 들어, 아래 그림처럼 메모리 주소 1000번지의 값을 300으로 변경했지만, 캐시 메모리에는 이전 값인 200이 그대로 남아있다면 문제가 발생합니다. 이 상태에서 CPU가 1000번지의 값을 조회하면, 캐시는 오래된 값(200)을 반환하게 됩니다. 이처럼 캐시와 메모리 간 데이터 일관성이 깨질 수 있습니다.

캐시와 메모리 간 데이터 일관성이 깨지는 것을 방지하는 방법에는 크게 두 가지가 있습니다.

  1. 즉시 쓰기 (Write-Through)
    • 데이터를 저장할 때, 캐시 메모리와 메모리 둘다 저장하는 방법입니다.
    • 메모리를 항상 최신 상태로 유지하여 캐시 메모리와 메모리 간의 일관성이 깨지는 상황을 방지할 수 있지만, 데이터를 쓸 때마다 메모리와 캐시 메모리에 동시에 접근해야 한다면, 효율성이 떨어질 수 있다는 단점이 있습니다.
  2. 지연 쓰기 (Write-Back) :
    • 캐시 메모리에만 값을 써 두었다가 추후 수정된 데이터를 한번에 메모리에 반영하는 방법입니다.
    • 메모리 접근 횟수를 줄일 수 있어, 즉시 쓰기 방식에 비해 속도는 더 빠르지만, 메모리와 캐시 메모리 간의 일관성이 깨질 수 있다는 단점이 있습니다.