테마
메모리와 캐시
CPU는 메모리보다 훨씬 빨라서, 계산보다 메모리를 기다리는 데 시간을 더 쓰는 일이 흔하다. 컴퓨터는 이 차이를 "작고 빠른 저장소를 CPU 가까이, 크고 느린 저장소를 멀리" 두는 계층 구조와, 자주 쓰는 데이터를 가까운 층에 복사해 두는 캐시 메모리(cache memory)로 메운다. 이 문서는 메모리의 종류와 계층을 보고, 캐시(cache)가 데이터를 찾는 순서와 찾지 못했을 때 치르는 비용을 정리한다.
RAM과 ROM
RAM(Random Access Memory, 임의 접근 메모리)은 실행 중인 프로그램의 명령어와 데이터를 담는 주기억장치다. "임의 접근"은 어느 주소든 거의 같은 시간에 읽고 쓸 수 있다는 뜻이다. RAM은 휘발성(volatility)을 가진다. 즉 전원이 꺼지면 내용이 사라진다. 그래서 오래 남길 데이터는 SSD·HDD 같은 보조기억장치에 따로 저장해야 한다.
RAM은 만드는 방식에 따라 둘로 나뉜다.
- DRAM(Dynamic RAM, 동적 램)은 작은 축전기(capacitor)에 전하를 담아 비트를 기억한다. 전하가 조금씩 새므로 주기적으로 다시 채우는 리프레시(refresh)가 필요하다. 칸 하나가 단순해서 싸고 용량을 크게 만들 수 있어 메인 메모리로 쓴다.
- SRAM(Static RAM, 정적 램)은 트랜지스터(transistor, 전기 신호를 켜고 끄는 반도체 스위치) 여러 개로 만든 회로에 비트를 붙잡아 둔다. 리프레시가 필요 없고 DRAM보다 훨씬 빠르지만, 칸 하나가 크고 비싸서 적은 용량만 캐시 메모리로 쓴다.
둘의 차이는 리프레시와 속도·가격이지 휘발성이 아니다. SRAM도 전원이 꺼지면 내용이 사라진다.
ROM(Read-Only Memory, 읽기 전용 메모리)은 전원이 꺼져도 내용이 남는 메모리다. 컴퓨터를 켜자마자 실행할 펌웨어(firmware, 하드웨어에 붙박이로 저장된 작은 프로그램)처럼, 운영체제가 올라오기 전에 필요한 프로그램을 담는다. 이름과 달리 요즘 쓰는 플래시 메모리(flash memory) 같은 ROM은 전기로 지우고 다시 쓸 수 있다.
메모리 계층
저장 장치는 빠를수록 비싸고 작다. 모든 데이터를 가장 빠른 장치에 둘 수는 없으므로, 속도와 용량을 맞바꾼 여러 층을 쌓는다. 이것을 메모리 계층(memory hierarchy)이라 한다. 맨 위의 레지스터(register)는 CPU 코어(core) 안에서 지금 계산 중인 값을 담는 가장 빠른 저장 공간이고, 맨 아래는 SSD·HDD 같은 보조기억장치다. 표의 L1·L2·L3에서 L은 단계(Level)를 뜻하고, 숫자가 작을수록 CPU에 가깝고 빠르다.
| 층 | 위치 | 한 번 접근 시간(대략) | 용량(대략) |
|---|---|---|---|
| 레지스터 | CPU 코어 안 | 1ns 미만 | 수백 바이트~수 KB |
| 캐시 메모리 L1·L2·L3 | CPU 칩 안 | 약 1ns~수십 ns | 수십 KB~수십 MB |
| 메인 메모리(DRAM) | 메인보드 | 약 100ns | 수 GB~수백 GB |
| 보조기억장치(SSD·HDD) | 저장 장치 | SSD 수십~수백 µs, HDD 수 ms | 수백 GB~수십 TB |
ns(나노초)는 10억분의 1초, µs(마이크로초)는 100만분의 1초, ms(밀리초)는 1000분의 1초다. 숫자는 세대와 제품마다 다르므로 자릿수 감각으로만 본다. 각 층은 대체로 바로 아래 층에 있는 데이터 일부를 복사해 들고 있다. CPU는 위층에서 먼저 찾고, 없을 때만 아래층으로 내려간다.
캐시 메모리
캐시는 한 번 가져온 데이터를 더 가까운 곳에 복사해 두고 다음에 다시 쓰는 저장소다. 캐시 메모리는 그중 CPU와 메인 메모리 사이에 있는 작고 빠른 SRAM이다. 요즘 CPU는 보통 세 단계를 둔다.
- L1: 코어마다 있고 가장 작고 빠르다. 명령어용과 데이터용을 따로 두는 경우가 많은데, 그러면 다음 명령어를 가져오는 일과 데이터를 읽는 일을 동시에 할 수 있다.
- L2·L3: 아래로 갈수록 크고 느리다. L2는 흔히 코어마다 따로, L3는 여러 코어가 함께 쓴다.
CPU는 가까운 층부터 차례로 찾는다.
다이어그램 로딩…
캐시는 바이트 하나가 아니라 캐시 라인(cache line)이라는 묶음 단위로 메모리에서 데이터를 가져온다. 많은 x86(PC·서버)·ARM(스마트폰 등) CPU에서 캐시 라인은 64바이트다. 그래서 주소 하나를 읽으면 그 옆 주소들도 함께 캐시에 올라온다. 프로그램은 이웃한 데이터를 이어서 읽는 경우가 많아서, 다음 접근 때 데이터를 캐시에서 바로 찾을 가능성이 커진다.
히트, 미스, 적중률
CPU가 찾는 데이터가 캐시에 있으면 캐시 히트(cache hit)다. 없어서 아래 층까지 가야 하면 캐시 미스(cache miss)다. 전체 접근 중 히트가 차지하는 비율을 적중률(hit ratio)이라 한다.
적중률이 중요한 이유는 미스 한 번의 비용이 히트보다 훨씬 크기 때문이다. 평균 접근 시간은 대략 "히트 시간 + 미스 비율 × 미스 한 번의 추가 시간"으로 계산한다. 히트가 1ns, 미스 한 번에 메모리까지 100ns가 더 든다고 해 보자. 적중률 95%면 1 + 0.05 × 100 = 6ns이고, 99%면 1 + 0.01 × 100 = 2ns다. 적중률이 4%포인트 올랐을 뿐인데 평균 시간은 3분의 1이 된다. 캐시가 가득 차면 새 데이터를 넣기 위해 기존 데이터 중 하나를 내보내야 한다. 이때 가장 오래 안 쓴 것을 내보내는 LRU(Least Recently Used, 최근 최소 사용)에 가까운 규칙을 흔히 쓴다. 최근에 쓰지 않은 데이터는 곧 다시 쓸 가능성도 낮다고 보기 때문이다.
이어지는 내용은 메모리와 캐시 2에서 다룬다.
면접 포인트
- "메모리 계층을 두는 이유는?" → 빠른 저장소는 비싸고 작다. 속도·용량을 맞바꾼 층을 쌓고, 위층에서 먼저 찾는다.
- "DRAM과 SRAM 차이는?" → DRAM은 리프레시 필요·싸고 큼·메인 메모리, SRAM은 빠르고 비쌈·캐시 메모리. 둘 다 휘발성.
- "적중률이 왜 중요한가요?" → 미스 한 번이 히트보다 훨씬 비싸다. 적중률 95%→99%면 평균 접근 시간이 3분의 1.
