07 Flash memory

초강송·2026년 4월 10일

고급컴퓨터구조

목록 보기
6/11

07 Flash memory

Prerequisite

  • DRAM: RAM의 한 종류, volatile
    • DRAM의 storage unit: cell (transistor 1개 + capacitor 1개)
  • NAND Flash: non-volatile (GATE가 있어서 전하가 새어나가는 걸 막아주는 역할을 함)
  • SSD: NAND Flash 여러 개를 넣어 만든 저장장치, non-volatile (page/block, 수천 개 cell 묶음)

Charge Mem/Resistive Mem

  • charge memory는 그냥 둬도 전하가 새어나가고, storage unit을 작게 만들면 더 잘 새어나간다는 단점이 있음
  • RowHammer effect: DRAM의 전하 leakage 현상을 이용해서, 인접한 셀의 데이터가 바뀌게 만듦
  • 이런 realiability issue 해결할 수 있도록, charge 기반이 아닌 저항 기반의 memory가 PCM
  • Charge Memory (DRAM, Flash)
    • 전하를 저장하는 방식으로 write
    • 전하에 따라 변화한 voltage를 읽는 read
  • Resistive Memory (PCM, STT-MRAM)
    • 짧은 시간 동안 전류를 흘려서 write
    • resistance R을 읽는 read

Phase Change Memory

  • RESET: amorphous, 높은 저항 10610^{-6} ~ 10610^{-6}
  • SET: crystalline, 낮은 저항 10310^{-3} ~ 10410^{-4}
  • 저항값은 amorph, cryst 두 가지뿐만 아니라 그 사이 값도 존재한다. → 표현 가능한 상태의 수가 늘어난다. (단순히 1, 0이 아니라) → 한 셀에 여러 비트를 저장할 수 있다.

  • Advantage
    • DRAM이나 Flash보다 미세 공정이 가능하다. (capacitor가 없는 구조이기 때문에)
    • Can be denser than DRAM (한 셀에 여러 비트를 저장 가능)
    • non-volatile
    • no refresh, low idle power
  • Disadvantage
    • read latency, write latency, write bandwidth, energy, 내구도가 모두 DRAM보다 안 좋음
    • NAND flash에 비해선 좋음
  • MLC-PCM (Multi-Level Cell PCM)
    • 셀마다 1 bit 이상 저장하는 구조
    • 값을 읽고 쓰는 데 latency, energy가 더 많이 듦

STT-MRAM

  • free layer의 방향을 조절해서 방향을 바꿀 수 있음, 똑같이 1 cell에 여러 bit를 표현할 수 있음
  • Advantage
    • Scaling
    • non-volatile
    • low idle time
    • MTJ라는 걸 조절하면, non-volatile은 좀 약해지지만, latency나 energy를 개선할 수 있음
  • Disadvantage
    • latnecy, energy가 안 좋음
    • density가 안 좋음 (셀에 여러 bit를 저장할 수 있지만, 저항을 정밀하게 조절하는 게 어렵다고 함)

SSD (Solid State Drive)

  • NAND Flash Memory는 read, write 단위는 page이지만 erase 단위는 block임
  • Flash 메모리는 구조적으로 “erase-before-write” 특성이 있어서 기존 데이터 위에 바로 쓸 수 없다.
    • 즉, 어떤 블록에 이미 데이터가 있으면, 새 데이터를 덮어쓰려면 그 블록 전체를 먼저 지워야 함.
    • 그 page를 한 번이라도 썼으면, 다시 덮어쓰는 건 X
  • flash cell은 charge된 상태를 0, discharge 된 상태를 1이라고 정의함

  • V_ref 기준으로 작으면 1, 크면 0 이렇게 판단하는데, MLC (Multi-Level Cell) 구조에서는 retention loss (시간이 지남에 따라 전하가 새는 문제)로 인해 내가 01로 저장했던 게 00으로 읽힐 수 있음
  • SSD controller가 V_ref를 조금씩 옮겨서 보정해 주는 과정이 들어감 (adpative read)
  • 하지만 완벽히 보정할 수 없음. 그래서 ECC가 필수.

Optimal Read Reference Voltage (OPT)

  • charge 기반이기 때문에 leakge problem
  • realibility랑 endurance가 안 좋음
    • read는 거의 문제가 없지만 write와 erase를 많이 반복하면 cell이 손상되어 수명이 줄어듦
    • 이 현상을 P/E Cycle (Program/Erase Cycle) 한계라고 부름

Modern SSD Architecture

  • SSD 구성
    • SSD Controller / DRAM / NAND 여러 개

Request Handling: Write

  • host interface를 통해 OS나 device driver로부터 write request가 host request queue에 큐잉됨
    • Host Interface Layer(HIL, SATA, NVMe, CPU와 SSD간 interface)

  • data가 DRAM의 write buffer에 먼저 적힘 (여긴 overwrite도 가능하고, write latency도 줄이기 위해서)
    • power off가 되어도 DRAM write buffer에 있는 데이터가 날아가면 안 됨
    • capacitor를 둬, capacitor가 순간적으로 전력을 공급해줘서 NAND로 안전하게 옮김
    • DRAM의 크기를 키울수록 더 많은 capacitor가 필요 → DRAM 크기를 마냥 못 키우는 첫 번째 이유 (capacitor는 물리적으로 부피도 크고 가격도 비쌈)

  • cpu(os)는 logical page address로 write 요청을 보내기 때문에 이를 physical page address로 변환함
  • DRAM에는 L2P (Logical-to-Physical) mapping table을 저장함
    • 4KiB physical data(page, address)를 가리키는데 4B가 필요함

      • 즉 각 entry는 고정된 4B를 차지
    • SSD 크기를 1TB라고 했을 때, 2^40B

    • 2^40 / 4Ki = 2^40 / 2^12 = 2^28 개의 page가 필요

    • 각 페이지당 4B mapping이 필요하므로, 2^28 * 4 = 2^30 = 1G 저장 공간 필요

    • SSD 크기 / DRAM 크기 = 2^40/2^30 = 2^10 = 대충 10^3, 0.1% 비율이 나옴

  • Garbage collection:
    • victim block 골라서 valid page copy, erase the victim block담당
  • Wear-leveling
    • block의 P/E cycle이 비슷하게 유지되도록 관리
    • flash는 erase before write 구조임. 쓰기 전에 지워야 하고 지우기 전에 copy를 해야 됨 → 이 작업은 빈 공간이 많이 없으면 오래 걸리고 불리해짐 (옮길 공간을 찾고 확보하고 이러느라) → cell 이 순차적으로 죽으면 빈 공간이 점점 줄어들어 copy 할 곳이 적어짐. copy 과정이 느려짐 → cell은 비슷하게 살다가 한꺼번에 죽는 게 나음. 그래야 최대한 빈 공간을 오래 많이 확보 가능

  • Randomizer: 데이터를 저장 전에 섞어서 쓰는 패턴을 무작위로 만듦
  • ECC 생성: 전하가 새어나가서 읽은 데이터가 원래와 달라질 때 이걸 보고 복구
  • 진짜 NAND한테 write 명령 보냄

Request Handling: Read

  • write buffer에서 줄 수 있으면 바로 줌 (이때 partial return X)
  • 없으면 address translation 해서 NAND 찾아가서 줌
  • 읽을 때 랜덤하게 쓴 데이터를 읽고, ECC 보고 오류 수정하고, 다시 randomizer가 데이터를 섞은 방식을 역으로 적용해서 데이터 복원함

0개의 댓글