О системе виртуальной памяти

Эффективное управление памятью является важным аспектом записи высокоэффективного кода и в OS X и в iOS. Минимизация использования памяти не только уменьшает объем потребляемой памяти Вашего приложения, это может также сократить сумму процессорного времени, которое это использует. Для надлежащей настройки кода, хотя, необходимо понять что-то о том, как базовая система управляет памятью.

И OS X и iOS включают полностью интегрированную систему виртуальной памяти, которую Вы не можете выключить; это всегда включено. Обе системы также обеспечивают до 4 гигабайтов адресуемого пространства на 32-разрядный процесс. Кроме того, OS X обеспечивает приблизительно 18 эксабайт адресуемого пространства для 64-разрядных процессов. Даже для компьютеров, имеющих 4 или больше гигабайта в наличии RAM, система редко выделяет это много RAM единственному процессу.

Для предоставления доступа процессов к их всему адресному пространству на 18 эксабайт или на 4 гигабайта OS X использует жесткий диск для содержания не использующихся в настоящее время данных. Поскольку память становится полной, не использующиеся разделы памяти записаны в диск для создания места для данных, которые необходимы теперь. Часть диска, хранящего неиспользованные данные, известна как запоминающее устройство, потому что это обеспечивает резервное хранилище для оперативной памяти.

Несмотря на то, что OS X поддерживает запоминающее устройство, iOS не делает. В приложениях для iPhone данные только для чтения, которые уже находятся на диске (таком как кодовые страницы) просто удалены из памяти и перезагружены от диска по мере необходимости. Перезаписываемые данные никогда не удаляются из памяти операционной системой. Вместо этого если сумма свободной памяти опускается ниже определенного порога, система просит, чтобы запущенные приложения высвободили память добровольно для создания места для новых данных. Завершаются приложения, которым не удается высвободить достаточно памяти.

Следующие разделы представляют терминологию и обеспечивают краткий обзор системы виртуальной памяти, используемой и в OS X и в iOS. Для более подробной информации о том, как система виртуальной памяти работает, см. Руководство по программированию Ядра.

О виртуальной памяти

Виртуальная память позволяет операционной системе выходить из ограничений физического RAM. Диспетчер виртуальной памяти создает логическое адресное пространство (или «виртуальное» адресное пространство) для каждого процесса и делится, это в унифицированно измеренные блоки памяти вызвало страницы. Процессор и его блок управления памятью (MMU) поддерживают таблицу страниц для отображения страниц в логическом адресном пространстве программы к аппаратным адресам в RAM компьютера. Когда код программы получает доступ к адресу в памяти, MMU использует таблицу страниц для перевода указанного логического адреса в фактический аппаратный адрес памяти. Этот перевод происходит автоматически и очевиден для запущенного приложения.

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

Если нет никаких свободных страниц, доступных в физической памяти, обработчик должен сначала выпустить существующую страницу для создания места для новой страницы. Как системные страницы выпуска зависят от платформы. В OS X система виртуальной памяти часто пишет страницы в запоминающее устройство. Запоминающее устройство является находящимся на диске репозиторием, содержащим копию страниц памяти, используемых данным процессом. Движущиеся данные с физической памяти на запоминающее устройство вызываются разбивка на страницы (или «выгружающий»); движущиеся данные от запоминающего устройства въезжают задним ходом к физической памяти, призван разбивка на страницы (или «загружающий»). В iOS нет никакого запоминающего устройства и таким образом, страницы, никогда не разбиваются на страницы к диску, но страницы только для чтения все еще быть разбитыми на страницы в от диска по мере необходимости.

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

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

Подробные данные системы виртуальной памяти

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

Ядро связывает объект VM с каждой областью логического адресного пространства. Ядро использует объекты VM отследить и управлять резидентными и нерезидентными страницами связанных областей. Область может отобразиться на часть запоминающего устройства или на файл с отображенной памятью в файловой системе. Каждый объект VM содержит карту, связывающую области или с пейджером по умолчанию или с vnode пейджером. Пейджер по умолчанию является администратором системы, управляющим нерезидентными страницами виртуальной памяти в запоминающем устройстве и выбирающим те страницы, когда требуется. vnode пейджер реализует доступ к файлу с отображенной памятью. vnode пейджер использует механизм разбивки на страницы для обеспечения окна непосредственно в файл. Этот механизм позволяет Вам считать и записать части файла, как будто они были расположены в памяти.

В дополнение к отображающимся областям или к значению по умолчанию или к vnode пейджеру, объект VM может также отобразить области на другой объект VM. Ядро использует это сам ссылка на метод для реализации областей копии на записи. Области копии на записи позволяют различным процессам (или многократные блоки кода в процессе) поделиться страницей, пока ни один из них не пишет в ту страницу. Когда процесс пытается записать в страницу, копия страницы создается в логическом адресном пространстве процесса, делающего записи. От той точки вперед, запись поддерживает свою собственную отдельную копию страницы, в которую это может записать в любое время. Области копии на записи позволяют системе совместно использовать большие количества данных эффективно в памяти, все еще позволяя процессам управлять теми страницами непосредственно (и безопасно) в случае необходимости. Эти типы областей обычно используются для страниц данных, загруженных из системных платформ.

Каждый объект VM содержит несколько полей, как показано в Таблице 1.

Табличные 1  Поля объекта VM

Поле

Описание

Резидентные страницы

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

Размер

Размер области, в байтах.

Пейджер

Пейджер, ответственный за отслеживание и обработку страниц этой области в запоминающем устройстве.

Тень

Используемый для оптимизации копии на записи.

Копия

Используемый для оптимизации копии на записи.

Атрибуты

Флаги, указывающие состояние различных подробных данных реализации.

Если объект VM вовлечен в копию на записи (vm_copy) работа, тень и поля копии могут указать на другие объекты VM. Иначе оба поля обычно NULL.

Соединенная проводом память

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

Таблица 2 перечисляет некоторые затраты соединенной проводом памяти для сгенерированных приложением объектов.

Таблица 2  Соединенная проводом память сгенерирована программным обеспечением пользовательского уровня

Ресурс

Соединенная проводом память, используемая ядром

Процесс

16 килобайтов

Поток

блокированный в продолжении — 5 килобайтов; блокированный — 21 килобайт

Порт Маха

116 байтов

Отображение

32 байта

Библиотека

2 килобайта плюс 200 байтов для каждой задачи, использующей его

Область памяти

160 байтов

Как Вы видите, каждый поток, процесс, и библиотека способствует резидентному месту системы. В дополнение к Вашему приложению с помощью соединенной проводом памяти, однако, само ядро требует соединенной проводом памяти для следующих объектов:

Соединенные проводом структуры данных также связаны с физической страницей, и таблицы карты раньше хранили информацию отображения виртуальной памяти, Оба из этих объектов масштаб с суммой доступной физической памяти. Следовательно, когда Вы, которых дополнительную память к системе, увеличивает сумма соединенной проводом памяти, даже если ничто иное не изменяется. Когда компьютер сначала загружается в Средство поиска без другого выполнения приложений, соединенная проводом память может использовать приблизительно 14 мегабайтов системы на 64 мегабайта и 17 мегабайтов системы на 128 мегабайтов.

Соединенные проводом страницы памяти сразу не попятились к бесплатному списку, когда они становятся недопустимыми. Вместо этого они «собраны «мусор»», когда количество свободной страницы падает ниже порога, инициировавшего страницу события.

Списки страницы в ядре

Ядро поддерживает и запрашивает три списка в масштабе всей системы страниц физической памяти:

Когда число страниц в бесплатном списке падает ниже порога (определенный размером физической памяти), пейджер пытается сбалансировать очереди. Это делает это путем получения по запросу страниц из неактивного списка. Если к странице недавно получили доступ, она повторно активирована и помещена в конец списка активных пользователей. В OS X, если неактивная страница содержит данные, недавно не записанные в запоминающее устройство, его содержание должно быть разбито на страницы к диску, прежде чем это сможет быть помещено в бесплатный список. (В iOS измененные но неактивные страницы должны остаться в памяти и быть очищены приложением, которому принадлежат они.), Если неактивная страница не была изменена и не является постоянно (соединенным проводом) резидентным объектом, это украдено (любые текущие виртуальные отображения к нему уничтожаются), и добавил к бесплатному списку. Как только свободный размер списка превышает целевой порог, отдых пейджера.

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

Разбивка на страницы обрабатывает

В OS X, когда число страниц в свободных падениях списка ниже вычисленного порога, ядро предъявляет претензии в отношении физических страниц для бесплатного списка путем свопинга неактивных страниц из памяти. Чтобы сделать это, ядро выполняет итерации всех резидентных страниц в активных и неактивных списках, выполняя следующие шаги:

  1. Если страница в списке активных пользователей недавно не затронута, это перемещено в неактивный список.

  2. Если страница в неактивном списке недавно не затронута, ядро находит объект VM страницы.

  3. Если объект VM никогда не разбивался на страницы прежде, вызовы ядра подпрограмма инициализации, создающая и присваивающая объект пейджера по умолчанию.

  4. Пейджер объекта VM по умолчанию пытается выписать страницу к запоминающему устройству.

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

Разбивка на страницы в процессе

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

Когда любой тип отказа происходит, ядро определяет местоположение записи карты и объекта VM для области, к которой получают доступ. Ядро тогда проходит через список объекта VM резидентных страниц. Если желаемая страница находится в списке резидентных страниц, ядро генерирует мягкий отказ. Если страница не находится в списке резидентных страниц, это генерирует серьезный отказ.

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

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