Энергонезависимая память. Иерархия памяти

Фундаментальный конспект лекции по дисциплине «Архитектура аппаратных средств» (СИЭУиП, занятие 13, §2.2, с. 8). Физика уровней хранения, пирамида памяти, математический анализ эффективного времени доступа, принципы локальности, кэширование, устройство NAND Flash (3D TLC/QLC, Wear Leveling, TBW) и протокол NVMe.

1. Пирамида иерархии памяти: физическая природа компромисса

Центральный процессор современного компьютера способен выполнять триллионы элементарных микроопераций в секунду. Однако процессор бесполезен, если он вынужден простаивать в ожидании инструкций и операндов. Идеальная память должна обладать тремя ключевыми качествами: нулевой задержкой доступа, бесконечным объемом и нулевой стоимостью при абсолютной энергонезависимости (сохранности данных).

Фундаментальное аппаратное ограничение: Не существует физического полупроводникового элемента, который одновременно был бы экстремально быстрым, емким, дешевым и энергонезависимым. Чем быстрее запоминающая ячейка, тем больше транзисторов она требует на 1 бит, тем большую площадь на кристалле кремния она занимает, тем выше её паразитные токи утечки и себестоимость.

Для разрешения этого противоречия архитекторы ЭВМ используют иерархическую структуру памяти, организуемую в виде пирамиды:

                      ▲
                     / \       1. Регистры ЦП (1–2 такта, ~0.5–1 нс, ~1–4 КБ, SRAM)
                    /   \
                   /     \     2. Кэш L1 (4–5 тактов, ~1–1.5 нс, ~32–96 КБ, SRAM)
                  /       \
                 /         \   3. Кэш L2 (12–14 тактов, ~3–5 нс, ~1–2 МБ, SRAM)
                /           \
               /             \ 4. Кэш L3 (35–50 тактов, ~10–20 нс, ~16–96 МБ, SRAM)
              /               \
             /─────────────────\  (Граница кристалла процессора)
            /                   \
           /                     \ 5. Оперативная память (150–250 тактов, ~50–80 нс, 16–128 ГБ, DRAM)
          /                       \
         /                         \ 6. Энергонезависимый NVMe SSD (~10–30 мкс, 512 ГБ–4 ТБ, NAND Flash)
        /                           \
       /                             \ 7. Магнитный жесткий диск HDD (~5–10 мс, 2–24 ТБ, Magnetic Platter)
      /                               \
     /─────────────────────────────────\ 8. Архивные ленты LTO / Облачный холодный архив (Секунды/минуты, Петабайты)
    ▼                                   ▼
[Скорость ↑, Стоимость ↑, Ёмкость ↓]      [Скорость ↓, Стоимость ↓, Ёмкость ↑, Энергонезависимость ✓]
    
Уровень иерархии Технология Время доступа (такты и нс) Человеческая аналогия (1 такт = 1 сек) Энергозависимость Относительная стоимость за 1 ГБ
Регистры ЦП Flip-Flop / D-триггеры 1 такт (~0.5–1 нс) 1 секунда (мысль в голове) Энергозависимая Экстремальная (~$100 000+)
Кэш L1 SRAM (6T транзисторов) 4–5 тактов (~1–1.5 нс) 5 секунд (книга в руке) Энергозависимая Колоссальная (~$10 000)
Кэш L2 SRAM (6T транзисторов) 12–14 тактов (~3–5 нс) 15 секунд (книга на столе) Энергозависимая Очень высокая (~$2 000)
Кэш L3 SRAM (6T/eDRAM/3D) 35–50 тактов (~10–20 нс) 45 секунд (книжная полка в комнате) Энергозависимая Высокая (~$500)
ОЗУ (DRAM) 1T-1C (транзистор + конденсатор) 150–250 тактов (~50–80 нс) 3–4 минуты (поход в соседнее здание) Энергозависимая (требует регенерации) Умеренная (~$3–5 / ГБ)
NVMe SSD 3D TLC/QLC NAND Flash ~10–30 мкс (~50 000 тактов) 14 часов (поездка в другой город) Энергонезависимая Низкая (~$0.07 / ГБ)
HDD Магнитные пластины + головка ~5–10 мс (~20 000 000 тактов) 7 месяцев (пешая экспедиция на полюс) Энергонезависимая Очень низкая (~$0.015 / ГБ)
Архив Tape LTO Магнитная лента в картриджах Десятки секунд / минуты Десятилетия (полет к другой планете) Энергонезависимая (30+ лет) Минимальная (~$0.005 / ГБ)

2. Принципы локальности данных: фундамент кэширования

Иерархия памяти работает эффективно только благодаря фундаментальному эмпирическому феномену вычислительных процессов — принципу локальности ссылок (Locality of Reference). Он гласит: программы не обращаются к адресному пространству абсолютно случайно; в каждый короткий промежуток времени процессор работает с компактным подмножеством памяти.

2.1. Временная локальность (Temporal Locality)

Если к некоторому участку памяти произошло обращение в текущий момент времени $t$, то с высокой долей вероятности к этой же ячейке произойдет повторное обращение в ближайшем будущем ($t + \Delta t$).

2.2. Пространственная локальность (Spatial Locality)

Если процессор обратился к ячейке памяти по адресу $A$, то с высокой вероятностью в ближайшие такты ему потребуются данные из соседних адресов $A+1, A+2, \dots$

Классический антипаттерн в C/C++:
// Плохо: обход матрицы по столбцам (катастрофа пространственной локальности)
// Каждый шаг перескакивает через всю строку N, вызывая постоянные кэш-промахи:
for (int j = 0; j < N; j++) {
    for (int i = 0; i < N; i++) {
        sum += matrix[i][j]; // Cache Miss на каждом шаге!
    }
}

// Отлично: обход матрицы по строкам (идеальная пространственная локальность)
// Загруженная 64-байтная линия кэша обслуживает 16 последовательных чисел float:
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        sum += matrix[i][j]; // 1 Miss на 16 чисел, 15 Cache Hits подряд!
    }
}
      
При больших размерах матрицы $N > 1000$ второй вариант работает в 10–30 раз быстрее исключительно за счет пространственной локальности кэша!

3. Организация кэш-памяти: адресация, ассоциативность и политики записи

3.1. Структура физического адреса памяти

Когда процессор запрашивает адрес оперативной памяти (например, 64-битный), аппаратура кэша разделяет адресную шину на три функциональных поля:

[ Тег адреса (Tag) ] — [ Индекс набора (Index) ] — [ Смещение в строке (Offset: 6 бит = 64 байта) ]

3.2. Способы отображения и ассоциативность кэша

3.3. Политики записи: Write-Through против Write-Back

Когда процессор выполняет операцию записи данных (Store), возникает вопрос: когда и как изменения переносятся в оперативную память?

Параметр Сквозная запись (Write-Through) Обратная запись (Write-Back)
Механизм работы Данные записываются одновременно и в кэш-память, и во внешнюю память (ОЗУ). Данные записываются только в кэш. Линия помечается служебным битом изменения — Dirty Bit. В ОЗУ данные сбрасываются только в момент вытеснения линии (Eviction).
Нагрузка на системную шину Высокая: каждая операция записи занимает системную шину и оперативную память. Минимальная: сотни модификаций переменной происходят внутри кристалла SRAM без обращения к ОЗУ.
Задержка для процессора Высокая (требует буферизации через Write Buffer, при заполнении которого процессор останавливается). Минимальная: операция Store завершается за 1 такт так же быстро, как запись в регистр.
Сложность аппаратуры и риск сбоя Низкая сложность. ОЗУ всегда содержит актуальные данные (нет риска рассинхронизации). Высокая сложность: требуется логика отслеживания Dirty-бит и протоколы когерентности (MESI/MOESI). При внезапном обесточивании несохраненные грязные строки теряются.
Политика при промахе записи Обычно No-Write-Allocate: данные пишутся прямо в ОЗУ без загрузки линии в кэш. Обычно Write-Allocate: 64-байтная линия загружается из ОЗУ в кэш, затем модифицируется.

4. Расчет эффективного времени доступа к памяти (T_eff)

Поскольку процессор при каждом обращении сначала проверяет кэш, а при промахе обращается к оперативной памяти, средневзвешенное (эффективное) время доступа выражается формулой:

T_eff = H · T_cache + (1 - H) · T_ram

где:

Демонстрационный расчет чувствительности архитектуры:
Пусть $T_{cache} = 2$ нс, а задержка обращения к ОЗУ $T_{ram} = 60$ нс.
  • При $H = 99\%$ (0.99): $T_{eff} = 0.99 \cdot 2 + 0.01 \cdot 60 = 1.98 + 0.60 = \mathbf{2.58\text{ нс}}$.
  • При $H = 95\%$ (0.95): $T_{eff} = 0.95 \cdot 2 + 0.05 \cdot 60 = 1.90 + 3.00 = \mathbf{4.90\text{ нс}}$.
  • При $H = 90\%$ (0.90): $T_{eff} = 0.90 \cdot 2 + 0.10 \cdot 60 = 1.80 + 6.00 = \mathbf{7.80\text{ нс}}$.
Вывод: Снижение Hit Rate всего на 9% (с 99% до 90%) приводит к замедлению подсистемы памяти более чем в 3 раза (с 2.58 нс до 7.80 нс)! В современных многоядерных чипах это приводит к тому, что процессор 70–80% времени простаивает в ожидании данных (Memory Stall Cycles). Именно поэтому архитекторы наращивают объемы кэш-памяти (например, до 96 МБ 3D V-Cache у AMD).

5. Физика энергонезависимой памяти: NAND Flash, 3D-структуры и износ

5.1. Физический принцип хранения заряда: плавающий затвор и ловушка заряда

В основе полупроводниковой энергонезависимой памяти лежит полевой транзистор со специальным изолированным слоем, способным годами удерживать электрический заряд без внешнего источника питания:

5.2. Типы ячеек: SLC, MLC, TLC, QLC

Чтобы снизить стоимость хранения, инженеры научились измерять точное количество заряда в ячейке, деля его на дискретные уровни напряжения:

Тип ячейки Бит в ячейке Уровней напряжения ($2^N$) Ресурс (P/E циклов) Напряжение и чувствительность Особенности применения
SLC (Single-Level) 1 бит 2 уровня 50 000 – 100 000 Широкое окно между состояниями «0» и «1». Мгновенное чтение/запись. SLC-кэш, промышленные контроллеры, космос.
MLC (Multi-Level) 2 бита 4 уровня 3 000 – 10 000 Четко различимые 4 порога напряжения. Enterprise SSD прошлых поколений.
TLC (Triple-Level) 3 бита 8 уровней 1 000 – 3 000 Очень узкие диапазоны напряжений; требует точных алгоритмов ECC (LDPC). Массовый стандарт для быстрых потребительских и серверных NVMe SSD.
QLC (Quad-Level) 4 бита 16 уровней 300 – 1 000 Микроскопическая разница напряжений. Высокий риск ошибок при утечке даже нескольких электронов. Бюджетные накопители, холодные файловые архивы (Read-Intensive).

5.3. Переход к 3D NAND

До 2015 года флеш-память масштабировалась в плоскости кристалла (2D Planar). При приближении к нормам 15 нм расстояние между ячейками сократилось до нескольких нанометров, что вызвало паразитную емкостную связь между соседними затворами (Cell-to-Cell Crosstalk) и утечки сквозь оксид толщиной в несколько атомов.

Решением стал переход к 3D NAND (V-NAND): цилиндрические вертикальные каналы памяти, пронизывающие кристалл снизу вверх. Современные чипы содержат от 176 до 232+ вертикальных слоев ячеек Charge Trap, что позволило увеличить физический размер ячейки (повысив надежность и ресурс) и одновременно достичь колоссальной емкости кристалла (до 1–2 Тбит на один полупроводниковый кристалл).

5.4. Асимметрия операций: почему SSD не умеет перезаписывать «на месте»

Фундаментальное правило физики NAND Flash:
  • Чтение и Запись (Программирование) выполняются строго страницами (Pages) размером 4 КБ, 8 КБ или 16 КБ.
  • Стирание (Erase) возможно выполнять только целыми блоками (Blocks) размером 2 МБ, 4 МБ или 8 МБ (блок состоит из 128–512 страниц).
  • Невозможно записать бит «0» поверх бита «0» без предварительного стирания ячейки в состояние «1». Для стирания требуется подача высокого напряжения ~20 В на подложку целого блока!

Из-за этой асимметрии контроллер SSD при обновлении файла не может перезаписать старые секторы. Он вынужден записывать новые данные в свободную страницу, а старую помечать как недействительную (Invalid). Это порождает три ключевых механизма:

  1. Сборка мусора (Garbage Collection): контроллер SSD в фоновом режиме находит блоки с большим числом недействительных страниц, копирует оставшиеся живые страницы в новый свободный блок, а старый блок целиком стирает для повторного использования.
  2. Команда TRIM: команда операционной системы, сообщающая контроллеру SSD, какие блоки файлов были удалены пользователем в файловой системе (NTFS, ext4), чтобы контроллер не тратил ресурс на их перезапись при сборке мусора.
  3. Коэффициент усиления записи (Write Amplification Factor — WAF): отношение физически записанного контроллером объема данных в чипы памяти к объему данных, отправленному операционной системой ($WAF = \frac{\text{Bytes Written to NAND}}{\text{Bytes Written by Host}}$). При случайной мелкой записи без TRIM WAF может достигать 3–5, ускоряя износ ячеек.

5.5. SLC-кэширование (псевдо-SLC)

Прямая запись в ячейки TLC/QLC требует медленной ступенчатой подгонки напряжения (алгоритм ISPP). Чтобы скрыть эту медлительность, контроллеры организуют динамический SLC-кэш: часть свободных ячеек TLC/QLC временно программируется как 1-битные SLC (только 2 уровня напряжения).

Пока объем непрерывной записи укладывается в буфер SLC-кэша (например, 20–80 ГБ), скорость составляет 4000–7000 МБ/с. Однако как только буфер заполняется, контроллер вынужден одновременно принимать новые данные и «уплотнять» (Folding) накопленные данные из SLC-режима в полноценный 3-битный TLC или 4-битный QLC. Скорость записи мгновенно падает до истинной скорости чипов: для TLC — до 400–800 МБ/с, а для QLC — до катастрофических 50–100 МБ/с.

5.6. Ресурс накопителя и алгоритмы Wear Leveling

Каждый цикл туннелирования Фаулера-Нордгейма создает микродефекты в кристаллической решетке диэлектрика. Со временем оксид истончается, и ячейка перестает удерживать электроны (деградация бита).

6. Протоколы и системные интерфейсы: NVMe против SATA AHCI

Долгое время твердотельные накопители подключались через интерфейс SATA и протокол AHCI (Advanced Host Controller Interface). Протокол AHCI создавался в начале 2000-х годов исключительно для медленных вращающихся магнитных дисков (HDD) и не был рассчитан на параллелизм полупроводниковой памяти. В 2011 году консорциум ведущих производителей разработал революционный стандарт NVMe (Non-Volatile Memory Express).

Характеристика SATA III (Протокол AHCI) PCIe NVMe (Gen4 / Gen5 x4)
Физическая шина Последовательный кабель SATA, чипсетный контроллер Прямые линии шины PCI Express процессора (x4)
Теоретическая пропускная способность До 600 МБ/с (6 Гбит/с) До 8 000 МБ/с (Gen4 x4) / до 16 000 МБ/с (Gen5 x4)
Количество очередей команд 1 очередь До 64 000 очередей
Глубина каждой очереди До 32 команд До 64 000 команд в каждой очереди
Механизм прерываний и задержки Устаревшие прерывания с синхронизацией и блокировками ядра (Lock contention) Векторные прерывания MSI-X (до 2048 векторов), lockless архитектура с привязкой очереди к ядру ЦП
Накладные расходы драйвера (CPU Overhead) ~20 000 инструкций ЦП на 1 команду ввода-вывода ~2 000 инструкций ЦП на 1 команду ввода-вывода (в 10 раз меньше!)

7. Контрольные вопросы для самопроверки

  1. Почему регистры процессора и кэш L1 строятся на триггерах и SRAM, а оперативная память — на конденсаторах DRAM?
    Ответ: Ячейка SRAM состоит из 6 транзисторов (6T) и переключается за доли наносекунды без необходимости регенерации заряда, но занимает огромную площадь кремниевого кристалла. Ячейка DRAM состоит всего из 1 транзистора и 1 микроскопического конденсатора (1T-1C), что обеспечивает фантастическую плотность упаковки (гигабайты на чипе), но конденсатор теряет заряд за миллисекунды, требует периодической регенерации (Refresh) и считывается с разрушением заряда, что определяет задержку в десятки наносекунд.
  2. Каким образом аппаратура кэша отличает попадание от промаха при обращении к памяти?
    Ответ: Аппаратура извлекает из физического адреса поле Index и находит соответствующий Set кэша. Затем аппаратные компараторы параллельно сравнивают поле Tag запрошенного адреса с тегами всех линий, хранящихся в данном наборе. Если тег совпал и установлен бит валидности (Valid Bit = 1), регистрируется Cache Hit, и данные выдаются по смещению Offset. Если совпадений нет — формируется сигнал Cache Miss.
  3. В чем принципиальная разница между политиками записи Write-Through и Write-Back?
    Ответ: При Write-Through данные записываются параллельно в кэш и в ОЗУ, что гарантирует полную согласованность, но резко тормозит процессор из-за медлительности шины памяти. При Write-Back данные пишутся мгновенно только в кэш с установкой флага Dirty Bit, а в ОЗУ сбрасываются только при неизбежном вытеснении линии, что освобождает системную шину для полезных вычислений.
  4. Почему падение Hit Rate с 99% до 90% приводит к деградации производительности системы в разы?
    Ответ: Время доступа к кэшу составляет ~2 нс, а к ОЗУ — ~60 нс (разница в 30 раз!). При промахе процессор вынужден ожидать данные сотни тактов (Miss Penalty). Увеличение доли промахов с 1% до 10% увеличивает средневзвешенную составляющую задержки ОЗУ в 10 раз ($0.10 \times 60 = 6$ нс против $0.01 \times 60 = 0.6$ нс), что удваивает или утраивает общее эффективное время доступа $T_{eff}$.
  5. Почему твердотельный накопитель NAND Flash не может просто перезаписать измененный байт поверх старого?
    Ответ: Ячейка NAND может электрически переходить из состояния «1» (стерто) в «0» (запрограммировано) отдельными страницами по 4–16 КБ. Но обратный переход из «0» в «1» требует стирания высоким напряжением (~20 В), которое конструктивно подается только на изолированную подложку целого блока размером 2–8 МБ (сотни страниц). Поэтому перезапись выполняется через цикл Read-Modify-Write с записью в новую свободную страницу.
  6. Что произойдет с QLC SSD, если на него непрерывно копировать файл объемом 150 ГБ?
    Ответ: Первые 30–50 ГБ будут записаны на высокой скорости (2000–3500 МБ/с) благодаря динамическому SLC-кэшу. После исчерпания свободных ячеек SLC буфер переполнится. Контроллер начнет одновременно принимать входящий поток и уплотнять ранее записанные данные в 4-битные ячейки QLC (процесс Folding). Скорость записи рухнет до истинной скорости записи QLC — примерно 50–100 МБ/с, что медленнее стандартного жесткого диска.
  7. В чем ключевое преимущество протокола NVMe над устаревшим SATA AHCI при многопоточной нагрузке?
    Ответ: Протокол SATA AHCI имеет всего 1 очередь глубиной до 32 команд, что при многоядерных процессорах приводит к блокировкам драйвера операционной системы (Lock contention). NVMe поддерживает до 64 000 параллельных очередей глубиной до 64 000 команд каждая, позволяя выделить каждому ядру ЦП собственную независимую очередь команд без блокировок, минимизируя задержки и накладные расходы драйвера в 10 раз.
  8. Зачем контроллер SSD использует алгоритм статического выравнивания износа (Static Wear Leveling)?
    Ответ: Если использовать только динамическое выравнивание, то блоки, занятые неизменяемыми системными файлами (Windows/Linux, установленные программы), никогда не будут перезаписываться. Оставшаяся свободная часть диска износится в разы быстрее. Static Wear Leveling принудительно перемещает холодные статические данные в блоки с высоким износом, освобождая наименее изношенные блоки под циклическую запись, равномерно распределяя ресурс по всем кристаллам.