캐시 메모리는 중앙처리장치(CPU)와 주기억 장치(main memory) 사이에서 데이터 전송 속도를 높이기 위한 고속의 메모리입니다. CPU는 속도 차이를 줄이기 위해 자주 사용하는 데이터를 캐시에 저장하고, 캐시에서 데이터를 가져와 빠르게 처리합니다. 캐시 메모리의 동작 원리와 관련된 쓰기 정책(write policy)과 교체 정책(replacement policy)을 포함해 캐시 메모리에 대해 상세하게 설명하겠습니다.
캐시 메모리는 CPU가 자주 사용하는 데이터를 임시로 저장해, 주기억 장치에 직접 접근하는 것보다 빠르게 데이터를 읽고 쓸 수 있도록 합니다. CPU는 메모리 접근 시 우선 캐시를 참조하며, 캐시에 데이터가 있을 경우 이를 바로 사용합니다. 이를 캐시 히트(Cache Hit)라고 하며, 데이터가 없을 경우 캐시 미스(Cache Miss)가 발생하여 데이터를 주기억 장치에서 가져와 캐시에 적재합니다.
캐시 메모리는 일반적으로 여러 수준으로 나뉩니다:
• L1 캐시: CPU 코어에 가장 가까운 고속 메모리. 매우 작지만 속도가 빠름.
• L2 캐시: L1 캐시보다 느리고 크지만, 여전히 CPU와 가깝습니다.
• L3 캐시: 다수의 CPU 코어가 공유하며, 속도는 L2보다 느리지만 용량은 큼.
쓰기 정책은 CPU가 데이터를 수정할 때 그 변경 내용을 캐시와 주기억 장치에 어떻게 반영할지 결정하는 방식입니다. 주요 쓰기 정책에는 Write Through와 Write Back이 있습니다.
2.1 Write Through
Write Through는 캐시에 데이터가 적재되었을 때, 데이터가 수정되면 즉시 주기억 장치에도 동일한 데이터를 기록하는 방식입니다.
• 장점: 주기억 장치에 항상 최신 데이터가 있어 데이터 무결성을 보장합니다.
• 단점: 데이터를 수정할 때마다 주기억 장치에도 쓰기를 수행하므로 성능이 다소 떨어집니다.
2.2 Write Back
Write Back은 캐시에서 수정된 데이터를 즉시 주기억 장치에 쓰지 않고, 캐시에서만 수정된 상태로 남겨두다가 해당 데이터가 캐시에서 교체될 때 주기억 장치에 기록하는 방식입니다.
• 장점: 데이터를 수정할 때마다 주기억 장치에 접근하지 않으므로 속도가 빠릅니다.
• 단점: 캐시에만 수정된 데이터가 존재할 수 있으므로, 주기억 장치에 항상 최신 상태의 데이터가 보장되지 않습니다. 전력 손실이나 장애 상황에서는 데이터 손실 가능성이 있습니다.
캐시는 용량이 제한적이므로 새로운 데이터를 적재할 때 기존 데이터를 교체해야 할 경우가 있습니다. 교체 정책은 어떤 데이터를 캐시에서 제거하고 새로운 데이터를 적재할지 결정하는 규칙입니다. 주요 교체 정책에는 LRU, FIFO, LFU, Random 등이 있습니다.
3.1 LRU (Least Recently Used)
LRU는 가장 최근에 사용되지 않은 데이터를 교체하는 방식입니다. 즉, 가장 오랫동안 사용되지 않은 데이터가 제거됩니다.
• 장점: 자주 사용되는 데이터는 캐시에 오래 남아 있어 캐시 히트율이 높습니다.
• 단점: 사용 이력을 추적해야 하므로 추가적인 하드웨어 비용이 발생할 수 있습니다.
3.2 FIFO (First In, First Out)
FIFO는 캐시에 가장 먼저 적재된 데이터를 먼저 제거하는 방식입니다.
• 장점: 구현이 간단합니다.
• 단점: 가장 오래된 데이터가 반드시 덜 중요하다는 보장이 없어 성능이 저하될 수 있습니다.
3.3 LFU (Least Frequently Used)
LFU는 사용 빈도가 가장 낮은 데이터를 교체하는 방식입니다. 데이터의 접근 횟수를 추적하여, 가장 적게 참조된 데이터를 교체합니다.
• 장점: 자주 사용되는 데이터는 캐시에 오래 남아 있어 성능이 향상됩니다.
• 단점: 사용 횟수를 추적하는데 추가적인 메모리와 연산 비용이 필요합니다.
3.4 Random (임의 선택)
Random 방식은 임의로 캐시의 한 블록을 선택하여 교체하는 방식입니다.
• 장점: 구현이 매우 간단하며, 추적할 필요가 없습니다.
• 단점: 성능이 예측 불가능하며, 중요한 데이터가 교체될 수 있습니다.
캐시 미스는 CPU가 요청한 데이터가 캐시에 존재하지 않을 때 발생하며, 이를 주기억 장치에서 가져와 캐시에 저장하게 됩니다. 캐시 미스는 3가지 종류로 나뉩니다.
4.1 Compulsory Miss (필연적 미스)
데이터가 처음 캐시에 로드될 때 발생하는 미스입니다. 이때는 어떤 캐시 정책을 사용하더라도 캐시 미스가 발생할 수밖에 없습니다.
4.2 Capacity Miss (용량 미스)
캐시의 용량이 부족하여 데이터를 저장할 수 없는 경우 발생합니다. 캐시가 충분히 크면 이러한 미스는 줄어듭니다.
4.3 Conflict Miss (충돌 미스)
직접 사상 방식이나 집합 연관 사상 방식에서 특정 캐시 라인에 데이터가 중복되면서 발생하는 미스입니다. 캐시의 특정 라인에 여러 데이터가 매핑되면 서로 교체가 반복되면서 발생하는 경우가 많습니다.
캐시 일관성(Cache Coherence)은 다중 프로세서 환경에서 캐시에 동일한 데이터가 서로 다른 상태로 저장될 때 발생하는 문제입니다. 이를 해결하기 위해 캐시 일관성 프로토콜이 사용됩니다. 대표적인 프로토콜로는 MESI 프로토콜이 있으며, 이는 각 캐시 라인의 상태를 Modified, Exclusive, Shared, Invalid 네 가지 상태로 구분하여 관리합니다.
결론
캐시 메모리는 CPU와 주기억 장치 사이의 성능 차이를 줄이기 위해 매우 중요한 역할을 합니다. 캐시의 쓰기 정책과 교체 정책은 캐시의 성능을 좌우하는 핵심 요소로, 시스템의 특성과 요구에 맞는 정책을 선택하는 것이 중요합니다.