캐시메모리 동작을 좌우하는 지역성·일관성·쓰기 정책

캐시 지역성, 사상 기법, MESI 일관성, 쓰기·교체 정책과 프리페치가 캐시 성능에 미치는 영향을 정리한다.

2026-08-14 · 최초 발행 2026-01-16

캐시가 빠르게 동작하려면

캐시는 자주 필요해질 데이터를 가까이에 두는 장치지만, 그 자체만으로 효율이 보장되지는 않는다. 프로그램의 메모리 접근 패턴을 활용하는 지역성, 여러 코어의 복사본을 맞추는 일관성, 변경 데이터를 기록하는 쓰기 정책이 함께 작동해야 한다.

반복과 인접 접근이 만드는 지역성

프로그램의 메모리 참조는 무작위로 흩어지기보다 일정한 패턴을 보인다. 이 성질이 캐시 지역성(Locality)이며, 비교적 작은 캐시로도 높은 적중률을 기대할 수 있는 근거다.

시간적 지역성(Temporal Locality)은 최근 참조한 데이터가 가까운 시점에 다시 사용될 가능성이 높다는 뜻이다. 반복문에서 재사용되는 변수, 자주 호출하는 함수, 스택의 지역 변수, 전역 변수와 상수가 이런 패턴을 만든다.

시간축t=0변수 A 접근t=1t=2변수 A 재접근t=3t=4변수 A 재접근동일 데이터반복 참조

아래 루프에서는 sum이 반복해서 사용되므로 시간적 지역성이 나타난다.

for (int i = 0; i < 1000; i++) {
    sum += array[i];  // sum은 1000번 재사용 (시간적 지역성)
}

공간적 지역성(Spatial Locality)은 한 주소를 읽은 뒤 그 주변 주소도 이어서 참조할 가능성이 높다는 특성이다. 배열의 순차 접근, 구조체 멤버 접근, 명령어의 순차 실행, 스택 프레임 사용에서 확인할 수 있다.

메모리 영역주소 1000주소 1004주소 1008주소 1012주소 1016현재 접근다음 접근 예상캐시 블록으로함께 로드

배열 요소를 연속해서 읽는 코드는 공간적 지역성을 활용한다.

for (int i = 0; i < 1000; i++) {
    sum += array[i];  // 연속된 배열 요소 접근 (공간적 지역성)
}

시간적·공간적·순차적 지역성은 캐시 설계와 코드 작성 방식에 각각 연결된다.

지역성 유형 캐시 설계 적용 프로그래밍 최적화
시간적 LRU 교체 정책 반복문 내 변수 재사용
공간적 블록 단위 로드 (Cache Line) 배열 순차 접근
순차적 프리페치 (Prefetch) 분기 예측 힌트

메인 메모리 주소를 캐시에 배치하는 방법

캐시 사상(Cache Mapping)은 소용량 캐시와 대용량 메인 메모리 사이의 주소 대응 방식이다. 이 선택은 구현 난이도와 충돌 가능성, 적중률에 영향을 준다.

캐시 사상 기법직접 사상Direct Mapping완전 연관 사상Fully Associative집합 연관 사상Set-Associative간단한 구현충돌 많음최고 적중률높은 비용균형 잡힌 선택n-way 구성

적중률(Hit Ratio)은 전체 메모리 접근 가운데 캐시에서 데이터를 찾은 비율이다.

적중률 = 캐시 적중 횟수 / 전체 메모리 접근 횟수
미스율 = 1 - 적중률

캐시 미스는 최초 접근에 따른 강제 미스(Cold), 캐시 용량이 부족한 용량 미스(Capacity), 같은 위치로 다른 블록이 매핑되는 충돌 미스(Conflict)로 구분할 수 있다.

미스 유형 원인 해결 방안
강제 미스 (Cold) 최초 접근 시 캐시에 없음 프리페치
용량 미스 (Capacity) 캐시 용량 부족 캐시 크기 증가
충돌 미스 (Conflict) 동일 위치에 다른 블록 매핑 연관도 증가

멀티코어에서 캐시 복사본을 맞추는 방식

각 코어가 자체 캐시를 갖는 시스템에서는 동일 메모리 주소의 데이터가 여러 캐시에 복사될 수 있다. 한 코어가 값을 바꾸면 다른 캐시에 남아 있는 복사본과의 불일치가 문제가 된다.

코어 2코어 1코어 0캐시X = 10캐시X = 10캐시X = ?메인 메모리X = 10코어 0이 X=20 쓰기불일치 발생!코어 1의 X는 여전히 10

버스 기반 시스템에서는 모든 캐시가 버스 트래픽을 감시하는 스누핑 프로토콜(Snooping Protocol)으로 일관성을 유지한다. 대표적인 MESI 프로토콜은 캐시 라인을 Modified, Exclusive, Shared, Invalid 상태로 관리한다.

상태 의미 특성
Modified 수정됨, 이 캐시만 보유 쓰기 발생, 메모리와 불일치
Exclusive 배타적, 이 캐시만 보유 메모리와 일치, 쓰기 시 M으로
Shared 공유됨, 다른 캐시도 보유 가능 메모리와 일치, 읽기만 가능
Invalid 무효, 유효하지 않은 데이터 접근 시 캐시 미스 처리
Read Miss(다른 캐시에 없음)Read Miss(다른 캐시에 있음)WriteWrite다른 코어 Read다른 코어 ReadWrite Back다른 코어 WriteInvalidExclusiveSharedModified

대규모 멀티프로세서에서는 중앙 디렉터리가 캐시 라인의 공유 상태를 관리하는 디렉터리 프로토콜(Directory Protocol)을 사용한다. 수백 개 이상의 코어를 지원하고 브로드캐스트 없이 포인트-투-포인트 통신을 사용하지만, 상태 정보를 위한 디렉터리 오버헤드와 조회 지연이 따른다.

코어들디렉터리무효화 메시지블록 X: 코어 0, 1 보유상태: Shared코어 0X 보유코어 1X 보유코어 2코어 3코어 0이 X 수정 요청

변경 데이터를 기록하는 선택

Write-Through는 CPU가 데이터를 쓸 때 캐시와 메인 메모리에 동시에 기록한다. 메모리와 캐시가 항상 동일하게 유지되고 구현 및 복구가 단순한 대신, 모든 쓰기가 메모리로 전달되어 버스 트래픽이 높다. Write Buffer를 사용하면 쓰기 지연을 줄일 수 있다.

CPU 쓰기캐시 갱신메모리 갱신Write Buffer

Write-Back은 수정 내용을 우선 캐시에만 기록하고, 해당 라인이 교체될 때 메모리에 반영한다. 교체 시에만 쓰기 때문에 버스 트래픽과 불필요한 메모리 접근을 줄일 수 있지만, 수정 여부를 추적하는 Dirty 비트와 더 복잡한 일관성 처리가 필요하다.

아니오아니오CPU 쓰기캐시 갱신Dirty = 1라인 교체?Dirty?메모리에 Write-Back그냥 교체캐시에만 유지
특성 Write-Through Write-Back
메모리 일관성 항상 유지 교체 시 갱신
버스 대역폭 높음 낮음
구현 복잡도 단순 복잡
전력 소모 높음 낮음
오류 복구 용이 어려움
사용 사례 임베디드, L1 일부 현대 CPU L1/L2/L3

쓰기 미스가 발생했을 때 블록을 캐시에 넣을지 여부도 별도로 정한다. Write Allocate(Fetch on Write)는 블록을 캐시에 로드한 뒤 기록하므로 이후 접근에 유리하며 Write-Back과 주로 결합한다. No-Write Allocate(Write Around)는 메모리에 직접 기록해 캐시 오염을 막으며 Write-Through와 주로 결합한다.

아니오쓰기 미스 발생Write Allocate?블록 로드캐시에 쓰기메모리에 직접 쓰기

제한된 캐시 공간에서 남길 데이터를 고르기

캐시가 가득 찬 상태에서 새 블록을 저장하려면 기존 블록 가운데 하나를 교체해야 한다. LRU(Least Recently Used)는 가장 오래 전에 사용된 블록을 내보내 시간적 지역성을 활용한다. LFU(Least Frequently Used)는 사용 빈도가 가장 낮은 블록을 교체한다. FIFO(First In First Out)는 가장 먼저 들어온 블록을, Random은 무작위 블록을 대상으로 한다.

캐시 교체 정책LRU가장 최근 미사용LFU사용 빈도 최저FIFO먼저 들어온Random무작위높은 적중률복잡한 구현빈도 기반카운터 필요단순 구현Belady 이상 현상매우 단순예측 불가

완전한 LRU는 연관도가 높아질수록 구현 비용이 커진다. Pseudo-LRU는 근사 방식을 사용해 이 비용을 줄이며, Tree-PLRU는 이진 트리로 최근 사용 정보를 추적한다. n-way 캐시에서는 n-1 비트만 필요하다.

요청보다 먼저 데이터를 가져오는 프리페치

프리페치(Prefetch)는 프로세서가 데이터를 요청하기 전에 캐시로 미리 로드하는 기법이다. 강제 미스를 줄여 성능을 높인다. 하드웨어 프리페치는 CPU가 접근 패턴을 분석해 자동 수행하고, 소프트웨어 프리페치는 컴파일러나 프로그래머가 명시적 힌트를 제공한다.

프리페치 적용프리페치 시작백그라운드 로드요청 시점캐시 적중!프리페치 없음요청미스메모리 접근대기...데이터 도착

스트라이드 프리페처는 연속 메모리 접근의 간격(Stride)을 감지해 다음 접근을 예측한다.

접근 패턴: 100, 200, 300, 400, ...
감지된 Stride: 100
다음 프리페치: 500, 600, ...

캐시의 효율은 단일 정책으로 결정되지 않는다. 지역성은 캐시 설계의 기반이 되고, MESI 같은 일관성 프로토콜은 멀티코어 환경의 데이터 정합성을 다룬다. 쓰기와 교체 정책은 성능·전력·구현 복잡도 사이의 선택을 만들며, 프리페치는 미스 지연을 숨기는 역할을 맡는다.

캐시메모리컴퓨터구조캐시 일관성MESI캐시 정책프리페치