CPU는 빠르지만, 데이터가 필요하다
CPU는 매우 빠르게 명령을 실행한다. 하지만 명령을 실행하려면 먼저 데이터와 명령어를 가져와야 한다. 아무리 계산 회로가 빨라도 필요한 값이 늦게 도착하면 CPU는 기다릴 수밖에 없다. 그래서 컴퓨터 성능의 많은 부분은 "얼마나 빨리 계산하느냐"뿐 아니라 "얼마나 빨리 데이터를 가져오고 저장하느냐"에 의해 결정된다.
문제는 빠르고 큰 메모리를 만들기 어렵다는 점이다. 빠른 메모리는 비싸고, 같은 비용으로 많이 만들기 힘들다. 반대로 큰 저장 공간은 싸게 만들 수 있지만 CPU가 바로 쓰기에는 느리다. 이 한계를 해결하기 위해 컴퓨터는 여러 종류의 기억장치를 층처럼 배치한다. 이것이 메모리 계층 구조다.

가까울수록 빠르고, 작고, 비싸다
CPU에 가장 가까운 곳에는 레지스터가 있다. 레지스터는 CPU 내부에 있는 아주 작은 저장 공간이다. 연산에 바로 사용할 값, 현재 실행 중인 명령과 관련된 값이 이곳에 놓인다. 속도는 매우 빠르지만 개수와 용량은 작다.
그다음에는 캐시 메모리가 있다. 캐시는 CPU 가까이에 두는 임시 보관소다. RAM보다 훨씬 빠르지만 용량은 작다. 보통 L1, L2, L3처럼 여러 단계로 나뉘며, CPU에 가까울수록 더 빠르고 작다.
그 아래에는 RAM이 있다. RAM은 실행 중인 프로그램과 데이터를 담는 주된 작업 공간이다. 우리가 프로그램을 실행하면 저장장치에 있던 파일이 RAM으로 올라오고, CPU는 RAM에 있는 명령어와 데이터를 읽으며 작업한다. 다만 RAM은 전원이 꺼지면 내용이 사라지는 휘발성 메모리다.
가장 아래에는 SSD나 HDD 같은 보조기억장치가 있다. 이곳은 전원이 꺼져도 데이터를 오래 보관한다. 용량은 크고 가격은 상대적으로 낮지만, CPU가 직접 빠르게 읽기에는 느리다.
RAM은 실행 중인 작업대다
RAM을 책상에 비유할 수 있다. 책장에 있는 책이 보조기억장치라면, 지금 펼쳐 놓고 읽는 책과 필기 도구는 RAM에 해당한다. 책상 위에 있어야 바로 볼 수 있고 사용할 수 있다.
프로그램도 마찬가지다. 실행 파일은 평소에 SSD 같은 저장장치에 있다. 사용자가 실행하면 운영체제가 그 프로그램의 코드와 필요한 데이터를 RAM에 올린다. CPU는 RAM에서 명령어를 가져오고, 계산 결과를 다시 RAM에 저장한다. 그래서 RAM이 부족하면 여러 프로그램을 동시에 실행하기 어려워지고, 컴퓨터가 느려질 수 있다.
메모리 주소로 위치를 찾는다
RAM 안에는 수많은 저장 칸이 있다. 컴퓨터는 각 칸을 구분하기 위해 메모리 주소를 사용한다. 주소는 데이터가 놓인 위치를 나타내는 번호다.
CPU가 어떤 데이터를 읽고 싶다면 "몇 번 주소의 값을 가져와라"라고 요청한다. 이때 주소를 전달하는 통로를 주소 버스라고 한다. 주소 버스가 위치 정보를 보내면, 메모리는 그 주소에 해당하는 칸을 찾아 데이터를 내보낸다. 데이터가 오가는 통로는 데이터 버스라고 부른다.
예를 들어 CPU가 1000번 주소에 있는 값을 읽으려 한다고 하자. CPU는 주소 버스를 통해 1000이라는 위치를 보낸다. 메모리는 그 위치를 찾고, 그곳에 저장된 비트들을 데이터 버스로 CPU에 전달한다. 쓰기 작업은 반대다. CPU가 주소와 데이터를 함께 보내면 메모리는 해당 위치에 값을 저장한다.
캐시는 CPU의 기다림을 줄인다
CPU와 RAM 사이에는 속도 차이가 크다. CPU가 매번 RAM에서 데이터를 기다리면 많은 시간이 낭비된다. 캐시는 이 문제를 줄이기 위해 자주 쓰는 데이터를 CPU 가까이에 미리 보관한다.
CPU가 어떤 값을 필요로 할 때 먼저 캐시를 확인한다. 캐시에 있으면 바로 가져다 쓴다. 이것을 캐시 히트라고 한다. 없으면 RAM에서 가져와야 한다. 이것을 캐시 미스라고 한다. 캐시 미스가 많아지면 CPU는 RAM 응답을 기다리느라 멈추는 시간이 늘어난다.
캐시는 단순히 한 개의 값만 저장하지 않는다. 보통 필요한 값 주변의 데이터도 함께 가져온다. 곧 이어서 사용할 가능성이 높기 때문이다. 이 판단의 바탕에는 지역성의 원리가 있다.
지역성은 빠른 컴퓨터의 숨은 규칙이다
지역성은 프로그램이 데이터를 사용하는 경향을 말한다. 최근 사용한 데이터를 다시 사용할 가능성이 높다는 것을 시간 지역성이라고 한다. 예를 들어 반복문에서 같은 변수를 계속 읽고 쓰는 경우가 그렇다.
반대로 한 위치를 사용하면 그 근처 위치도 곧 사용할 가능성이 높다는 것을 공간 지역성이라고 한다. 배열을 처음부터 끝까지 차례대로 읽는 경우가 대표적이다.
캐시는 이 성질을 이용한다. 자주 쓰는 값과 그 주변 값을 미리 보관해 CPU가 RAM까지 가지 않아도 되게 만든다. 가상 메모리도 비슷한 생각을 활용한다. 지금 필요한 부분을 우선 메모리에 두고, 덜 필요한 부분은 나중에 가져온다.
결국 메모리 계층은 타협의 결과다. 모든 저장 공간을 레지스터처럼 빠르게 만들 수 없기 때문에, 컴퓨터는 빠른 작은 공간과 느린 큰 공간을 함께 사용한다. 좋은 성능은 CPU의 속도만으로 나오지 않는다. 필요한 데이터가 적절한 시점에, 적절한 위치에 있어야 한다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
