Страничная подкачка
Страничная подкачка (англ. paging) — это механизм управления виртуальной памятью, при котором адресное пространство процесса и физическая память компьютера разбиваются на блоки фиксированного размера, называемые страницами. В отличие от сегментной организации, где блоки имеют переменную длину, страничная подкачка позволяет операционной системе эффективно перемещать данные между оперативной памятью и вторичным хранилищем (обычно жёстким диском или SSD), обеспечивая иллюзию наличия большего объёма оперативной памяти, чем доступно физически.
История
Концепция виртуальной памяти, лежащая в основе страничной подкачки, была впервые предложена в 1959 году немецким учёным Фридрихом Людвигом Бауэром и независимо — британским инженером Томом Килберном. Первая коммерческая реализация страничной подкачки появилась в 1960-х годах в суперкомпьютере Atlas (Великобритания), где использовалась система односторонней подкачки. В 1970-х годах механизм был внедрён в операционные системы общего назначения, такие как MULTICS и UNIX. В СССР разработки в этой области велись в рамках создания многозадачных вычислительных комплексов, например, в системе ОС ЕС ЭВМ (аналог OS/360), где страничная подкачка применялась для повышения эффективности использования ограниченных ресурсов памяти.
Массовое распространение страничная подкачка получила с появлением персональных компьютеров и операционных систем Microsoft Windows (начиная с Windows 3.0) и Linux (с ядром версии 1.0, 1994 год). В современных системах этот механизм является стандартным для управления памятью.
Основные принципы работы
Виртуальная и физическая память
Процесс оперирует виртуальными адресами, которые отображаются на физические адреса оперативной памяти или на область на диске (файл подкачки или раздел подкачки). Размер страницы фиксирован и обычно составляет 4 КБ в архитектуре x86 и x86-64, хотя в некоторых системах (например, в SPARC или PowerPC) могут использоваться страницы размером 8 КБ или 64 КБ.
Таблица страниц
Для каждого процесса операционная система поддерживает таблицу страниц — структуру данных, хранящую соответствие между виртуальными и физическими страницами. Каждая запись в таблице (Page Table Entry, PTE) содержит:
- Номер физической страницы (frame number).
- Бит присутствия (present bit), указывающий, находится ли страница в оперативной памяти.
- Бит доступа (accessed bit) — отмечает, была ли страница прочитана или записана.
- Бит модификации (dirty bit) — показывает, была ли страница изменена.
- Права доступа (чтение, запись, исполнение).
Страничный обмен (page swapping)
Когда процесс обращается к виртуальному адресу, страница которого отсутствует в оперативной памяти (бит присутствия равен 0), возникает страничное прерывание (page fault). Операционная система:
- Приостанавливает выполнение процесса.
- Выбирает страницу для выгрузки из физической памяти (жертву) по алгоритму замещения.
- Если страница-жертва была изменена (dirty bit = 1), она записывается на диск.
- Считывает требуемую страницу с диска в освободившуюся физическую память.
- Обновляет таблицу страниц и возобновляет выполнение процесса.
Этот процесс называется подкачкой (swapping). Если объём оперативной памяти недостаточен, система может выполнять частые страничные прерывания, что приводит к трэшингу (thrashing) — резкому падению производительности.
Классификация алгоритмов замещения страниц
Операционная система использует различные стратегии для выбора страницы, которую следует выгрузить на диск:
- FIFO (First-In, First-Out) — выгружается самая старая страница. Прост в реализации, но может приводить к вытеснению часто используемых страниц.
- LRU (Least Recently Used) — выгружается страница, к которой дольше всего не было обращений. Эффективен, но требует аппаратной поддержки или дополнительных затрат на отслеживание.
- LFU (Least Frequently Used) — выгружается страница с наименьшей частотой обращений.
- Clock (или Second Chance) — приближение LRU, использующее кольцевой список и бит доступа. Широко применяется в ядрах Linux и Windows.
- NRU (Not Recently Used) — выгружается страница, не использовавшаяся в последнем такте.
В современных системах (например, в ядре Linux до версии 5.8) использовался гибридный алгоритм, основанный на LRU с двумя списками (активные и неактивные страницы). Начиная с версии 5.8, внедрён алгоритм MGLRU (Multi-Generational LRU), улучшающий производительность при высоких нагрузках.
Реализация в операционных системах
Microsoft Windows
В Windows страничная подкачка реализована через файл подкачки (pagefile.sys), расположенный на системном диске. Размер файла может быть фиксированным или динамическим. Начиная с Windows NT, используется двухуровневая таблица страниц для поддержки 32-битных адресов, а в 64-битных версиях — четырёхуровневая. В Windows 10 и 11 применяется механизм сжатия памяти (Memory Compression), который уменьшает количество операций подкачки, сохраняя сжатые страницы в оперативной памяти.
Linux
В Linux подкачка осуществляется через раздел подкачки (swap partition) или файл подкачки (swap file). Ядро использует алгоритм замещения на основе LRU с двумя списками (активные и неактивные страницы). Начиная с версии 5.8, добавлена поддержка MGLRU. Размер страницы по умолчанию — 4 КБ, но поддерживаются большие страницы (Huge Pages) для приложений с интенсивным использованием памяти.
macOS
macOS использует файл подкачки (swapfile) и динамическое управление размером. В версиях до 10.15 (Catalina) применялся механизм подкачки на основе LRU, а начиная с Big Sur — улучшенный алгоритм с учётом сжатия памяти (Memory Compression).
Преимущества и недостатки
Преимущества
- Изоляция процессов: каждый процесс имеет собственное виртуальное адресное пространство, что предотвращает взаимное влияние и повышает безопасность.
- Эффективное использование памяти: физическая память может быть распределена между процессами динамически, без необходимости загрузки всей программы целиком.
- Поддержка больших программ: приложения могут использовать адресное пространство, превышающее объём физической памяти.
- Упрощение управления памятью: разработчикам не нужно заботиться о фрагментации физической памяти.
Недостатки
- Накладные расходы: операции с таблицами страниц и страничные прерывания требуют времени процессора и памяти.
- Трэшинг: при недостатке оперативной памяти производительность может катастрофически упасть.
- Задержки: чтение с диска (даже SSD) значительно медленнее доступа к оперативной памяти, что приводит к заметным паузам в работе приложений.
- Фрагментация страниц: хотя страницы фиксированы, таблицы страниц могут занимать значительный объём памяти (особенно при большом количестве процессов).
Применение
Страничная подкачка используется во всех современных многозадачных операционных системах общего назначения: Windows, Linux, macOS, FreeBSD, Android и iOS. В специализированных системах (реального времени, встраиваемых) она часто отключается для обеспечения предсказуемости задержек. В суперкомпьютерах и высокопроизводительных вычислениях подкачка может быть заменена прямым управлением памятью (например, через RDMA), чтобы избежать накладных расходов.
Интересные факты
- В операционной системе Windows 95 и 98 файл подкачки назывался win386.swp, а его размер мог быть задан пользователем вручную.
- В ядре Linux до версии 2.6 использовался алгоритм замещения, основанный на списке «недавно использованных» страниц, который при высоких нагрузках приводил к частым сбоям.
- В 2019 году компания Microsoft представила технологию «DirectStorage» для Windows 11, которая позволяет обходить традиционную подкачку при работе с играми, загружая данные напрямую с SSD в видеопамять.
- В мобильных операционных системах (Android, iOS) подкачка часто заменяется сжатием памяти и принудительным завершением фоновых процессов, чтобы избежать задержек, связанных с чтением с флеш-памяти.
- В архитектуре x86-64 поддерживаются страницы размером 4 КБ, 2 МБ и 1 ГБ. Большие страницы уменьшают количество записей в таблицах страниц и снижают нагрузку на TLB (Translation Lookaside Buffer), что повышает производительность в приложениях с большими объёмами данных.
Источники
- Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание, 2015).
- Стивенс У. «UNIX: взаимодействие процессов» (2003).
- Документация ядра Linux: «Memory Management» (kernel.org, версия 6.0, 2022).
- Microsoft Docs: «Memory Management in Windows 10 and Windows 11» (2023).
- Hennessy J., Patterson D. «Computer Architecture: A Quantitative Approach» (6-е издание, 2017).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →