[OSTEP] 스터디 18주차 Flash 기반 SSD

아마 2025년 마지막 포스팅이자 OSTEP 스터디 정리가 될 것이다. 2026년에도 계속해서 OSTEP 내용들과 개발 관련 포스팅을 올릴 수 있도록 하겠다.

현대 스토리지 기술의 중심인 SSD(Solid State Drive)는 HDD와 달리 기계적 장치가 없으며, 반도체를 이용해 데이터를 저장한다. OSTEP(Operating Systems: Three Easy Pieces)에서 다루는 Flash 기반 SSD의 핵심 구조와 작동 원리, 그리고 운영체제가 직면한 과제들을 정리한다.


1. 하드웨어 구조 (NAND Flash Structure)

NAND 플래시 메모리는 데이터를 저장하기 위해 계층적인 구조를 가진다.

  • 뱅크(Bank) 및 다이(Die): 병렬 처리를 가능하게 하는 상위 단위이다.
  • 블록(Block): 여러 개의 페이지가 모여 하나의 블록을 이룬다. (예: 128KB, 256KB 등)
  • 페이지(Page): 데이터를 읽고 쓰는 최소 단위이다. (예: 4KB)

이러한 계층 구조는 마치 블록들이 책장(다이)에 꽂힌 책(뱅크)이고, 각 책이 여러 장의 페이지로 이루어진 것과 유사하다. 데이터는 이 페이지 단위로 기록되지만, 삭제는 항상 블록 단위로 이루어진다는 것이 중요한 특징이다.


2. 플래시 메모리의 핵심 제약 사항

SSD를 이해하기 위해 반드시 알아야 할 물리적 특성이 존재한다. 이러한 제약들 때문에 SSD 컨트롤러는 복잡한 내부 로직을 수행해야 한다.

  1. Read (읽기): 페이지 단위로 매우 빠르게 수행된다.
  2. Program (쓰기): 페이지 단위로 수행되지만, 반드시 빈(Erase된) 상태의 페이지에만 쓸 수 있다. 이미 데이터가 있는 페이지에는 덮어쓰기가 불가능하다. 이는 HDD와 가장 큰 차이점 중 하나이다.
  3. Erase (삭제): 페이지 단위가 아닌 블록 단위로만 가능하다. 이 'Erase-before-write' 특성은 SSD 관리의 가장 큰 난제이다.
  4. 수명 (Wear-out): 각 블록은 삭제 및 프로그램 횟수(P/E Cycle)에 한계가 있어, 과도하게 사용하면 데이터를 저장할 수 없게 된다. 이는 플래시 메모리 셀의 물리적 특성에서 기인한다.

3. FTL(Flash Translation Layer)의 설계 전략

OS는 SSD를 '연속된 섹터의 배열'로 인식하고자 하지만, 실제 플래시는 '덮어쓰기 불가'라는 제약이 있다. 이를 해결하기 위해 SSD 컨트롤러 내부의 FTL은 논리적 주소(LBA)를 물리적 주소(PBA)로 동적으로 매핑한다.

A. 로그 구조 매핑 (Log-structured Mapping)

FTL은 HDD처럼 제자리에 덮어쓰지(Update-in-place) 않는다. 대신 새로운 데이터를 항상 비어 있는 페이지에 추가(Append)하고, 매핑 테이블을 업데이트한다. 기존 데이터가 저장되었던 페이지는 '무효(Invalid)' 상태가 된다.

B. 매핑의 단위 (Granularity)

  • 페이지 수준 매핑(Page-level Mapping): 모든 페이지를 개별적으로 매핑한다. 유연성이 극대화되지만, 매핑 테이블의 크기가 너무 커져서 SSD의 메모리(DRAM)에 다 담기 힘들다는 단점이 있다.
  • 블록 수준 매핑(Block-level Mapping): 블록 단위로만 매핑한다. 테이블 크기는 줄어들지만, 블록 내의 작은 데이터 하나만 수정해도 전체 블록을 새로 써야 하는 비효율이 발생한다.
  • 혼합 매핑(Hybrid Mapping): OSTEP에서 중요하게 다루는 개념이다. 최근 쓰기는 페이지 단위로(Log Block), 오래된 데이터는 블록 단위로(Data Block) 관리하여 효율성과 공간 절약을 동시에 꾀한다.

4. 가비지 컬렉션(Garbage Collection)과 쓰기 증폭

로그 구조로 데이터를 계속 쌓다 보면 결국 빈 공간이 부족해진다. 이때 FTL은 가비지 컬렉션을 수행한다.

  1. Victim 블록 선정: 무효(Invalid) 페이지가 많은 블록을 선택한다.
  2. 데이터 이동: 해당 블록에서 아직 살아있는(Valid) 페이지들만 골라 새로운 블록으로 옮긴다.
  3. 블록 삭제: 이제 유효한 데이터가 없는 기존 블록을 통째로 Erase 하여 빈 공간으로 만든다.

이 과정에서 사용자가 요청한 1개 페이지 쓰기를 처리하기 위해, 내부적으로 여러 페이지를 읽고 쓰는 과정이 발생하는데 이를 쓰기 증폭(Write Amplification)이라 한다. 이는 SSD 성능 저하의 주범이다.


5. 수명 관리: 웨어 레벨링(Wear Leveling)

플래시 셀은 지우기 횟수에 한계가 있다. 만약 특정 블록에만 쓰기 작업이 집중된다면 그 블록은 금방 고장 나게 된다. FTL은 모든 물리 블록에 대해 삭제/쓰기 횟수를 모니터링하며, 작업 부하를 전체 블록에 고르게 분산시키는 웨어 레벨링 알고리즘을 수행하여 SSD 전체의 수명을 보장한다.


6. OS와의 협력: TRIM 명령

OS 수준에서 파일이 삭제되어도 SSD는 이를 즉시 알 수 없다(그저 무효화된 데이터일 뿐이다). 이를 방치하면 가비지 컬렉션 시 불필요한 데이터 이동이 발생한다. TRIM 명령은 OS가 특정 섹터의 데이터가 더 이상 필요 없음을 SSD에 명시적으로 알려주어, 가비지 컬렉션 효율을 높이고 쓰기 증폭을 줄이는 역할을 수행한다.