CPU와 캐시, 메모리 계층
레지스터와 캐시라는 말을 들어봤는지 모르겠다.
메모리의 종류는 생각보다 많다. CPU 레지스터, 캐시메모리, 램, 하드디스크 등등...
우리의 컴퓨터는 전부 이러한 구조에 기반해서 구성이 되어있다.
가장 깊숙한 곳에는 CPU의 레지스터와 캐시메모리가 들어있다.
레지스터
레지스터는 CPU 내부에 포함된 작은 저장공간이다.
출처 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=han95173&logNo=130069015038
CPU가 무언가 의미있는 연산을 하려면, 무조건 레지스터를 거쳐야만 한다.
간단한 덧셈만 하려고 하더라도, 덧셈에 사용할 두개의 피연산자를 레지스터 메모리에 올리고, 바로 연산을 수행하는 형태가 된다.
레지스터는 가장 빠르지만, 개수가 매우 한정적이다.
인텔 CPU들이 제공하는 레지스터의 총 용량이 100바이트 좀 넘는 정도라고 한다. 1킬로바이트도 안 되는 것이다.
예전에는 훨씬 적었다.
그래서 보통 여분의 데이터들은 RAM이라고 부르는 좀더 크고 저렴한 메모리에 적재해서 사용한다.
최소 기가급-테라급까지 수용 가능하기 때문이다.
메인 메모리 (RAM)
보통 컴퓨터 맞출때 램 크기를 굉장히 중요시하는데, 그게 메인메모리다.
DRAM이라고도 부른다.
이렇게 생겨먹었고, 컴퓨터에 여러개 꽂을 수 있다.

특징으로는, 레지스터보단 느리지만 그래도 꽤 빠르고, 전원을 끄면 데이터가 날라간다는 것 정도가 있다.
CPU 레지스터에 다 수용하지 못하는 여분의 데이터들을 보관하는데 사용된다.
프로그램에서 일반적으로 "변수"를 할당한다고 하면 기본적으로 다 메인메모리에 할당되는거라 보면 된다. 단, 최적화를 잘 먹는다면 레지스터에 할당될 수도 있다.
컴퓨터의 전반적인 체감성능에 매우 큰 영향을 준다.
프로그램을 다 RAM에 올리지 못하면 더 느린 디스크에 저장을 해야하는데, 그러면 속도가 땅을 뚫기 때문이다.
예전에는 4기가, 8기가만 해도 크다고 했었는데, 요즘은 32기가쯤은 깔아줘야 쓸만하다.
1테라짜리도 1000만원쯤이면 사더라.
빠르고 참 좋지만 전원을 끄면 날라간다는 한계도 있고, 비용과 크기의 한계도 있어서 지속적인 저장은 디스크에 한다.
디스크
하드디스크라고도 부르는 그녀석이다.
예전에는 하드디스크밖에 없었는데 요즘은 더 빠른 SSD로 교체가 많이 되고 있는 상황이다.
이게 하드디스크고

이게 SSD다.

어쨌든 공통적으로 전원이 꺼져도 영구적으로 보존되는 비휘발성이고, 메모리보다 비용도 저렴하며, 크기도 훨씬 크다는 특징이 있다.
크기가 급속도로 커져서 요즘은 디스크라 하면 거의 테라급부터 시작하는 분위기가 됐다.
유일한 단점은 아무래도 메모리보다는 느리다는 것이다.
캐시 메모리
CPU는 당장 사용할 데이터는 레지스터에, 나중에 사용할 데이터는 램에 두고 쓴다고 했다.
그런데 생각보다... 레지스터와 램의 성능 차이는 매우 크다. 레지스터의 접근은 피코세컨드 단위로 완료되는데 반해, 메모리 접근은 수백 나노세컨드 단위로나 이루어진다.
이런 성능 간극에서 발생하는 병목을 줄이기 위해 중간에서 사용되는 것이 바로 캐시메모리다.
SRAM이라고 부르는데, 매우 비싸다.
원래 CPU와 별개인 개념이긴한데, CPU 사면 그 안에 패키징되어있다. 사실상 하나다.
캐시메모리의 접근은 매우 빨라서 나노세컨드 미만 단위로 완료된다.
그래서 메모리에서 자주 사용되는 데이터를 보관해놨다가 레지스터가 꺼내갈수 있게 해주는 역할을 한다.
이러한 원리를 캐싱이라고 하며, 소프트웨어 수준에서도 매우 자주 응용이 된다.
하지만 캐시메모리는 진짜 정말 매우 비싼 자원이라서, 대부분의 CPU에는 킬로바이트 단위 정도로 내장이 된다. 그래서 정말 필요한 것만 캐시 메모리에 올리도록 전략을 잘 짜야하는데... 항상 잘 되지는 않는다.
현대 소프트웨어에서 성능최적화의 상당부분을 차지하는 요소이기도 하다. 캐싱이 잘 되는 코드일수록 성능이 급속히 향상된다.
캐시, 캐시, 그리고 또 캐시
캐시메모리라고 단순하게 뭉뚱그려 말했지만, 현대 CPU들은 캐시메모리를 또 여러 단계로 나눠쓴다.
요즘은 3개 정도 된다.
제일 빠르고 작은것부터 L1 캐시, L2 캐시, L3 캐시다. 그리고 다 SRAM이다.

https://aidanbae.github.io/code/devops/computer/cpucache/
L1 캐시는 코어 하나당 하나씩 독립적으로 들고있다. 보통 8kb-64kb 정도 크기를 가지며 제일 빠르다. 메모리와 직접 소통하지는 않고, L2, L3 캐시를 통해 메모리에 간접접근을 한다.
L2 캐시는 몇개의 코어가 공유하는 캐시다. 보통 수십kb에서 몇mb 정도 된다. L1보다 느리고 L3보다 빠르다. L1 캐시와 메인메모리를 연결해준다.
싱글코어 환경에서는 L2까지만 사용된다.
L3 캐시는 보통 메가바이트 수준 용량을 가지고, 모든 코어들이 공유하는 메모리다. 몇mb에서 수십mb 정도 된다. L2 캐시와 메인메모리를 이어주며, 보통 멀티코어 환경에서 활용된다.