Chapter 12. Physical Storage Systems
한 줄 핵심: 모든 데이터는 결국 물리 매체 위에 놓이며, 매체는 속도·비용·신뢰성의 트레이드오프로 **계층(hierarchy)**을 이룬다. 디스크 성능은
access time = seek time + rotational latency로 결정되고, 순차 접근(첫 블록만 seek) 과 무작위 접근(매번 seek) 의 격차가 DB 물리 설계의 출발점이다.
이 챕터가 답하는 핵심 질문
- Q1. 저장 매체는 무엇을 기준으로 나뉘고, 어떻게 고르는가?
- Q2. 저장 계층(storage hierarchy)은 왜 생기며 어떻게 구성되는가?
- Q3. 자기 디스크(HDD)는 물리적으로 어떻게 생겼는가?
- Q4. 디스크 성능은 무엇으로 측정하며, 왜 순차 접근이 빠른가?
Q1. 저장 매체는 무엇을 기준으로 나뉘고, 어떻게 고르는가? ✅
A. 가장 근본적인 구분은 전원이 꺼졌을 때 데이터가 살아남는가이고, 매체 선택은 속도·비용·신뢰성 3가지로 결정한다.
| 분류 | 정의 | 예시 |
|---|---|---|
| 휘발성 (volatile storage) | 전원이 꺼지면 내용이 사라짐 | cache, main memory |
| 비휘발성 (non-volatile storage) | 전원이 꺼져도 내용이 유지됨 | secondary·tertiary storage, 배터리 백업 main memory |
비유
휘발성은 칠판(수업=전원이 끝나면 지워짐), 비휘발성은 공책(덮어도 남음). DB는 절대 잃으면 안 되는 데이터를 다루므로 최종적으로는 반드시 비휘발성 매체에 기록한다.
- 비휘발성에는 secondary·tertiary storage뿐 아니라 배터리로 백업된 main memory도 포함된다 (배터리가 내용을 지켜주므로).
매체 선택의 3가지 기준:
- 속도 (Speed) — 데이터에 얼마나 빨리 접근하는가
- 비용 (Cost) — 단위 용량당 매체 구입 비용
- 신뢰성 (Reliability) — 데이터를 얼마나 안전하게 보존하는가
→ 세 마리 토끼를 동시에 잡는 매체는 없다. 그래서 계층 구조(Q2) 가 등장한다.
Q2. 저장 계층(storage hierarchy)은 왜 생기며 어떻게 구성되는가? ✅
A. 어떤 매체도 빠름·쌈·대용량을 모두 만족하지 못하므로, 위로 갈수록 빠르고 비싸며, 아래로 갈수록 느리지만 싸고 용량이 큰 피라미드형 계층을 쌓는다.
| 계층 (위 → 아래) | 용량 예시 |
|---|---|
| cache | 25 MB |
| main memory | 16 GB |
| flash memory | 512 GB, solid state drive (SSD) |
| magnetic disk | 4 TB, hard disk drive (HDD) |
| optical disk | — |
| magnetic tapes | — |
비유 — 책상, 책장, 도서관 창고
- cache/main memory = 책상 위 펼친 책: 손만 뻗으면 되지만 좁다.
- SSD/HDD = 방 안의 책장: 일어나 가져와야 하지만 훨씬 많다.
- tape/optical = 도서관 지하 서고: 꺼내는 데 오래 걸리지만 거의 무한 보관.
primary / secondary / tertiary 3단계 구분:
| 구분 | 위치 | 휘발성 | 속도 | 별칭 | 예시 |
|---|---|---|---|---|---|
| primary | 최상위 | 휘발성 | 가장 빠름 | — | cache, main memory |
| secondary | 중간 | 비휘발성 | 중간 (moderately fast) | on-line storage | flash memory, magnetic disk |
| tertiary | 최하위 | 비휘발성 | 느림 | off-line storage | magnetic tape, optical storage |
- secondary: 비휘발성+적당히 빠름 → DB 본체가 상주. 항상 연결되어 즉시 접근 가능해 on-line.
- tertiary: 평소 분리되어 off-line, 백업·보관용인 archival storage로 쓰임.
Magnetic tape (tertiary 대표):
- 순차 접근(sequential access)만 가능 (카세트테이프처럼 감아야 함)
- 용량 1 ~ 12 TB
- 운영: 소수 드라이브 + 다수 테이프 (테이프는 싸고 드라이브는 비쌈)
- Juke box: 테이프를 자동 교체해 페타바이트(수천 TB) 규모 저장
Q3. 자기 디스크(HDD)는 물리적으로 어떻게 생겼는가? ✅
A. HDD 성능은 전부 기계 부품의 물리적 움직임에서 나오므로, platter–track–sector–cylinder 구조를 알아야 성능을 이해할 수 있다. (LP판 플레이어: 도는 판 위에서 바늘이 위치를 찾아감)
| 부품 | 설명 |
|---|---|
| Platter | 데이터가 기록되는 원형 금속판 (LP판) |
| Spindle | platter들을 꽂아 회전시키는 중심축 |
| Track | platter 표면의 동심원 데이터 띠. platter당 5만~10만(50K–100K) 이상 |
| Sector | track을 부채꼴로 자른 조각. 읽기/쓰기 가능한 최소 데이터 단위. 보통 512 bytes |
| Read-write head | 데이터를 읽고 쓰는 헤드 (바늘) |
| Arm | 헤드를 원하는 track 위로 이동시키는 팔 |
| Cylinder | cylinder = 모든 platter의 번째 track의 집합 (세로로 관통하는 원통) |
위에서 본 platter 한 장 (ASCII 그림)
track (동심원 띠) ┌───────────────┐ ╱ ┌─────────┐ ╲ │ ╱ ┌───┐ ╲ │ ← 바깥 track: 둘레가 길어 │ │ │ ● │ ←spindle│ sector를 더 많이 담음 │ │ └───┘ │ │ (1000~2000개) │ ╲ sector ╱ │ ╲ └───┬───┘ ╱ ← 안쪽 track: 짧아서 └──────┼───────┘ sector 적음 (500~1000개) │ 한 sector = 부채꼴 한 조각 = 512 B = 읽기/쓰기 최소 단위헤드(바늘)는 arm을 따라 **반지름 방향(안↔밖)**으로 움직여 원하는 track을 고르고, platter가 회전하면서 원하는 sector가 헤드 밑으로 지나가는 순간 읽는다.
옆에서 본 cylinder (platter 여러 장 + 공통 arm)
═══════════ platter 0 ── head 0 ┐ ═══════════ platter 1 ── head 1 │ 모든 head가 ═══════════ platter 2 ── head 2 ├─ 하나의 arm에 붙어 ═══════════ platter 3 ── head 3 ┘ 동시에 같은 번호 track 위에 있음 ↑ 같은 번호 track들을 세로로 묶은 것 = 'cylinder'→ arm을 한 번 움직이면 모든 head가 같은 cylinder에 도달하므로, 한 cylinder 안의 데이터는 seek 없이 읽을 수 있다. 그래서 DB는 관련 데이터를 같은 cylinder에 모으면 빠르다.
- track당 sector 수: 안쪽 500~1000개, 바깥쪽 1000~2000개 (바깥 원이 더 길어서)
- Head-disk assembly: 하나의 spindle에 보통 1~5장 platter, platter마다 헤드 1개, 모든 헤드가 하나의 공통 arm에 장착 → 모든 헤드가 동시에 같은 track 번호 위에 위치 (cylinder 개념이 유용한 이유)
Sector 읽기/쓰기 과정:
- Disk arm이 회전(swing) 하여 헤드를 올바른 track에 위치시킨다.
- Platter는 계속 회전하므로, 목표 sector가 헤드 아래를 지나는 순간 읽거나 쓴다.
→ 모든 접근에 “팔 이동”+“판 도는 대기”라는 두 기계적 지연이 따른다 → Q4의 성능 지표로 직결.
Q4. 디스크 성능은 무엇으로 측정하며, 왜 순차 접근이 빠른가? ✅
A. 핵심 공식은 access time = seek time + rotational latency이고, 순차 접근은 첫 블록에만 seek하지만 무작위 접근은 매번 seek하기 때문에 격차가 크다.
| 구성 요소 | 정의 | 일반적 값 |
|---|---|---|
| Seek time | arm을 올바른 track으로 재배치하는 시간 | 4 to 10 ms |
| Rotational latency | 접근할 sector가 헤드 아래로 회전해 올 때까지 대기 | 4 to 11 ms (5400~15000 r.p.m.) |
- 평균 rotational latency = 1회전 시간의 1/2 (운 좋으면 0, 최악이면 한 바퀴 → 평균 반 바퀴)
- 전체 access time = 5 ~ 20 msec (모델에 따라)
- Data-transfer rate: 디스크에서 읽거나 쓰는 속도, 최대 25 ~ 200 MB/s
비유
seek time = 도서관에서 원하는 책장(track)까지 걸어가는 시간, rotational latency = 책장이 회전식이라 원하는 칸(sector)이 앞으로 돌아올 때까지 기다리는 시간. 둘 다 끝나야 데이터 전송이 시작된다.
실제 숫자로 access time 계산해 보기
디스크가 10,000 r.p.m.(분당 1만 회전), seek time 5 ms, data-transfer rate 100 MB/s, 블록 크기 4 KB라고 하자.
① 평균 rotational latency = 1회전 시간의 절반
- 1회전 시간 =
- 평균 latency =
② 한 블록 전송 시간(transfer time)
- (거의 무시할 수준!)
③ 블록 1개를 무작위로 읽는 총 시간
핵심 깨달음: 실제 데이터를 옮기는 시간(0.04 ms)은 거의 공짜고, 시간의 99%는 **헤드를 움직이고(seek) 판이 돌기를 기다리는(rotation) “준비 시간”**이다. → 그래서 “준비 시간을 몇 번 치르느냐”가 곧 성능이다 = 순차 접근이 빠른 이유.
순차 vs 무작위 — 100개 블록 읽기 시간 비교
같은 디스크로 연속된 블록 100개를 읽는다고 하자.
무작위(Random) 순차(Sequential) seek 블록마다 1번 → 100 × 5 ms = 500 ms 첫 블록만 1번 → 5 ms rotation 블록마다 → 100 × 3 ms = 300 ms 첫 블록만 ≈ 3 ms (이후는 헤드 밑으로 줄줄이 지나감) transfer 100 × 0.04 ms = 4 ms 100 × 0.04 ms = 4 ms 총합 ≈ 804 ms ≈ 12 ms → 같은 양의 데이터인데 약 67배 차이! 무작위는 매 블록마다 “준비 시간(seek+rotation = 8 ms)“을 100번 치르지만, 순차는 단 한 번만 치르고 나머지는 판이 도는 대로 받아먹는다. DBMS가 관련 데이터를 인접 블록에 모으려고 애쓰는 이유가 바로 이 67배다.
Disk block — 저장 할당의 논리적 단위:
- Disk block = 저장 공간 할당(allocation)·검색(retrieval)의 논리적 단위, 보통 4 ~ 16 KB. (sector가 하드웨어 최소 단위면, block은 OS/DB가 다루는 논리적 묶음)
| 블록 크기 | 단점 |
|---|---|
| 작은 블록 | 전송 횟수가 많아짐 (조금씩만 가져옴) |
| 큰 블록 | 부분만 채워져 공간 낭비 |
→ 택배 상자 크기: 너무 작으면 여러 번 배송, 너무 크면 안이 비어 낭비.
Sequential vs Random Access — 시험 포인트:
| 항목 | Sequential | Random |
|---|---|---|
| 연속 요청 대상 | 연속된(successive) block | 디스크 어디에나 있는 block |
| Seek 횟수 | 첫 블록만 | 매 접근마다 |
| 실효 전송률 | 높음 | 낮음 (seek에 시간 낭비) |
왜 중요한가
seek time(4~10ms)은 가장 비싼 비용. 순차 접근은 이를 단 한 번만 치르고 platter가 도는 대로 줄줄이 읽지만, 무작위 접근은 블록마다 arm을 움직인다. 책을 1쪽부터 읽는 것 vs 매번 아무 쪽이나 펴서 한 줄씩 읽는 것의 차이. 그래서 DBMS는 관련 데이터를 인접 블록에 배치해 순차 접근을 유도한다.