본문 바로가기
컴퓨터구조

[키워드로 풀어본 컴퓨터구조] 04. 캐쉬 메모리(Cache Memory)

by Lizardee 2023. 7. 22.
캐쉬 메모리(Cache Memory)

Cache Memory 관계

Cache Memory는 메인 메모리와 CPU 간의 데이터 속도 향상을 위한 중간 버퍼 역할을 하는 CPU 내 또는 외에 존재하는 메모리이다. 전체 시스템의 성능을 개선시킬 수 있는 메모리이다.

 

Cache Memory는 CPU와 메인 메모리 사이에 존재한다고 말할 수 있는데, CPU 내에 존재할 수도 있고, 역할이나 성능에 따라서는 CPU 밖에 존재할 수도 있다. 빠른 CPU의 처리속도와 상대적으로 느린 메인 메모리에서의 속도의 차이를 극복하는 중간 버퍼 역할을 한다. 쉽게 표현하면, CPU는 빠르게 일을 진행하고 있는데, 메모리에서 데이터를 가져오고 가져가는 것이 느려서 중간에 미리 CPU에 전달될 데이터를 들고 서 있는 형태라고 말할 수 있다.

 

 

Cache Memory의 성능

Cache Memory는 메인 메모리의 일정 블록사이즈의 데이터를 담아 두었다가 CPU에 워드사이즈만큼의 데이터를 전송하게 된다. 이때 이 사이즈들이 캐시의 성능에 영향을 미치게 된다. 블록사이즈나 워드사이즈가 상대적으로 크다면, 그만큼 Cache Hit율이 높아지기 때문이다.

 

CPU에서 필요로 하는 데이터가 캐시 메모리에 있어서 참고할 수 있느냐는 것이 Cache Memory의 성능이 된다. 이때 CPU가 필요한 데이터카 Cache Memory 내에 들어와 있다면 'Cache Hit'라 하고, 접근하고자 하는 데이터가 없을 경우에는 'Cache Miss'라 한다. 원하는 데이터가 있을 수도 있고 없을 수도 있는데, 이때 원하는 데이터가 Cache에 있을 확률을 'Hit Ratio'라 한다.

Cache Memory 동작 순서

 

 

Cache Memory의 지역성

CPU에서 명령어를 수행하면서 매번 Cache Memory를 참조하게 되는데, 이때 Hit율이 지역성을 갖는다. 지역성(Local of Reference)이라는 것은 프로세스들이 기억장치 내의 정보를 균일하게 액세스하는 것이 아니라, 어느 순간에 특정 부분을 집중적으로 참조하는 것을 말한다.

 

▶ Cache Memory의 공간적 지역성(Locality)

공간적 지역성(spatial locality of reference)이라는 것은 한 번 참조한 메모리 옆에 있는 메모리를 다시 참조하게 되는 성질을 말한다.

프로그램에서 배열(Array)는 일정한 메모리 공간을 순차적으로 할당받아 사용하는 것인데, 공간할당을 연속적으로 받게 된다. 이 연속적으로 받게 된 메모리가 사용될 때 연속적으로 사용될 가능성이 높다. C 프로그램 언어에서 예를 들면 int a[10]이라고 선언을 한다면 프로그램 중간에서 a[0] 사용 후 인접한 a[1]이 사용될 확률이 높다는 것이다.

 

▶ Cache Memory의 시간적 지역성(Locality)

시간적 지역성(temporal locality of reference)이란 한 번 참조된 주소의 내용은 곧 다음에 다시 참조된다는 특성을 말한다.

시간적 지역성의 대표적인 예는 반복문(for, while)을 연상해 볼 수 있다. 반복문을 수행하면 특정 메모리 값으로 선언된 부분을 반복하여서 접근하게 된다. 이렇게 방금 전에 접근했던 메모리를 다시 참고하게 될 확률이 높아지는 것이 시간적 지역성이다.

 

지역성의 특성은 블록사이즈의 크기와 연관이 있다. 블록사이즈가 커지면 캐시의 Hit율도 올라간다. 그렇다고 해서 무작정 블록사이즈를 키우는 것만으로는 그 효율성을 높일 수 없다. 이에 따라 몇 가지 요소를 고려하여 설계해야 한다. 설계의 목표는 Hit율을 높이고 최소의 시간에 데이터를 전달하는 것이다. Hit 실패 시에 다음 동작을 처리하는 데 있어서 시간을 최소화하는 것이 중요하며, 데이터의 일관성을 유지해서 이에 따른 오버헤드를 최소화해야 한다.

 

 

Cache Memory의 쓰기 정책

CPU에서 메모리에 읽기 요청을 하게 되면 먼저 캐시에 그 해당 데이터가 있는지 확인한다. 이 과정에서 그 데이터가 있는 경우 Hit했다고 하여 그 해당 데이터를 가져오게 된다. 이 Hit를 위해서 언제, 어떤 방식으로, 어떤 데이터를 Cache Memory에 적재해둘 것인가가 Hit율을 좌우하고, 성능의 관심사가 된다.

이를 위해서 Write Through, Write Back 정책이 주로 사용된다.

 

▶ Write Through 정책

프로세서(CPU)에서 메모리에 쓰기 요청을 할 때마다 캐시의 내용과 메인 메모리의 내용을 같이 바꾸는 방식이다.

이 방식은 구조가 단순하다는 장점을 가지고 있지만, 데이터에 대한 쓰기 요청을 할 때마다 항상 메인 메모리에 접근해야 하므로 캐시에 의한 접근 시간의 개선이 없어지게 되며, 따라서 쓰기 시의 접근 시간은 주 메모리의 접근 시간과 같게 되는 단점을 가지게 된다. 하지만 실제 프로그램에서 메모리 참조 시, 쓰기에 대한 작업은 통계적으로 10~15%에 불과하며 따라서 그 구조가 단순하고, 메모리와 캐시의 데이터를 동일하게 유지하는 데 별도의 신경을 쓰지 않아도 되므로 많이 사용하는 방식이다.

 

Write Back 정책

CPU에서 메모리에 대한 쓰기 작업 요청 시, 캐시에서만 쓰기 작업을 하고, 그 변경 사실을 확인할 수 있는 표시를 해 놓은 후, 캐시로부터 해당 블록의 내용이 제거될 때 그 볼록을 메인 메모리에 복사함으로써 메인 메모리와 캐시의 내용을 동일하게 유지하는 방식이다.

이 방식은 '동일한 블록 내에 여러 번 쓰기를 실행하는 경우 캐시에만 여러 번 쓰기를 하고, 메인 메모리에는 한 번만 쓰게 되므로, 이 경우에 매우 효율적으로 동작하게 된다.

 

 

Cache Memory의 주소 매핑 방식

캐시 메모리는 실제 메인 메모리에 비해 그 크기가 매우 작아서, 메인 메모리와 1:1 매칭되는 동일한 주소 체계를 가질 수 없다. 그래서 메인 메모리와 다른 형태의 주소 매핑 방식을 사용하고 있다. 

일반적으로 direct mapping, associative mapping, set associative mapping과 같은 방법이 있다.

 

▶ 직접 매핑(direct mapping)

이 매핑 방식은 메인 메모리를 일정한 크기의 블록으로 나누고, 각각의 블록을 캐시의 정해진 위치에 매핑하는 방식이다.

이는 세 가지 매핑 방법 중 가장 간단하며 구현도 가장 쉬운 방식이다.

 

어소시에이티브 매팅(associative mapping)

직접 매핑이 동일한 라인 번호의 주소를 매핑할 수 없다는 단점은 캐시의 성능을 매우 저하시킬 수 있으며, 이에 대한 개선으로 캐시의 태그 필드를 확장하여, 캐시의 어떤 라인과도 무관하게 매핑시킬 수 있는 매핑 방법이 바로 어소시에이티브 매핑(associative mapping) 방식이다.

 

셋 어소시에이티브 매핑(set associative mapping)
어소시에이티브 매핑 방식이 어떤 주소든지 동시에 매핑시킬 수 있어 높은 히트율을 가질 수 있다는 장점을 가지고 있으나, 그에 준하는 단점 또한 가지고 있어 이들에 대한 장점을 취하고, 단점을 줄이기 위한 절충안으로 나온 것이 셋 어소시에이티브 매핑(set associative mapping) 방식이며, 많은 마이크로프로세서들이 이 방식을 택하고 있다.

매핑 방식 세 가지 기법 정리

 

 

Cache 일관성 문제를 해결하기 위한 프로토콜

공유 메모리 구조에서는 다중 프로세스가 메모리 사용 시 그 성능을 개선하기 위해서 Cache Memory에 저장하게 되는데, 이때 공유 메모리 간에 데이터의 불일치가 발생하게 된다.

캐시 일관성 문제는 주로 변경 가능한 데이터 공유, 프로세스의 이주, 출력 동작 시에 발생된다.

 

▶ 공유 Cache를 사용하는 방법

모든 프로세스들이 하나의 Cache를 사용하는 방법으로, 구조가 간단하나 프로세스 간 충돌이 심하다. 

 

▶ 버스 감시 매커니즘을 이용

스누피 제어기와 같이 변경에 대한 자신의 캐시 블록 상태를 제어하는 방식으로, Write Through 방식의 캐시 블록 상태와 Write Back 방식의 캐시 블록 상태를 감시하는 방식이다.

 

▶ 디렉터리 기반 캐시 일관성 유지 방법

캐시 정보 상태를 디렉터리에 저장하여 데이터 일관성을 유지하고 중앙 집중식(주기억장치 내) 디렉터리에 기억하는 방식이다.

 

 

Cache Memory의 교체 알고리즘

캐시에 빈 공간이 없는 상태에서 새로운 내용이 메인 메모리로부터 캐시 메모리에 복사되어야 하는 상황에서, 기존에 적재되어 있던 내용 중 어떤 것을 내릴 것인가 결정하는 것이 필요하다.

이 교체 알고리즘이 필요한데, 이 교체 알고리즘에는 FIFO, LRU, LFU 등이 있다.

Cache Memory 교체 알고리즘

▶ LRU(Least Recently Used)

교체에 있어서 지역성을 고려해서, 최근에 가장 많이 사용하지 않았던 내용을 내리는 것이 효율적인데, 이러한 방식을 LRU(Least Recently Used)라 한다. 이 방식의 구현을 위해서 각각의 라인에 추가적인 비트를 두고, 각 라인에 대한 데이터 참조 시, 그 발생하는 시점을 기록함으로써 이 방식을 실현하고 있다.