목차18개 항목
출처와 참고
노션 정리를 바탕으로, 계층별 역할은 ByteByteGo의 System Design 101 가이드 「Types of Memory」, 「Types of Memory and Storage」로, SRAM·DRAM의 구조와 DRAM 접근 타이밍·NUMA는 Ulrich Drepper의 「What every programmer should know about memory, Part 1」(2007)로 보강했다. 「계층별 접근 시간의 자릿수」, 「하드 디스크의 구성」, 「플래시 메모리와 SSD」, 「RAID」 등 일부 절은 강민철의 「혼자 공부하는 컴퓨터 구조+운영체제」 강의(한빛미디어)를 바탕으로 보강했다. 「매체마다 다른 접근 방식」 절은 CrashCourse의 「Crash Course Computer Science」 강의를 바탕으로 보강했다. 「메모리 대역폭」 절은 fru1tworld/cs-basic 모의 면접 질문 목록을 점검해 빠진 개념을 보강했다. 내부·외부 기억장치와 전송률, 「칩 조직과 기억장치 모듈 설계」, SDRAM 세대별 읽기 시간, 차세대 비휘발성 메모리, 하드 디스크의 기록 방식, 플래시 셀·NOR와 NAND·SSD 구성, RAID의 MTTF와 작은 쓰기 문제는 고려사이버대학교 「컴퓨터구조」(2024-1학기) 강의 내용으로 보강했다. karanpratapsingh의 「System Design」 강의 저장소를 바탕으로 RAID 레벨별 최소 디스크 수·용량 효율·허용 고장 비교를 보강했다.
빠른 메모리는 비싸고 작으며, 큰 메모리는 느리다. 그래서 컴퓨터는 여러 종류의 저장 장치를 계층으로 쌓고, 자주 쓰는 데이터를 위쪽에 두는 방식으로 "빠르면서도 큰" 메모리처럼 보이게 만든다.
메모리 계층
flowchart TB top["▲ 빠름 · 비쌈 · 작음"] ~~~ m1["레지스터"] ~~~ m2["L1 캐시"] ~~~ m3["L2 / L3 캐시"] ~~~ m4["메인 메모리 (DRAM)"] ~~~ m5["보조 기억 장치 (SSD / HDD / RAID)"] ~~~ m6["원격 보조 저장소 (네트워크 스토리지, 클라우드 백업, 테이프)"] ~~~ bottom["▼ 느림 · 저렴 · 큼"]
| 계층 | 역할 | 휘발성 |
|---|---|---|
| 레지스터 | CPU 안의 아주 작은 저장소. 지금 계산 중인 값을 담는다 | 휘발 |
| 캐시(L1~L3, SRAM) | CPU 가까이에서 자주 쓰는 메모리 내용을 복사해 둔다 | 휘발 |
| 메인 메모리(DRAM) | 실행 중인 프로그램과 데이터 | 휘발 |
| SSD | 반도체로 된 영속 저장소. 움직이는 부품이 없어 빠르다 | 비휘발 |
| HDD | 회전하는 디스크와 헤드로 된 대용량 장기 저장소 | 비휘발 |
| 원격 보조 저장소 | 네트워크로 접근하는 백업·보관용 저장소 | 비휘발 |
위로 갈수록 비트당 가격이 오르고 용량이 줄며 접근 시간이 짧아진다. 지역성 덕분에 CPU의 접근은 위쪽 계층에 몰려, 아래로 갈수록 접근 빈도가 떨어진다. 그래서 계층 전체의 성능 대 가격비가 좋아진다. 위 계층에 있으면 바로 쓰고 없을 때만 아래로 내려가는 평균 접근 시간 계산은 캐시 메모리와 MMU에 있다.
CPU가 주소로 직접 접근하는 레지스터·캐시·주기억장치를 내부 기억장치, 장치 컨트롤러를 거쳐야만 접근하는 디스크·SSD 등을 외부 기억장치라 한다. 전송 단위도 다르다. 주기억장치는 워드 단위로, 보조 기억 장치는 블록(512바이트, 4KB 등) 단위로 주고받는다.
기억장치의 속도는 두 값으로 잰다. 접근 시간은 주소와 읽기/쓰기 신호가 도착한 순간부터 접근이 끝날 때까지의 시간이고, 데이터 전송률은 초당 옮기는 양이다.
데이터 전송률 = (1 / 접근 시간) × 한 번에 읽는 양
접근 시간 100ns, 한 번에 32비트(4바이트) → 4B / 100ns = 40MB/s계층별 접근 시간의 자릿수
계층 사이의 속도 차이는 몇 배가 아니라 몇 자릿수다. Jeff Dean이 정리해 널리 퍼진 「모든 프로그래머가 알아야 할 지연 시간」 표의 대표값은 다음과 같다. 정확한 값은 하드웨어 세대마다 다르므로 자릿수만 본다.
| 동작 | 대략의 시간 |
|---|---|
| L1 캐시 참조 | 0.5ns |
| L2 캐시 참조 | 7ns |
| 메인 메모리 참조 | 100ns |
| 메모리에서 1MB 순차 읽기 | 250µs |
| 하드 디스크 탐색(seek) | 10ms |
| 하드 디스크에서 1MB 순차 읽기 | 20ms |
| 캘리포니아 ↔ 네덜란드 패킷 왕복 | 150ms |
L1 참조와 디스크 탐색은 약 2천만 배 차이다. 하드 디스크에서 1MB를 읽는 시간은 대륙 간 네트워크 왕복과 같은 자릿수다. 웹 쪽 지연 숫자는 프론트엔드 개발자가 알아야 할 지연 시간 숫자에 있다.
시스템 설계에서도 같은 원리를 쓴다. 자주 읽는 데이터는 위 계층(메모리 캐시)에, 오래 보관할 데이터는 아래 계층(오브젝트 스토리지·아카이브)에 둔다. 블록·파일·오브젝트 스토리지
계층을 잇는 버스
| 버스 | 연결 대상 |
|---|---|
| 내부 버스 | CPU 내부의 레지스터, 캐시 |
| 외부(시스템) 버스 | CPU ↔ 메인 메모리 |
| 입출력 버스 | I/O 프로세서 ↔ 디스크 등 외부 장치 |
주기억 장치
실행 중인 프로그램과 데이터를 담는 빠른 저장소로, RAM과 ROM으로 구성된다.
- RAM: 읽기/쓰기 가능. 실행 중인 프로그램을 담는다.
- ROM: 읽기 전용(현재는 주로 Flash). 전원이 꺼져도 남아야 하는 펌웨어(BIOS, 현재 PC는 UEFI)와 부트스트랩 코드를 담는다.
RAM의 종류
RAM은 전원이 꺼지면 내용이 사라지는 휘발성 저장 장치다. CPU는 보조기억장치에 직접 접근하지 못하므로, 실행할 프로그램은 보조기억장치에서 RAM으로 복사된 뒤 실행된다. 그래서 보조기억장치에는 "보관할 대상"을, RAM에는 "실행할 대상"을 둔다. RAM이 크면 미리 올려 둘 수 있는 데이터가 많아 실행이 빨라지지만, 필요 이상으로 크면 효과가 없다.
| 종류 | 특징 | 주된 용도 |
|---|---|---|
| DRAM (Dynamic) | 시간이 지나면 데이터가 사라져 주기적으로 다시 써야(refresh) 한다. 소비 전력이 낮고 싸며 집적도가 높다 | 주기억장치 |
| SRAM (Static) | 전원만 있으면 데이터가 유지되고 DRAM보다 빠르다. 집적도가 낮고 전력 소모가 크며 비싸다 | 캐시 메모리 |
| SDRAM (Synchronous) | 클럭에 동기화되어 클럭마다 CPU와 데이터를 주고받는 DRAM. SDR SDRAM이라고도 한다 | 주기억장치 |
| DDR SDRAM (Double Data Rate) | 한 클럭에 두 번 데이터를 주고받아 대역폭을 두 배로 넓힌 SDRAM. DDR2·DDR3·DDR4·DDR5로 갈수록 대역폭이 넓어진다. 2026년 기준 새 데스크톱·서버는 DDR5(JEDEC 규격 최대 8800MT/s), 노트북·스마트폰은 저전력판 LPDDR5·LPDDR5X를 쓴다 | 주기억장치 |
DRAM과 플래시 사이를 메우려는 차세대 비휘발성 메모리도 있다. 셋 다 전원이 꺼져도 남고 플래시보다 훨씬 빠르게 쓸 수 있지만, DRAM보다는 느리다.
| 종류 | 저장 원리 | 쓰이는 곳 |
|---|---|---|
| PRAM(PCM, 상변화 메모리) | 특수 합금(GST)에 짧고 높은 전압을 주면 저항이 낮은 결정 상태, 길고 낮은 전압을 주면 저항이 높은 비정질 상태가 된다. 저항 차이로 0과 1을 읽는다 | 상변화 계열로 알려진 인텔 Optane(3D XPoint)이 상용화됐지만 2022년 단종됐다 |
| FRAM(FeRAM, 강유전체 메모리) | 전기를 끊어도 분극 방향이 유지되는 강유전체(PZT)의 분극으로 저장한다 | 쓰기가 잦고 전력이 적어야 하는 마이크로컨트롤러, 계측기, 스마트카드 |
| MRAM(자기 저항 메모리) | 얇은 절연막을 사이에 둔 두 자성층의 자화 방향이 같으면 저항이 낮고(터널링 전류가 흐름), 반대면 높다 | 임베디드 MCU·SoC의 내장 비휘발성 메모리(eMRAM) |
SRAM과 DRAM이 다른 이유
| SRAM | DRAM | |
|---|---|---|
| 한 비트 | 트랜지스터 6개(서로 물린 인버터 두 쌍) | 트랜지스터 1개 + 커패시터 1개 |
| 유지 | 전원만 있으면 그대로 | 커패시터의 전하가 새므로(leakage) 64ms마다 재충전(refresh). 재충전 중인 행은 읽을 수 없다 |
| 읽기 | 신호가 곧바로 나온다 | 읽으면 전하가 빠지고, 신호가 약해 감지 증폭기가 필요하며, 충·방전에 시간이 걸린다 |
| 크기·값 | 셀이 커서 비싸다 | 셀이 작고 규칙적이라 촘촘히 싸게 만든다 |
그래서 빠르지만 비싼 SRAM은 CPU 캐시에, 느리지만 싼 DRAM은 주기억장치에 쓴다. 주기억장치는 원리적으로 느리다는 것이 캐시를 고려해 코드를 짜야 하는 출발점이다(캐시를 고려한 코드).
DRAM 접근은 왜 느리고, 왜 순서대로 읽으면 빠른가
DRAM 칩의 셀은 행과 열의 격자다(셀을 격자로 놓는 이유는 디지털 논리 회로와 부품의 「메모리 셀을 행렬로 배치하는 이유」). 주소선을 아끼려고 주소를 두 번에 나눠 보낸다.
flowchart TB s1["RAS(행 주소 선택): 행 주소를 보내 한 행 전체를 감지 증폭기로 연다"] s2["CAS(열 주소 선택): 열 주소를 보낸다"] s3["데이터 전송: 한 번에 여러 워드를 연속 전송(burst) → 캐시 라인 하나를 채운다"] s4["다른 행을 열려면 지금 행을 닫고 프리차지<br/>tRP(행 프리차지 시간), 행을 연 뒤 최소 tRAS가 지나야 닫을 수 있다"] s1 -->|"tRCD(RAS→CAS 지연) 기다림"| s2 s2 -->|"CL(CAS 지연) 기다림"| s3 s3 --> s4
모듈 사양의 CL-tRCD-tRP-tRAS(예: 2-3-2-8) 숫자가 이 대기 클럭 수다.
주소를 두 번에 나누면 핀이 절반으로 준다. 16M × 4비트(64Mbit) 칩은 셀을 4096행 × 4096열 × 4비트로 배열하므로 위치 16M개에 주소 24비트가 필요하지만, 행 주소 12비트와 열 주소 12비트를 같은 12개 핀으로 차례로 넣는다. CPU가 낸 주소를 행·열로 쪼개 순서대로 보내고 그에 맞춰 RAS·CAS 신호를 만드는 것이 메모리 컨트롤러다.
- 이미 열린 행 안에서는 RAS 없이 CAS만 다시 보내면 되므로, 연속 주소를 읽는 순차 접근이 훨씬 빠르다. 행을 계속 바꾸는 무작위 접근은 프리차지·활성화 대기가 매번 붙는다.
- 버스의 최고 속도는 「전송만 계속할 때」의 값이다. 행을 바꿀 때마다 쉬는 클럭이 생겨, 이론상 6.4GB/s인 버스가 무작위 접근에서는 1.8GB/s까지 떨어지는 예도 있다.
- DDR은 클럭의 올라가는 쪽과 내려가는 쪽에서 모두 전송해 셀 배열의 주파수를 올리지 않고 대역폭을 늘린다. 대역폭은 늘지만 첫 데이터가 나오기까지의 지연은 줄지 않는다. 메모리 지연이 세대가 바뀌어도 약 100ns 근처에 머무는 이유다.
메모리 대역폭
대역폭은 단위 시간에 옮길 수 있는 데이터 양이고, 첫 데이터까지 걸리는 지연과는 다른 축이다.
채널 하나의 최대 대역폭 = 전송 속도(MT/s) × 버스 폭(8바이트)
DDR5-6400 채널 하나: 6400 × 10⁶ × 8B = 51.2GB/sSDRAM 세대별로 64비트 버스에서 버스트 8번(캐시 라인 64바이트)을 읽는 시간을 비교하면, 첫 데이터까지의 지연(CAS 지연, 여기서는 15ns로 고정)은 그대로이고 전송 구간만 줄어든다.
| 방식 | 버스 클럭 | 전송 | 버스트 8회 읽기 | 최대 대역폭 |
|---|---|---|---|---|
| SDR SDRAM (PC133) | 133MHz (7.5ns) | 클럭당 1번 | 15 + 7.5 × 8 = 75ns | 133M × 8B ≈ 1.06GB/s |
| DDR-266 | 133MHz | 상승·하강 에지에서 2번 | 15 + 3.75 × 8 = 45ns | ≈ 2.13GB/s |
| DDR2-533 | 266MHz (3.75ns) | 2번 | 15 + 1.875 × 8 = 30ns | ≈ 4.26GB/s |
전송 구간은 60 → 30 → 15ns로 절반씩 줄지만 CAS 지연이 남아 전체 시간은 그만큼 줄지 않는다. 위 「DRAM 접근」에서 본 「대역폭은 늘어도 지연은 그대로」의 숫자 예다.
CPU는 메모리 채널을 여러 개 두어 대역폭을 더한다. 데스크톱은 2채널, 서버 CPU는 소켓당 8~12채널이다. 그래도 코어가 늘수록 코어 하나에 돌아가는 몫은 줄어든다. 큰 배열을 한 번씩 훑기만 하는 작업(스트리밍, 복사, 계산이 적은 벡터 연산)은 CPU가 아니라 대역폭이 상한을 정하는 메모리 바운드 작업이라, 코어를 늘려도 빨라지지 않는다. 가져온 바이트당 계산량을 늘리는 블로킹, 데이터를 작게 만드는 압축·작은 타입, 같은 NUMA 노드의 메모리를 쓰게 하는 배치가 대책이다(캐시를 고려한 코드). GPU와 AI 가속기가 DRAM을 칩 옆에 쌓은 HBM을 쓰는 이유도 대역폭이다.
NUMA: 모든 메모리가 같은 거리에 있지 않다
과거 PC는 모든 CPU가 하나의 버스(FSB)로 노스브리지의 메모리 컨트롤러에 붙어, 메모리 대역폭을 모두가 나눠 썼다. 지금은 메모리 컨트롤러가 CPU 안에 들어 있고 소켓마다 자기 메모리가 붙는다. 소켓이 둘 이상인 서버에서는 다른 소켓의 메모리를 읽으려면 소켓 간 연결을 건너야 하므로 더 느리다. 이를 NUMA(Non-Uniform Memory Access)라 하고, 추가 비용을 NUMA 계수라 한다. 대역폭은 소켓 수만큼 늘지만, 스레드와 그 스레드가 쓰는 메모리를 같은 노드에 두어야 빠르다(Linux numactl, 첫 접근 시 할당되는 first-touch 정책).
칩 조직과 기억장치 모듈 설계
칩 용량이 같아도 조직(위치 수 × 위치당 비트)에 따라 주소선과 데이터선 수가 달라진다. 위치가 N개면 주소선 A개는 2ᴬ = N을 만족한다.
| 64비트 칩의 조직 | 주소선 | 데이터선 | 같은 방식의 1Gbit 칩 |
|---|---|---|---|
| 8 × 8 | 3 | 8 | 128M × 8 → 주소 27비트 |
| 16 × 4 | 4 | 4 | 256M × 4 → 주소 28비트 |
| 64 × 1 | 6 (행 3 + 열 3, 3×8 디코더 2개) | 1 | 1G × 1 → 주소 30비트 |
- 128 × 8 RAM: 8비트 워드 128개 → 주소선 7개(2^7 = 128). 칩 선택(CS) 신호가 활성일 때만 동작하고, RD/WR 신호로 읽기/쓰기를 고른다.
- 512 × 8 ROM: 읽기만 가능, 주소선 9개(2^9 = 512).
칩 하나로 모자라면 여러 개를 묶어 모듈을 만든다. 무엇이 모자라냐에 따라 잇는 방법이 다르다.
| 모자란 것 | 연결 | 방법 | 예 |
|---|---|---|---|
| 워드 폭 (칩의 데이터 비트 B < 워드 N비트) | 병렬 | N/B개를 나란히 놓고 주소선과 CS를 모두 공통으로 잇는다. 한 주소의 워드가 칩마다 B비트씩 나뉘어 저장된다 | 1K × 8 칩 4개 → 1K × 32 (주소 A9 |
| 위치 수 (용량) | 직렬 | 하위 주소 비트는 모든 칩에 공통으로, 남는 상위 비트는 디코더로 풀어 칩 하나의 CS만 켠다. 데이터선은 공통이다 | 1K × 8 칩 4개 → 4K × 8 (A9 |
설계는 필요한 용량 결정 → 칩 선택과 주소 맵(어느 칩이 몇 번지부터 몇 번지까지 맡는지) 작성 → 세부 회로 순으로 한다. 예를 들어 8비트 마이크로컴퓨터에 ROM 1KB(0번지부터)와 RAM 2KB(800H번지부터)를 1K × 8 ROM 하나와 512 × 8 RAM 네 개로 붙인다면, 주소 맵에서 RAM 네 개가 800H9FFH, A00HBFFH, C00HDFFH, E00HFFFH를 나눠 맡도록 상위 주소 비트를 디코딩한다. 64비트 컴퓨터용 DIMM이 64M × 8 SDRAM 칩 8개를 병렬로 이어 512MB, 64비트 폭을 만들고, 9번째 칩을 더해 8비트 ECC를 함께 저장하는 것도 같은 원리다.
DRAM 모듈
DRAM 칩을 기판에 모아 꽂아 쓰는 형태로 발전해 왔다: SIMM(한쪽 면 접점) → DIMM(양면 독립 접점, SDRAM/DDR 세대) → 노트북용 소형 SO-DIMM. 세대(DDR … DDR5)마다 핀 수와 슬롯이 달라 서로 꽂히지 않는다.
보조 기억 장치
하드 디스크의 구성
- 플래터: 데이터가 기록되는 원판 (트랙 → 섹터, 같은 반경의 트랙 묶음이 실린더)
- 스핀들: 플래터를 회전시키는 모터
- 헤드 / 암: 헤드가 읽고 쓰며, 암(액추에이터)이 헤드를 원하는 트랙으로 옮긴다
- 컨트롤러: 기계 제어와 버스 인터페이스를 맡는 작은 컴퓨터
플래터는 보통 여러 장이고 양면을 모두 쓴다. 면마다 헤드가 하나씩 있고, 모든 헤드는 한 디스크 암에 붙어 함께 움직인다. 그래서 연속된 데이터는 한 트랙을 다 채운 뒤 옆 트랙으로 가지 않고 같은 실린더의 다른 면에 이어서 기록한다. 헤드를 옮기지 않고(탐색 없이) 면만 바꿔 가며 읽을 수 있기 때문이다. 섹터 하나 이상을 묶은 단위를 블록이라 부르며, 파일 시스템은 이 블록 단위로 공간을 관리한다(파일 시스템 구현).
바깥쪽 트랙은 안쪽보다 길다. 트랙에 데이터를 어떻게 싣느냐에 따라 두 방식이 있다.
| 방식 | 동작 | 장점 | 단점 |
|---|---|---|---|
| 등각속도(CAV) | 모든 트랙에 같은 수의 섹터. 일정한 속도로 돌며 어느 트랙이든 같은 비율로 읽는다 | 구동 장치가 단순하다 | 바깥 트랙의 기록 밀도가 낮아 공간이 낭비된다 |
| 다중 영역 기록(MZR) | 표면을 동심원 영역(zone) 여러 개로 나누고 바깥 영역일수록 트랙당 섹터를 더 많이 둔다. 영역 안에서는 밀도가 같다 | 전체 용량이 커진다 | 제어 회로가 복잡하고, 영역마다 읽기·쓰기 속도가 조금씩 다르다 |
현대 하드 디스크는 MZR(ZBR)을 써서, 같은 디스크라도 바깥쪽(앞쪽 LBA)의 순차 전송이 안쪽보다 빠르다.
포맷(formatting)은 트랙과 섹터의 시작·끝을 구분하는 제어 정보를 디스크에 미리 기록하는 작업이다. 섹터 하나는 데이터(예: 512바이트) 앞에 ID 필드(동기 바이트, 트랙·헤드·섹터 번호)를 두고, 오류 검출용 CRC를 붙인다. 섹터 사이와 트랙 사이에는 헤드 정렬 오차와 자기 간섭을 막는 틈(gap)을 둔다. 지금의 디스크는 섹터 데이터를 4KB로 키운 Advanced Format을 쓴다.
접근 시간(탐색 + 회전 지연 + 전송)과 용량 계산, 헤드 이동을 줄이는 스케줄링은 디스크 관리와 스케줄링에 있다.
자기 테이프는 순차 접근만 가능하지만 용량당 가격이 싸고 오래 보관할 수 있어, 지금도 데이터센터의 백업·아카이브에 LTO 테이프가 쓰인다.
플래시 메모리와 SSD
플래시 메모리는 전기적으로 데이터를 읽고 쓰는 반도체 저장 장치다. USB 메모리, SD 카드, SSD가 모두 플래시 메모리다. 비트당 트랜지스터 하나로 저장해 비트당 둘을 쓰는 EEPROM보다 집적도가 높다.
셀은 게이트가 두 개인 트랜지스터다. 일반 트랜지스터와 같은 제어 게이트 아래에, 산화막으로 사방이 막힌 부동 게이트(floating gate)가 있다.
| 동작 | 원리 |
|---|---|
| 쓰기(프로그램) | 제어 게이트에 높은 전압을 걸면 강한 전기장 때문에 채널의 전자가 산화막을 터널링해 부동 게이트에 갇힌다 → 0 |
| 지우기 | 반대쪽(기판)에 높은 전압을 걸어 갇힌 전자를 빼낸다 → 다시 1. 셀 하나가 아니라 블록 단위로 한다 |
| 읽기 | 낮은 전압을 걸었을 때 부동 게이트가 비어 있으면 전류가 많이 흘러 1, 전자가 차 있으면 전기장을 막아 거의 흐르지 않아 0 |
전자가 산화막을 드나들 때마다 막이 조금씩 상해서 쓰고 지울 수 있는 횟수(아래 P/E 사이클)에 한계가 생긴다. 셀을 잇는 방식에 따라 두 종류가 있다.
| 비교 | NOR 플래시 | NAND 플래시 |
|---|---|---|
| 셀 연결 | 비트 라인에 셀을 병렬로 연결 | 셀 여러 개를 직렬로 연결 |
| 접근 단위 | 바이트(셀) 단위 임의 읽기. 메모리처럼 코드를 바로 실행(XIP)할 수 있다 | 페이지 단위 읽기·쓰기, 블록 단위 삭제 |
| 집적도 | 셀마다 배선이 많아 낮다 | 배선이 적어 높다 → 대용량에 맞다 |
| 용도 | 마이크로컨트롤러·임베디드의 펌웨어, 부트 코드 | SSD, USB 메모리, SD 카드, 스마트폰 저장소 |
대용량 저장에는 NAND 플래시가 쓰인다. 데이터를 저장하는 가장 작은 단위인 셀에 몇 비트를 담느냐에 따라 종류가 나뉜다.
| 종류 | 셀당 비트 | 특징 |
|---|---|---|
| SLC (Single Level Cell) | 1 | 가장 빠르고 수명이 길지만 용량 대비 비싸다. 산업용, 그리고 SSD 안에서 일부 영역을 SLC처럼 쓰는 쓰기 캐시(SLC 캐시) |
| MLC (Multi Level Cell) | 2 | 한때 고급 소비자 SSD의 주류였지만 지금은 드물다 |
| TLC (Triple Level Cell) | 3 | 속도·수명·가격의 균형이 좋아 2026년 기준 소비자·서버 SSD의 주류 |
| QLC (Quad Level Cell) | 4 | 가장 고밀도이고 용량 대비 싸지만, 쓰기 속도와 수명이 TLC보다 낮다. 대용량·읽기 위주 용도 |
셀당 비트가 늘수록 용량은 커지고 속도·수명은 줄어든다. 여기서 수명은 셀을 쓰고 지울 수 있는 횟수(P/E 사이클)다. 한 셀에 구분해야 할 전압 단계가 많아질수록 셀이 닳는 영향을 크게 받아, 같은 용량이라도 셀 종류에 따라 가격·속도·수명이 달라진다. 실제 체감 속도는 셀보다 인터페이스가 크게 좌우한다. SATA SSD는 SATA 3(6Gb/s)에 묶여 순차 읽기가 약 550MB/s에 머물고, NVMe SSD는 PCIe 레인을 직접 써서 PCIe 4.0 제품이 약 7GB/s, PCIe 5.0 제품이 약 14GB/s대까지 나온다.
flowchart LR c1["셀"] --> c2["페이지"] --> c3["블록"] --> c4["플레인"] --> c5["다이"]
읽기·쓰기는 페이지 단위, 삭제는 더 큰 블록 단위다.
하드 디스크와 가장 다른 점은 덮어쓰기가 안 된다는 것이다. 페이지는 세 상태를 가진다.
| 상태 | 의미 |
|---|---|
| Free | 비어 있어 새 데이터를 쓸 수 있다 |
| Valid | 유효한 데이터가 들어 있다. 이 상태에서는 덮어쓸 수 없다 |
| Invalid | 더 이상 쓰지 않는 쓰레기값이 들어 있다 |
데이터를 고치면 새 내용은 Free 페이지에 쓰고 기존 페이지는 Invalid가 된다. Invalid 페이지가 쌓이면 SSD는 가비지 컬렉션으로 블록 안의 Valid 페이지만 새 블록으로 옮긴 뒤 기존 블록을 통째로 지운다.
이런 규칙을 운영체제가 모르게 감추는 것이 SSD 안의 컨트롤러다. 컨트롤러는 작은 프로세서로 FTL(Flash Translation Layer)이라는 펌웨어를 돌려, 파일 시스템이 하드 디스크처럼 논리 블록 주소로 읽고 쓰게 해 준다.
| SSD 구성 요소 | 역할 |
|---|---|
| NAND 플래시 칩 여러 개 | 여러 채널에 나눠(인터리빙) 동시에 읽고 써서 칩 하나보다 빠르다 |
| 컨트롤러 + FTL | 논리 주소 → 실제 페이지 매핑, 마모 평준화(쓰기를 모든 블록에 고르게 퍼뜨려 일부 블록만 먼저 닳지 않게), 가비지 컬렉션, 오버 프로비저닝(사용자에게 보이지 않는 여유 블록을 두어 가비지 컬렉션과 교체에 쓴다) |
| DRAM 버퍼 | 매핑 테이블과 데이터를 잠시 담는다. 값싼 SSD는 DRAM 없이 호스트 메모리 일부를 빌려 쓰기도 한다(HMB) |
| 외부 인터페이스 | SATA 또는 PCIe(NVMe) 직렬 연결 |
운영체제가 지운 블록을 알려 주는 TRIM 명령은 FTL이 그 페이지를 미리 Invalid로 처리해 가비지 컬렉션 부담을 줄이게 한다.
매체마다 다른 접근 방식
접근 방식은 네 가지로 나눈다. 처음부터 차례로 훑는 순차 접근(테이프), 목표 근처로 바로 간 뒤 순차로 찾는 직접 접근(디스크, 광학 디스크), 주소로 바로 가서 어느 위치든 같은 시간이 걸리는 임의 접근(반도체 메모리), 저장된 내용의 일부 비트를 비교해 찾는 연관 접근(아래 「연관 메모리」)이다. RAM의 「임의 접근(random access)」은 어느 주소든 같은 시간에 읽는다는 뜻이다. 보조 기억 장치는 기록 원리에 따라 원하는 위치에 닿기까지의 대기가 다르고, 이 차이가 계층에서의 자리를 정한다. 접근 방식의 일반론(순차·직접)은 파일 시스템의 「접근 방식」에 있다.
| 매체 | 기록 원리 | 원하는 위치에 닿는 법 | 접근을 늦추는 것 |
|---|---|---|---|
| 자기 테이프 | 긴 띠의 자성 방향 | 순차 접근. 그 위치까지 감거나 되감는다 | 수백 m를 감는 시간 |
| 하드 디스크 | 회전하는 원판 표면의 자성 방향 | 헤드를 트랙으로 옮기고, 원판이 돌아 섹터가 올 때까지 기다린다 | 탐색 시간 + 회전 지연(밀리초 단위) |
| 광학 디스크(CD·DVD·블루레이) | 표면의 미세한 홈(pit)과 평면(land)이 레이저를 다르게 반사한다 | 하드 디스크처럼 회전하며 광학 헤드가 찾아간다 | 하드 디스크보다 느린 탐색. 레이저 파장이 짧을수록(CD → DVD → 블루레이) 홈을 촘촘히 새겨 용량이 커진다 |
| SSD·플래시 | 셀에 가둔 전하 | 움직이는 부품 없이 주소로 바로 간다 | 탐색은 없지만 읽기 지연(수십 µs)이 DRAM(약 100ns)보다 두세 자릿수 길고, 쓰기는 위의 페이지·블록 규칙을 따른다 |
움직이는 부품이 사라질수록 대기가 줄지만, 가장 빠른 SSD도 DRAM보다 느리다. 그래서 저장 기술이 바뀌어도 작고 빠른 메모리 위에 크고 느린 저장소를 쌓는 계층 구조는 그대로 남는다.
RAID
여러 디스크를 묶어 하나처럼 쓰면서 성능이나 안정성을 높이는 기술(Redundant Array of Independent Disks, 처음 제안될 때는 Inexpensive Disks).
작은 디스크 여러 개를 디스크 배열로 묶으면 큰 디스크 하나보다 싸게 용량을 얻고, 블록을 라운드 로빈으로 나눠 담아(디스크 인터리빙) 동시에 읽고 쓸 수 있다. 문제는 고장이다. 디스크가 하나라도 고장 나면 배열이 멈추므로 배열의 평균 고장 간격(MTTF)은 대략 디스크 하나의 MTTF ÷ 디스크 수로 줄어든다. MTTF 30,000시간짜리 디스크 100개면 300시간이다. 그래서 중복 정보(미러, 패리티, 검사 디스크)를 더해 고장 난 디스크를 시스템을 멈추지 않고 분리하고, 남은 정보로 데이터를 복구하고, 새 디스크로 교체해 재구성하는 것이 RAID의 핵심이다.
| 레벨 | 방식 | 특징 |
|---|---|---|
| RAID 0 | 블록 스트라이핑 | 여러 디스크에 나눠 저장 → 빠르지만 중복이 없어 하나만 고장 나도 전체 손실 |
| RAID 1 | 미러링 | 같은 데이터를 두 디스크에 저장 → 안정적이지만 용량 효율 50% |
| RAID 2 | 비트 단위 스트라이핑 + 해밍 코드 | 해밍 코드로 오류 정정. 실제로는 거의 쓰이지 않음 |
| RAID 3 | 바이트 단위 스트라이핑 + 전용 패리티 디스크 | 큰 순차 전송에 유리 |
| RAID 4 | 블록 단위 스트라이핑 + 전용 패리티 디스크 | 쓰기마다 패리티 디스크가 병목 |
| RAID 5 | 블록 스트라이핑 + 패리티 분산 | 패리티를 모든 디스크에 돌려 저장 → 병목 해소, 디스크 1개 고장까지 복구 |
| RAID 6 | 블록 스트라이핑 + 이중 패리티 | 디스크 2개 동시 고장까지 복구 |
- RAID 1은 복구가 간단하지만 쓰기가 RAID 0보다 느리고, 같은 데이터를 두 번 저장하는 만큼 비용이 든다.
- RAID 2는 해밍 코드를 쓰므로 검사 디스크가 많이 든다. 데이터 디스크 G개에 필요한 검사 디스크 C개는 2ᶜ − 1 ≥ G + C를 만족해야 해서, G = 8이면 C = 4(오버헤드 50%), G = 16이면 C = 5(31%)다. 오늘날 디스크는 자체적으로 ECC를 하므로 쓰이지 않는다.
- RAID 4는 완전한 복사본 대신 패리티만 따로 저장해 RAID 1보다 적은 디스크로 안전성을 얻는다. RAID 5는 그 패리티를 모든 디스크에 나눠 RAID 4의 병목을 없앤 것이다.
- 작은 쓰기 문제: 블록 하나 D를 D′로 고칠 때 나머지 블록을 모두 읽어 패리티를 다시 구할 필요는 없다. XOR의 성질로
P′ = P ⊕ D ⊕ D′이므로 옛 데이터 읽기, 옛 패리티 읽기, 새 데이터 쓰기, 새 패리티 쓰기의 4번 접근이면 디스크 수와 상관없이 끝난다. 그래도 단순 쓰기 한 번보다 네 배다. RAID 4는 모든 쓰기가 패리티 디스크를 두 번씩 건드려 병목이 되고, RAID 5는 패리티가 흩어져 있어 데이터 디스크 G개일 때 최대 (G + 1)/2개의 쓰기를 동시에 할 수 있다. 디스크 수보다 많은 블록을 한꺼번에 쓰는 큰 쓰기는 패리티를 미리 계산해 데이터와 패리티를 한 번씩만 쓰면 된다. - 그래서 읽기와 작은 쓰기가 많은 곳에는 RAID 1이, 용량·비용이 중요하고 큰 쓰기가 많은 곳에는 RAID 5가 어울린다. 가격 대비 성능은 RAID 5가 낫다.
- RAID 6은 쓰기 속도를 조금 희생하더라도 더 안전하게 보관하고 싶을 때 쓴다. 여러 레벨을 섞은 RAID 10, RAID 50 같은 구성(Nested RAID)도 있다.
- RAID 10(1+0)은 디스크를 둘씩 미러링(RAID 1)한 쌍들을 다시 스트라이핑(RAID 0)한다. 미러 덕분에 패리티 계산이 없어 작은 쓰기에도 빠르고, 재구성도 짝 디스크를 복사하기만 하면 돼 빠르다. 대신 용량의 절반을 쓴다. DB 서버처럼 쓰기가 많고 안정성도 필요한 곳에서 흔하다.
| 레벨 | 최소 디스크 | 용량 효율(N장) | 견디는 고장 | 읽기 | 쓰기 |
|---|---|---|---|---|---|
| RAID 0 | 2 | 100% | 없음 | 높음 | 높음 |
| RAID 1 | 2 | 50%(2중 미러) | 짝 하나가 남는 한 | 높음 | 디스크 한 장 수준 |
| RAID 5 | 3 | (N−1)/N, 3장이면 67% | 1장 | 높음 | 작은 쓰기마다 4번 접근해 떨어진다 |
| RAID 6 | 4 | (N−2)/N, 4장이면 50% | 2장 | 높음 | 패리티가 둘이라 RAID 5보다 더 떨어진다 |
| RAID 10 | 4 | 50% | 미러 쌍마다 1장(같은 쌍 두 장이 죽으면 손실) | 높음 | 중간(두 번씩 쓴다) |
디스크가 커질수록 재구성에 몇 시간~며칠이 걸리고, 그동안 한 장이 더 고장 나거나 읽기 오류가 나면 RAID 5는 데이터를 잃는다. 그래서 대용량 디스크 배열은 RAID 6이나 RAID 10을 고르는 편이다.
- 디스크 여러 장에 줄무늬처럼 나뉘어 놓인 데이터 조각을 스트라이프(stripe), 그렇게 나눠 저장하는 일을 스트라이핑이라 한다. 한 디스크에 연속으로 쓰는 조각의 크기(stripe size)는 RAID 볼륨을 만들 때 정한다.
- 일반적인 패리티 비트는 오류를 검출만 하지만, RAID의 패리티는 나머지 디스크의 데이터와 XOR해 고장 난 디스크 한 장의 내용을 복구할 수 있다.
- RAID는 메인보드 펌웨어(BIOS·UEFI 설정의 RAID 모드), 전용 RAID 컨트롤러, 운영체제의 소프트웨어 RAID(디스크 관리와 스케줄링의 md) 중 어디서든 구성할 수 있다.
| 가장 원하는 것 | 고를 만한 레벨 |
|---|---|
| 입출력 속도 | RAID 0 (데이터가 사라져도 되는 임시 작업 공간) |
| 단순하고 확실한 복구 | RAID 1 |
| 용량 효율과 안전성의 균형 | RAID 5 |
| 디스크 두 장 고장까지 견디기 | RAID 6 |
| 속도와 안전성 모두 | RAID 10 |
RAID는 디스크 고장에 대비할 뿐 백업이 아니다. 실수로 지운 파일, 랜섬웨어, 컨트롤러 고장은 모든 디스크에 똑같이 반영된다.
연관 메모리 (Associative Memory)
- 일반 메모리는 주소로 찾지만, 연관 메모리(CAM)는 내용으로 찾는다.
- 인자 레지스터(argument)에 찾을 값을, 키 레지스터(key)에 비교할 비트 위치(마스크)를 넣으면 모든 워드를 동시에 비교해 일치하는 위치를 알려준다.
- 병렬 비교 회로가 필요해 비싸지만 매우 빠르다. 캐시의 태그 비교, TLB 등에 쓰인다.
핵심 정리
- 위쪽 계층일수록 빠르고 비싸고 작다. 계층 구조는 지역성을 이용해 평균 접근 시간을 줄인다.
- 디스크 접근 시간은 탐색 시간이 지배한다.
- 칩의 워드 폭이 모자라면 병렬로, 위치 수가 모자라면 상위 주소를 디코딩해 직렬로 이어 모듈을 만든다.
- 플래시는 부동 게이트에 전자를 가둬 저장하고, SSD 컨트롤러의 FTL이 덮어쓰기 불가·블록 단위 삭제·마모를 감춘다.
- RAID는 스트라이핑(성능), 미러링·패리티(안정성)의 조합이다. 패리티 RAID의 작은 쓰기는 P′ = P ⊕ D ⊕ D′로 4번 접근이 든다.
관련 노트: 캐시 메모리와 MMU (계층 사이를 잇는 캐시와 주소 변환 하드웨어), 입출력 구조와 시스템 버스 (CPU와 메모리를 잇는 버스의 대역폭과 타이밍), 파이프라인과 병렬 처리 (UMA·NUMA 메모리 접근 모델), 디스크 관리와 스케줄링 (운영체제가 디스크 요청을 처리하는 방법)
원본 기록11
- 원문 (새 창) riverkim.kr/196
- 원문 (새 창) riverkim.kr/197
- 원문 (새 창) www.youtube.com/playlist?list=PLc8fQ-m7b1hCHTT7VH2oo0Ng7Et096dYc
- 원문 (새 창) bytebytego.com/guides/types-of-memory
- 원문 (새 창) bytebytego.com/guides/types-of-memory-and-storage
- 원문 (새 창) lwn.net/Articles/250967/
- 원문 (새 창) www.youtube.com/watch?v=m2NfFJEvssY
- 원문 (새 창) www.youtube.com/watch?v=lgFmNUG_Atw
- 원문 (새 창) www.youtube.com/watch?v=TQCr9RV7twk
- GitHub 원문 (새 창) github.com/fru1tworld/cs-basic/blob/main/interview/cs/architecture.md
- GitHub 원문 (새 창) github.com/karanpratapsingh/system-design