Skip to content
난이도 문제은행 3

보조기억장치와 입출력 ​

메모리는 빠르지만 전원이 꺼지면 내용이 사라진다. 그래서 데이터를 오래 남기려면 보조기억장치(secondary storage)가 필요하고, 그 대표가 HDD(Hard Disk Drive, 하드 디스크 드라이브)와 SSD(Solid State Drive, 반도체 저장 장치)다. 둘은 저장 원리가 완전히 달라서 느린 이유도 조심할 점도 다르므로, 이 문서는 두 장치의 구조와 각각 무엇이 속도를 좌우하는지 정리한다.

HDD: 도는 원판과 움직이는 헤드 ​

HDD는 자기로 기록하는 원판인 플래터(platter)를 빠르게 돌리고, 팔 끝의 헤드(head)로 데이터를 읽고 쓴다. 원판 표면은 동심원 모양의 트랙(track)으로 나뉘고, 트랙은 다시 섹터(sector)라는 작은 칸으로 나뉜다. 한 섹터는 보통 512바이트나 4KB다.

데이터 하나를 읽는 데 걸리는 시간은 세 부분으로 나뉜다.

  • 탐색 시간(seek time): 헤드가 팔을 움직여 원하는 트랙까지 가는 시간이다. 보통 가장 크다.
  • 회전 지연(rotational latency): 원하는 섹터가 원판이 돌아 헤드 아래로 올 때까지 기다리는 시간이다. 분당 7,200번 도는 디스크는 한 바퀴에 약 8.3ms가 걸리므로, 평균적으로 그 절반인 약 4.2ms를 기다린다.
  • 전송 시간(transfer time): 헤드 아래를 지나는 데이터를 실제로 읽는 시간이다.

앞의 두 시간은 기계가 움직이는 시간이라 밀리초 단위다. 그래서 여기저기 흩어진 데이터를 읽는 랜덤 접근(random access)은 매번 탐색과 회전 대기를 치러 매우 느리고, 이어진 데이터를 쭉 읽는 순차 접근(sequential access)은 훨씬 빠르다. 데이터베이스가 디스크 접근 횟수를 줄이려고 애쓰는 이유가 이것이다(디스크 I/O와 인덱스 참고).

SSD: 플래시 메모리의 규칙 ​

SSD는 움직이는 부품 없이 플래시 메모리(flash memory)에 데이터를 저장한다. 플래시 메모리는 전원이 없어도 데이터가 남는 반도체 메모리다. 기계가 움직일 필요가 없으므로 랜덤 접근도 HDD보다 훨씬 빠르다.

대신 플래시 메모리에는 HDD에 없는 규칙이 있다.

  1. 읽기와 쓰기는 플래시 메모리의 가장 작은 쓰기 칸인 페이지(page) 단위(보통 수 KB)로 한다.
  2. 이미 쓴 페이지는 그 자리에 덮어쓸 수 없다. 다시 쓰려면 먼저 지워야 한다.
  3. 지우기는 페이지 수백 개를 묶은 블록(block) 단위(제품에 따라 수백 KB~수 MB)로만 할 수 있다.
  4. 블록마다 지우고 다시 쓸 수 있는 횟수에 한계가 있어, 한도를 넘으면 그 블록은 망가진다.

그래서 SSD 안의 장치 컨트롤러(device controller)는 데이터를 고칠 때 원래 페이지를 지우지 않는다. 새 내용을 비어 있는 다른 페이지에 쓰고, 옛 페이지는 "무효"로 표시한다. 이렇게 운영체제가 "몇 번 칸을 읽어라"라고 요청할 때 쓰는 번호인 논리 주소(logical address)와 실제 페이지 위치를 이어 주는 표를 관리하는 부분을 FTL(Flash Translation Layer, 플래시 변환 계층)이라 한다. 무효 페이지가 쌓인 블록은 나중에 남은 유효 페이지만 다른 곳으로 옮긴 뒤 통째로 지우는데, 이 청소 작업을 가비지 컬렉션(garbage collection)이라 한다. 청소 중에는 유효 페이지를 옮겨 쓰고 블록을 지우는 일이 사용자 쓰기와 함께 처리되므로 쓰기가 느려질 수 있다.

다이어그램 로딩…

웨어 레벨링(wear leveling)은 쓰기를 모든 블록에 고르게 퍼뜨리는 기법이다. 같은 블록만 계속 쓰면 그 블록이 먼저 수명을 다하므로, 자주 바뀌는 데이터를 여러 블록으로 돌려 가며 써서 SSD 전체 수명을 늘린다.

SSD를 연결하는 방식도 속도를 좌우한다. 예전 SATA(Serial ATA, 직렬 ATA) 연결에서 쓰던 AHCI(Advanced Host Controller Interface, 고급 호스트 컨트롤러 인터페이스)라는 접속 규격은 HDD에 맞춰 만들어져, 명령을 넣는 큐(queue)가 하나(최대 32개 명령)뿐이었다. 큐가 하나면 여러 코어(core)가 그 큐 하나를 차례로 기다려야 한다. NVMe(Non-Volatile Memory Express, 비휘발성 메모리 익스프레스)는 SSD를 고속 확장 통로인 PCIe(PCI Express, 고속 확장 버스 규격)에 직접 붙이고, 규격상 최대 65,535개의 입출력 큐를 둘 수 있다. 그래서 코어마다 자기 큐를 줄 수 있어, 코어들이 서로 기다리지 않고 동시에 명령을 넣는다.

이어지는 내용은 보조기억장치와 입출력 2에서 다룬다.

면접 포인트 ​

  • "HDD가 랜덤 접근에 느린 이유는?" → 탐색 시간 + 회전 지연, 기계가 움직이는 밀리초 단위 비용.
  • "SSD의 특징은?" → 덮어쓰기 불가, 쓰기는 페이지·지우기는 블록 단위, FTL·가비지 컬렉션·웨어 레벨링.
  • "NVMe가 빠른 이유는?" → SSD를 PCIe에 직접 붙이고 입출력 큐를 여러 개 둬 여러 코어가 동시에 명령을 넣는다.

관련 문서