Файл с отображением памяти - Memory-mapped file

А файл с отображением памяти это сегмент виртуальная память[1] которому назначена прямая побайтовая корреляция с некоторой частью файла или файлового ресурса. Этот ресурс обычно представляет собой файл, который физически присутствует на диске, но также может быть устройством, объектом общей памяти или другим ресурсом, который Операционная система может ссылаться через дескриптор файла. Как только она присутствует, эта корреляция между файлом и пространством памяти позволяет приложениям обрабатывать отображаемую часть, как если бы она была первичной памятью.

История

ТОПС-20 ПМАП

Рано (c. 1969)[2] реализация этого была PMAP системный вызов на ДЕК-20 с ТОП-20 Операционная система,[3] функция, используемая Software House Система баз данных System-1022.[4]

SunOS 4 mmap

SunOS 4[5] представил Unix mmap, позволяющий программам «отображать файлы в память».[1]

Файлы с отображаемой памятью Windows (GMMF)

Спустя два десятилетия после выпуска PMAP TOPS-20, Windows NT были предоставлены файлы с расширяемой памятью (GMMF).

Поскольку «функция CreateFileMapping требует, чтобы в нее был передан размер», а изменение размера файла затруднительно, был разработан API GMMF.[6] Использование GMMF требует объявления максимума, до которого может увеличиваться размер файла, но неиспользуемое пространство не теряется.

Преимущества

Преимущество отображения памяти в файл заключается в повышении производительности ввода-вывода, особенно при использовании с большими файлами. Для небольших файлов файлы с отображением памяти могут привести к потере свободное пространство[7] поскольку карты памяти всегда выравниваются по размеру страницы, который обычно составляет 4 КиБ. Следовательно, для файла размером 5 КиБ будет выделено 8 КиБ, и, таким образом, 3 КиБ будут потрачены впустую. Доступ к файлам с отображением памяти происходит быстрее, чем при использовании прямых операций чтения и записи по двум причинам. Во-первых, системный вызов выполняется на несколько порядков медленнее, чем простое изменение локальной памяти программы. Во-вторых, в большинстве операционных систем фактически отображаемая область памяти является ядра кеш страницы (файловый кеш), что означает, что не нужно создавать копии в пользовательском пространстве.

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

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

Процесс отображения памяти обрабатывается диспетчер виртуальной памяти, которая является той же подсистемой, которая отвечает за Файл подкачки. Файлы с отображением в памяти загружаются в память целиком. страница вовремя. В размер страницы выбирается операционной системой для максимальной производительности. Поскольку управление файлами подкачки является одним из наиболее важных элементов системы виртуальной памяти, загрузка разделов файла размером со страницу в физическую память обычно является очень оптимизированной системной функцией.[8]

Типы

Есть два типа файлов с отображением памяти:

Сохранились

Сохраненные файлы связаны с исходным файлом на диске. Данные сохраняются в исходный файл на диске после завершения последнего процесса. Эти файлы с отображением в память подходят для работы с очень большими исходными файлами.[9]

Несохраняемый

Несохраняемые файлы не связаны с файлом на диске. Когда последний процесс завершает работу с файлом, данные теряются. Эти файлы подходят для создания общей памяти для межпроцессного взаимодействия (IPC).[9]

Недостатки

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

Другой недостаток файлов с отображением в память связан с особенностями данной архитектуры. адресное пространство: файл, размер которого превышает адресуемое пространство, может содержать только части, отображаемые за раз, что затрудняет его чтение. Например, 32-битный архитектура, такая как Intel IA-32 можно напрямую адресовать только 4 ГиБ или меньшие части файлов. Отдельным программам доступен еще меньший объем адресного пространства - обычно от 2 до 3 ГиБ, в зависимости от ядра операционной системы.

Ошибки ввода-вывода в базовом файле (например, его съемный диск отключен или оптический носитель извлечен, диск заполнен при записи и т. Д.) При доступе к его отображенной памяти сообщаются приложению как сигналы SIGSEGV / SIGBUS в POSIX, а Структурированное исключение EXECUTE_IN_PAGE_ERROR в Windows. Весь код, обращающийся к отображаемой памяти, должен быть подготовлен для обработки этих ошибок, которые обычно не возникают при доступе к памяти.

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

Общее использование

Возможно, наиболее частым использованием файла с отображением в память является загрузчик процессов в большинстве современных операционных систем (включая Майкрософт Виндоус и Unix-подобный систем.) Когда процесс запускается, операционная система использует файл с отображением памяти для переноса исполняемого файла вместе с любыми загружаемыми модулями в память для выполнения. Большинство систем отображения памяти используют метод, называемый пейджинг по запросу, где файл загружается в физическую память подмножествами (по одной странице в каждом) и только тогда, когда на эту страницу действительно есть ссылка.[11] В конкретном случае исполняемых файлов это позволяет ОС выборочно загружать только те части образа процесса, которые действительно необходимо выполнить.

Еще одно распространенное использование файлов с отображением в память - разделение памяти между несколькими процессами. В современном защищенный режим В операционных системах процессам обычно не разрешается доступ к пространству памяти, выделенному для использования другим процессом. (Попытка программы сделать это вызывает неверные ошибки страницы или же нарушения сегментации.) Существует ряд методов безопасного совместного использования памяти, и файловый ввод-вывод с отображением в память является одним из самых популярных. Два или более приложений могут одновременно отображать один физический файл в памяти и получать доступ к этой памяти. Например, операционная система Microsoft Windows предоставляет приложениям механизм для отображения памяти совместно используемого сегмента самого файла подкачки системы и обмена данными через этот раздел.

Поддержка платформы

Большинство современных операционных систем или сред выполнения поддерживают те или иные формы доступа к файлам с отображением памяти. Функция mmap (),[12] который создает отображение файла с учетом дескриптора файла, начального местоположения в файле и длины, является частью POSIX спецификации, поэтому широкий спектр POSIX-совместимых систем, таких как UNIX, Linux, Mac OS X[13] или же OpenVMS, поддерживают общий механизм для файлов отображения памяти. Операционные системы Microsoft Windows также поддерживают группу API функции для этой цели, такие как CreateFileMapping ().[14]

Вот некоторые бесплатные переносимые реализации файлов с отображением в память для Microsoft Windows и POSIX-совместимых платформ:

В Язык программирования Java предоставляет классы и методы для доступа к файлам с отображением памяти, таким как FileChannel.

В Язык программирования D поддерживает файлы с отображением памяти в своей стандартной библиотеке (модуль std.mmfile).[19]

Рубин имеет гем (библиотеку) под названием Mmap, который реализует отображенные в память файловые объекты.

Начиная с версии 1.6, Python включил mmap модуль в своей стандартной библиотеке.[20] Детали модуля различаются в зависимости от того, используется ли хост-платформа. Windows или же Unix-подобный.

За Perl есть несколько модулей для файлов отображения памяти на CPAN, Такие как Sys :: Mmap[21] и Файл :: Карта.[22]

В среде выполнения Microsoft .NET P / Invoke может использоваться для использования файлов с отображением памяти непосредственно через Windows API. Управляемый доступ (P / Invoke не требуется) к файлам с отображением памяти был представлен в версии 4 среды выполнения (см. Файлы с отображением в память ). Для предыдущих версий существуют сторонние библиотеки, которые предоставляют управляемые API.[23]

PHP поддерживал методы отображения памяти в ряде встроенных функций доступа к файлам, таких как file_get_contents (), но удалил это в версии 5.3 (см. журнал изменений ).

Для Язык программирования R в CRAN существует библиотека под названием bigmemory который использует библиотеку Boost и предоставляет массивы с отображением памяти непосредственно в R. ff предлагает отображенные в память векторы, матрицы, массивы и фреймы данных.

В Язык программирования J поддерживает файлы с отображением памяти по крайней мере с 2005 года. Он включает поддержку упакованных данных массива и файлов с одним типом данных. Поддержка может быть загружена из 'data / jmf'. Механизмы баз данных Jdb и JD J используют файлы с отображением памяти для хранилищ столбцов.

Рекомендации

  1. ^ а б Крис Зибенманн (7 июня 2018 г.). «История запутанного набора низкоуровневых способов распределения памяти в Unix».
  2. ^ Разработка началась в 1969 г., отгружена в 1976 г.
  3. ^ "Справочное руководство по отслеживанию вызовов TOPS-20" (PDF).
  4. ^ "Система базы данных 1022". У нас был кеш PMAP для файлового ввода-вывода (например, PA1050) в расширенных разделах.
  5. ^ Декабрь 1988 г.
  6. ^ Джеффри Рихтер (октябрь 1995 г.). «Добавьте в приложение файлы с расширяемой отображенной памятью». Журнал Microsoft Systems. С. 17–28.
  7. ^ «Архивная копия». Архивировано из оригинал 7 августа 2011 г.. Получено 21 мая 2011.CS1 maint: заархивированная копия как заголовок (связь)
  8. ^ , «Что могут предложить файлы с отображением памяти?».
  9. ^ а б «Файлы с отображением в память». Сеть разработчиков Microsoft. Получено 4 января 2016.
  10. ^ http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, читать по сравнению с mmap (или io по сравнению с ошибками страницы) по Мэтью Диллон
  11. ^ "Пейджинг по запросу"
  12. ^ Файлы с отображением памяти В архиве 9 февраля 2007 г. Wayback Machine
  13. ^ Apple - Mac OS X Leopard - Технологии - UNIX В архиве 23 апреля 2009 г. Wayback Machine
  14. ^ Функция CreateFileMapping (Windows)
  15. ^ «Совместное использование памяти между процессами: файлы с отображением памяти». Boost.org.
  16. ^ «Файлы с отображением в память». Boost.org.
  17. ^ «Файлы с отображением памяти для систем Windows и POSIX». SourceForge.
  18. ^ "cpp-mmf". GitHub.
  19. ^ "std.mmfile - язык программирования D". Цифровой Марс. Получено 4 декабря 2011.
  20. ^ «Новые модули в 1.6». Архивировано из оригинал 30 декабря 2006 г.. Получено 23 декабря 2008.
  21. ^ "Модуль Sys :: Mmap Perl".
  22. ^ "File :: Map Perl Module".
  23. ^ DotNet В архиве 19 апреля 2010 г. Wayback Machine