12.1 저장 계층 구조 (Storage Hierarchy)
모든 저장매체는 속도·비용·신뢰성의 절충(trade-off) 위에 놓인다. 빠를수록 비싸고 작으며, 쌀수록 느리고 크다.
지속성(Persistence)으로 본 분류
- 휘발성
(Volatile) - 전원이 꺼지면 내용이 소실된다. 예: SRAM, DRAM(메인 메모리).
- 비휘발성
(Non-Volatile) - 전원이 꺼져도 내용이 유지된다. secondary·tertiary 저장장치, battery-backed memory 포함.
저장매체 평가 요소
- Speed
- 접근 속도(지연·대역폭). 위로 갈수록 빠르다.
- Cost
- 단위 용량당 비용(cost per unit). 위로 갈수록 비싸다.
- Reliability
- 데이터 손실에 대한 신뢰성.
인터랙티브: 저장 계층 피라미드
각 층을 클릭하면 휘발성·속도·비용·용량·특징이 오른쪽에 표시됩니다. DRAM과 NVM 사이의 점선이 휘발성/비휘발성 경계입니다.
Primary
가장 빠르나 휘발성. SRAM·DRAM(캐시·메인 메모리). CPU가 직접 접근.
Secondary
비휘발성, 적당히 빠름. SSD·HDD. 온라인 저장(online storage).
Tertiary
보관(archival)용 자기·광학. Tape·Optic. 가장 싸고 크지만 느림.
NVM(Non-Volatile Memory)의 핵심 3특성: Persistent(비휘발) · DRAM-like Speed(DRAM급 속도) · Byte-addressable(바이트 단위 접근). 피라미드에서 NVM은 DRAM 아래·SSD 위, 즉 휘발성/비휘발성 경계 바로 아래에 위치한다.
보충 실제 NVM: STT-RAM, PCM(상변화 메모리), NVDIMM-N, DCPMM(Intel Optane). 차세대 보관 매체: DNA storage(0/1을 ATGC 염기로, 반감기 500년+), Project Silica(석영 유리에 펨토초 레이저로 write·빛으로 read).
"Tape is dead, Disk is tape, Flash is disk." — 매체의 역할이 한 칸씩 아래로 밀려나는 흐름을 압축한 문장. 과거의 디스크 역할(랜덤 접근 1차 저장)을 이제 플래시가, 과거의 테이프 역할(순차 백업)을 이제 디스크가 맡는다.
12.2 5분 규칙 (The Five-Minute Rule)
"어떤 페이지를 메모리에 상주시킬까, 디스크에 둘까?"를 경제성으로 답하는 규칙.
대략 5분마다 한 번 이상 참조되는 페이지는, 디스크에서 매번 읽어오는 것보다 메모리에 상주시키는 편이 비용 효율적이다. 손익분기 간격(Break-Even Interval)은 다음 공식으로 구한다.
= Technology Ratio × Economic Ratio
- Technology Ratio = PagesPerMB ÷ IOPS — 1MB가 담는 페이지 수를 디스크 IOPS로 나눈 값(시간 차원).
- Economic Ratio = DiskPrice ÷ MemoryPricePerMB — 디스크 1대 가격을 메모리 1MB 가격으로 나눈 값(비용 차원).
인터랙티브: 5분 규칙 계산기
12.3 저장 인터페이스 (Storage Interfaces)
저장장치와 호스트를 잇는 버스의 대역폭. 세대가 올라갈수록 두 배씩 빨라진다.
SATA = 6 Gbps · SAS = 12 Gbps · NVMe = 24 Gbps. (6 → 12 → 24, 2배씩.)
12.4 HDD — 자기 디스크 (Magnetic Disk)
platter(원판)·read/write head·moving arm·motor로 구성. 데이터 한 블록을 읽는 데 걸리는 시간이 핵심 지표.
접근 시간 4요소 & 3단계
① Seek time
헤드를 올바른 트랙으로 이동(0~수 ms). 가장 큼.
② Rotational delay
원판이 올바른 섹터까지 회전(0~수 ms). 평균 0.5회전.
③ Transfer time
실제 데이터 R/W(보통 <1ms).
④ Controller overhead
컨트롤러 처리 시간(고정값).
Rotational delay = 0.5 회전 × (60000 / RPM) ms | Transfer = (Sector bytes / Rate) 환산
인터랙티브: HDD 접근시간 계산기
512B 섹터 · 15000 RPM · avg seek 4ms · 100MB/s · controller 0.2ms 조건에서: seek 4 + rot.delay 2.0(=0.5×60000/15000) + transfer ≈0.005(=512B/100MB/s) + overhead 0.2 = ≈ 6.2 ms. 회전 지연이 두 번째로 크다는 점에 주의.
성능 지표
Disk block
저장 할당·검색의 논리 단위(보통 4KB~16KB). 작은 블록 = 전송 횟수↑, 큰 블록 = 공간 낭비↑.
Sequential vs Random
Sequential: 첫 블록만 seek, 이후 연속. Random: 매번 seek+rot.delay 발생 → 훨씬 느림.
IOPS
초당 처리 가능한 임의(random) 블록 R/W 수. 랜덤 부하의 핵심 지표.
12.5 SSD & FTL
SSD는 표준 블록 인터페이스 뒤에 다수의 NAND 플래시 칩을 숨긴다. 그 핵심 두뇌가 FTL(Flash Translation Layer).
NAND Flash 특성
- Read/Write 단위
- page 단위로 읽고 쓴다(512B~16KB). read와 write는 비대칭(read가 빠름).
- Erase 단위
- 지우기는 block 단위(page 여러 개 묶음).
- No-overwrite
- 한 page는 1회만 쓸 수 있고, 재기록하려면 먼저 erase해야 한다(제자리 덮어쓰기 불가).
- Finite lifespan
- flash chip은 erase 횟수에 수명 한계가 있다.
보충 NAND는 NOR보다 저렴해 대용량 저장에 쓰인다.
SSD 내부 데이터 경로
HIL → FTL(가장 중요) → FIL → Flash Chip 그리드
- HIL (Host Interface Layer): 호스트의 LBA 요청 수신.
- FTL (Flash Translation Layer): LBA → PBA(Block#, Page#) 매핑, GC·wear leveling 담당.
- FIL (Flash Interface Layer): 실제 칩 제어.
- 채널 병렬성: Channel #0..#N 열 단위로 칩 배치, 같은 행을 동시 접근 → 병렬 처리.
호스트가 LBA0를 쓰면 FTL이 빈 위치 (0,0)에 기록. 같은 LBA0를 다시 쓰면 no-overwrite 때문에 제자리에 못 쓰고, 새 위치 (0,1)에 쓴 뒤 옛 위치 (0,0)의 Valid를 N으로 표시한다(Invalidation). 무효 페이지가 쌓이면 GC가 청소한다 → 다음 절.
SSD 수명 관리 — Wear Leveling · Over-provisioning · TRIM 보충
NAND는 erase 횟수에 한계(P/E cycle)가 있고 no-overwrite 특성 탓에 내부 쓰기가 늘어난다(WAF↑). FTL은 이 둘을 완화하려 세 가지 기법을 동시에 쓴다 — 앞 절의 GC·WAF와 직결된다.
Wear Leveling (마모 평준화)
각 블록의 P/E(Program/Erase) cycle 한도는 유한(예: TLC 수천 회)하다. 특정 블록에만 쓰기가 몰리면 그 블록이 먼저 죽고 SSD 전체 수명이 단축된다. FTL은 쓰기를 모든 블록에 고르게 분산해 어느 한 블록만 닳지 않게 한다.
- Dynamic: 새로 쓰는(hot) 데이터를 erase 횟수가 적은 free 블록으로 보냄.
- Static: 거의 안 바뀌는(cold) 데이터까지 가끔 옮겨, 닳지 않은 블록도 활용.
Over-provisioning (예비 영역, OP)
물리 용량 중 일부를 호스트에 노출하지 않고 FTL 전용 예비 공간으로 숨긴다(예: 7%, 28%). 예: 128GiB 물리 칩을 120GB로 광고하는 차이가 OP가 된다.
예비 free 블록이 많을수록 GC가 victim을 고르고 valid를 옮길 여유가 커져 WAF가 낮아지고 성능·수명이 함께 좋아진다. OP를 늘릴수록 WAF↓ 이득이 크다.
TRIM 명령
파일을 지워도 OS는 "이 LBA는 더 이상 안 쓴다"를 SSD에 알려주지 않으면, FTL은 해당 page를 여전히 valid로 오인해 GC 때 헛되이 복사한다(WAF↑).
TRIM(SATA) / UNMAP(SCSI) / Deallocate(NVMe)는 OS가 해당 LBA를 무효로 표시하도록 FTL에 통지한다. 그러면 GC가 그 page를 옮기지 않고 버려 복사량이 줄고 WAF가 감소, free 블록 확보도 빨라진다.
보충 한 줄 요약: Over-provisioning은 GC가 일할 free 공간을 늘려 WAF를 낮추고, TRIM은 옮길 필요 없는 죽은 page를 미리 알려 GC 복사량(SSD writes)을 줄여 WAF를 낮추며, Wear Leveling은 그렇게 발생하는 쓰기를 전 블록에 분산해 수명을 늘린다. 셋 다 앞 절의 WAF = (SSD writes + Host writes) / Host writes에서 분자(SSD writes)를 줄이거나 닳음을 분산하는 방향으로 작동한다.
12.6 가비지 컬렉션 & 쓰기 증폭 (GC & Write Amplification)
무효(invalid) 페이지가 쌓이면 공간을 회수해야 한다. 그 과정에서 호스트가 시키지 않은 내부 쓰기가 발생 → 쓰기 증폭.
Garbage Collection (Greedy)
- 블록이 거의 차서 임계치(threshold) 도달.
- victim 선택: valid 페이지가 가장 적은 블록(Greedy).
- victim의 valid 페이지를 free block으로 Copy(매핑 갱신).
- victim 블록 전체를 Erase → 다시 free block으로.
Write Amplification
호스트 쓰기가 GC를 유발해 내부 쓰기가 늘어나는 현상. 성능↓, 수명↓.
예: GC가 valid 페이지 3개를 옮기고(SSD writes=3), 호스트가 1개를 썼다면(host writes=1) → WAF = (3+1)/1 = 4.
인터랙티브: FTL + GC + Write Amplification 애니메이션
"다음 단계"를 눌러 쓰기 → 무효화 → GC → WAF 계산 시나리오를 따라가 보세요. 파랑=valid, 빨강=invalid, 흰색=free.
① GC victim = valid 페이지가 가장 적은 블록(Greedy) — 옮길 데이터가 최소라 비용 최소.
② WAF = (SSD writes + Host writes) / Host writes, 캐논 예제 (3+1)/1 = 4. WAF는 항상 ≥ 1이며 클수록 나쁘다.
12.7 SSD 성능 (Performance)
SSD의 진가는 큐 깊이(Queue Depth)를 높여 채널 병렬성을 활용할 때 드러난다.
단일 명령(QD-1) 기준
4KB read ≈ 10,000 IOPS / write ≈ 40,000 IOPS.
병렬(QD-32) 기준
read: SATA 100,000 / NVMe(PCIe) 350,000 IOPS. write(QD-32) 100,000 IOPS.
참고: Samsung 970 Pro (NVMe) 사양
| 항목 | 값 |
|---|---|
| Sequential Read | 3,500 MB/s |
| Sequential Write | 2,300 MB/s |
| Random Read 4KB (QD-32) | 370,000 IOPS |
| Random Write (QD-32) | 500,000 IOPS |
| Random Read (QD-1) | 15,000 IOPS |
| Random Write (QD-1) | 55,000 IOPS |
12.8 RAID (Redundant Arrays of Independent Disks) 보충
여러 개의 값싼 디스크를 묶어 한 대의 논리 디스크처럼 쓰되, 단일 디스크보다 더 신뢰성 있고 더 빠르게 만드는 기법.
보충 RAID는 두 개의 직교(orthogonal)하는 축으로 이해한다. ① 중복(redundancy)으로 신뢰성을 얻고, ② 병렬성(parallelism)으로 성능을 얻는다. 두 축은 독립적이며, 각 RAID 레벨은 둘을 다른 비율로 조합한 것이다.
두 축 ① — Reliability via Redundancy (중복으로 신뢰성)
Mirroring (미러링)
같은 데이터를 두 디스크에 똑같이 둔다. 한 디스크가 죽어도 사본으로 계속 서비스. 두 디스크가 동시에 죽어야 데이터 손실이 일어나는데, 이는 매우 드물다.
읽기는 두 사본 중 가까운 쪽에서 → 읽기 처리량↑. 쓰기는 양쪽 모두 써야 함(둘 중 느린 쪽 기준).
Parity (패리티) — 공간 효율적 중복
사본 전체를 두는 대신 XOR 패리티 한 블록만 둔다. 디스크 한 대가 죽으면 나머지 데이터와 패리티를 XOR해 잃어버린 블록을 복원한다.
MTTF(Mean Time To Failure, 평균 고장 시간): 디스크 한 대가 평균 얼마 만에 고장 나는가(예: 100,000시간). MTTR(Mean Time To Repair, 평균 복구 시간): 고장 난 디스크를 교체·재구성하는 데 걸리는 시간.
미러 쌍의 MTTDL(Mean Time To Data Loss, 평균 데이터 손실 시간)은, 한 디스크가 죽고 MTTR 안에 나머지 한 대마저 죽어야 손실이 나므로 단일 디스크 MTTF보다 훨씬 길다:
예: MTTF 100,000h, MTTR 10h → MTTDL ≈ 100,000² / (2×10) = 5 × 108 시간(약 57,000년). 복구 시간(MTTR)을 줄일수록 안전해진다.
두 축 ② — Performance via Parallelism (병렬성으로 성능)
Data Striping (데이터 스트라이핑)
한 덩어리의 데이터를 여러 디스크에 쪼개 분산해, N개 디스크를 동시에 읽고 써 대역폭을 N배로 끌어올린다.
Bit-level vs Block-level
- Bit-level striping: 한 바이트의 비트들을 여러 디스크에 분산. 한 블록 접근에도 모든 디스크가 동원됨 → 동시성↓. 현실에선 거의 안 씀.
- Block-level striping: 블록 단위로 라운드로빈 분산(블록 i → 디스크 i mod N). 큰 전송은 병렬, 작은 독립 요청들은 서로 다른 디스크에서 동시 처리 → 가장 실용적.
인터랙티브: RAID 레벨 비교
레벨 버튼을 누르면 블록 배치 다이어그램과 특성(공간 효율·고장 허용·성능)이 갱신됩니다. RAID 0·1·5는 SVG로 실제 블록/패리티 배치를 도식화합니다. 파랑=데이터, 보라=패리티, 초록=미러 사본.
RAID 레벨 표
| 레벨 | 방식 | 공간 오버헤드 | 허용 고장 | 읽기 / 쓰기 성능 | 비고 |
|---|---|---|---|---|---|
| RAID 0 | Block striping, 무중복 | 0% | 0대 | 최고 / 최고 | 신뢰성 최저(한 대만 죽어도 전손). 순수 성능용. |
| RAID 1 | Mirroring | 100% | 1대↑ | 매우 좋음 / 보통(2회 쓰기) | 가장 안전·단순. 용량 절반. |
| RAID 2 | Bit-level + Hamming ECC | 중간 | 1대 | — | 디스크 자체 ECC와 중복 → 현재 사용 안 함. |
| RAID 3 | Byte-level striping + 전용 parity | 1대분 | 1대 | 좋음 / 낮음 | 전용 패리티 디스크가 병목. RAID 5에 밀려 거의 안 씀. |
| RAID 4 | Block striping + 전용 parity disk | 1대분 | 1대 | 좋음 / 낮음 | 패리티 디스크에 쓰기 집중 → 병목. |
| RAID 5 | Block striping + 분산 parity | 1대분 | 1대 | 매우 좋음 / 보통 | 패리티를 전 디스크에 분산 → 병목 해소. 가장 널리 쓰임. |
| RAID 6 | Block striping + P+Q 이중 분산 parity | 2대분 | 2대 | 매우 좋음 / 낮음 | 두 디스크 동시 고장 허용. 대용량 어레이의 재구성 위험 대비. |
조합·세부 개념
RAID 1+0 (10) vs 0+1
1+0 (스트라이프된 미러): 먼저 디스크를 쌍으로 미러한 뒤 그 미러 쌍들을 스트라이프. 한 쌍에서 한 대가 죽어도 그 쌍의 사본이 살아 어레이가 멀쩡 → 더 견고.
0+1 (미러된 스트라이프): 먼저 스트라이프한 뒤 그 스트라이프 세트 전체를 미러. 한 대만 죽어도 그 스트라이프 세트 전체가 무효가 되어 복구 폭이 큼 → 실무에선 1+0 선호.
RAID 5의 Small-Write Problem
한 블록만 갱신해도 패리티를 다시 계산해야 하므로 read-modify-write가 필요: ① 옛 데이터 read, ② 옛 패리티 read, ③ 새 데이터 write, ④ 새 패리티 write → 4 I/O.
작은 무작위 쓰기가 많은 OLTP에선 이 4배 비용이 부담 → 미러(RAID 1/10)가 유리할 수 있다.
Hot Swap
시스템을 끄지 않고 고장 디스크를 교체. 다운타임 없이 복구 시작.
Hot Spare
대기용 빈 디스크를 미리 장착. 고장 즉시 자동 재구성 시작 → MTTR↓.
Hardware vs Software RAID
HW: 전용 컨트롤러·배터리 백업 캐시, CPU 부담↓. SW: OS가 처리, 저렴·유연하나 CPU 사용.
① 성능만, 신뢰성 불필요(스크래치·캐시) → RAID 0. ② 단순·안전, 무작위 쓰기 많은 OLTP → RAID 1 / 1+0. ③ 읽기 위주 + 용량 효율 + 1대 고장 허용 → RAID 5. ④ 대용량·재구성 시간이 길어 두 번째 고장이 걱정 → RAID 6. RAID 2·3은 사실상 도태, RAID 4는 RAID 5로 대체.
12.9 디스크 블록 접근 최적화 (Optimization of Disk-Block Access) 보충
HDD의 seek·회전 지연이 비싸므로, OS·DB는 여러 기법으로 물리 접근 횟수와 거리를 줄인다.
보충 핵심 아이디어: 무작위·소량 접근을 순차·대량 접근으로 바꾸고, 비싼 물리 동작(seek/회전)을 모아서·미리·한 방향으로 처리한다.
Buffering (버퍼링)
읽은 블록을 메모리 버퍼에 캐시해 같은 블록의 재접근 시 디스크를 건너뛴다. 쓰기도 모아 두었다 한 번에 내려쓴다.
Read-ahead / Prefetch (선반입)
순차 접근이 예측되면 요청되기 전에 다음 블록들을 미리 읽어 둔다. 전형적 순차 스캔에서 대기 시간을 숨긴다.
File Organization / Clustering
함께 접근되는 블록을 물리적으로 인접하게 배치(클러스터링)해 seek를 줄인다.
시간이 지나면 삽입·삭제로 단편화(fragmentation)가 생겨 인접성이 깨진다 → 재구성(defragmentation) 필요.
Nonvolatile Write Buffers (NV-RAM)
쓰기를 NV-RAM(배터리 백업/플래시)에 먼저 받아 즉시 "안전하다"고 응답한다. 실제 디스크 반영은 나중에 모아서 → 쓰기 지연을 숨기면서 내구성(durability) 보장.
Log-based File System (로그 기반 파일 시스템)
갱신을 제자리에 덮어쓰지 않고 로그의 끝에 순차로 append한다. 흩어진 무작위 쓰기를 하나의 순차 쓰기로 변환해 seek를 거의 없앤다(쓰기 폭주에 강함). 단, 옛 버전 정리를 위한 정리(cleaning) 비용이 따른다 — SSD의 GC와 같은 발상.
Disk-Arm Scheduling (디스크 암 스케줄링)
대기 중인 여러 요청을 어떤 순서로 처리하면 헤드 이동(seek)을 최소화할까?
FCFS
First-Come First-Served. 도착 순서 그대로. 공정하나 헤드가 왔다 갔다 해 이동 거리가 크다.
Elevator (SCAN)
엘리베이터처럼 한 방향으로 끝까지 가며 도중 요청을 처리하고, 끝에서 방향을 뒤집는다. 이동 거리 대폭 감소.
C-SCAN
Circular SCAN. 한 방향으로만 처리하고 끝에 닿으면 처리 없이 시작으로 복귀. 대기 시간을 더 균등하게.
인터랙티브: 디스크 암 스케줄링 (FCFS vs SCAN)
요청 트랙 큐와 시작 위치를 바꿔, FCFS와 SCAN의 헤드 이동 경로·총 이동 거리를 비교하세요.
12.10 핵심 정리 (Exam Cheatsheet)
시험 직전 한 번 더. 숫자와 공식 위주로.
| 주제 | 꼭 기억할 것 | 핵심도 |
|---|---|---|
| 저장 계층 | 휘발성(SRAM/DRAM) ↔ 비휘발성(NVM/SSD/HDD/Tape), 경계는 DRAM–NVM 사이. 위=$$$·빠름·작음. | 🎯 핵심 |
| NVM 3특성 | Persistent · DRAM-like Speed · Byte-addressable. | 🎯 핵심 |
| 5분 규칙 | BreakEven = (PagesPerMB/IOPS) × (DiskPrice/MemPerMB) = Technology × Economic. | 🎯 핵심 |
| 인터페이스 | SATA 6 / SAS 12 / NVMe 24 Gbps. | 🎯 핵심 |
| HDD 접근시간 | seek + 0.5×(60000/RPM) + transfer + overhead. 예제 = 6.2 ms. | 🎯 최빈출 |
| NAND | read/write=page, erase=block, no-overwrite, 유한 수명. | 🎯 핵심 |
| FTL | LBA→PBA(Block#,Page#) 매핑, 재쓰기 시 새 page + 옛 page Valid=N(Invalidation). | 🎯 핵심 |
| GC | Greedy: valid 최소 블록을 victim으로, valid copy → erase. | 🎯 최빈출 |
| WAF | (SSD writes + Host writes)/Host writes. 예제 (3+1)/1 = 4. | 🎯 최빈출 |
| SSD 성능 | QD-32 read: SATA 100K / NVMe 350K IOPS. | 보조 |
| SSD 수명 | Wear leveling(쓰기 분산), Over-provisioning(예비→WAF↓), TRIM(죽은 page 통지→GC 복사↓). | 보충 |
| RAID | 두 축: 중복(신뢰성)·병렬(성능). 0=striping, 1=mirror, 5=분산 parity(최다 사용), 6=2대 허용. 5 small-write=4 I/O. | 보충 |
| MTTDL | mirror ≈ MTTF²/(2·MTTR). MTTR 줄일수록 안전. | 보충 |
| 디스크 접근 최적화 | Buffering·Read-ahead·Clustering·NV-RAM·Log-FS. 암 스케줄링: FCFS < SCAN(엘리베이터) < C-SCAN. | 보충 |