Отображаемая память файл представляет собой сегмент виртуальной памяти [1] , который был назначен прямыми байты-в-байт корреляции с некоторой частью файла или файл , как ресурс. Этот ресурс обычно представляет собой файл, который физически присутствует на диске, но также может быть устройством, объектом общей памяти или другим ресурсом, на который операционная система может ссылаться через файловый дескриптор . Когда эта корреляция между файлом и пространством памяти присутствует, приложения могут обрабатывать отображаемую часть, как если бы это была первичная память.
История
ТОПС-20 ПМАП
Рано ( с. 1969 ) [2] Реализация этого была PMAP системный вызов на DEC-20 «s TOPS-20 операционная система, [3] функция используется Software House в базе данных системы System-1022 . [4]
SunOS 4 mmap
SunOS 4 [5] представил Unix «s 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 ГиБ, в зависимости от ядра операционной системы. Однако этот недостаток практически устранен в современной 64-битной архитектуре.
mmap также имеет тенденцию быть менее масштабируемым, чем стандартные средства файлового ввода-вывода, поскольку многие операционные системы, включая Linux, имеют ограничение на количество ядер, обрабатывающих ошибки страницы. Чрезвычайно быстрые устройства, такие как современные твердотельные накопители NVM Express , могут серьезно повлиять на накладные расходы. [11]
Ошибки ввода-вывода в базовом файле (например, его съемный диск отключен или оптический носитель извлечен, диск заполнен при записи и т. Д.) При доступе к его отображенной памяти сообщаются приложению как сигналы SIGSEGV / SIGBUS на POSIX, а Структурированное исключение EXECUTE_IN_PAGE_ERROR в Windows. Весь код, обращающийся к отображаемой памяти, должен быть подготовлен к обработке этих ошибок, которые обычно не возникают при доступе к памяти.
Только аппаратные архитектуры с MMU могут поддерживать файлы с отображением в память. На архитектурах без MMU операционная система может копировать весь файл в память, когда делается запрос на его отображение, но это чрезвычайно расточительно и медленно, если будет доступна только небольшая часть файла, и может работать только с файлами. который уместится в доступной памяти.
Общее использование
Возможно, наиболее распространенное использование файла с отображением в память - это загрузчик процесса в большинстве современных операционных систем (включая Microsoft Windows и Unix-подобные системы). Когда процесс запускается, операционная система использует файл с отображением памяти для передачи исполняемого файла. вместе с любыми загружаемыми модулями в память для выполнения. Большинство систем отображения памяти используют метод, называемый подкачкой по запросу , при котором файл загружается в физическую память подмножествами (по одной странице в каждом) и только тогда, когда на эту страницу действительно ссылаются. [12] В конкретном случае исполняемых файлов это позволяет ОС выборочно загружать только те части образа процесса, которые действительно необходимо выполнить.
Другое распространенное использование файлов с отображением в память - разделение памяти между несколькими процессами. В современных операционных системах с защищенным режимом процессам обычно не разрешается обращаться к пространству памяти, выделенному для использования другим процессом. (Попытка программы сделать это приводит к ошибкам из-за недействительных страниц или нарушениям сегментации .) Существует ряд методов безопасного совместного использования памяти, и ввод-вывод файлов с отображением в память является одним из самых популярных. Два или более приложений могут одновременно отображать один физический файл в памяти и получать доступ к этой памяти. Например, операционная система Microsoft Windows предоставляет приложениям механизм для отображения памяти совместно используемого сегмента файла подкачки самой системы и обмена данными через этот раздел.
Поддержка платформы
Большинство современных операционных систем или сред выполнения поддерживают ту или иную форму доступа к файлам с отображением памяти. Функция mmap () , [13], которая создает отображение файла с заданным файловым дескриптором, начальным местоположением в файле и длиной, является частью спецификации POSIX , поэтому большое количество POSIX-совместимых систем, таких как UNIX , Linux , Mac OS X [14] или OpenVMS поддерживают общий механизм для файлов отображения памяти. Операционные системы Microsoft Windows также поддерживают для этой цели группу функций API , таких как CreateFileMapping () . [15]
Некоторые бесплатные переносимые реализации файлов с отображением в память для Microsoft Windows и POSIX-совместимых платформ:
- Boost.Interprocess, [16] в библиотеках Boost C ++
- Boost.Iostreams, [17] также в библиотеках Boost C ++
- Fmstream [18]
- Cpp-mmf [19]
Язык программирования Java предоставляет классы и методы для доступа к файлам с отображением памяти, таким как FileChannel
.
Язык программирования D поддерживает файлы с отображением памяти в своей стандартной библиотеке (модуль std.mmfile). [20]
В Ruby есть гем (библиотека) под названием Mmap, который реализует отображаемые в память файловые объекты.
Начиная с версии 1.6 Python включает модуль mmap в его стандартной библиотеке. [21] Детали модуля различаются в зависимости от того, является ли хост-платформа Windows или Unix-подобной .
Для Perl доступно несколько модулей для файлов отображения памяти на CPAN , например: Sys :: Mmap [22] и Файл :: Карта . [23]
В среде выполнения Microsoft .NET P / Invoke можно использовать для использования файлов с отображением памяти непосредственно через Windows API . Управляемый доступ (P / Invoke не требуется) к файлам с отображением памяти был представлен в версии 4 среды выполнения (см. Файлы с отображением в память ). Для предыдущих версий существуют сторонние библиотеки, которые предоставляют управляемые API. [24]
PHP поддерживал методы отображения памяти в ряде встроенных функций доступа к файлам, таких как file_get_contents (), но удалил это в версии 5.3 (см. Журнал изменений ).
Для языка программирования R существует библиотека в CRAN, называемая bigmemory, которая использует библиотеку Boost и предоставляет массивы с отображением памяти непосредственно в R. Пакет ff предлагает отображенные в память векторы, матрицы, массивы и фреймы данных.
Язык программирования J поддерживает файлы с отображением в память, по крайней мере, с 2005 года. Он включает поддержку упакованных данных массива и файлов с одним типом данных. Поддержка может быть загружена из 'data / jmf'. Механизмы баз данных Jdb и JD J используют файлы с отображением памяти для хранилищ столбцов.
Рекомендации
- ^ a b Крис Зибенманн (7 июня 2018 г.). «История запутанного набора низкоуровневых способов распределения памяти в Unix» .
- ^ Разработка началась в 1969 г., отгружена в 1976 г.
- ^ «Справочное руководство по монитору вызовов TOPS-20» (PDF) .
- ^ «Система базы данных 1022» .
У нас был кеш PMAP для файлового ввода-вывода (например, PA1050) в расширенных разделах.
- ↑ Декабрь 1988 г.
- ^ Джеффри Рихтер (октябрь 1995 г.). «Добавьте в свое приложение файлы с расширяемой отображенной памятью». Журнал Microsoft Systems . С. 17–28.
- ^ «Архивная копия» . Архивировано из оригинального 7 -го августа 2011 года . Проверено 21 мая 2011 года .CS1 maint: заархивированная копия как заголовок ( ссылка )
- ^ , «Что могут предложить файлы с отображением памяти?».
- ^ а б «Файлы с отображением памяти» . Сеть разработчиков Microsoft . Проверено 4 января +2016 .
- ^ http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html , чтение против mmap (или io против ошибок страницы) Мэтью Диллон
- ^ Папагианнис, Анастасиос; Xanthakis, Giorgos; Салоустрос, Гиоргос; Маразакис, Манолис; Билас, Ангелос (2020). Оптимизация ввода-вывода с отображением памяти для устройств быстрого хранения . USENIX ATC '20. С. 813–827.
- ^ "Требование пейджинга"
- ^ Память Подключенные Файлы архивации 9 февраля 2007 в Wayback Machine
- ↑ Apple - Mac OS X Leopard - Технология - UNIX. Архивировано 23 апреля 2009 г. на Wayback Machine.
- ^ Функция CreateFileMapping (Windows)
- ^ «Совместное использование памяти между процессами: файлы с отображением памяти» . Boost.org.
- ^ «Файлы с отображением памяти» . Boost.org.
- ^ «Файлы с отображением памяти для систем Windows и POSIX» . SourceForge.
- ^ "cpp-mmf" . GitHub.
- ^ "std.mmfile - язык программирования D" . Цифровой Марс . Проверено 4 декабря 2011 года .
- ^ «Новые модули в 1.6» . Архивировано из оригинала 30 декабря 2006 года . Источник +23 Декабрю 2008 .
- ^ "Модуль Sys :: Mmap Perl" .
- ^ "File :: Map Perl Module" .
- ^ DotNet архивации 19 апреля 2010 в Wayback Machine