CPU의 속도에 비해 메모리의 속도는 느리다. 그리고 두 장치의 속도 차로 인해 병목 현상이 발생하게 된다. 이를 방지하기 위해 사용하는 것이 바로 캐시 메모리이다.
캐시 메모리는 메모리와 CPU 사이에 위치하여 CPU가 자주 사용하는 데이터를 저장함으로써 CPU가 메모리에 접근하는 횟수를 줄임으로써 성능을 향상시킨다.
일반적으로 메모리 계층에서 가장 빠른 속도로 CPU에 버금갈 만큼 속도가 빠르지만 매우 비싸며, 따라서 용량이 적은 편이다.
CPU에서 메모리에 접근하기 전, 먼서 캐시 메모리에 현재 원하는 데이터가 있는지 여부를 확인한다. 이때 필요한 데이터가 있는 경우를 적중(Hit), 없는 경우를 실패(Miss)라고 하며, 요청한 데이터를 캐시 메모리에서 찾을 확률을 적중률(Hit ratio)이라고 한다.
적중률 = 캐시 메모리의 적중 횟수 / 전체 메모리의 참조 횟수
CPU에서 데이터를 가져올 때는 캐시 메모리 > 메모리 > 보조 기억 장치 순으로 접근하게 되는데,
와 같이 적중 여부에 따라 달리 동작하게 된다.
일반적으로 CPU는 이러한 캐시 메모리를 2~3개 정도 사용하며 순서에 따라 L1, L2, L3 등과 같이 구별한다(L은 Level을 의미한다). 각 캐시 메모리는 속도와 크기 등에 따라 구별되며, 레벨이 낮은 순으로 접근하게 된다.
구분 | 내용 |
---|---|
워드(word) | CPU의 기본 처리 단위로서, 블록/라인을 구성하는 기본 단위 |
블록(block) | 메모리를 기준으로 잡은 캐시와의 전송 단위 캐시 라인과 크기가 동일하며, 여러 개의 워드로 구성됨 |
캐시 라인(cache-line) | 캐시 관점에서의 캐시-메모리 간 전송 단위 메모리 블록과 동일한 크기 여러 개의 캐시 라인으로 이어져 있으며 각 라인은 여러 개의 워드로 구성됨 |
CPU가 캐시 메모리에 데이터 쓰기 작업을 하게 되면, 캐시의 일관성을 유지하기 위해 메인 메모리 또는 보조 기억 장치 등의 저장소에도 데이터 쓰기 작업을 진행해 주어야 한다. 이때 메모리 쓰기 정책은 크게 두 가지로 나눌 수 있다.
Write-Through
캐시 메모리에 데이터가 쓰이는 시점에 데이터를 메인 메모리에도 저장하는 정책, 즉 캐시 메모리와 실제 메모리 저장소 모두에 데이터를 업데이트하는 정책이다.
구분 | 내용 |
---|---|
장점 | 캐시와 메모리에 업데이트를 동시에 하므로 캐시 일관성을 유지할 수 있어 안정적 |
단점 | 데이터에 대한 쓰기를 요청할 때 마다 항상 메인 메모리에 접근해야 하므로 캐시에 의한 접근 시간의 개선 효과가 없어지게 됨 (이를 방지하기 위해 Write buffer를 추가하여 사용 |
Write-Back
우선 캐시 메모리에만 데이터를 업데이트하여 사용하다가 캐시 메모리가 새로운 데이터 블록으로 교체될 때 메인 메모리의 데이터를 업데이트하는 정책이다.
구분 | 내용 |
---|---|
장점 | Write-through에 비해 처리 속도가 훨씬 빠름 |
단점 | 캐시 일관성이 유지되기 어려워 종종 캐시와 메모리의 값이 서로 다른 경우가 발생할 수 있음 |
캐시가 효율적으로 동작하기 위해서는 앞서 언급한 캐시의 적중률(Hit-rate)을 극대화해야 하며, 이를 위해서는 캐시에 저장할 데이터가 지역성(Locality)을 가져야 한다.
지역성이란 데이터의 접근이 시간적 혹은 공간적으로 가깝게 일어나는 것을 의미하며, 이때 프로그램이 모든 코드나 데이터에 대해 균등하게 접귾지 않는다는 특성이 있다는 것을 전제로 한다.
즉, 지역성이란 메모리 내의 정보 중 어느 한 순간에 특정한 부분을 집중적으로 참조하는 특성을 말한다. 이는 크게 두 가지로 구분할 수 있다.
캐시 메모리는 메인 메모리에 비해 크기가 매우 작기 때문에 메인 메모리와 1:1로 매칭하는 것은 불가능하다. 또한 캐시가 아무리 CPU에 가깝게 위치하더라도, 데이터가 캐시 내의 어느 곳에 저장되어 있는지 찾기가 어려워 모든 데이터를 순회해야 한다면 캐시의 장점이 사라지게 된다.
따라서, 캐시에 데이터를 저장할 때 이를 쉽게 찾을 수 있도록 특정 자료 구조를 사용하여 묶음으로 저장하며, 이를 캐싱 라인(Caching Line)이라고 한다. 빈번하게 사용되는 데이터의 주소들이 흩어져 있기 때문에 캐시에 저장하는 데이터에는 데이터의 주소 등을 기록해둔 태그를 달아둘 필요가 있는데, 이러한 태그들의 묶음을 의미하는 것이다.
간단히 캐시 메모리에 주소를 저장하는 방식을 말하는 것으로 이해해도 무방하며, 일반적으로 세 가지 매핑 방식으로 구분할 수 있다.