속도가 빠른 장치와 느린 장치 간의 속도 차이에 따른 병목 현상을 줄이기 위한 범용 메모리입니다. 메인 메모리와 CPU 사이에 위치하며 CPU 속도에 버금갈 만큼 메모리 계층에서 속도가 빠르지만 용량이 적고 비싸다는 단점이 있습니다.
캐시 메모리는 메인 메모리에서 자주 사용하는 프로그램과 데이터를 저장해두어 속도를 빠르게 합니다. 이를 위해 CPU가 어떤 데이터를 원하는지 어느 정도 예측할 수 있어야 합니다. 작은 크기에 캐시 메모리에 CPU가 참조할 정보가 어느 정도 담겨있는지에 따라 캐시 메모리의 성능이 결정되기 때문입니다.
이를 위해 지역성을 이용합니다.
캐시 지역성은 데이터에 대한 접근이 시간 혹은 공간적으로 가깝게 발생하는 것을 의미합니다. 캐시의 적중률을 극대화하여 캐시가 효율적으로 동작하기 위해 사용되는 성질입니다.
가상 메모리 포스팅에서 설명렸듯이 지역성은 두 가지가 있습니다. 어느 부분에서 지역성을 이야기하냐에 따라 설명은 조금 달라질 수 있지만 기본 원리는 같습니다.
캐시 메모리는 메인 메모리에 비해 크기가 매우 작기 때문에 메인 메모리와 1:1 매칭이 불가능합니다. 캐시 메모리가 아무리 CPU에 가깝더라도, 데이터가 캐시 메모리 내의 어디에 저장되어 있는지 찾기가 어렵습니다. 만약 모든 데이터를 순회해야 한다면 캐시 메모리의 장점을 잃기 때문에 쉽게 찾을 수 있는 구조가 필요합니다.
따라서 캐시는 데이터를 저장할 때, 특정 자료구조를 사용하여 묶음으로 저장합니다. 바로 캐싱 라인(Caching Line)이라고 합니다. 빈번하게 사용되는 데이터의 주소들이 흩어져 있기 때문에 캐시 메모리에 저장되는 데이터에는 데이터의 주소 등을 기록해둔 태크를 달아둘 필요가 있습니다. 이런 태그들의 묶음을 의미합니다.
캐싱 라인은 다음과 같은 매핑 방법을 사용합니다.
메인 메모리를 일정한 크기의 블록으로 나누어 각 블록을 캐시 메모리의 정해진 위치에 매핑하는 방식인 직접 매핑입니다. 가장 간단하고 구현도 쉽습니다. 하지만 적중률이 낮아질 수 있습니다. 또한 동일한 캐시 메모리에 할당된 여러 데이터를 사용할 때 충돌이 발생하게 됩니다.
캐시 메모리의 빈 공간에 마음대로 주소를 저장하는 방식입니다. 저장은 간단하지만, 원하는 데이터가 있는지 찾기 위해서는 모든 태그를 병렬적으로 검사해야 하기 때문에 복잡하고 비용이 높습니다.
Direct Mapping과 Full Associative Mapping의 장점을 결합한 방식입니다. 빈 공간에 마음대로 주소를 저장하되, 미리 정해둔 특정 행에만 저장하는 방식입니다. Direct Mapping에 비해 검색은 느리지만 저장이 빠르고, Full Associative Mapping에 비해 저장은 느리지만 검색이 빠릅니다. 주로 사용되는 방식입니다.
캐시 미스(Cache Miss)는 CPU가 참조하려는 데이터가 캐시 메모리에 없을 때 발생합니다.
Compulsory Miss를 줄이기 위해 무작위로 캐시에 데이터를 가져옵니다.