[메모리] 2. 캐시 메모리

2025. 11. 01.
게시일
Nov 1, 2025

캐시 메모리 개요

주 메모리와 CPU 사이에 존재하는 메모리로, 주 메모리에서 자주 쓰이는 일부분을 저장(캐싱)해서 프로그램 실행속도를 빠르게 하는 메모리다. 캐시 메모리는 하드웨어 스펙상에 포함된 개념으로, 애플리케이션 개발자 입장에서는 캐시가 어떻게 돌아가는지 몰라도 된다. 그러나 상황에 따라서 개발자가 직접 캐시 최적화를 의도해 프로그램을 설계 해야 하는 경우도 종종 있다. 캐시 메모리는 여러개의 Cache Line을 단위로 해 구성되어있고, 일반적으로 SRAM으로 만들어진다.
 
notion image
  • Memory Block: 메인 메모리에서 캐시로 가져오는 최소 전송 단위
  • Cache Line: 캐시 내부에서 하나의 메모리 블록을 저장하는 공간 단위
저 수많은 Memory Block 중 자주 쓰이는 Memory Block을 캐시의 Cache Line에 캐싱하는 것이다. Cache Line의 크기(즉 Memory Block의 크기)는 CPU 마다 다르지만, 현대에는 64B가 표준적인 크기로 알려져있다.

Locality(지역성)이란?

캐시 메모리의 용량은 무한정 커질 수 없기 때문에, 캐시는 어떤 메모리를 캐싱해둘 것인지 신중히 선택해야 한다. 캐시가 어떤 메모리 블럭을 캐싱할지 선택하는 기준이 바로 이 Locality 이다.
  • Time Locality : 최근 접근했던 메모리는 다시 접근할 가능성이 높다. 이런 특징을 Time Locality라고 한다. 캐시메모리는 최근에 사용된 캐시라인을 유지하려고 하는데, 이게 Time Locality를 활용한 것이다.
  • Spatial Locality : 최근 접근 메모리의 인근 주소의 메모리는 다시 접근할 가능성이 높다. 이런 특징을 Spatial Locality라고 한다. 캐시메모리는 인접한 메모리 전체(캐시 라인) 단위로 함께 가져오는데, 이게 Spatial Locality를 활용한 것이다.

캐시 내부 계층 (L1, L2, L3 Cache)

캐시 메모리는 SRAM으로 만든다. SRAM은 DRAM보다 매우 빠르지만, 용량을 크게 만들수록 면적과 전력 소모가 급격히 증가하고, 높은 클럭을 맞추기 어려워진다. 즉 용량이 클수록 더 느린 특성을 가진다. 따라서 현대의 캐시 메모리는 하나의 큰 메모리로 구성하지 않고, L1, L2 캐시로 계층화하여 설계한다.
notion image
여기에 더해 요즘에는 L3 Cache라는 개념까지 있다. CPU 안에 코어가 여러개가 들어가는 다중코어 설게가 보편화되자, 각 코어에는 L1, L2 캐시를 두고, 코어 간 공유하는 큰 캐시 메모리를 하나 더 둔 것이다. 이게 L3 Cache다.
위 사진에서 보다시피, 현대 CPU 다이(회로)면적에서 캐시가 차지하는 면적은 어마어마하다. 캐시가 CPU 성능에서 정말 중요한 핵심 부품 중 하나란걸 방증하기도 한다.

캐시 Hit / 캐시 Miss

프로그램이 메모리에 접근할 때 요청한 데이터가 캐시에 이미 존재하면 Cache Hit 라고 하며, 이 경우 메인 메모리에 접근하지 않고 빠르게 데이터를 사용할 수 있다.
반대로, 캐시에 데이터가 존재하지 않으면 Cache Miss가 발생하며, 이때는 메인 메모리에서 해당 Memory Block을 가져와 Cache Line에 채운 뒤데이터를 사용하게 된다.
따라서 최적화 된 소프트웨어를 개발하기 위해서는 Cache Hit Rate를 높여야 한다. 동일한 기능을 하는 함수라도, 알고리즘이나 구현체에 따라 Cache Hit Rate가 다를 수 있어 중요한 지점이다. 후술할 “캐시 친화적 개발” 란에서 자세한 내용을 다룬다.

Full-Associative vs Set-Associative

Full-Associative

notion image
Fully Associative Cache
Fully Associative Cache
Fully Associative Cache - 가장 이상적인 형태의 Cache라고 볼 수 있다. 그냥 아무 Cache Line에 아무 Block이 다 들어올 수 있는 Cache를 말한다. 그런데 CPU에서 Cache에 접근하면 “이 주소의 메모리가 현재 Cache에 있나요?”를 물어봐야 한다. Cache 메모리에서는 해당 주소가 Cache가 있는지 없는지 알려면 각 TAG를 비교 해야 하는데, 메모리의 TAG를 전부 동시에 병렬비교하는 회로를 만드는게 물리적 회로가 커져 쉽지 않다. 따라서 아주 작은 용량의 특수 고속 캐시에만 쓰이고, L1,L2,L3 캐시 등 주메모리 캐시에는 보통 안쓰인다.

Set-Associative

 
notion image
Two Way Set Associative Cache
Two Way Set Associative Cache
L1, L2, L3 등 주메모리 캐싱용으로는 Set-Associative Cache를 사용한다. 여기서부터는 Set과 Way의 개념이 등장한다.
  • Set은 메모리 주소의 일부 비트(Index)에 의해 선택되는 캐시의 논리적 묶음이다.
  • Way는 하나의 set 안에 존재할 수 있는 cache line의 개수를 의미한다.
이 구조는 굉장히 큰 단점이 있는데, set 주소공간에 최대 way 수 만큼의 캐시라인밖에 넣지 못한다는 것이다. 예를 들어 8-way에서, 같은 Set Number를 지닌 메모리 블럭은 한번에 최대 8개 까지만 캐싱할 수 있다.
이런 불편하고 복잡하기 짝이 없는 시스템을 사용하는 이유는, 획기적으로 캐시메모리의 회로를 단순화시켜주기 때문이다. CPU가 캐시 히트를 검색 할 때, 주소에서 선택된 한 개의 세트 안의 TAG만 비교하면 되기 때문이다. 예를 들어 8-way라면 8개의 TAG만 병렬 비교하면 된다.
만약 여기서 Way가 1개, 즉 Set당 메모리블럭을 단 한 개 씩만 넣을 수 있는 캐시라면 Direct-Mapped Cache라고 부른다.
 
 

캐시 교체 정책

작성중…

캐시 일관성

작성중…

Cache Line Alignment

현대 CPU는 대체로 L1 캐시라인의 크기가 64B인데, 이 64B에 맞추는 메모리 정렬도 있다. 이를 cache Line Alignment라고 한다.
 
요지는 이것이다. 캐시메모리가 들어간 CPU들은 절대 메모리를 직접 접근하지 않는다.
  1. CPU가 메모리 요청을 하면 MMU는 캐시를 둘러본다.
  1. 캐시 miss가 나면, MMU는 메모리 블럭을 빼와 캐시에 적재한다.
  1. CPU에게 적재된 캐시를 돌려준다.
MMU가 캐싱을 할 때는 메모리의 시작주소를 Cache Line의 배수 단위로 저장되어야 한다. 애초에 주소 공간을 고정된 Cache Line 단위로 쪼갠 메모리 블록을 캐시 라인에 저장하기 때문이다.
Cache Line Padding은 바로 이 Cache Line의 크기(64B)에 맞춰 정렬해주는 것으로, Cache 접근 횟수를 줄여주는 기법이다.

캐시 친화적 개발

일반적인 상황에서는 캐시 친화적 개발이 필요없다. 하지만 성능이 굉장히 민감한 소프트웨어를 개발할 때는 캐시 친화적 개발이 필요할 수 있다. 특히 C언어 같이 비교적 Low-Level인 언어에서는 꽤 중요한 개념이다.
  • Cache Line Padding
작성중…
  • Linked List 대신 Array, Vector 등 메모리 연속 사용
작성중…
  • Loop Blocking : 데이터를 캐시 용량의 크기에 맞춰서 처리. 예를 들어 캐시 메모리가 64KB라면 한번에 64KB씩 가져와서 연산하는 것이다.
  • 접근순서 최적화 (캐시 친화적 반복문)
작성중…
  • NUMA
이건 NUMA 글에서 다룸
 
 
 

광의적인 의미의 캐시 메모리

사실 지금까지 논의한 캐시 메모리는 CPU - 주 메모리 사이의 캐시 메모리를 말한 것이지만, 실제로는 병목현상이 일어나는 지점에는 대부분 캐시 메모리가 설치되어있다.

Storage Cache

HDD나 SSD 안에도 내장된 Cache Memory 장치가 있는데, 보통 SRAM이나 DRAM으로 만들어져있다. 참조와 변경이 자주 일어나는 파일은 Storage의 Controller회로가 알아서 이 캐시 메모리에 알아서 캐싱한다.

Filesystem Cache

운영체제가 디스크 I/O를 줄이기 위해 메인 메모리(RAM)에 파일 데이터를 캐싱한다. 위에서 말했던 Storage Cache가 따로 물리적으로 존재하는 캐시라면, 이 캐시는 메인 메모리에 마련된 논리적인 캐시라고 볼 수 있다

Network Cache

네트워크 캐시는 물리적인 캐시 장치라기 보다는 논리적인 의미의 캐시 인데, 멀리 떨어진 네트워크로 부터 데이터를 받아오는 것은 느리기 때문에 중간에 가까운 서버를 두고, 여기에 데이터를 캐싱해 빠르게 제공한다. 대표적으로 CDN cache가 있다.
제목: [메모리] 2. 캐시 메모리작성일: 2025. 11. 01.