나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-12-13 04:01:25

메모리 계층 구조


[[컴퓨터공학|컴퓨터 과학 & 공학
Computer Science & Engineering
]]
[ 펼치기 · 접기 ]
||<tablebgcolor=#fff,#1c1d1f><tablecolor=#373a3c,#ddd><colbgcolor=#0066DC><colcolor=white> 기반 학문 ||수학(해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학(환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학(형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학 ||
하드웨어 구성 SoC · CPU · GPU(그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품
기술 기계어 · 어셈블리어 · C/C++ · C# · Java · Python · BIOS · 절차적 프로그래밍 · 객체 지향 프로그래밍 · 해킹 · ROT13 · 일회용 비밀번호 · 사물인터넷 · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시(SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화 · 하드웨어 가속
연구

기타
논리 회로(보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 운영 체제 · 데이터베이스 · 프로그래밍 언어{컴파일러(어셈블러 · JIT) · 인터프리터 · 유형 이론 · 파싱 · 링커 · 난해한 프로그래밍 언어} · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩(유니코드 · MBCS) · 네트워크 · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도(최적화) · 소프트웨어 개발 방법론 · 디자인 패턴 · 정보처리이론 · 재귀 이론 · 자연어 처리(기계 번역 · 음성인식) · 버전 (버전 관리 시스템 · Git · GitHub)


1. 개요2. 원인(돈과 용량, 성능의 반비례 관계)3. 컴퓨터 메모리의 종류
3.1. 레지스터3.2. 캐시 메모리3.3. 메인 메모리3.4. 스토리지 (SSD, HDD)3.5. 이동식 저장장치
4. 지역참조성5. 결론6. 관련 문서

1. 개요

파일:external/cs.uwec.edu/memory_hierarchy.png
컴퓨터의 설계에서, 각각의 특징이 있는 서로 다른 여러 종류의 기억 장치를 함께 사용하여 최적의 효율을 낼 수 있게 하는 것이다. 처리 속도가 빠른 저장 장치는 용량 대비 가격이 비싸고, 용량이 넉넉한 저장 장치는 처리 속도가 느리다. 그러나 컴퓨터가 행하는 작업은 매우 다양하다. 빠른 속도가 필요한 상황도 있지만, 단순히 많은 내용을 천천히 읽고 쓰는 작업도 그만큼 많다. 이러한 상황에 맞게 여러 저장 장치를 각각 사용할 수 있도록 하여 싸고 성능 좋은 컴퓨터를 구현하는 설계가 메모리 계층 구조다.

존 폰 노이만이 저술한 《컴퓨터와 뇌》[1]에서 처음으로 언급되었다. 폰 노이만 구조의 컴퓨터 알고리즘은 병목 현상이 필연적으로 발생할 수 밖에 없기에 이를 해결하고자 여러 방법이 고안되었는데 메모리 계층 구조가 그 방법들 중 하나이다.

2. 원인(돈과 용량, 성능의 반비례 관계)

컴퓨터의 저장장치는 두 가지 요건을 갖고 있다. 첫째는 단위 시간당 데이터 처리량을 의미하는 스루풋(throughput). 흔히 ‘대역폭’으로도 알려져 있는 이 능력은 쉽게 말해서 입출력의 속력이다. 같은 시간 안에 얼마나 많은 정보를 옮길 수 있는지, 또는 같은 양의 정보를 얼마나 빨리 옮길 수 있는지가 바로 스루풋이다. 둘째는 용량(capacity). 용량은 저장 장치에 담을 수 있는 정보의 총량이다. 일반적으로 입출력 속력이 빠를수록, 용량이 클수록 저장 장치의 가격은 올라간다.

예를 들어 SSDHDD를 생각해보자. SSD는 데이터를 읽고 쓰는 속력이 매우 빠르지만 1 GB당 가격이 비싸다. HDD는 반대로 속력이 느리지만 1 GB당 가격은 싸다. 2020년 1월 가격비교 사이트 기준 모 회사 DDR4 램 16 GB가 7만원인데, 같은 회사의 SSD는 500 GB에 9만원이고 다른 회사의 HDD는 6만원에 2 TB이다. 램에서 SSD, HDD로 내려올 수록 가격 대비 용량이 올라가고 속력이 내려가는 것을 볼 수 있다. 이는 RAM에서 캐시, 레지스터로 더 올라갈 때에도 마찬가지이다.

이론적으로는 돈을 아낌없이 써서 전부 SSD로 해결하는 게 최선이지만, 빠른 읽기/쓰기가 필요한 작업은 사실 많지 않다. 때문에 대부분의 컴퓨터는 SSD와 HDD를 둘 다 사용한다. 용량은 비교적 작지만 끊임없이 사용하고 성능에 직접적인 영향을 주는 운영체제(윈도우/리눅스/맥OS)와 자주 사용하는 프로그램은 SSD에, 용량은 크지만 사용하는 작업 자체는 단순해서 빠른 액세스가 필요하지 않은 동영상, 사진 자료 등은 HDD에 저장하는 것이다. 이렇게 하면 SSD의 성능과 HDD의 용량을 모두 얻을 수 있어, 보다 낮은 가격으로도 쾌적한 컴퓨터 이용이 가능해진다.

속력 뿐만 아니라 레이턴시(latency)[2] 차이도 크다. 같은 메모리 계층이라도 어떤 식으로 데이터를 요청해서 접근하는지에 따라 레이턴시 차이가 나타나지만, 현세대 CPU에서 평균적인 레이턴시 기준으로 L1 캐시 메모리는 1 ns 수준, L2 캐시 메모리는 2~3 ns 수준, L3 캐시 메모리는 10~15 ns 수준이나, 메인 메모리는 20~100 ns, NAND SSD는 100 μs ~ 1 ms, HDD는 5~15 ms 수준이다. 다만, 속력과 용량만큼 중요하게 생각하지 않는 이유는 빈번한 데이터 요청이 아닌 이상 대용량 처리할 때 속력이 빠를 수록 결과적으로 더 빠르기 때문이다.

이와 같은 저장 장치 간의 성능 차이에는 메모리 자체의 성능 문제도 있겠지만, CPU 차원에서의 소프트웨어적인 주소 처리 문제나 부품의 설계 자체에 의한 물리적 거리 문제도 있다. 이것이 모든 문제의 근원이다. CPU와 RAM 사이의 물리적 거리가 접근 속도에 영향을 미친다. 서버용 메인보드의 경우 CPU 소켓이 여러개 있는데 CPU와 메모리 뱅크가 번갈아가며 배치되어 있는 것도 각 CPU 소켓에 RAM를 최대한 가깝게 설치하도록 설계되어 있기 때문이다.

빠르고 큰 저장 장치는 비싸다는 것은 컴퓨터라는 개념 자체가 정립된 이래로 항상 발생한 문제점이기에, 컴퓨터 공학자들은 싸고 빠른 컴퓨터를 만들 수 있는 방법을 연구하기 시작했다. 그래서 1990년대에 들어서 레지스터-L1캐시-DRAM-HDD-플로피 디스크 정도의 메모리 계층 구조가 정립되었다. 그러나, 각 계층별 격차가 매우 크고 특히 L1 캐시 - DRAM과 DRAM - HDD 사이의 간극이 어마무시했던 관계로, 이로 인한 성능 최적화 한계를 극복하기 위해 메모리 계층 구조는 점점 더 복잡해지고 있다.

과거 PC에 L2 캐시가 있는 게 특이하던 시절도 있었으나, 이제는 L3 캐시가 보편화 되었고(인텔 Iris Pro등 극히 일부 제품에는 L4 캐시에 해당되는 물건도 달려있다!), DRAM과 HDD 사이에 NAND SSD를 추가하고, DRAM과 NAND SSD 사이에 3D XPoint 기반 SSD를 추가하고, SSD 방식으론 3D XPoint 성능을 100% 써먹지 못하는 문제를 해결하기 위해 옵테인 DIMM을 추가하고 #, 다시 주류 NAND SSD와 HDD 사이에 QLC SSD를 추가하는 등...설명만 읽어도 어지러울 지경 # (교량 부분을 우선 보는 게 이해가 쉬울 것이다[3]), #

그러나 계층이 지나치게 다층화되면 그건 그것대로 또 최소 비용의 증가를 불러오기 때문에 서버용 등에만 저런 복잡한 구조를 도입하고 2020년대 초반 가정용 PC는 레지스터-캐시-RAM-SSD-인터넷 또는 이동식 저장장치의 5단계로 1990년대에 비해 큰 변화가 없는 모습을 보이고 있다.

장치 간 소통의 원활함을 위해 장치 별로 메모리 계층 구조를 갖기도 한다. HDD나 SSD에서 볼 수 있는 버퍼 메모리가 대표적.

3. 컴퓨터 메모리의 종류

일반적인 컴퓨터 프로그램의 구동에는 레지스터, 캐시, RAM의 세 가지 기억 장치를 사용한다. 이들은 SSD와 HDD보다 처리 속도가 훨씬 빠른 기억 장치로, '주 기억장치'라고 부른다. 예를 들어, 지금 이 문서를 읽는 동안 여러분의 컴퓨터(또는 같은 기능을 하는 모바일 기기)는 웹 브라우저를 구동하고 있다. 이때 웹 브라우저는 RAM과 캐시, CPU를 통해 열심히 정보를 읽고 쓰는 중이다. 그 뒤 웹 브라우저를 끄고 게임을 할 때는 어떨까? 웹 브라우저는 더 이상 구동되지 않지만, 필요할 때 언제든지 다시 실행할 수 있도록 SSD, HDD에 브라우저 프로그램의 데이터는 남아 있다. 그러나 지금 당장 사용하고 있지 않기 때문에 RAM 이상의 처리 성능을 지닌 기억장치에는 웹 브라우저가 이미 들어있지 않다. 주 기억 장치는 게임을 실행하느라 바쁘다.

처리 성능과 가성비 외에도 주 기억장치는 HDD, SSD와 큰 차이점이 있다. 2020년대 현재 주 기억장치는 모두 휘발성 기억장치로, 전원이 공급되지 않으면 모든 데이터가 사라진다. 때문에 이들은 정보를 오랫동안 저장하는 기능에는 매우 부적합하다. 영구적으로 코드를 꽂아 놔야 하는 외장 하드 같은 물건은 정말 특수한 경우에나 쓰인다.

보다 자세한 사항은 틀:컴퓨터 메모리를 참조.

3.1. 레지스터

컴퓨터 기억 장치 중에서 가장 빠른 메모리로 CPU가 연산한 계산 결과를 저장하는데 쓰인다. CPU마다 다르겠지만 한 CPU에 100개 들어있으면 매우 많은 편. 그러나 무작정 많다고 좋은 건 아니고, CPU 스펙에도 포함되지 않는다. 자세한 것은 CPU 문서 참조.

메모리 계층 구조에서 가장 빠른 메모리이나 용량이 매우 적다는 것이 단점이다. 얼머나 적냐면 몇 바이트만 저장할 수 있다. 그래서 큰 데이터를 저장할 수 없고 CPU의 연산 결과를 저장하는데 사용된다.

3.2. 캐시 메모리

레지스터 다음으로 빠른 메모리로 CPU 코어와의 거리에 따라 L1 캐시, L2 캐시, L3 캐시 등으로 나뉜다. 보통은 SRAM으로 구성되어 있으며 작을수록이 CPU 코어와 가까운 상위 캐시 메모리로 빠르지만 용량이 적다. 반면 레벨이 높을수록이 용량이 크지만 CPU 코어와의 거리가 멀기에 속도가 느리다. 최하위 레벨 캐시의 경우 마지막 레벨을 의미하는 LLC(Last Level Cache)라고도 부른다. 또한 L1 캐시는 명령어 캐시와 데이터 캐시로 나뉘어져 있다.

보통은 프로그래머가 제어할 수 없으며 CPU의 메모리 컨트롤러에 의해 제어된다. 따라서 이러한 특징으로 사용자에게 투명(Transparent)하다고 한다. 물론 캐시의 특성을 이해하고 프로그래밍하면 훨씬 효율 좋은 코드를 생성할 수 있다.

CPU가 데이터를 요청할 때 먼저 캐시 메모리에서 가져오게 되며 마침 요청한 데이터가 캐시 메모리에 있어서 바로 가져올 수 있게된 경우를 '캐시 적중'이라고 부른다. 반면 요청한 데이터가 캐시 메모리에 없어 메인 메모리에서 직접 가져와야 할 경우를 '캐시 부적중'이라고 부른다. 당연히 캐시 적중률이 높아야 성능상 이득을 얻는다.

1960년대에는 CPU 안에 캐시 메모리가 없었고 메인보드에서 CPU와 메인 메모리 사이의 독립적인 칩으로 존재하였으나 CPU의 집적도가 높아지면서 1980년대부터 CPU 안에 캐시 메모리가 탑재되었다. 당시 하나의 캐시 메모리만 있었고 별도로 메인보드에 창작하는 캐시 메모리가 여전히 있었는데 이를 L2 캐시로 취급되었다. 1990년대 이후에는 L2 캐시도 CPU 안에 들어가게 되었다. 1990년대 후반부에 잠시 L2 캐시를 없앤 인텔 셀러론 시리즈의 코빙턴이 출시되었으나 큰 성능 하락으로 인한 혹평 속에 단종되는 등, 가정용 보급형 CPU에서도 L2캐시가 필수적이라 취급되는 세상이 왔고, 2000년대에는 L3 캐시가 추가되었다.

2024년 기준, 가정용 컴퓨터의 CPU의 캐시 메모리 용량은 L1 캐시는 코어당 수십 KB, L2 캐시는 수 MB에서 수십 MB, L3 캐시는 수에서 백수십 MB의 용량을 가지고 있다. L1 캐시와 L2 캐시는 CPU 코어[4]마다 존재하고 L3 캐시는 모든 코어에서 공용으로 사용하는 식으로 되어 있다.

3.3. 메인 메모리

CPU나 메인보드와 분리되어 있는 메모리 중에서는 최상위 메모리이자, 프로그램을 직접 구동하는 데 사용되는 '주 기억 장치'의 최하위 메모리. CPU와 캐시에 비하면 훨씬 느리지만, HDD는 말할 것도 없고 SSD에 비해서도 차원이 다르게 빠르다.

2021년 현재 가정용 PC당 수~수십GB 정도로 들어있으며[5], 주로 DRAM으로 구성된다.

이전에는 SRAM를 사용하였으나[6] SRAM는 DRAM에 비해 100배 이상으로 빠르지만 구조가 복잡하고 많은 면적을 차지하여 비싼데다 대용량으로 만들기 어렵다는 문제로 인해 지금은 적은 면적을 차지하고 저렴하면서 대용량으로 만들기 위한 DRAM으로 대체된 상태다.

3.4. 스토리지 (SSD, HDD)

프로그램이 구동될 때에는 직접 쓰이지 않는 '보조 기억장치' 또는 '저장소'들 중에서는 컴퓨터 안에 내장되어 있는 이 메모리들이 대개 최상위에 위치하게 된다. 둘 다 있는 컴퓨터에서는 대개 SSD가 HDD보다 상위에 위치하게 된다. 세부사항은 SSD, HDD 참조.

2023년 현재 가정용으로 SSD는 250GB ~ 2TB 정도, HDD는 1TB ~ 십수TB 정도의 용량으로 구성된다.

일반적으로는 ATA라는 중간 계층을 따로 두어 통신하지만, NVMe SSD처럼 PCIe 등을 통해 CPU와 직접 통신하는 경우도 있다.

3.5. 이동식 저장장치

USB 메모리, ODD 등을 의미한다. 기업용으로는 자기테이프도 있다.

때로는 키보드, 마우스 등 입력장치나 클라우드 스토리지 등을 이 위치에 넣는 경우도 있다.

4. 지역참조성

컴퓨터 프로그램은 메모리의 같은 지역을 자주 확인하는 경향이 있다. 게임을 예시로 들어 생각해 보자.

리그 오브 레전드라는 게임을 플레이한다고 치자. 플레이어는 마우스로 화면의 한 지점을 계속 우클릭하여 자신의 캐릭터인 '챔피언'을 조작하고 있다. 이때 챔피언의 위치 정보는 계속해서 바뀔 것이다. 때문에 CPU는 마우스를 읽어내면서 챔피언의 위치 기록을 끊임없이 바꾸어야 한다. 하지만 맵에 고정되어 있는 넥서스와 부쉬 등 지형의 위치는 보통 바뀌지 않는다. 그러니까 챔피언의 위치에 비해, 지형지물의 위치 데이터는 자주 읽을 필요가 없다. 그렇다면 자주 쓰는 정보만 빠른 메모리에 올려놓으면 되지 않을까?

CPU는 RAM보다 많이 빠르다. RAM에 데이터를 요청하면 RAM는 요청한 데이터를 CPU로 보내주게 되는데, 이 과정에서 CPU는 RAM으로부터 데이터를 받기 전까지 대기를 하게 된다. [7] 만약에 RAM에 챔피언의 위치 정보와 넥서스의 위치 정보를 모두 저장할 경우에는 CPU는 챔피언의 위치를 변경할 때마다 느린 RAM의 속도에 맞추어 잠깐 동안 멈춰야 하고 챔피언의 위치는 계속 바뀌는데 그 때마다 CPU가 대기를 하게 되어 컴퓨터가 전체적으로 느려진다.

그래서 CPU는 자주 변경되는 챔피언의 위치 정보를 캐시에 저장한다. 캐시는 레지스터보다 느리지만 RAM보다는 빠르기에 CPU가 챔피언의 위치를 바꿀 때마다 잠깐 멈추기는 하지만 훨씬 짧게 멈춘다. CPU가 멈추는 시간이 줄어들기 때문에 결과적으로 CPU가 더 열심히 일하게 되고 성능이 좋아진다.

그렇다면, 챔피언 말고 넥서스의 위치기록도 캐시에 올려놓으면 되지 않을까? 안 되는 건 아니지만, 캐시는 RAM보다 비싸다.[8] 다시 말해, 같은 용량의 정보를 담으려면 돈을 더 많이 써야 하고, 똑같은 가격으로 사도 저장 용량이 크게 부족하다. 그러니 자주 쓰는 챔피언 정보는 비싸지만 빠른 캐시에 올려두고, 자주 쓰지 않는 넥서스 정보는 느리지만 싼 RAM에 올려놓는 것이다.

이처럼 프로그램이 일부분만을 자주 사용하는 현상을 지역 참조성이라고 한다. 이 지역참조성은 특별한 한 프로그램에서만 일어나는 것이 아니라 거의 대다수의 프로그램에서 일어나는 것이 알려져 있다. 만약 당신이 웹브라우저에서 여러 탭을 켜 놓았다고 가정하자. 웹브라우저는 다른 탭보다 당신이 지금 보고 있는 이 탭의 정보에 보다 자주 접속할 것이다. 이처럼 거의 모든 프로그램이 자신이 가진 정보 중 일부분에 자주 접속하는 지역참조성 현상을 보인다.

5. 결론

싼 메모리는 용량이 크지만 느리고, 비싼 메모리는 용량이 작지만 빠르다. 대부분의 컴퓨터 프로그램들은 프로그램의 전체가 아닌 작은 부분에만 자주 접근하므로, 그 작은 부분만을 비싸고 빠른 메모리에 저장하고 사용하면 비싼 저장 장치로 컴퓨터를 도배하지 않아도 프로그램의 전체적인 성능이 향상된다. 이 때문에 컴퓨터 메모리는 용량이 많고 느린 아래쪽에서 시작해서 용량이 작고 빠른 위쪽으로 올라가는 계층구조를 지니고 있다. 이를 '메모리 계층 구조'라 한다.

6. 관련 문서



[1] 저술 도중에 사망하는 바람에 책은 그의 사후에 출판되었다.[2] 잠복이라는 의미도 있지만 컴퓨터 분야에서는 지연 시간, 대기 시간, 접근 시간, 호출 시간, 응답 시간이라는 의미로 사용된다.[3] 사실 나머지는 기술적 세부 사항 설명이거나 특정 제품 벤치마크 부분이라서, 이 문서에 관련된 개념 이해는 저부분만 보면 충분하다.[4] 단, 인텔 e코어는 4개의 코어 클러스터가 하나의 L2 캐시를 공유하여 사용한다.[5] 서버용은 이보다 큰 수~수십TB 정도로 들어있다.[6] 대표적으로 닌텐도 패미컴에 탑재된 Work RAM이 SRAM이다.[7] 실제로는 다른 일을 하는 경우가 잦다. 어디까지나 비유이다.[8] RAM의 용량 대비 가격은 공정 향상과 치킨 게임에 힘입어 어마무시한 수준으로 떨어졌지만 캐시 메모리는 수십년 동안 고작 3% 떨어지는 것에 그쳤다.