[CS기초공부하기] 캐시메모리란?
오늘은 캐시메모리에 대해 공부를 해보고 정리를 해보고자 한다.
보통 어려운 개념을 만나게 되었을 때, 바로 해당 내용을 이해하기보다는 시각적으로 친숙해진 뒤, 해당 개념이 나오게 된 배경부터 공부를 하곤하였다.
캐시메모리는 나에게 낯설고 어려운 개념이었기에, 등장배경을 중심으로 캐시메모리에 대해 살펴보고자 한다.
캐시메모리란?
캐시 메모리는 CPU의 처리속도와 주기억장치의 접근 속도 차이를 줄이기 위해 사용하는 고속 Buffer Memory이다. 캐시메모리는 L1, L2, L3 캐시로 구성되는데, CPU안의 존재(L1)하기도 하고, CPU와 RAM사이의 존재(L2)하기도 한다. 각 캐시의 이름 앞에 붙은 L과 숫자는 level을 의미하고, 레벨이 낮을수록 크기가 작지만 빠른 속도를 보여준다. 작업관리자 창을 보면 각 L1, L2, L3 캐시가 얼마나 사용되는지도 확인할 수 있다.
데이터를 저장하는 공간의 속도와 용량은 반비례 관계이다. 따라서 대체적으로 속도가 빠른 메모리의 경우 저장공간이 작고, 느린메모리의 경우는 저장공간이 큰 특징을 가지게 된다.
캐시는 주로 CPU칩 안에 존재하는 아주 작은 메모리이므로, 그만큼 속도가 아주 빠르며 비싼 메모리인 것이다.
캐시메모리의 등장 배경
CPU의 성능이 빠르게 증가함에 따라 CPU와 CPU밖에 있는 DRAM(메모리)와의 속도 차이가 급격하게 증가하였는데, 이 때문에 CPU 쿨럭속도를 아무리 올려도 DRAM(메모리)에서 데이터를 빠르게 전달해주지 못해 전체 시스템 성능이 정체되는 문제가 발생하게 된다. 이에 따라 메모리의 한 종류인 SRAM(캐시메모리)가 등장하게 된다. SRAM(캐시메모리)는 기존 DRAM에 비해 속도가 훨씬 빠르지만 가격이 매우 비싸다는 단점이 있었다. 그래서 SRAM(캐시메모리)를 사용자가 직접 장착하게 하는 대신에 CPU와 DRAM 사이에 SRAM(캐시메모리) 장착 공간을 별도로 두어 데이터를 직접 접근하는 것보다 빠르게 접근하도록 만든 것에서 시작된다.즉 캐시메모리는 CPU와 메모리 사이의 속도차이를 줄이기 위하여 등장한 고속메모리인 것이다.
캐시메모리 작동원리
캐시메모리는 데이터 지역성(Locality)의 원리를 사용한다. 데이터 지역성을 알기 전에 '파레토의 법칙: 상위20%가 전체 생산의 80%를 담당한다'는 메모리 계층구조에도 적용된다. 즉 자주 사용하는 20% 메모리 계층을 효율적으로 사용한다면 80%의 일을 효과적으로 처리할 수 있다는 것이다.
캐시는 이처럼 자주 사용하는 데이터를 저장하여 상대적으로 멀리 있는 RAM에 접근하는 횟수를 줄여서 컴퓨터의 처리속도를 눈에 띄게 향상시키는 원리를 따르는 것이다.
'자주사용하는 데이터'에 대한 판단은 시간지역성(Temporal locality)와 공간지역성(Spatial locality)로 구분하여 생각해볼 수 있다.
시간지역성은 최근 접근한 데이터에 다시 접근하는 경향을 말한다. 예를 들어 for 루프에서 인덱스 역할을 하는 변수 i 에는 짧은 시간안에 여러번의 접근이 이루어진다.
for(let i = 0; i < 10; i++){
arr[i] = i
}
반면 공간 지역성은 최근 접근한 데이터의 주변 공간에 다시 접근하는 경향을 말한다. 위 루프에서 arr의 각 요소를 참조하면서 가까운 메모리 공간에 연속적으로 접근하고 있다. (배열의 요소들은 메모리 공간에 연속적으로 할당되기 때문)
위 그림은 페이즈를 참조한 기록으로, 가로 축은 실행시간이고, 세로 축은 메모리 주소이다. 즉 수평으로 이어진 참조기록(핑크)는 긴시간에 걸쳐서 같은 메모리 주소를 참조한 것이고(시간지역성), 수직으로 이어진 참조기록은 같은 시간 밀접한 메모리의 주소들을 참조한 것이다.(공간 지역성)
캐시메모리가 실제 동작하는 과정은 다음과 같다.
0) 캐시메모리에 데이터를 저장할 때, 공간지역성을 최대한 활용하기 위해 데이터와 옆 주소의 데이터도 같이 가져와 미래에 쓰일 것을 대비하고 있는다.
1) CPU가 메모리에 데이터를 요청할 때, DRAM에 접근하기 전 일단 캐시 메모리에 접근하여 데이터 존재 여부를 확인한다.
: 캐시 메모리는 DRAM에 비해 사이즈가 매우 작기 때문에 모든 데이터를 저장할 수 없고 자주 사용하는 일부 데이터만을 보관한다. DRAM은 보통 4GB~16GB 크기, 캐시메모리는 32KB ~ 8MB 정도의 크기를 가지고 있다.
2) CPU가 요청한 데이터가 캐시 메모리에 있다면, 이를 '캐시 히트(Cache Hit)'라 부르고 해당 데이터를 반환한다.
3) CPU가 요청한 데이터가 캐시 메모리에 존재하지 않는다면, 이를 '캐시 미스(Cache Miss)'라 부르고, 메인메모리에 접근하여 해당 데이터를 가져와 반환한다.
: 위 그림(오른쪽)에서 CPU가 요청한 12번 데이터가 캐시에 존재하지 않을 때, 메모리에서 가져오는 것을 보여준다.
정리
지금까지 캐시메모리란 무엇인지, 왜 등장하게 되었는지, 어떻게 동작하는지에 대하여 알아보았다.
요약하자면 캐시메모리는 CPU와 메인메모리간의 데이터 속도차이를 해결하기 위하여 등장하였고, CPU혹은 CPU와 RAM 사이 공간에 존재하여 자주 사용하는 데이터만을 미리 저장해두어 이를 해결하고 있는 아주 작고 빠른 메모리이다.
캐시에 대한 자료를 조사하고, 학습하는 과정에서 캐시가 실제로 어떻게 Indexing을 하여 동작하는지, 캐시히트율을 높이기 위한 방법들은 무엇이 있는지, 실제 적용되고 있는 캐시의 사례들도 같이 공부해보았다. 완벽하게 이해가 되지 않아 포스팅에 담지는 못하였지만 브라우저 상에서의 캐시밖에 몰랐던 나에게 꽤나 흥미로운 주제였다고 생각한다.