Открыть сервис

Страничная память

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

История

Концепция страничной памяти была впервые предложена в 1961 году в Манчестерском университете в рамках проекта компьютера Atlas. Система Atlas использовала однобитный механизм защиты и была первой, где реализована подкачка страниц между основной памятью и магнитным барабаном. В 1970-х годах страничная память стала стандартом для многозадачных операционных систем, таких как Unix и VMS. В 1980-х годах, с появлением процессоров Intel 80386, страничная память была реализована на аппаратном уровне в x86-архитектуре, что позволило использовать её в персональных компьютерах. В современных системах (Linux, Windows, macOS) страничная память является обязательным компонентом ядра.

Классификация

Страничная память классифицируется по нескольким признакам:

По способу отображения

  • Одноуровневая страничная таблица — все страницы процесса отображаются в одной таблице. Используется в простых системах (например, ранние версии VAX/VMS).
  • Многоуровневая страничная таблица — таблицы организованы иерархически (например, двухуровневая в x86-32, четырёхуровневая в x86-64). Позволяет экономить память за счёт частичного заполнения таблиц.

По размеру страницы

  • Фиксированный размер — все страницы имеют одинаковый размер (обычно 4 КБ в x86, 8 КБ в ARM, 64 КБ в PowerPC).
  • Гибридный размерподдержка больших страниц (например, 2 МБ или 1 ГБ в x86-64) для уменьшения накладных расходов на таблицы.

По механизму подкачки

  • Страничная подкачка (paging) — страницы выгружаются на диск при нехватке физической памяти.
  • Сегментно-страничная — комбинация сегментации и страничной памяти (например, в Intel 80386).

Устройство и принцип работы

Основные компоненты

Страничная память включает:

  • Виртуальные страницы — блоки виртуального адресного пространства процесса.
  • Физические страницы (фреймы) — блоки физической памяти одинакового размера.
  • Страничные таблицы — структуры данных, хранящие отображение виртуальных страниц на физические фреймы.
  • Буфер ассоциативной трансляции (TLB) — аппаратный кэш, ускоряющий преобразование адресов.

Преобразование адреса

Виртуальный адрес делится на номер виртуальной страницы (VPN) и смещение внутри страницы (offset). Процессор, используя страничную таблицу, преобразует VPN в номер физического фрейма (PFN), затем добавляет смещение для получения физического адреса. Если страница отсутствует в физической памяти (страничный сбой), операционная система загружает её с диска.

Аппаратная поддержка

В архитектуре x86-64 преобразование адресов выполняется блоком управления памятью (MMU) процессора. MMU использует регистр CR3 для указания на корневую страничную таблицу. При каждом обращении к памяти MMU проверяет TLB; при промахе происходит аппаратный обход страничных таблиц.

Характеристики

Размер страницы

Размер страницы влияет на производительность и использование памяти. Малые страницы (4 КБ) уменьшают внутреннюю фрагментацию, но увеличивают количество записей в таблицах и нагрузку на TLB. Большие страницы (2 МБ, 1 ГБ) снижают накладные расходы на таблицы, но могут приводить к потере памяти из-за неполного использования.

Производительность

Основные факторы производительности:

  • Частота страничных сбоев — зависит от рабочего набора процесса и алгоритма замещения страниц (например, LRU, FIFO, Clock).
  • Эффективность TLB — размер TLB (обычно 64–1024 записи) и ассоциативность влияют на процент попаданий.
  • Скорость доступа к страничным таблицам — многоуровневые таблицы увеличивают задержку при промахе TLB.

Защита памяти

Каждая запись в страничной таблице содержит биты защиты: чтение/запись/исполнение, пользовательский/супервизорный режим, бит присутствия. Это предотвращает несанкционированный доступ процессов друг к другу и к ядру.

Применение

Многозадачные операционные системы

Страничная память является основой для изоляции процессов. В Linux и Windows каждый процесс имеет собственное виртуальное адресное пространство, что предотвращает взаимное влияние. Механизм подкачки позволяет запускать больше процессов, чем доступно физической памяти.

Виртуализация

В гипервизорах (например, KVM, VMware) страничная память гостевых систем отображается на физическую память хоста через вложенные страничные таблицы (Nested Page Tables, Intel EPT/AMD NPT). Это снижает накладные расходы на трансляцию адресов.

Отображение файлов в память

Системный вызов mmapUnix) или CreateFileMapping (в Windows) позволяет отобразить файл на диск в виртуальную память. Операционная система автоматически подгружает страницы файла при обращении, что ускоряет ввод-вывод.

Большие страницы в высокопроизводительных вычислениях

В приложениях, работающих с большими объёмами данных (базы данных, численное моделирование), используются большие страницы (Huge Pages в Linux, Large Pages в Windows) для уменьшения количества промахов TLB и повышения производительности.

Примеры реализации

Linux

В ядре Linux используется четырёхуровневая страничная таблица (PGD, P4D, PUD, PMD, PTE) для x86-64. Размер страницы по умолчанию — 4 КБ. Поддержка больших страниц (HugeTLB) и прозрачных больших страниц (Transparent Huge Pages) включена начиная с версии 2.6.38. Алгоритм замещения страниц — модифицированный вариант Clock (LRU-подобный).

Windows

В Windows NT используется двухуровневая страничная таблица для x86-32 и четырёхуровневая для x86-64. Размер страницы — 4 КБ. Windows поддерживает большие страницы (Large Pages) через API VirtualAlloc. Алгоритм замещения — FIFO с учётом частоты использования.

macOS

В XNU (ядро macOS) используется страничная память на основе архитектуры ARM или x86-64. Размер страницы — 4 КБ (на ARM — 16 КБ для некоторых моделей). macOS использует механизм vm_compressor для сжатия неактивных страниц вместо подкачки на диск.

Интересные факты

  • В ранних версиях Unix (1970-е) страничная память не использовалась — применялась простая сегментация. Страничная память была добавлена в 3BSD (1979).
  • В суперкомпьютерах Cray (1980-е) страничная память не применялась из-за высокой стоимости аппаратной реализации; использовались только сегменты.
  • В архитектуре x86-64 максимальный размер виртуального адресного пространства составляет 256 ТБ (48 бит), хотя физически процессоры поддерживают до 64 ТБ.
  • Некоторые процессоры (например, ARM Cortex-M) не имеют MMU и не поддерживают страничную память — они работают только с физическими адресами.

Критика

Основные недостатки страничной памяти:

  • Накладные расходы на таблицы — многоуровневые таблицы могут занимать значительный объём памяти (например, в 64-битных системах одна пустая таблица верхнего уровня занимает 512 байт, но при большом количестве процессов суммарные затраты растут).
  • Фрагментация TLB — при использовании страниц разного размера TLB может заполняться неэффективно, снижая производительность.
  • Сложность отладки — страничные сбои и ошибки защиты (например, segmentation fault) усложняют разработку низкоуровневого ПО.
  • Проблемы с реальным временем — механизм подкачки вносит непредсказуемые задержки, что неприемлемо для систем жёсткого реального времени (например, в авионике).

Источники

  • Andrew S. Tanenbaum, Herbert Bos. «Modern Operating Systems» (4th edition), 2014.
  • Intel Corporation. «Intel 64 and IA-32 Architectures Software Developer’s Manual», Volume 3A, 2023.
  • Daniel P. Bovet, Marco Cesati. «Understanding the Linux Kernel» (3rd edition), 2005.
  • Mark Russinovich, David A. Solomon, Alex Ionescu. «Windows Internals» (7th edition), 2017.
  • John L. Hennessy, David A. Patterson. «Computer Architecture: A Quantitative Approach» (6th edition), 2018.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →