Виртуальная память: как работают страницы, TLB и файл подкачки
Оглавление статьи

Короткий ответ
Виртуальная память — это механизм, который даёт каждому процессу собственное адресное пространство и отображает виртуальные адреса на физическую память. Процессор и MMU переводят адрес через таблицы страниц, а TLB кэширует недавние результаты перевода. ОС может выделять страницы по требованию, защищать их правами доступа, совместно отображать код и файлы, а при необходимости освобождать RAM.
Файл подкачки Windows и swap Linux — лишь часть этого механизма, а не синоним виртуальной памяти. Страница может отсутствовать в RAM потому, что ещё не выделена, отображена из файла, была вытеснена, нарушает права доступа или вообще не принадлежит процессу. Поэтому page fault не всегда означает чтение с диска и не всегда является ошибкой приложения.
Зачем нужна виртуальная память
Без дополнительного уровня программе пришлось бы работать с реальными адресами RAM и учитывать, где размещены другие процессы. Виртуальная адресация отделяет представление памяти в приложении от её физического размещения. Один и тот же виртуальный адрес в двух процессах может указывать на разные физические фреймы.
Изоляция. Процесс не получает произвольный доступ к памяти другого процесса.
Защита. Для страницы задаются разрешения на чтение, запись и исполнение.
Удобство программ. Код работает с непрерывными диапазонами виртуальных адресов, даже если физические фреймы разрознены.
Отложенное выделение. ОС может предоставить адресный диапазон, а физическую страницу назначить при первом обращении.
Совместное использование. Несколько процессов могут отображать одни и те же страницы библиотек или файла.
Работа с файлами. Memory mapping позволяет обращаться к содержимому файла через адресное пространство.
Фраза «программа видит больше памяти, чем установлено ОЗУ» передаёт только один эффект. Важнее то, что виртуальная память обеспечивает адресацию, защиту, совместное использование и управление жизненным циклом страниц.
Основные термины
| Термин | Что означает | Не путать с |
|---|---|---|
| Виртуальный адрес | Адрес, с которым работает инструкция процесса | Номер байта в физической RAM |
| Адресное пространство | Набор виртуальных адресов и правил их отображения для процесса | Фактически занятой оперативной памятью |
| Страница | Единица виртуальной адресации и управления | Страницей документа или веб-сайта |
| Фрейм | Область физической памяти, на которую отображается страница | Кадром видео |
| Таблица страниц | Структура с отображениями адресов, состоянием и правами | Списком всех байтов процесса |
| MMU | Аппаратный блок, участвующий в трансляции и проверке доступа | Планировщиком процессов |
| TLB | Быстрый кэш недавних трансляций адресов | Кэшем данных процессора |
| Page fault | Исключение при обращении, которое нельзя завершить текущим отображением | Обязательным чтением swap или аварией |
| Working set / RSS | Страницы процесса, находящиеся в RAM по определению конкретной ОС | Полным размером виртуального адресного пространства |
| Pagefile / swap | Дисковое пространство, которое ОС может использовать для части страниц | Всей виртуальной памятью |
Как виртуальный адрес превращается в физический
Инструкция процессора обращается к виртуальному адресу.
Адрес разделяется на номер виртуальной страницы и смещение внутри неё.
MMU ищет готовую трансляцию в TLB.
При попадании TLB возвращает физический фрейм и проверяются права доступа.
При промахе выполняется обход таблиц страниц или вызывается обработчик, в зависимости от архитектуры.
Номер физического фрейма объединяется с тем же смещением внутри страницы.
Если корректного отображения нет, процессор генерирует page fault, а ОС решает, можно ли продолжить выполнение.
Таблицы часто многоуровневые: хранить плоскую запись для каждой потенциальной страницы огромного адресного пространства было бы слишком дорого. Промежуточные уровни создаются только для используемых диапазонов. Конкретное число уровней, размер записи и поддерживаемые размеры страниц зависят от архитектуры и конфигурации ОС.
Почему нужен TLB
Если для каждого чтения сначала обращаться к таблице страниц в памяти, трансляция заметно увеличит стоимость доступа. TLB хранит небольшой набор недавних соответствий «виртуальная страница → физический фрейм». При попадании перевод выполняется быстро; при промахе требуется page walk и затем запись может попасть в TLB.
Промах TLB и page fault — разные события. При TLB miss нужная страница может уже находиться в RAM, но её трансляции нет в этом кэше. Page fault возникает, когда текущая запись не позволяет завершить обращение: например, страница ещё не выделена, отсутствует в RAM или нарушены права.
Что происходит при page fault
Обработчик ОС получает адрес и причину исключения. Дальнейший путь зависит от состояния страницы:
для допустимого, но ещё не выделенного диапазона может быть назначен новый нулевой фрейм;
страница отображённого файла может быть прочитана из этого файла;
ранее вытесненная изменённая страница может быть возвращена из pagefile или swap;
механизм copy-on-write может создать частную копию при первой записи;
при нарушении прав или недопустимом адресе ОС передаст процессу исключение, которое может завершить программу.
Различают minor и major faults. В общем случае minor fault обслуживается без чтения требуемой страницы с накопителя, а major требует ввода-вывода. Точные счётчики и трактовка зависят от ОС. Само наличие faults нормально; проблему оценивают по задержкам, частоте major faults, памяти рабочего набора и характеру нагрузки.
Demand paging и вытеснение
При demand paging данные загружаются по мере обращения, а не целиком при запуске программы. Это ускоряет старт и позволяет не держать в RAM неиспользуемые части кода и файлов. Когда свободных фреймов мало, ОС освобождает память: чистую страницу отображённого файла можно отбросить и позднее прочитать снова, изменённую анонимную страницу при наличии политики подкачки нужно сохранить в backing store.
Реальные ядра не обязаны реализовывать буквальный учебный FIFO или точный LRU. Они используют приближённые и адаптивные политики, учитывают активность страниц, классы памяти, NUMA, фоновые операции и давление памяти. Поэтому список учебных алгоритмов полезен для понимания компромиссов, но не описывает полностью современную реализацию.
Виртуальная память, RAM, cache и swap: в чём разница
| Показатель | Что измеряет | Как интерпретировать |
|---|---|---|
| Virtual size | Диапазоны адресного пространства процесса | Может быть намного больше реально занятой RAM |
| Resident memory | Страницы процесса, находящиеся в физической памяти | Не вся резидентная память обязательно уникальна для процесса |
| Working set | Набор страниц процесса в RAM по правилам Windows | Подходит для поиска активных потребителей RAM |
| File cache | Свободная RAM, используемая для ускорения файловых операций | Может быть быстро перераспределена; это не обязательно «утечка» |
| Committed memory | Память, для которой система обещала backing | В Windows лимит связан с RAM и файлами подкачки |
| Swap used | Объём страниц, размещённых в области подкачки | Сам факт ненулевого значения не доказывает проблему |
| Memory pressure | Сводная оценка способности системы удовлетворять запросы памяти | Часто полезнее одного числа «свободно» |
Файл подкачки в Windows
pagefile.sys — скрытый системный файл, который поддерживает часть committed memory и может использоваться для дампов при сбоях. В актуальном описании Microsoft сказано, что pagefile позволяет убрать редко используемые изменённые страницы из RAM, расширяет commit limit и нужен для некоторых сценариев crash dump.
Универсальная формула «размер файла подкачки равен 1,5 объёма ОЗУ» не учитывает пиковый commit, дампы, свободное место и требования приложений. Для обычного компьютера безопасная отправная точка — системное управление. Фиксировать размер, переносить или отключать pagefile стоит только по измеренной причине и с пониманием последствий.
Большой pagefile не делает накопитель эквивалентом RAM: задержка диска существенно выше, а интенсивная подкачка замедляет работу. Но полное отключение не ускоряет компьютер автоматически и может снизить commit limit или лишить систему нужного типа дампа.
Swap в Linux
Linux поддерживает swap-разделы и swap-файлы. Ядро использует виртуальную память не только для swap: в подсистему входят demand paging, отображение файлов, защита, совместные страницы, anonymous memory, page cache и другие механизмы. Это подчёркивает официальная документация Linux Kernel.
Параметр vm.swappiness влияет на баланс reclaim, но не является процентом RAM, после которого «включается swap». Его эффект зависит от версии ядра, типа нагрузки, доступности zswap/zram, скорости накопителя и других настроек. Менять значение только потому, что в интернете указан «лучший» номер, не стоит. Сначала наблюдайте memory pressure, major faults, I/O, latency и OOM-события на своей нагрузке.
Ненулевой swap может оставаться после краткого пика: ядру не всегда выгодно немедленно возвращать давно неиспользуемые страницы в RAM. Проблема начинается, когда рабочий набор не помещается, система постоянно перемещает страницы и полезная работа уступает место I/O.
Как виртуальная память выглядит в macOS
macOS использует виртуальную память, компрессию и swap. В Activity Monitor доступны Physical Memory, Memory Used, Cached Files, Compressed, Swap Used и график Memory Pressure. Apple рекомендует смотреть на давление памяти, которое учитывает несколько факторов, а не только объём свободной RAM.
Зелёный график при некотором объёме swap сам по себе не требует ручной «очистки». Жёлтый или красный уровень вместе с задержками и растущим swap указывает, что системе трудно обслуживать текущую нагрузку. Закройте ненужные тяжёлые процессы, уменьшите рабочие наборы приложений и проверьте вкладки, виртуальные машины и проекты разработки.
Сравнение Windows, Linux и macOS
| Система | Дисковый механизм | Где наблюдать | Консервативная настройка |
|---|---|---|---|
| Windows | Один или несколько pagefile | Task Manager: Memory, Committed; Performance Monitor | Оставить System managed без измеренной причины менять |
| Linux | Swap-раздел, swap-файл; возможны zswap/zram | free, vmstat, sar, PSI, /proc | Сначала измерить workload и только затем менять swap/swappiness |
| macOS | Управляемые системой swap-файлы и компрессия | Activity Monitor: Memory Pressure, Compressed, Swap Used | Оценивать давление памяти и процессы, не пытаться вручную задавать swap |
Как понять, что памяти действительно не хватает
Зафиксируйте симптом. Замедление, закрытие приложения, OOM, длительный I/O или только большое число в интерфейсе — разные случаи.
Измерьте в момент нагрузки. Среднее значение за день может скрыть короткий пик.
Смотрите на несколько метрик. RAM, working set/RSS, commit, memory pressure, major faults, swap I/O и latency.
Найдите процесс и рабочий набор. Большой virtual size сам по себе не доказывает нехватку.
Проверьте повторяемость. Утечка обычно растёт со временем при одинаковом сценарии.
Сопоставьте с диском. Thrashing сопровождается активной подкачкой и заметной задержкой, а не просто занятым swap.
Нормальная ОС старается использовать свободную RAM для кэша. Поэтому цель «всегда иметь как можно больше свободной памяти» ошибочна. Важно, может ли система быстро освободить кэш и обслужить запросы приложений без постоянной подкачки.
Можно ли отключить файл подкачки или swap
Технически в некоторых системах это возможно, но решение зависит от нагрузки. Без pagefile Windows получает более низкий commit limit и может не создать нужный дамп. Без swap Linux при резком пике раньше столкнётся с отказом выделения и OOM killer, хотя для специализированного сервера такая политика иногда выбрана осознанно.
Аргумент «у меня много RAM» недостаточен. Нужны измеренные peak commit/working set, требования программ, политика дампов, резерв свободного места и проверка поведения при отказе. Для домашнего Windows-компьютера системно управляемый pagefile обычно безопаснее ручной настройки.
Частые мифы
«Виртуальная память — это файл на диске». Нет, адресация и отображение страниц работают и без вытеснения в swap.
«Page fault означает ошибку». Допустимый fault может быть нормальной частью ленивого выделения или загрузки страницы.
«Virtual size показывает расход RAM». Это размер адресных диапазонов, а не обязательно резидентная память.
«Любой swap замедляет компьютер». Ненулевой объём не равен активной тяжёлой подкачке.
«SSD превращает swap в RAM». Накопитель быстрее HDD, но его задержки и пропускная способность не равны RAM.
«Размер страницы всегда 4 КБ». Размер и поддержка huge pages зависят от архитектуры и ОС.
«Нужно вручную очистить RAM». Кэш освобождается по требованию; принудительная очистка часто лишь ухудшает следующий доступ.
Ошибки при настройке
менять pagefile или swappiness по универсальной формуле без замеров;
считать всю занятую RAM проблемой и игнорировать reclaimable cache;
оценивать приложение только по virtual size;
путать TLB miss с page fault, а minor fault — с чтением swap;
отключать подкачку перед диагностикой нестабильности;
увеличивать swap вместо устранения утечки памяти;
сравнивать метрики Windows, Linux и macOS как полностью одинаковые;
делать вывод по одному снимку без наблюдения во времени.
Чек-лист диагностики
понятно, какой симптом проверяется и когда он возникает;
сняты показатели во время реальной нагрузки;
различаются virtual size, resident/working set, commit и swap;
проверены major faults и ввод-вывод, а не только общий счётчик faults;
найден процесс с растущим рабочим набором;
учтены кэш и сжатая память;
проверено свободное место для pagefile/swap;
до настройки сохранены исходные значения;
изменение проверено одинаковым воспроизводимым сценарием;
есть план возврата к системным настройкам.
Вывод
Виртуальная память — это прежде всего слой адресации и защиты между процессом и физической RAM. Страницы, таблицы, MMU и TLB делают трансляцию прозрачной, а page faults позволяют ОС лениво выделять память, читать отображённые файлы, возвращать вытесненные страницы и останавливать недопустимый доступ.
Pagefile и swap помогают переживать пики и освобождать RAM, но не заменяют оперативную память и не требуют настройки «на всякий случай». Для практической диагностики важны рабочий набор, commit, memory pressure, major faults и swap I/O в момент реальной нагрузки. Менять параметры стоит только после измерений.
Часто задаваемые вопросы
Что такое виртуальная память простыми словами?
Это механизм, который даёт процессу собственные виртуальные адреса и отображает их на физическую память. Он обеспечивает изоляцию, права доступа, ленивое выделение и совместное использование страниц.
Виртуальная память и файл подкачки — одно и то же?
Нет. Виртуальная память включает адресные пространства, таблицы страниц, защиту и отображение файлов. Pagefile или swap — лишь возможное дисковое хранилище для части страниц.
Что такое page fault?
Это исключение при обращении к странице, которое нельзя завершить текущим отображением. ОС может выделить страницу, прочитать её из файла или swap, выполнить copy-on-write либо завершить процесс при недопустимом доступе.
Каждый page fault замедляет компьютер?
Нет. Minor fault обычно обслуживается без чтения требуемой страницы с накопителя. Major fault требует ввода-вывода и заметно дороже; важны частота и влияние на реальную нагрузку.
Что такое TLB?
TLB — небольшой быстрый кэш трансляций виртуальных страниц в физические фреймы. Он уменьшает число обходов таблиц страниц. Промах TLB не равен page fault.
Какой размер файла подкачки выбрать в Windows?
Универсальной формулы нет. Для обычного компьютера разумная отправная точка — System managed. Ручной размер выбирают по пиковому commit, требованиям дампа, приложений и свободному месту.
Нужно ли отключать swap, если много оперативной памяти?
Не обязательно. Отключение меняет поведение при пиках и отказах. Решение принимают по измерениям рабочей нагрузки, политике OOM и требованиям системы, а не только по объёму RAM.
Как понять, что система уходит в подкачку?
Смотрите не только на занятый swap, но и на swap I/O, major faults, memory pressure, задержки и размер рабочих наборов. Постоянное перемещение страниц с падением отзывчивости похоже на thrashing.
Комментарии 0
Обсудите материал, задайте вопрос или дополните его своим опытом.
Комментарии доступны зарегистрированным пользователям. Почту нужно подтвердить один раз.
Начните обсуждение: задайте вопрос автору или поделитесь практическим опытом.