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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

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

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

История[править | править вики-текст]

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

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

Алгоритмы определения устаревших страниц[править | править вики-текст]

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

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

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

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

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

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

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

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

Файлы и разделы подкачки[править | править вики-текст]

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

Фрагментация файла подкачки[править | править вики-текст]

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

Рекомендации по размещению файла подкачки[править | править вики-текст]

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

Безопасность при работе со swap-файлом[править | править вики-текст]

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

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

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

Использование файла подкачки может приводить к заражению некоторых ОС компьютерными вирусами, так как существует уязвимость[источник не указан 1097 дней], позволяющая вытеснить выполняемые программы в виртуальную память и изменить выполняемый код с помощью прямого доступа к жёсткому диску.

Unix[править | править вики-текст]

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

Пример создания 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 используют файл подкачки для организации режима сна («Спящий режим», Hibernation или «Suspend to disk» - режим S4 ACPI). Для поддержки этого режима рекомендованный размер SWAP файла или раздела равен размеру памяти увеличенному на 10-15%.

ОС Microsoft Windows и Windows NT[править | править вики-текст]

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


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

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

Примечания[править | править вики-текст]