본문 바로가기
Computer Architecture/Basic

캐시 메모리(Cache Memory)의 원리

by FastBench 2023. 4. 10.

초안 :  2023.04.10

 

CPU 는 프로그램을 실행하기 위해 메모리에서 명령어 및 데이터를 불러온다.

문제는 이 과정이 칩 외부의 시스템버스를 통해서 이뤄지므로 딜레이가 상당하다는 것이다. 다음에 쓰일 명령어나 변수를 예측에서 코어 내부의 SRAM 기반 메모리에 박아둔다면 이와 같은 딜레이를 드라마틱하게 줄일 수 있을 것이다.

이를 위한 메모리가 바로 캐시메모리(Cache Memory) 이다.

 

 

CPU 내부에는 여러개의 캐시메모리가 존재하는데, 여기서도 코어와 가까운 순서대로 계층 (hierarchy)을 구성한다.

코어와 가장 가까운 캐시메모리를 L1 (level 1) 캐시, 그 다음을 L2 캐시, 그 다음을 L3 캐시라고 한다.

 

보통 L1, L2 캐시는 각 코어 내부에 있고 L3 은 코어 외부에 위치하면서 여러 코어가 공유하는 형태로 되어있다.

또한 L1 캐시의 경우 L1I, L1D 로 나누어 Instruction(명령어), Data(데이터) 만을 저장하도록 캐시를 분리하는 경우도 있다. 

이를 split cache 라고 한다.

캐시메모리는 CPU가 사용할 법한 데이터를 예측해서 저장을 해 놓아야 한다. 어떻게 이를 예측할 수 있을까?

 

캐시메모리는 지역성의 원리 (Principle of locality) 에 입각해서 메모리로부터 가져올 데이터를 결정한다. 

프로그램이 실행될 때, 주로 CPU가 메모리에 접근하는 경향은 아래와 같다.

1. CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다. (temporal locality)
2. CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다. (spatial locality)

temporal locality (시간적 지역성)

우리가 프로그래밍을 할 때, 변수에 값을 저장하고 추후 해당 변수에 접근하여 값을 사용한다.

즉, 변수에 저장된 값은 일반적으로 한번만 사용되지 않고 프로그램이 실행되는 동안 여러번 사용된다. (반복문을 떠올려 보자.)

따라서 CPU는 최근에 접근했던 (변수가 저장된) 메모리 공간을 여러번 다시 접근할 수 있다.

spatial locality (공간적 지역성)

프로세서가 사용하는 메모리 주소가 특정 부분에 모여있음을 의미한다.

만약 프로세서가 현재 1000번지의 명령을 읽는다면, 그 다음에는 1004, 그 다음에는 1008번지 등의 인근 번지를 읽을 확률이 높다. 물론 분기문을 만난다면 갑자기 다른 번지수로 점프할 수 있다. 허나 점프한 후에도 마찬가지로 그 다음에는 인근 번지를 읽을 확률이 높다.

명령어가 아닌 데이터의 경우에도 마찬가지인데, 배열을 처리하거나 구조체를 처리할 경우 메모리의 어느 한곳에 모여있을 것이기 때문에 메모리의 일부분을 집중해서 사용할 가능성이 크다. 

 


프로세서가 특정 주소의 명령 or 데이터를 읽으려고 할 때, 프로세서는 먼저 해당 주소의 내용이 캐시메모리에 저장되어있는지 확인하고 있다면 바로 읽어온다. 이를 Cache hit 라고 한다.

 

반대의 경우는 cache miss 라고 한다. miss 가 발생하면 프로세서는 메인메모리에서 해당 주소를 읽어오고 캐시에 저장(temporal locality) 할 뿐만 아니라, 인접 주소의 내용 또한 block 단위로 복사하여 캐시메모리에 저장(spatial locality)한다. 

 

프로세서가 메모리로 부터 주소를 읽으려고 할 때, 그 주소에 해당하는 데이터가 캐시메모리에 있을 확률 (즉, Cache hit 할 확률)을 cache hit ratio 라고 한다. 캐시메모리의 용량은 매우 작지만, 그래도 일반적인 프로그램의 경우 90% 이상의 hit ratio 가 나온다.

 

 

 

 

Reference

  • 혼자 공부하는 컴퓨터 구조 + 운영체제, 한빛미디어, 강민철
  • 컴퓨터 구조의 핵심, 퍼플, 양희재

 

 

 

 

댓글