Подкачка страниц

Подкачка страниц (англ. paging; иногда используется термин swapping от swap, /swɔp/) — один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (жёсткий диск или другой внешний накопитель, такой как флеш-память), освобождая ОЗУ для загрузки других активных фрагментов памяти. Такими фрагментами в современных ЭВМ являются страницы памяти.

Временно выгруженные из памяти страницы могут сохраняться на внешних запоминающих устройствах как в файле, так и в специальном разделе на жёстком диске (partition), называемых соответственно swap-файл и swap-раздел. В случае необходимости выгрузить из ОЗУ страницы, соответствующие содержимому какого-либо файла на жёстком диске (например, memory-mapped files), они могут не выгружаться, а просто удаляться. При запросе такой страницы она может быть считана из оригинального файла.

Когда приложение обратится к отсутствующей в ОЗУ странице, произойдет исключительная ситуация PageFault. Обработчик этого события должен проверить, была ли запрошенная страница ранее выгружена, и, если она есть в swap-файле, загрузить её обратно в память.

Изначально под свопингом понималась выгрузка процесса из оперативной памяти целиком, в результате чего неактивные процессы могли полностью отсутствовать в ОЗУ. При наступлении условий активизации процесса диспетчер памяти загружал образ процесса обратно.

Смысл термина изменился в 60-х годах, когда в операционных системах появилась поддержка виртуальной памяти: под свопингом стали понимать загрузку и выгрузку отдельных страниц. Впервые подкачка страниц была реализована в компьютере Atlas, выпущенном в 1962 году.

Отказы страниц

[править | править код]

Основные функции механизма подкачки выполняются при попытке программы получить доступ к страницам, в данный момент не отображенным в физическую память (ОЗУ). Эта ситуация называется отказом страницы. В этот момент операционная система должна получить управление и обработать отказ страницы в прозрачной для программы форме. Таким образом, операционной системе необходимо:

  1. Определить расположение требуемой страницы во вторичном хранилище.
  2. Получить пустой страничный кадр в физической памяти для использования в качестве контейнера для данных.
  3. Загрузить запрошенные данные в полученный страничный кадр.
  4. Обновить таблицу страниц, чтобы она указывала на новый страничный кадр.
  5. В прозрачной форме вернуть управление программе, повторно выполнив вызвавшую ошибку страницы инструкцию.

Если при получении пустого страничного кадра не хватает свободной оперативной памяти, выполняется алгоритм замены страниц, осуществляющий выбор одного из использующихся страничных кадров для выгрузки. Если выгружаемый страничный кадр был выделен динамически во время выполнения программы либо если он является частью сегмента данных программы и изменялся с момента чтения в память (другими словами, если он стал «грязный»), перед освобождением он должен быть сохранён во вторичном хранилище. В противном случае содержимое страничного кадра в оперативной памяти не отличается от содержимого страницы во вторичном хранилище, поэтому его выгрузка не требуется. Если позже в процессе работы произойдёт обращение к выгруженной странице, возникнет другой отказ страницы и нужно будет снова выделить страничный кадр, чтобы содержимое страницы во вторичном хранилище можно было повторно загрузить в ОЗУ.

Для обеспечения эффективной работы система подкачки должна выбирать для выгрузки те страничные кадры, обращение к которым в ближайшее время наименее вероятно. Существуют различные алгоритмы замещения страниц. В операционных системах используются алгоритмы LRU (англ. Last recently used), FIFO (англ. First In First Out) либо алгоритмы с учётом рабочего множества процесса[1].

Для дальнейшего улучшения времени отклика системами подкачки могут использоваться различные стратегии прогнозирования ближайших обращений к страницам. Такие системы пытаются загрузить страницы в основную память заблаговременно, до того, как программа обратится к ним.

Алгоритмы определения устаревших страниц

[править | править код]

При выделении места для новой страницы бывает необходимо удалить какую-либо страницу, в данный момент находящуюся в памяти. Правила замещения страниц служат для принятия решения о том, какую именно страницу следует удалить из памяти. Идеальным кандидатом является «мёртвая» страница, которая больше не потребуется кому-либо (например, относится к завершённому процессу). Если же таких страниц нет в памяти (или их количества недостаточно), используется правило локального или глобального замещения страниц:

  • Правило локального замещения выделяет каждому процессу или группе взаимосвязанных процессов определённое количество страниц. Если процессу нужна новая страница, он должен заменить одну из собственных.
  • Правило глобального замещения страниц позволяет брать страницы любого процесса, используя глобальные критерии выбора. Для реализации данного подхода необходимо выбрать критерий, по которому будет приниматься решение о страницах, хранимых в памяти.

Наиболее часто используемые критерии поиска:

  • Least recently used. Удаляются те страницы, доступ к которым производился наиболее давно. Считается, что в последующем к таким страницам будет происходить минимум обращений.
  • Last recently used. Удаляются недавно освободившиеся страницы. Подразумеваются страницы только что завершившихся процессов.

Пробуксовка

[править | править код]

Большинство программ не использует всю выделенную им память одновременно, а только некоторую её часть, определяемую выполняемыми в данный момент инструкциями и требующимися им данными. Если программа отвечает принципу локальности, то используемая часть памяти может быть существенно меньше всей выделенной программе памяти. Размер этой используемой части отражает достижение программой некоторого стабильного состояния в потреблении памяти и часто называется рабочим множеством.

Системы с виртуальной памятью работают эффективно, когда сумма рабочих множеств всех процессов не превышает размер физической оперативной памяти. В этом случае время, требуемое на обработку отказов страниц не оказывает большого влияния на производительность. Однако, программа, работающая с большими структурами данных, может иметь слишком большой рабочий набор, который система подкачки не сможет эффективно обслуживать. Это приведет к непрерывному потоку отказов страниц и резкому снижению производительности компьютера. Такая ситуация называется пробуксовкой: страницы непрерывно выгружаются, а затем к ним происходит обращение, вызывая частые отказы страниц.

Интересной особенностью пробуксовки является медленный до определённой критической точки рост числа отказов страниц по мере роста рабочего множества. После достижения этой критической точки число отказов страниц резко возрастает и на их обработку тратится большая часть вычислительной мощности.

Для исключения пробуксовки пользователь может предпринять следующие действия:

  • Увеличить объём оперативной памяти компьютера.
  • Сократить число одновременно выполняющихся программ.
  • Изменить приоритеты процессов так, чтобы часть из них завершилась быстрее и освободила часть ресурсов.

Недостатки и возможность их преодоления

[править | править код]

В случае расположения данных виртуальной памяти на внешних запоминающих устройствах (например, жестких дисках), как чаще всего и происходит, доступ к памяти замедляется (по сравнению с оперативными запоминающими устройствами).

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

В 32-разрядной Windows XP, Vista, 7 для своп-файла можно использовать оперативную память за пределами 3-го гигабайта, используя сторонние программы по созданию электронных дисков, хранящихся в памяти.

В Linux поддерживается сходный механизм, zswap, размещающий своп в памяти в сжатом виде.

Файлы и разделы подкачки

[править | править код]

Реализация хранения виртуальных данных в различных операционных системах различается в силу архитектурных особенностей их ядер и файловых систем.

Фрагментация файла подкачки

[править | править код]

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


Рекомендации по размещению файла подкачки

[править | править код]
  • Одним из способов выделения места для swap‐файла (раздела) является кратное выделение памяти, когда объём этого файла равен объёму оперативной памяти, умноженному на константу от 0,5 до 2 или 3.
  • Если на компьютере имеется более одного жёсткого диска, то для более быстрого обращения к файлу подкачки его желательно разместить на наименее нагруженном запросами чтения/записи физическом диске. Хорошим выбором будет физический файл подкачки на диске, который имеет наибольшую скорость чтения/записи.
  • В Windows скорость чтения из небольших разделов больше у FAT32 по сравнению с NTFS, однако, благодаря более высокой устойчивости NTFS к сбоям и значительным объёмам современных жестких дисков, разделы с FAT32 ныне редко используются.

Безопасность при работе со swap-файлом

[править | править код]

Из файла (раздела) подкачки зачастую можно извлечь конфиденциальную информацию, используемую при работе вычислительной системы. Поэтому при работе с секретными данными обычно производится очистка swap, например, с помощью утилиты sswap из комплекта secure remove.

Также многие программы, работающие с ценной информацией или с шифрованием, могут выборочно отключать возможность откачки фрагментов памяти.

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

В ОС Unix и подобных ей swap обычно помещается на отдельный раздел жёсткого диска, что ранее ускоряло доступ к данным по сравнению с расположением swap на обычном разделе. В ядрах Linux 2.6 и новее работа swap-файла не уступает по производительности swap-разделу[2][3].

Пример создания swap-файла для GNU/Linux:

# dd if=/dev/zero of=/swap bs=1024 count=128K # mkswap /swap # sync # swapon /swap 

Oracle Solaris может использовать тома ZFS в качестве разделов подкачки:

# zfs create -V 2G pool/swap # swap -a /dev/zvol/dsk/pool/swap 

Кроме использования при работе системы некоторые дистрибутивы GNU/Linux используют swap-раздел для организации режима сна («спящий режим», hibernation или «suspend to disk» — режим S4 ACPI). Для поддержки этого режима размер swap следует задать равным размеру оперативной памяти, увеличенному на 10-15 %.

Область жёсткого диска, предназначенная для свопинга, располагается в отдельном файле, который называется файл подкачки, своп-файл (от англ. swap file). Он называется pagefile.sys, и по умолчанию создаётся системой в корневом каталоге диска C:. В дальнейшем пользователь может управлять размером и размещением файла подкачки, например, используя панель управления, пункт Система.

В Windows 9x файл подкачки называется win386.swp и располагается в каталоге Windows. Однако правкой файла system.ini его можно перенести в корневой каталог для последующего совместного использования с Windows NT.

Также, начиная с Windows Vista, появилась возможность создавать выделенный раздел подкачки, аналогичный по назначению используемым в UNIX-системах.

В Android SWAP реализован в некоторых оболочках настройкой операционной системы.

Данная возможность приобретает всё большую популярность у пользователей и производителей, и всё больше производителей смартфонов реализуют в своих оболочках SWAP для управления пользователями.

Данная возможность прогрессирует, и на данный момент в оболочке Realme возможно включить SWAP размером в 12 ГБ, что является рекордом на 2023г.

Примечания

[править | править код]
  1. Peter J. Denning. Thrashing: Its causes and prevention // Proceedings AFIPS, Fall Joint Computer Conference. — 1968. — Т. 33. — С. 915–922. Архивировано 4 марта 2013 года.
  2. "Jesper Juhl": Re: How to send a break? - dump from frozen 64bit linux. LKML (29 мая 2006). Дата обращения: 28 октября 2010. Архивировано 19 июня 2012 года.
  3. Andrew Morton: Re: Swap partition vs swap file. LKML. Дата обращения: 28 октября 2010. Архивировано 19 июня 2012 года.