CPU는 빠르고, 메모리는 느리다.
두 장치의 속도차로 인한 비효율을 보완하기 위해 사용하는 것이 바로 캐시 메모리!
자주 쓰는 데이터를 캐시 메모리에 저장해 메모리에 접근하는 횟수를 줄인다.

캐시 메모리란?

캐싱(caching)은 컴퓨터의 처리 성능을 높이기 위한 기법이다.

CPU는 데이터를 처리하기 위해 메모리와 끊임없이 데이터를 주고받는다. 이 때 CPU에 비해 메모리는 속도가 느리기 때문에 메모리에 접근할 때 CPU는 효율적으로 사용되지 못한다.

 

캐시 메모리(cache memory)는 CPU와 메모리의 속도 차이로 인한 병목 현상을 완화하기 위해 사용한다. 캐시메모리는 메모리와 CPU 사이에 위치해 있으며, 메모리 계층 구조에서 레지스터 다음으로 상위에 위치한다.

 

출처 : https://www.quora.com/What-is-Memory-hierarchy

책상에서 자주 사용하는 물건을 가까운 자리에 두듯, 자주 사용하는 데이터를 CPU와 가까운 위치에 저장해 필요할 때 마다 빠르게 꺼내쓸 수 있다. 캐시메모리를 사용하면 CPU가 메모리에 접근하는 횟수를 줄여 성능 향상의 효과를 볼 수 있다. (CPU의 기능 자체에는 영향을 주지 않는다)

캐시 메모리는 가격이 비싸기 때문에 일반적으로 작은 용량으로 구성된다.

 

적중과 실패


캐시메모리가 있는 컴퓨터 시스템은 CPU가 메모리에 접근하기 전 먼저 캐시 메모리에서 원하는 데이터의 존재 여부를 확인한다. 이때 필요한 데이터가 있는 경우를 적중(hit), 없는 경우를 실패(miss)라고 한다.

 

이 때 요청한 데이터를 캐시메모리에서 찾을 확률을 적중률(hit ratio)이라고 한다.

캐시 메모리의 성능은 적중률에 의해 결정된다.

         캐시 메모리의 적중 횟수
적중률 = -----------------------
         전체 메모리의 참조 횟수

실패율은 반대로 캐시 메모리의 실패 횟수를 전체 메모리 참조 횟수로 나눈 값이며, (1 - 적중률)로 구할 수 있다.

 

보통 CPU는 데이터를 가져오기 위해 캐시 메모리 > 메모리 > 보조기억장치 순으로 접근한다.

  • 캐시 적중일 때 : 캐시 메모리의 데이터를 CPU 레지스터에 복사한다.
  • 캐시 실패/메모리 적중일 때 : 메모리의 데이터를 캐시 메모리에 복사하고, 캐시 메모리의 복제된 내용을 CPU 레지스터에 복사한다.
  • 캐시, 메모리 실패일 때 : 보조 기억장치에서 필요한 데이터를 메모리에 복사한다. 메모리에 복제된 내용을 캐시 메모리에 복제한다. 캐시 메모리의 복제된 데이터를 CPU 레지스터에 복제한다.

 

캐시메모리에 최대한 많은 데이터를 넣는다면 CPU에 필요한 대부분의 데이터를 빠르게 얻어올 수 있겠지만, 위에서 언급했듯 캐시메모리는 용량이 적기 때문에 작업 집합의 일부만을 적재할 수 있다.

 

마트에서 사용할 물류 창고를 만든다고 가정해보자.

물류 창고에 마트에서 팔 수 있는 모든 종류의 물건을 최대한 많이 갖다둔다면 손님이 원하는 물건이 품절돼서 사지 못하는 일이 드물 것이다. 하지만 현실적으로 공간의 크기와 건설 비용의 제약이 있으므로 물류 창고에는 잘팔리는 물건 위주로 보관하는 것이 유리할 것이다.

 

캐시 메모리의 성공 여부는 참조의 지역성(Locality of reference) 원리에 달려있다.

지역성은 짧은 시간 동안 제한된 주소 공간의 일부만 참조되는 경향을 말한다.

 

지역성의 종류

  • 시간적 지역성(temporal locality) : CPU가 한 번 참조한 데이터는 다시 참조할 가능성이 높다.
  • 공간적 지역성(spatial locality) : CPU가 참조한 데이터와 인접한 데이터 역시 참조될 가능성이 높다.
  • 순차적 지역성(sequential locality) : 분기가 발생하지 않는 한 명령어는 메모리에 저장된 순서대로 인출/실행된다.

지역성은 어디까지나 경향에 대한 것이므로 항상 캐시의 높은 적중률을 보장해주지는 않는다.

 

캐시 메모리의 기본 구성과 동작


CPU는 데이터를 요청할 때마다 캐시 메모리에서 해당 데이터의 존재 여부를 확인한다.

따라서 캐시 메모리는 요청받은 데이터를 탐색하는 기능이 필요하다.

캐시 메모리는 데이터를 관리하기 위해 데이터 메모리와 태그 메모리를 사용한다.

  • 블록 : 데이터의 기본 단위인 워드의 집합
  • 데이터 메모리 : 메모리의 데이터들이 저장된 블록으로 구성되어 있다.
  • 태그 메모리 : 데이터 메모리의 블록을 탐색할 정보를 포함한다.
    태그 메모리의 엔트리는 데이터 메모리 블록과 쌍을 이루면서 태그, 유효 비트, 갱신 비트를 포함한다. 또한 CPU 주소와 태그를 비교하는 비교기를 가지고 있다.
    • 태그(tag) : CPU가 요청한 데이터를 탐색하는데 사용할 주소의 일부. 캐시 블록 주소에서 인덱스로 사용되지 않는 부분이다.
    • 유효 비트(valid bit) : 캐시 블록이 유효한 데이터인지 나타낸다.
    • 갱신 비트(dirty bit) : 캐시로 블록을 가져온 후 CPU가 블록을 수정했는지 나타낸다.

 

기본적인 동작의 흐름

  • CPU가 캐시에 주소 전송 > 태그 메모리 탐색 > 일치하는 태그 발견 (hit) > 블록 상태 갱신(필요할 경우) >데이터 메모리에서 블록 추출 > 요청받은 데이터 선택 > 캐시가 CPU에 데이터 전송
  • CPU가 캐시에 주소 전송 > 태그 메모리 탐색 > 일치하는 태그 없음(miss) > 주소를 메모리로 전송해 대응하는 블록을 캐시에 저장 > 요청받은 데이터 선택 > 캐시가 CPU에 데이터 전송

 

캐시 메모리를 설계할 때 용량을 결정하는 것도 중요하지만, 캐시 메모리의 이용 전략을 정하는 것도 성능 측면에서 매우 중요하다. 다음 글에서는 캐시 메모리의 여러가지 설계 논점에 대해 정리하고자 한다.

 

참고 자료