Виртуальная память¶
Виртуальная память — это метод управления памятью вычислительной системы, позволяющий программам использовать для хранения своих данных и кода адресное пространство, превышающее объём физической оперативной памяти (ОЗУ), за счёт временного переноса части данных на вторичное хранилище (например, жёсткий диск или твердотельный накопитель). Этот механизм обеспечивает изоляцию процессов друг от друга, упрощает управление памятью для разработчиков и повышает общую эффективность использования ресурсов системы.
¶История
Концепция виртуальной памяти была разработана в 1950-х годах для решения проблемы ограниченности физической памяти в ранних компьютерах. Первые реализации появились в мейнфреймах, таких как Ferranti Atlas (Великобритания, 1962 год), где использовалась техника «одноуровневого хранения». В 1960-х годах идеи виртуальной памяти были развиты в проектах IBM (система M44/44X) и в операционной системе MULTICS (1960-е — 1970-е годы). Массовое внедрение виртуальной памяти в персональные компьютеры началось с процессоров Intel 80286 (1982 год) и 80386 (1985 год), которые поддерживали страничную организацию памяти. В операционных системах Microsoft Windows (начиная с Windows 3.0, 1990 год) и Unix-подобных системах (включая Linux) виртуальная память стала стандартным компонентом.
¶Принцип работы
Основная идея виртуальной памяти заключается в том, что программа оперирует не физическими адресами ОЗУ, а виртуальными адресами, которые транслируются в физические с помощью аппаратно-программных средств. Каждому процессу выделяется собственное виртуальное адресное пространство, которое может быть больше доступной физической памяти.
¶Страничная организация
Наиболее распространённый способ реализации виртуальной памяти — страничная организация (paging). Виртуальное адресное пространство делится на блоки фиксированного размера — страницы (обычно 4 КБ в архитектурах x86 и ARM). Физическая память также делится на блоки того же размера — фреймы (или страничные блоки). Операционная система ведёт таблицу страниц (page table), которая отображает виртуальные страницы на физические фреймы. Если виртуальная страница в данный момент не загружена в ОЗУ, она может быть выгружена на диск (в файл подкачки или раздел подкачки). При обращении к такой странице возникает страничный сбой (page fault), и операционная система загружает нужную страницу с диска в свободный фрейм, возможно, вытеснив другую страницу.
¶Сегментная организация
Альтернативный подход — сегментация (segmentation), при которой адресное пространство делится на сегменты переменного размера (например, код, данные, стек). Сегменты могут быть загружены в память не полностью, а по частям. Сегментация часто используется в сочетании со страничной организацией (например, в архитектуре x86). Однако в современных операционных системах (Windows, Linux) сегментация применяется ограниченно, и основным механизмом является страничная организация.
¶Трансляция адресов
Трансляция виртуального адреса в физический выполняется аппаратно — блоком управления памятью (MMU, Memory Management Unit), встроенным в процессор. MMU использует таблицу страниц, хранящуюся в оперативной памяти. Для ускорения трансляции применяется буфер ассоциативной трансляции (TLB, Translation Lookaside Buffer) — кэш, хранящий недавно использованные отображения виртуальных страниц на физические фреймы.
¶Компоненты системы виртуальной памяти
¶Файл подкачки (swap)
В операционных системах Windows виртуальная память реализуется через файл подкачки (pagefile.sys). В Unix-подобных системах (включая Linux) используется раздел подкачки (swap partition) или файл подкачки (swap file). Размер файла или раздела подкачки может быть фиксированным или динамическим (в Windows — автоматически управляемым системой). При нехватке физической памяти операционная система перемещает страницы из ОЗУ в файл подкачки и обратно.
¶Страничный демон (pager)
В Unix-подобных системах за управление страничной памятью отвечает страничный демон (page daemon, kswapd в Linux). Он периодически проверяет уровень свободной памяти и при необходимости вытесняет страницы на диск, используя алгоритмы замещения (например, LRU — Least Recently Used, или его модификации).
¶Алгоритмы замещения страниц
При возникновении страничного сбоя операционная система должна выбрать, какую страницу вытеснить из физической памяти. Основные алгоритмы:
- FIFO (First In, First Out) — вытесняется самая старая страница.
- LRU (Least Recently Used) — вытесняется страница, к которой дольше всего не было обращений.
- Clock (или Second Chance) — приближённый к LRU алгоритм, используемый в большинстве современных систем (включая Linux).
- NRU (Not Recently Used) — вытесняется страница, не использовавшаяся в последнее время.
¶Преимущества и недостатки
¶Преимущества
- Изоляция процессов: каждый процесс работает в своём виртуальном адресном пространстве, что предотвращает взаимное влияние и повышает безопасность.
- Эффективное использование памяти: физическая память может быть распределена между процессами динамически, а неиспользуемые страницы выгружаются на диск.
- Упрощение программирования: разработчики могут использовать большие адресные пространства, не заботясь о физическом размере ОЗУ.
- Совместное использование памяти: несколько процессов могут отображать одни и те же физические страницы (например, общие библиотеки).
¶Недостатки
- Снижение производительности: страничные сбои и операции ввода-вывода на диск существенно замедляют работу системы (особенно на жёстких дисках, где задержки доступа велики).
- Дополнительные накладные расходы: поддержка таблиц страниц, TLB и алгоритмов замещения требует ресурсов процессора и памяти.
- Фрагментация: при страничной организации возможна внутренняя фрагментация (неполное использование последней страницы), а при сегментации — внешняя фрагментация.
- Сложность реализации: корректная работа виртуальной памяти требует сложного аппаратного и программного обеспечения.
¶Применение
Виртуальная память используется практически во всех современных операционных системах общего назначения:
- Microsoft Windows (все версии начиная с Windows 3.0) — использует страничную организацию с файлом подкачки.
- Linux — использует страничную организацию с разделом или файлом подкачки.
- macOS — использует страничную организацию с swap-файлом.
- Android (на базе ядра Linux) — использует виртуальную память, но с агрессивным управлением памятью для мобильных устройств (например, вытеснение фоновых процессов).
В операционных системах реального времени (RTOS) виртуальная память применяется редко из-за непредсказуемых задержек, связанных со страничными сбоями.
¶Интересные факты
- В ранних версиях Windows (до Windows 95) файл подкачки назывался «временный файл подкачки» (temporary swap file) и мог быть отключён пользователем.
- В Linux существует возможность отключить виртуальную память (параметр
swappiness=0), но это не рекомендуется для систем с малым объёмом ОЗУ. - В суперкомпьютерах и серверах с большим объёмом ОЗУ (сотни гигабайт или терабайты) виртуальная память часто используется в минимальном объёме, чтобы избежать снижения производительности.
- Технология overcommit (в Linux) позволяет выделять процессам больше виртуальной памяти, чем сумма физической памяти и swap-пространства, что может привести к нехватке памяти (OOM — Out Of Memory) и аварийному завершению процессов.
¶Источники
- Таненбаум Э., Бос Х. Современные операционные системы. — 4-е изд. — СПб.: Питер, 2015.
- Сильбершац А., Гальвин П., Ганьон Г. Операционные системы: внутреннее устройство и принципы проектирования. — 9-е изд. — М.: Вильямс, 2016.
- Документация Microsoft: «Virtual Memory in Windows 10» (Windows Dev Center).
- Документация Linux: «Memory Management» (Linux Kernel Documentation).
- Статья «Virtual memory» в Encyclopedia Britannica.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


