Введение

Схема управления памятью компьютера

В компьютерных операционных системах страничная организация памяти (или подкачка на некоторых Unix-подобных системах) — это схема управления памятью, посредством которой компьютер хранит и извлекает данные из внешнего хранилища для использования в основной памяти. В этой схеме операционная система извлекает данные из внешнего хранилища блоками одинакового размера, называемыми страницами. Страничная организация является важной частью реализации виртуальной памяти в современных операционных системах, позволяя программам превышать размер доступной физической памяти за счет использования внешнего хранилища. Для упрощения основная память называется "RAM" (аббревиатура от random access memory – памяти с произвольным доступом), а внешнее хранилище – "диск" (сокращение для жесткого диска, барабанной памяти или твердотельного накопителя и т. д.). Однако, как и во многих аспектах вычислительной техники, эти понятия не зависят от используемой технологии. В зависимости от модели памяти, функциональность страничной организации обычно аппаратно реализована в центральном/микропроцессоре (CPU/MCU) с помощью блока управления памятью (MMU) или блока защиты памяти (MPU) и дополнительно активируется привилегированным системным кодом в ядре операционной системы. Например, в процессорах, реализующих архитектуру набора команд x86 (ISA), страничная организация памяти включается через контрольный регистр CR0.

История

В 1960-х годах, подкачка была ранней техникой виртуальной памяти. Целая программа или целый сегмент "выгружались" (или "выкатывались") из оперативной памяти на диск или магнитный барабан, а другой – загружались (или "закатывались"). Выгруженная программа оставалась в текущем состоянии, но её выполнение приостанавливалось, пока её оперативная память не использовалась другой программой; программа с выгруженным сегментом могла продолжать работу до тех пор, пока ей не понадобится этот сегмент, после чего она приостанавливалась до тех пор, пока сегмент не будет загружен. Программа могла включать несколько наложений, которые занимали одну и ту же область памяти в разное время. Наложения – это не метод страничного обмена оперативной памяти на диск, а лишь способ минимизировать использование оперативной памяти программой. В последующих архитектурах использовалась сегментация памяти, и отдельные сегменты программ стали единицами обмена между диском и оперативной памятью. Сегмент мог представлять собой весь сегмент кода программы или сегмент данных, а иногда и другие крупные структуры данных. Эти сегменты должны были быть непрерывными при нахождении в оперативной памяти, что требовало дополнительных вычислений и перемещений для устранения фрагментации. Ferranti's Atlas и Atlas Supervisor, разработанные в Университете Манчестера (1962), были первой системой, реализовавшей страничную организацию памяти. Последующие ранние машины и их операционные системы, поддерживающие страничную организацию, включают IBM M44/44X и её операционную систему MOS (1964), SDS 940 и Berkeley Timesharing System (1966), модифицированную IBM System/360 Model 40 и операционную систему CP 40 (1967), IBM System/360 Model 67 и операционные системы, такие как TSS/360 и CP/CMS (1967), RCA 70/46 и операционную систему с разделением времени (1967), GE 645 и Multics (1969), а также PDP 10 с добавленным аппаратным обеспечением для страничной организации, разработанным BBN, и операционную систему TENEX (1969). Эти машины и последующие машины, поддерживающие страничную организацию памяти, используют либо набор регистров адресов страниц, либо таблицы страниц в памяти, чтобы позволить процессору работать с произвольными страницами в любом месте оперативной памяти, как с кажущимся непрерывным логическим адресным пространством. Эти страницы стали единицами обмена между диском и оперативной памятью.

Трахнуть

После завершения инициализации большинство программ работают с небольшим количеством страниц кода и данных по сравнению с общим объемом памяти, необходимым программе. Страницы, к которым осуществляется наиболее частый доступ, называются рабочим набором. Когда рабочий набор составляет небольшой процент от общего числа страниц системы, системы виртуальной памяти работают наиболее эффективно, и незначительное количество вычислительных ресурсов тратится на обработку ошибок страниц. По мере роста рабочего набора обработка ошибок страниц остается управляемой, пока рост не достигнет критической точки. Затем количество ошибок резко возрастает, и время, затрачиваемое на их обработку, превышает время, необходимое для выполнения вычислений, ради которых программа и была написана. Это состояние называется "пробуксовкой" (thrashing). Пробуксовка возникает в программах, работающих с огромными структурами данных, поскольку их большой рабочий набор вызывает постоянные ошибки страниц, что значительно замедляет работу системы. Устранение ошибок страниц может потребовать освобождения страниц, которые вскоре потребуется повторно считать с диска. Термин "пробуксовка" также используется в других контекстах, помимо систем виртуальной памяти, например, для описания проблем с кэшем в вычислительной технике или синдрома "глупых окон" в сетях. Наихудший случай может возникнуть на процессорах VAX. Одиночная инструкция MOVL, пересекающая границу страницы, может иметь исходный операнд, использующий отложенную адресацию со смещением, где длинное слово, содержащее адрес операнда, пересекает границу страницы, и целевой операнд, использующий отложенную адресацию со смещением, где длинное слово, содержащее адрес операнда, пересекает границу страницы, при этом источник и назначение могут пересекать границы страниц. Эта единственная инструкция обращается к десяти страницам; если не все они находятся в оперативной памяти, каждая из них вызовет ошибку страницы. При возникновении каждой ошибки операционной системе необходимо выполнить сложные процедуры управления памятью, что может привести к множественным операциям ввода-вывода, включающим запись страниц других процессов на диск и чтение страниц активного процесса с диска. Если операционная система не сможет выделить десять страниц для этой программы, то устранение ошибки страницы приведет к отбрасыванию другой страницы, необходимой инструкции, и любая перезагрузка инструкции снова вызовет ошибку. Чтобы уменьшить чрезмерную подкачку и решить проблемы с пробуксовкой, пользователь может увеличить количество страниц, доступных для каждой программы, либо запустив меньше программ одновременно, либо увеличив объем оперативной памяти в компьютере.

Обмен

В многопрограммной или многопользовательской среде множество пользователей могут выполнять одну и ту же программу, код и данные которой размещены на отдельных страницах. Для минимизации использования оперативной памяти все пользователи совместно используют одну копию программы. Страничная таблица каждого процесса настроена таким образом, что страницы, адресующие код, указывают на эту единственную общую копию, а страницы, адресующие данные, указывают на различные физические страницы для каждого процесса. Разные программы также могут использовать одни и те же библиотеки. Чтобы экономить место, в физическую память загружается только одна копия общей библиотеки. Программы, использующие одну и ту же библиотеку, имеют виртуальные адреса, которые отображаются на одни и те же страницы (содержащие код и данные библиотеки). Когда программы хотят изменить код библиотеки, они используют механизм "копирование при записи", поэтому память выделяется только при необходимости. Общая память – это эффективный способ обмена данными между программами. Программы могут совместно использовать страницы памяти, а затем записывать и считывать данные для обмена информацией.

Атлас Ферранти

Первым компьютером, поддерживающим страничную организацию памяти, был суперкомпьютер Atlas, совместно разработанный компаниями Ferranti, Манчестерским университетом и Plessey в 1963 году. Машина имела ассоциативную (с произвольным доступом по содержимому) память с одной ячейкой для каждой страницы объемом 512 слов. Операционная система обрабатывала исключения, связанные с отсутствием страниц, и управляла переносом страниц между оперативной памятью и внешней памятью на магнитном барабане, чтобы предоставить программам единое адресное пространство.

Windows 3.x и Windows 9x

Страничная память была функцией Microsoft Windows, начиная с Windows 3.0 в 1990 году. Windows 3.x создает скрытый файл с именем 386SPART.PAR или WIN386.SWP для использования в качестве файла подкачки. Обычно он находится в корневом каталоге, но может располагаться и в другом месте (как правило, в каталоге WINDOWS). Его размер зависит от объема выделенной памяти для подкачки в системе (настройка, выбираемая пользователем в Панели управления → Дополнительно в разделе "Виртуальная память"). Если пользователь переместит или удалит этот файл, при следующем запуске Windows появится синий экран с сообщением об ошибке "Файл постоянной подкачки поврежден". Пользователю будет предложено выбрать, удалить файл или нет (даже если он не существует). Windows 95, Windows 98 и Windows Me используют аналогичный файл, а его настройки находятся в Панели управления → Система → вкладка "Производительность" → Виртуальная память. Windows автоматически устанавливает размер файла подкачки, начиная с 1,5-кратного объема физической памяти, и увеличивает его до 3-кратного объема физической памяти при необходимости. Если пользователь запускает ресурсоемкие приложения на системе с небольшим объемом физической памяти, рекомендуется вручную установить эти значения выше значений по умолчанию.

Windows NT

Файл, используемый для подкачки в семействе Windows NT, – это pagefile.sys. По умолчанию файл подкачки располагается в корневом каталоге раздела, на котором установлена Windows. Windows можно настроить на использование свободного места на любых доступных дисках для файлов подкачки. Однако для загрузочного раздела (то есть диска, содержащего каталог Windows) необходимо наличие файла подкачки, если система настроена на запись дампов памяти ядра или полных дампов после синего экрана смерти. Windows использует файл подкачки в качестве временного хранилища для дампа памяти. При перезагрузке системы Windows копирует дамп памяти из файла подкачки в отдельный файл и освобождает использованное в файле подкачки пространство.

Фрагментация

В конфигурации Windows по умолчанию файл подкачки может расширяться за пределы первоначального выделения при необходимости. Если это происходит постепенно, он может сильно фрагментироваться, что потенциально может привести к проблемам с производительностью. Распространенный совет, чтобы избежать этого, – установить фиксированный размер файла подкачки, чтобы Windows не расширял его. Однако файл подкачки расширяется только после заполнения, что в конфигурации по умолчанию составляет 150% от общего объема физической памяти. Таким образом, общий объем запрошенной виртуальной памяти, использующей файл подкачки, должен превышать 250% физической памяти компьютера, прежде чем файл подкачки будет расширен. Фрагментация файла подкачки, возникающая при его расширении, носит временный характер. Как только расширенные области перестанут использоваться (например, при следующей перезагрузке), дополнительное дисковое пространство будет освобождено, и файл подкачки вернется в исходное состояние. Установка фиксированного размера файла подкачки может быть проблематичной, если приложению Windows потребуется больше памяти, чем общий объем физической памяти и файла подкачки, что приведет к сбоям при выделении памяти и, как следствие, к сбоям приложений и системных процессов. Кроме того, файл подкачки редко читается или записывается последовательно, поэтому выигрыш в производительности от полностью последовательного файла подкачки минимален. Однако большой файл подкачки обычно позволяет использовать ресурсоемкие приложения без каких-либо негативных последствий, кроме увеличения использования дискового пространства. Хотя фрагментированный файл подкачки сам по себе не является проблемой, фрагментация файла подкачки переменного размера со временем создаст несколько фрагментированных блоков на диске, что приведет к фрагментации других файлов. Поэтому лучше использовать файл подкачки фиксированного размера, расположенный непрерывно, при условии, что выделенный размер достаточен для удовлетворения потребностей всех приложений. Требуемое дисковое пространство можно легко выделить на системах с современными характеристиками (например, система с 3 ГБ памяти с файлом подкачки фиксированного размера 6 ГБ на диске объемом 750 ГБ или система с 6 ГБ памяти и файлом подкачки фиксированного размера 16 ГБ и диском объемом 2 ТБ). В обоих примерах система использует около 0,8% дискового пространства, предварительно расширив файл подкачки до максимального размера. Дефрагментация файла подкачки также иногда рекомендуется для повышения производительности, когда система Windows постоянно использует значительно больше памяти, чем ее общий объем физической памяти. Однако эта точка зрения игнорирует тот факт, что, помимо временных результатов расширения, файл подкачки не фрагментируется со временем. В целом, проблемы с производительностью, связанные с доступом к файлу подкачки, гораздо эффективнее решаются путем увеличения объема физической памяти.

Unix и Unix-подобные системы

Системы Unix и другие Unix-подобные операционные системы используют термин "swap" для обозначения процесса использования дискового пространства вместо оперативной памяти, когда физическая оперативная память заполнена. В некоторых из этих систем принято выделять целый раздел жесткого диска для подкачки. Эти разделы называются разделами подкачки (swap-разделами). Многие системы используют для подкачки целый жесткий диск, отдельный от диска с данными, содержащий только раздел подкачки. Жесткий диск, предназначенный исключительно для подкачки, называется "диском подкачки", "временным диском" или "рабочим диском". Некоторые из этих систем поддерживают подкачку только на раздел подкачки, другие также поддерживают подкачку в файлы.

Линукс

Ядро Linux поддерживает практически неограниченное количество устройств или файлов подкачки, а также позволяет назначать приоритеты этим устройствам. Когда ядру требуется выгрузить страницы из физической памяти, оно использует устройство подкачки с наивысшим приоритетом, на котором есть свободное место. Если нескольким устройствам подкачки назначен одинаковый приоритет, они используются поочередно (по принципу, схожему с RAID 0), что повышает производительность, при условии эффективного параллельного доступа к базовым устройствам.

Обмен файлов и разделов

С точки зрения конечного пользователя, файлы подкачки в версиях 2.6.x и более поздних версий ядра Linux практически так же быстры, как и разделы подкачки; ограничение заключается в том, что файлы подкачки должны быть непрерывно выделены на базовых файловых системах. Для повышения производительности файлов подкачки ядро ведет карту их расположения на базовых устройствах и обращается к ним напрямую, обходя кэш и избегая накладных расходов файловой системы. При использовании жестких дисков, являющихся устройствами с вращающимися магнитными носителями, одним из преимуществ разделов подкачки является возможность их размещения в смежных областях жесткого диска, обеспечивающих более высокую пропускную способность или более быстрое время доступа. Однако административная гибкость файлов подкачки может перевесить некоторые преимущества разделов подкачки. Например, файл подкачки можно разместить на любой смонтированной файловой системе, установить любой желаемый размер и добавлять или изменять его по мере необходимости. Разделы подкачки менее гибки; их нельзя увеличить без использования инструментов разметки диска или управления томами, что вносит различные сложности и может привести к простоям.

Обменные цены

Swappiness – это параметр ядра Linux, который определяет относительный приоритет выгрузки страниц из оперативной памяти на диск по сравнению с удалением страниц из системного кэша страниц, когда запрос на выделение памяти не может быть удовлетворен из свободной памяти. Значение Swappiness можно установить в диапазоне от 0 до 200. Низкое значение заставляет ядро отдавать предпочтение удалению страниц из кэша, а высокое – выгрузке на диск "неактивных" страниц памяти. Значение по умолчанию – 60; увеличение этого значения может привести к высокой задержке, если потребуется вернуть неактивные страницы в оперативную память (например, при взаимодействии с программой, которая была неактивна), в то время как уменьшение значения (даже до 0) может вызвать высокую задержку при повторном чтении файлов, ранее удаленных из кэша, но повысит отзывчивость интерактивных приложений, поскольку они реже будут нуждаться в возврате неактивных страниц. Выгрузка на диск также может замедлить работу жестких дисков из-за большого количества случайных операций записи, в то время как твердотельные накопители (SSD) этой проблемы не имеют. В большинстве случаев значения по умолчанию работают хорошо, но для настольных компьютеров и интерактивных систем, используемых для выполнения любых задач, может быть полезно уменьшить это значение, а для пакетной обработки и менее интерактивных систем – увеличить его.

Смена смерти

Когда системной памяти крайне недостаточно для текущих задач и значительная часть активности памяти приходится на медленный файл подкачки, система может стать практически неспособной выполнять какие-либо задачи, даже если процессор простаивает. Когда каждый процесс ожидает данные из файла подкачки, система считается находящейся в состоянии "своп-смерти". "Своп-смерть" может возникнуть из-за некорректной настройки перерасхода памяти. Первоначальное описание проблемы "зависания из-за подкачки" относится к X-серверу. Если код или данные, используемые X-сервером для обработки нажатия клавиши, отсутствуют в оперативной памяти, то при нажатии клавиши сервер столкнется с одной или несколькими ошибками страниц, требуя чтения этих страниц из файла подкачки перед обработкой нажатия, что замедлит реакцию. Если эти страницы не останутся в памяти, их придется снова загружать для обработки следующего нажатия клавиши, что сделает систему практически неотзывчивой, даже если она фактически нормально выполняет другие задачи.

macOS

macOS использует несколько файлов подкачки. Стандартная (и рекомендованная Apple) установка размещает их на корневом разделе, хотя их можно разместить и на отдельном разделе или устройстве.

AmigaOS 4

AmigaOS 4.0 представила новую систему выделения оперативной памяти и дефрагментации физической памяти. Она по-прежнему использует плоское общее адресное пространство, которое невозможно дефрагментировать. Система основана на методе выделения памяти по блокам (slab allocation) и страничной организации памяти, позволяющей использовать подкачку. Страничная организация памяти была реализована в AmigaOS 4.1, но может привести к зависанию системы при полном использовании физической памяти. Память подкачки можно было включать и отключать в любой момент, предоставляя пользователю возможность использовать только физическую оперативную память.

Выступление

Резервная память операционной системы виртуальной памяти обычно на несколько порядков медленнее, чем оперативная память. Кроме того, использование механических устройств хранения вносит задержку, составляющую несколько миллисекунд для жесткого диска. Поэтому желательно уменьшить или исключить подкачку, где это практически возможно. Некоторые операционные системы предоставляют настройки для влияния на решения ядра. В Linux есть параметр /proc/sys/vm/swappiness, который изменяет баланс между выгрузкой оперативной памяти и удалением страниц из системного кэша страниц. Windows 2000, XP и Vista предлагают настройку реестра DisablePagingExecutive, которая определяет, могут ли код и данные в режиме ядра быть выгружены на диск. Большие ЭВМ часто использовали диски с головкой на дорожку или барабаны для хранения страниц и области подкачки, чтобы исключить время поиска, а также несколько технологий для одновременной обработки нескольких запросов к одному устройству с целью уменьшения задержки вращения. Флэш-память имеет ограниченное количество циклов стирания и записи (см. ограничения флэш-памяти), а минимальный объем данных, который можно стереть за один раз, может быть очень большим (128 КБ для SSD Intel X25-M), редко совпадающим с размером страницы. Поэтому флэш-память может быстро изнашиваться при использовании в качестве области подкачки в условиях нехватки памяти. С положительной стороны, флэш-память практически не имеет задержек по сравнению с жесткими дисками и не является энергозависимой, как чипы оперативной памяти. Технологии, такие как ReadyBoost и Intel Turbo Memory, разработаны для использования этих характеристик. Многие Unix-подобные операционные системы (например, AIX, Linux и Solaris) позволяют использовать несколько устройств хранения для области подкачки параллельно, чтобы повысить производительность.

Размер пространства для обмена

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

Размеры физического и виртуального адресного пространства

Странирование — это один из способов обеспечения возможности использования процессом адресного пространства, называемого "виртуальным адресным пространством" или "логическим адресным пространством", размера которого отличается от объема физической памяти, фактически установленной на данном компьютере, который и представляет собой физическое адресное пространство.

Главная память меньше виртуальной

В большинстве систем размер виртуального адресного пространства процесса значительно превышает объем доступной оперативной памяти. Например:
Адресная шина, соединяющая процессор с оперативной памятью, может быть ограничена. 32-битные внутренние адреса процессора i386SX позволяют адресовать 4 ГБ, но у него только 24 контакта подключены к адресной шине, что ограничивает установленный объем физической памяти до 16 МБ. Могут существовать и другие аппаратные ограничения на максимальный объем оперативной памяти, который можно установить. Максимальный объем памяти может быть не установлен из-за стоимости, поскольку стандартная конфигурация модели не предусматривает его, или потому, что покупатель не посчитал это целесообразным. Иногда не все внутренние адреса могут быть использованы для памяти, поскольку аппаратная архитектура может резервировать большие области для ввода-вывода или других функций.

Основная память такого же размера, как виртуальная память

Компьютер с истинным n-битным адресованием может иметь 2^n адресуемых единиц оперативной памяти. Примером является 32-битный x86 процессор с 4 ГБ и без расширения физического адреса (PAE). В этом случае процессор способен обращаться ко всей установленной оперативной памяти и не более того. Однако даже в этом случае, подкачка может быть использована для поддержки большего объема виртуальной памяти, чем физической. Например, одновременно может выполняться множество программ. В совокупности они могут потребовать больше физической памяти, чем установлено в системе, но не весь этот объем должен находиться в оперативной памяти одновременно. Система подкачки эффективно решает, какую память выгружать на вторичный носитель, обеспечивая оптимальное использование установленной оперативной памяти. Кроме того, операционная система может предоставлять программам сервисы, позволяющие работать с объемом памяти, превышающим установленный объем оперативной памяти, например, файлы, которые могут расти за пределы установленного объема оперативной памяти. Не весь файл может быть одновременно отображен в адресное пространство процесса, но операционная система может разрешать отображение отдельных областей файла в адресное пространство и их отмену, когда требуется отобразить другую область.

Основная память больше, чем виртуальное адресное пространство

Некоторые компьютеры обладают объемом основной памяти, превышающим виртуальное адресное пространство процесса, например, Magic 1, некоторые модели PDP 11 и некоторые системы с 32-битными процессорами x86 с расширением физических адресов. Это нивелирует значительное преимущество страничной организации памяти, поскольку отдельный процесс не может использовать больше основной памяти, чем размер его виртуального адресного пространства. В таких системах часто применяются методы подкачки для получения дополнительных преимуществ: "избыточный объем памяти" может использоваться в кэше страниц для кэширования часто используемых файлов и метаданных, таких как информация о каталогах, из вторичной памяти. Если процессор и операционная система поддерживают несколько виртуальных адресных пространств, "избыточный объем памяти" можно использовать для одновременного запуска большего числа процессов. Подкачка позволяет суммарному объему виртуальных адресных пространств превышать объем физической основной памяти. Процесс может хранить данные в файлах, отображенных в память, на файловых системах, поддерживающих работу с памятью, таких как файловая система tmpfs или файловые системы на RAM-диске, и отображать файлы в адресное пространство и из него по мере необходимости. Набор процессов все еще может полагаться на расширенные функции безопасности, обеспечиваемые изоляцией на основе страниц в многозадачной среде. Общий размер всех виртуальных адресных пространств по-прежнему ограничен объемом доступной вторичной памяти.