2.3 기억 공간은 왜 여러 층으로 나뉠까
컴퓨터가 하는 일에서 기억이 차지하는 자리는 크다. 앞 장에서 칩을 연산하는 칩(시스템 반도체)과 기억하는 칩(메모리 반도체)으로 나누었고, 앞 절에서는 이 둘을 각각 CPU와 메모리로 만났다. 그런데 기억 공간이 메모리에만 있는 것은 아니다. 앞 절에서 보았듯 CPU 안에도 기억 공간이 있다. 왜 기억 공간은 한 군데에 모여 있지 않을까?
앞 절의 3+5를 떠올려보자. 〈그림 2-5〉에서 CPU는 3과 5를 메모리 자리에 둔 채로는 더하지 못했고, LOAD 명령어로 연산하는 곳 바로 옆의 기억 공간으로 가져온 다음에야 더할 수 있었다. 그런데 그 자리는 그렇게 크지 않다. CPU 안의 한정된 공간을 연산하는 부분과 기억하는 부분이 나누어 써야 하기 때문이다. 그래서 당장 연산에 필요한 데이터 일부만 연산하는 곳 가까운 자리에 두고, 나머지는 연산하는 곳에서 먼 자리인 메모리에 둔다.
사람도 기억해둔 것을 모두 똑같이 꺼내 쓰지는 않는다. 지금 머릿속에 떠올려놓고 쓰는 것이 있고, 조금 전에 봐서 금방 떠올릴 수 있는 것이 있다. 오래되어 애써 떠올려야 하는 것도 있고, 머릿속이 아니라 수첩에 적어두고 찾아봐야 하는 것도 있다. 컴퓨터도 그렇다. 연산하는 곳 바로 옆 자리와 메모리 사이에 층이 하나 더 있고, 메모리 뒤로도 한 층이 더 있다.
이렇게 해서 컴퓨터의 기억 공간은 크게 레지스터, 캐시, 메모리, 저장장치의 네 층으로 나뉜다. 레지스터와 캐시는 CPU 안에 있고, 메모리와 저장장치는 CPU 밖의 별개 부품이다. 메모리는 앞 절에서 본 디램(DRAM)이고, 저장장치로는 SSD(Solid State Drive)가 대표적이다. 〈그림 2-6〉에서 저장장치인 SSD의 실물을 볼 수 있다.


〈그림 2-7〉은 네 층을 연산하는 곳에 가까운 순서로 세우고 속도와 크기를 함께 보여준다. 연산하는 곳에 가까운 층부터 하나씩 살펴보자.
레지스터는 지금 바로 연산에 쓸 값이나 연산 결과를 잠시 담는다. 가장 빠르지만 가장 작다.
캐시는 메모리에 있는 명령어와 데이터 일부를 복사해 가까이 두는 곳이다. 연산을 하는 데 같은 명령어나 데이터가 다시 필요하면 메모리까지 가지 않고 캐시에서 꺼내 쓴다.
메모리는 지금 실행 중인 프로그램의 명령어와 데이터를 담는다. 앞 절에서 3과 5, 그리고 이들을 가져오고 더하라는 명령어가 놓여 있던 곳이다.
저장장치는 설치해둔 프로그램이나 우리가 만든 문서와 사진처럼, 당장 쓰지 않는 것까지 모두 담아둔다. 앞의 셋은 전원이 끊기면 내용이 사라지는 휘발성 기억 공간이지만, 저장장치는 컴퓨터를 껐다 켜도 내용이 남는다.
연산하는 곳에서 멀어질수록 느려지는 대신 저장 공간은 커진다. 기기마다 차이는 있지만 양 끝을 비교해 보면, 레지스터는 대략 10억 분의 1초도 안 되는 시간에 값을 내주는 반면 SSD는 그보다 수만 배 이상 걸리기도 한다.
이 속도 차이에는 두 가지가 함께 작용한다. 하나는 거리다. CPU 안에 있는 레지스터와 캐시는 데이터가 오가는 거리가 짧지만, CPU 밖에 있는 메모리와 저장장치까지는 더 긴 길을 오가야 한다. 다른 하나는 구조의 차이다. 빠르게 꺼내 쓸 수 있도록 만든 기억 공간일수록 같은 양을 담는 데도 칩 안의 자리를 더 많이 차지하고 비용도 더 든다.
그러니 빠른 자리를 마냥 크게 만들 수는 없다. 빠른 공간은 꼭 필요한 만큼 작게 두고, 많은 내용을 담아야 하는 곳은 속도를 조금 양보하는 대신 큰 용량을 싸게 마련한다. 여러 층을 함께 쓰는 것은 빠르기와 용량, 비용을 함께 고려한 선택이다.
이렇게 층이 나뉘어 있으니, 일반적으로 데이터는 그것이 있는 가장 가까운 아래 층에서 찾아, 연산하는 곳 쪽으로 한 층씩 끌어올려 사용된다. 프로그램을 실행하면 저장장치에 있던 명령어와 데이터가 메모리로 올라오고, 그중 일부가 캐시에, 당장 연산에 쓸 값은 레지스터에 놓인다. 가져온다고 해서 원래 있던 층의 내용이 없어지는 것은 아니다. 같은 데이터가 여러 층에 함께 놓일 수 있다. 연산 결과는 레지스터에 두고 다음 연산에 쓰기도 하고, 필요하면 반대 방향으로 내려보내 메모리에 기록하기도 한다. 그 결과를 컴퓨터를 끈 뒤에도 남겨두려면 저장장치에 기록해야 한다. 우리가 ‘저장’을 누르는 것이 그런 경우다.
각 기억 공간이 실제로 어떻게 만들어지는지는 뒤에서 칩 안을 들여다볼 때 다시 만난다. 지금은 기억 공간이 여러 층으로 나뉘고, 연산하는 곳에 가까울수록 빠르지만 작고, 멀수록 느리지만 크다는 것만 알아두면 된다. 그리고 이 절에서는 ‘메모리’를 디램 층의 이름으로 썼지만, 앞으로는 일반적인 기억 공간을 뜻할 때도 ‘메모리’를 대표로 쓰고, 각 층의 특징이 필요할 때만 이름을 따로 부르겠다.