지난 글에서는 메모리(Memory) 구조와 계층 구조(Hierarchy)에 대해 정리했습니다.
메모리 계층 구조(Memory Hierarchy)는 CPU에 가까울수록 빠르지만 용량이 작고 비싸며, 멀어질수록 느리지만 용량이 크고 저렴하다는 특징을 가집니다.
이때 CPU와 주 기억 장치(Main Memory) 사이의 속도 차이를 줄이기 위해 사용되는 것이 바로 캐시 메모리(Cache Memory)입니다.
이번 글에서는 캐시 메모리(Cache Memory)가 왜 필요한지, 어떤 원리로 성능을 향상시키는지, 매핑 방식(Mapping), 캐시 테이블(Cache Table), 쓰기 정책까지 함께 정리하겠습니다.
캐시 메모리(Cache Memory)는 CPU와 주 기억 장치(Main Memory) 사이에 위치한 고속 메모리입니다.
CPU가 자주 사용하는 데이터(Data)나 명령어(Instruction)를 미리 저장해 두었다가, 필요할 때 더 빠르게 접근할 수 있도록 도와주는 역할을 합니다.
주 기억 장치(Main Memory)는 용량이 크지만 CPU에 비해 속도가 느립니다.
반면 CPU는 매우 빠르게 동작하기 때문에, 필요한 데이터를 주 기억 장치(Main Memory)에서 매번 가져오면 전체 성능이 떨어질 수 있습니다.
캐시 메모리(Cache Memory)는 이러한 속도 차이를 줄여 CPU가 대기하는 시간을 줄이고, 시스템 성능을 높이기 위해 존재합니다.
CPU는 명령어를 매우 빠른 속도로 처리할 수 있지만, 필요한 데이터가 항상 즉시 준비되어 있는 것은 아닙니다.
만약 CPU가 필요한 값을 매번 주 기억 장치(Main Memory)에서 직접 읽어와야 한다면, 메모리 접근 속도가 CPU의 처리 속도를 따라가지 못해 병목이 발생합니다.
즉, CPU의 성능이 아무리 좋아도 데이터(Data)를 제때 공급받지 못하면 전체 시스템은 느려질 수밖에 없습니다.
캐시 메모리(Cache Memory)는 이 문제를 완화하기 위해, 자주 사용할 가능성이 높은 데이터(Data)와 명령어(Instruction)를 CPU 가까이에 미리 저장해 둡니다.
덕분에 CPU는 주 기억 장치(Main Memory)까지 가지 않고도 필요한 데이터를 더 빠르게 가져올 수 있습니다.

CPU가 어떤 데이터에 접근하려 할 때, 그 데이터가 이미 캐시 메모리(Cache Memory)에 존재한다면 바로 사용할 수 있습니다. 이를 캐시 히트(Cache Hit) 라고 합니다.
반대로 필요한 데이터가 캐시에 없다면 주기억장치(Main Memory)까지 접근해야 하며, 이를 캐시 미스(Cache Miss) 라고 합니다.
즉,
캐시 메모리(Cache Memory)의 성능은 결국 얼마나 많은 접근이 캐시 히트(Cache Hit)로 이어지느냐와 밀접하게 연결됩니다.
Cache Hit 비율이 높을수록 CPU는 대기 시간을 줄일 수 있고, 전체 시스템 성능도 향상됩니다.
캐시 역시 하나만 존재하는 것이 아니라 보통 여러 단계로 나뉘어 구성됩니다.
즉, 캐시 메모리도 내부적으로 계층 구조를 이루며 성능과 용량 사이의 균형을 맞추고 있습니다.

캐시(Cache)는 용량이 제한되어 있기 때문에 주 기억 장치(Main Memory)의 모든 데이터를 그대로 담을 수는 없습니다.
그래서 Main Memory의 특정 블록(Block)을 캐시(Cache)의 어느 위치에 저장할지 정해 주는 규칙이 필요합니다.
이 규칙을 매핑(Mapping) 이라고 합니다.
대표적인 매핑 방식은 다음과 같습니다.
직접 매핑은 주 기억 장치(Main Memory)의 각 블록이 캐시의 정해진 한 위치에만 저장될 수 있는 방식입니다.
구조가 단순하고 구현이 쉽다는 장점이 있지만, 서로 다른 메모리 블록(Memory Block)이 같은 캐시 위치를 사용해야 하는 경우 충돌이 자주 발생할 수 있습니다.
즉, 빠르고 단순하지만 충돌 미스(Conflict Miss)에 취약한 방식입니다.
완전 연관 매핑은 주 기억 장치(Main Memory)의 한 블록(Block)이 캐시의 어느 위치에나 저장될 수 있는 방식입니다.
유연성이 높아 충돌을 줄일 수 있지만, 데이터를 찾을 때 캐시(Cache) 전체를 비교해야 하므로 구현이 복잡하고 비용이 큽니다.
즉, 가장 자유롭지만 하드웨어(Hardware) 부담이 큰 방식입니다.
집합 연관 매핑(Set-Associative Mapping)은 직접 매핑(Direct Mapping)과 완전 연관 매핑(Fully Associative Mapping)의 중간 형태입니다.
캐시를 여러 개의 집합(Set)으로 나누고, 주 기억 장치(Main Memory)의 블록은 특정 집합 안에서만 저장될 수 있도록 합니다.
다만 그 집합 내부에서는 여러 위치 중 하나를 선택할 수 있습니다.
즉, 직접 매핑(Direct Mapping)보다 충돌을 줄일 수 있고, 완전 연관 매핑(Fully Associative Mapping)보다 구현 부담이 적어 실제 시스템에서 많이 사용됩니다.

예를 들어 CPU가 어떤 메모리 주소에 접근한다고 가정해보겠습니다.
이 주소는 그대로 사용되는 것이 아니라, 캐시 구조에 맞게 태그(Tag), 인덱스(Index), 오프셋(Offset) 으로 나뉘어 사용됩니다.
즉, 캐시는 메모리 주소를 잘게 나누어 사용함으로써, 제한된 용량 안에서도 빠르게 데이터를 탐색할 수 있습니다.
이런 관점에서 보면 캐시 테이블(Cache Table)은 단순한 저장 공간이 아니라, 주소(Address)를 바탕으로 데이터(Data)를 빠르게 찾아내기 위한 구조라고 이해할 수 있습니다.

캐시(Cache)가 데이터를 효율적으로 관리하기 위해서는 단순히 데이터만 저장하는 것이 아니라, 해당 데이터에 대한 관리 정보도 함께 저장해야 합니다.
이때 캐시 테이블(Cache Table)에는 보통 태그(Tag), 유효 비트(Valid bit), 더티 비트(Dirty bit)와 같은 정보가 함께 기록됩니다.
태그(Tag)는 현재 캐시 라인(Cache Line)에 저장된 데이터가 어떤 메모리 블록(Memory Block)에 해당하는지를 식별하기 위한 정보입니다.
CPU가 특정 메모리 주소(Memory Address)에 접근하면, 캐시는 먼저 인덱스(Index)를 통해 확인할 위치를 찾고, 그 위치에 저장된 태그(Tag)를 비교하여 원하는 데이터가 맞는지 판단합니다.
즉, 태그(Tag)는 “이 캐시 라인(Cache Line)에 들어 있는 데이터가 내가 찾는 블록(Block)과 같은가” 를 확인하는 데 사용됩니다.
유효 비트(Valid bit)는 해당 캐시 라인(Cache Line)에 현재 유효한 데이터가 저장되어 있는지 여부를 나타냅니다.
캐시가 처음 초기화된 상태에서는 데이터가 없기 때문에 유효 비트(Valid bit)는 보통 0으로 설정됩니다.
이후 어떤 메모리 블록(Memory Block)이 캐시(Cache)에 적재되면 유효 비트(Valid bit)가 1이 되며, CPU는 이 값을 보고 해당 라인의 데이터가 실제로 사용 가능한지 판단합니다.
즉, 유효 비트(Valid bit)는 “이 캐시 라인(Cache Line)에 들어 있는 데이터가 의미 있는 값인가” 를 나타내는 정보입니다.
더티 비트(Dirty bit)는 Write-back 방식에서 사용되는 정보로, 해당 캐시 라인(Cache Line)의 데이터가 캐시에서 수정되었지만 아직 주 기억 장치(Main Memory)에는 반영되지 않았는지를 나타냅니다.
만약 더티 비트(Dirty bit)가 1이라면, 이 캐시 라인이 교체될 때 주 기억 장치(Main Memory)에 변경 내용을 반영해야 합니다.
반대로 더티 비트(Dirty bit)가 0이라면, 캐시의 데이터와 주 기억 장치(Main Memory)의 데이터가 동일하므로 바로 교체해도 문제가 없습니다.
즉, 더티 비트(Dirty bit)는 “이 데이터가 수정된 상태인가, 그리고 나중에 주 기억 장치(Main Memory)에 써야 하는가” 를 나타내는 정보입니다.
정리하면, 캐시 테이블(Cache Table)은 단순한 데이터 저장 공간이 아니라, 태그(Tag)를 통해 블록을 식별하고, 유효 비트(Valid bit)를 통해 데이터의 유효성을 판단하며, 더티 비트(Dirty bit)를 통해 수정 여부를 관리하는 구조라고 볼 수 있습니다.

캐시가 가득 찬 상태에서 새로운 데이터를 저장해야 한다면, 기존 데이터 중 하나를 내보내야 합니다.
이때 어떤 데이터를 제거할지 결정하는 규칙을 교체 정책(Replacement Policy) 이라고 합니다.
대표적으로는 다음과 같은 방식이 있습니다.
교체 정책은 캐시 히트율(Cache Hit Rate)에 직접적인 영향을 주기 때문에 성능과 밀접한 관련이 있습니다.

캐시 메모리(Cache Memory)는 데이터를 읽는 것뿐 아니라, CPU가 데이터를 쓸 때도 중요한 역할을 합니다.
특히 CPU가 어떤 값을 변경했을 때, 그 변경 내용을 캐시에만 반영할지, Main Memory에도 즉시 반영할지에 따라 성능과 데이터 일관성 유지 방식이 달라집니다.
대표적인 쓰기 정책으로는 Write-through 와 Write-back 이 있습니다.
Write-through는 CPU가 캐시에 데이터를 쓸 때, 주 기억 장치(Main Memory)에도 즉시 함께 반영하는 방식입니다.
즉, 데이터가 변경되면 캐시와 주 기억 장치(Main Memory)가 항상 같은 값을 유지하게 됩니다.
장점
단점
Write-back은 CPU가 데이터를 변경할 때, 우선 캐시에만 반영하고 주 기억 장치(Main Memory)에는 나중에 반영하는 방식입니다.
즉, 캐시(Cache)의 데이터가 변경되더라도 바로 주 기억 장치(Main Memory)에 쓰지 않고, 해당 캐시 블록(Cahce Block)이 교체될 때나 특정 시점에 반영합니다.
장점
단점
캐시 메모리(Cache Memory)는 CPU와 주기억장치(Main Memory) 사이의 속도 차이를 줄이기 위해 존재하는 고속 메모리입니다.
프로그램의 메모리 접근에는 지역성(Locality)이라는 특징이 있기 때문에, 캐시는 자주 사용할 가능성이 높은 데이터와 명령어를 미리 저장해 두고 CPU가 더 빠르게 접근할 수 있도록 도와줍니다.
또한 캐시는 단순히 데이터를 저장하는 공간이 아니라, 매핑 방식(Mapping), 캐시 테이블(Tag, Index, Offset), 교체 정책(Replacement Policy), 쓰기 정책(Write-through, Write-back)과 같은 구조를 통해 효율적으로 동작합니다.
| 논리 주소와 물리 주소로 이해하는 가상 메모리(Virtual Memory) (0) | 2026.04.27 |
|---|---|
| 주 기억 장치(Main Memory)의 동작 과정 및 원리 (0) | 2026.04.24 |
| 메모리의 구조와 동작 방식은 어떻게 될까? (0) | 2026.04.20 |
| CPU의 구조와 동작 과정은 어떻게 될까? (1) | 2026.04.20 |
| 운영체제는 어떻게 프로그램을 실행할까? (0) | 2026.04.16 |