본문 바로가기
Base/CS

효율성을 위한 메모리의 계층적 구조 (메모리 계층 구조)

by joooing 2021. 6. 13.
반응형

앞선 글에서는 컴퓨터가 어떻게 우리가 프로그래밍 언어로 작성한 코드를 알아듣고 처리하는지 알아보았다. 메모리와 구조에 대해서도 잠시 언급했는데, 이번 글에서는 메모리에 정보들을 더 효율적으로 저장하고 가져오기 위해 어떤 방법들을 사용했는지에 대한 이야기를 해보려고 한다. 컴퓨터에 있는 메모리들의 종류는 생각보다 훨씬 다양한데, 이 메모리들은 아래 피라미드 그림처럼 계층적인 구조를 이루고 있다. 지금은 낯설게 보일 수 있지만, 이 글을 다 보고나면 각 계층이 무슨 역할을 하고, 왜 이런 구조로 이루어지는지 알게될 것이다. 하나씩 차근차근 알아보도록 하자.

 

프로세서(CPU)-메모리(RAM) 격차

CPU는 어떤 명령어가 주어지면 내부 자체 메모리 셀인 레지스터에 데이터를 저장하고, 그 데이터들을 가지고 연산을 수행한다. 이 과정은 RAM과 끊임없이 데이터를 주고받음으로써 이루어진다.

 

하지만, CPU와 RAM은 메모리 접근속도 측면에서 차이가 난다. CPU는 RAM에 비해 속도가 굉장히 빠르다. CPU 명령어는 짧은 시간 내에 여러 연산들을 많이 수행할 수 있지만, RAM에서 데이터를 가져오는 시간은 훨씬 오래 걸리기 때문이다. 이렇게 되면 결국 CPU는 RAM에게 데이터를 읽거나 쓰는 작업을 요청하고, 작업이 진행되는 동안 마냥 기다려야 한다는 것이다. 아무리 CPU가 연산을 빠르게 수행해도, 데이터를 가져오고 저장하는 부분의 작업속도가 느리면 전체적인 처리 속도는 느려지게 된다.

 

아래 그래프에서도 볼 수 있듯이 CPU의 메모리 접근속도는 기술이 발전하면서 지수적으로 증가해왔다. 물론 RAM의 접근속도도 많이 증가했지만, CPU가 증가하는 것에 비하면 더딘 편이다. 이렇게 CPU와 RAM의 메모리 성능이 차이나는 것을 '프로세서-메모리 격차'라고 한다. 이런 격차에 대응하기 위해서는 어떻게 해야할까? 메모리에 좀 더 효율적으로 접근하는 방법에 대한 고민을 해야할 것이다. 컴퓨터 공학자들은 같은 계산을 처리하더라도 RAM이 연산하는 횟수를 최대한 줄이는 방법을 연구했고, 어떤 규칙성을 찾아냄으로써 효율성을 높일 수 있었다.

시간, 공간 지역성

RAM이 연산하는 횟수를 최소화하는 방법에 대해 고민하던 컴퓨터과학자들은 지역성이라는 개념에 대해 생각하게 되었다. 지역성은 데이터가 얼마나 가까이 있느냐에 대한 개념인데, 시간적으로 가까운 시간 지역성과 공간적으로 가까운 공간 지역성으로 구분할 수 있다.

좀 더 구체적으로 말하면, 시간 지역성어떤 메모리 주소에 접근했을 때, 잠시 후에 똑같은 주소에 다시 접근할 가능성이 높다는 규칙에 기반한 개념이다. 반면 공간 지역성어떤 메모리 주소에 접근했을 때, 잠시 후 그 근처의 주소에 접근할 가능성이 높다는 규칙에 기반한 개념이다. 이름 그대로 '시간'과 '공간'을 기준으로 이후에 접근할 가능성이 높은 메모리 주소들을 찾아내는 것이다.

 

시간 지역성 (temporal locality) : 어떤 메모리주소에 접근한 경우, 곧 똑같은 주소에 다시 접근할 가능성이 높음
공간 지역성 (spatial locality) : 어떤 메모리주소에 접근한 경우, 곧 근처 주소에 접근할 가능성이 높음

 

이런 규칙들을 어떻게 활용했길래 효율성을 높일 수 있던 것일까? 이렇게 조만간 접근할 가능성이 높은 메모리 주소들을 미리 예측하고, 그 주소들을 CPU의 레지스터에 미리 저장해두기로 했다. 이 방식을 사용해서 잘만 예측하면 CPU는 RAM에 굳이 접근하지 않고도 데이터들을 바로 꺼내 계산할 수 있게 된다. 즉, RAM 접근 연산 횟수를 엄청나게 줄일 수 있게 되는 것이다. 여기까지만 들으면 굉장히 이상적인 방법으로 보이지만, 문제가 하나 있었다. 이렇게 하려면 레지스터의 용량을 엄청나게 늘려야 한다는 것이다. 하지만 아직은 엄청난 용량의 CPU칩을 설계할 기술은 없었다. 좋은 방법이었지만 이런 용량 문제를 해결할 방법이 필요했다.

 

1차 캐시 (L1 Cache), 2차 캐시 (L2 Cache)

CPU의 레지스터 용량은 늘리지 못하더라도, CPU와 통합될 수 있는 보조 메모리를 만드는 것은 가능했다. 빠른 속도의 보조메모리를 하나 만들어 추가하는 것이다. 물론 보조역할을 해도 별개의 메모리이기 때문에, 레지스터로 옮기려면 물론 레지스터 자체에서 가져오는 것보단 시간이 좀 걸렸지만, RAM에서 가져오는 것보다는 훨씬 빠르게 작동할 수 있었다. 이 보조메모리가 바로 1차 캐시, L1 캐시이다. CPU와 RAM 사이에 위치하면서 속도와 용량이 둘의 중간 정도가 되는 메모리이다.

CPU 레지스터 용량을 늘리지 못하면, 보조 메모리를 하나 만들자!

 

이렇게 접근 가능성이 높은 메모리 주소의 데이터를, CPU의 레지스터와 더욱 가까운 곳에 임시로 저장해 둠으로써 데이터 전달 속도는 훨씬 빨라졌다. (거의 100배는 빨라졌다고 한다) 이렇게 속도가 훨씬 증가한 것을 보고, 그렇다면 1차 캐시의 용량을 더더욱 늘리면, RAM에서 데이터를 조회하는 연산횟수는 더더욱 줄어들지 않을까? 라는 생각을 할 수도 있을 것 같다. 하지만, CPU의 용량을 마냥 늘리지 못했던 것처럼 L1 캐시도 속도를 그대로 유지하면서 용량만 늘리는 것은 쉽지 않다. 그래서 다음으로 나온 아이디어는 그러면 메모리 캐시를 아예 한단계 더 추가하자는 것이었다. 이렇게 나오게 된 것이 2차 캐시, 바로 L2 캐시이다.

 

L1캐시가 CPU 레지스터의 캐시라면, L2 캐시는 L1 캐시의 캐시라고 할 수 있을 것 같다. 메모리들은 이렇게 계층적으로 서로의 캐시 역할을 해주게 되었고, 이로써 전체적인 효율성을 높일 수 있었다.

L1 캐시 용량을 늘리지 못하면, 캐시를 하나 더 늘리자!

 

여기까지의 내용을 정리하자면, 접근 가능성을 따졌을 때 가장 가능성이 높은 메모리 주소의 데이터들은 L1 캐시에 복사해두고, 그 다음으로 가능성이 높은 메모리 주소들은 L2 캐시에 복사해 두었다. 이 둘 모두에 찾는 데이터가 없으면 그때야 RAM에 직접 접근하는 것이다. 최근에는 더 나아가 L3 캐시를 탑재한 프로세서들도 나오고 있다. 이 캐시들은 CPU 칩에서 거의 대부분의 공간을 차지할 정도로 성능을 높이는 데 중요한 역할을 하고 있다.

CPU가 찾는 메모리가 L1에 없으면, L2에서 찾고, 그래도 없으면 RAM에 직접 접근!

 

지금까지 본 것만 해도 컴퓨터에는 RAM, L1, L2 캐시.. 등 굉장히 다양한 종류의 메모리들이 있었다. 그리고 이 다양한 메모리들은 각각 속도, 용량, 가격이 달랐고, 역할에 따라 계층적인 구조를 이루고 있었다. 처음에 봤던 그림을 아래 다시 가져와봤는데 이제 이 그림을 절반 정도 이해할 수 있을 것이다.

 

이 피라미드의 위쪽에 위치할수록 속도가 빠르고, 용량이 작고, 비싸다는 특징이 있다. 반대로 아래쪽에 있을수록 접근속도가 느리고, 용량이 크고, 저렴해진다. 그리고 L1, L2가 작동하는 방식처럼, 한 층의 메모리는 바로 아래층 메모리의 캐시 역할을 한다.

 

 

1차, 2차 메모리

위의 그림에서 CPU 레지스터 다음에 캐시들이 쭉 오고, 그 다음에 RAM이 있고, 더 아래층에는 하드디스크라는 메모리도 있다. RAM은 현재 실행중인 작업들에 필요한 데이터들을 저장하는 역할을 담당하는데 보통 16GB 정도면 용량이 큰 편에 속할 정도로 실행중인 프로그램들을 모두 담기에는 그리 용량이 크지는 않다.

 

하드디스크(HDD)는 TB 단위까지 나올 정도로 용량이 훨씬 커서(물론 속도는 그만큼 낮다) 컴퓨터의 프로그램들이나 훨씬 많은 데이터들을 보관한다. 뿐만 아니라 RAM이 포화상태 일 때, 당장 사용하지 않아도 되는, 우선순위가 낮은 데이터들을 '가상 메모리'라는 곳에 임시로 보관해주기도 한다.

 

RAM과 하드디스크도 역시나 속도와 용량이 차이가 나서 서로 다른 용도로 쓰인다. RAM을 1차 메모리, 하드디스크를 2차 메모리라고 부르는데, 이렇게 나누는 데는 이유가 있다. 일단 CPU는 2차 메모리에 직접 접근할 수 없고, 2차 메모리에 저장되어 있는 프로그램들은 1차 메모리로 복사되어야만 실행될 수 있다. 그래서 운영체제도 컴퓨터를 부팅할 때마다 반드시 2차 메모리에서 1차 메모리로 데이터들을 복사한 후에야 CPU로 실행을 시킬 수 있다.

RAM = 1차 메모리, HDD = 2차 메모리

 

최근에는 모터나 헤드같은 움직이는 부품들로 구성되는 하드디스크와 달리, 이런 부품들을 쓰지 않아 전력소모가 덜하고 안정적이고 빠른 SSD (Solid State Drive)라는 저장장치도 많이 사용한다. 아직까지는 그래도 좀 비싼 편이긴 해서, 자주 사용하는 데이터들만 SSD에 저장해두는 식으로 쓰기도 한다고 한다.

 

외부 저장장치, 3차 저장장치

다시 계층에서 조금 더 내려가 외부 저장장치에 대해서도 알아보도록 하자. 외부 저장장치는 이름처럼 컴퓨터 외부에 있는 저장장치이다. 데이터를 외부에 어떻게 저장한다는 걸까? 네트워크에 연결된 컴퓨터라면 이런 일이 가능하다. 로컬이나 인터넷을 통해서 다른 컴퓨터의 메모리에 접근을 할 수 있게 된다. 클라우드같은 것들이 여기에 해당한다. 물론 훨씬 가까이에 있는 내 컴퓨터의 메모리를 쓰는 것보다 접근시간은 훨씬 오래걸린다.

 

그럼 3차 저장장치는 뭘까? 언제나 컴퓨터와 연결되어 있지 않고, 늘 사용가능한 것도 아닌 저장장치를 이야기한다. USB나 CD같은 저장장치들이 해당한다고 할 수 있다. 하지만 여기에 저장된 데이터들에 접근하려면, 저장장치와 컴퓨터를 연결하는 과정을 거쳐야하기 때문에 시간이 오래 걸린다. 따라서 접근할 일이 많지 않은 데이터들을 보관하는 용도로 쓰는 것이 적합하다.

 

마무리

이제 이 피라미드에 있는 메모리 계층들이 CPU를 효율적으로 동작시키기 위해 각각 어떤 역할을 하고있는지 알게 되었을 것이다. 메모리 접근 속도를 최대한 빠르게 하기 위해 각각 속도나 용량 측면에서의 장단점을 살려서 계층적으로 역할을 분담하고 있었다. 덕분에 컴퓨터는 더 효율적으로 데이터들을 찾을 수 있었고, 우리도 점점 빠르고 성능 좋은 컴퓨터를 사용할 수 있게 되었다. 이제 메모리에 대한 이야기를 마무리 짓고 다음 글에서는 좀 더 범위를 넓혀, 웹 브라우저에 대해서도 알아보고자 한다.

 

반응형

댓글