Невозможно прочитать атрибуты указанного сопоставленного файла для раздела памяти

Обновлено: 02.07.2024

В современных операционных системах можно mmap (произносится как «em-map») файла в области памяти. Когда это будет сделано, к файлу можно будет обращаться так же, как к массиву в программе.

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

Поскольку MMAP-страницы могут быть сохранены обратно в их файл, когда физической памяти мало, можно MMAP-файлы на несколько порядков больше, чем физическая память и пространство подкачки. Единственным ограничением является адресное пространство. Теоретический предел составляет 4 ГБ на 32-разрядной машине, однако фактический предел будет меньше, поскольку некоторые области будут зарезервированы для других целей. Если используется интерфейс LFS, размер файла в 32-битных системах не ограничивается 2 ГБ (смещения подписаны, что уменьшает адресную область 4 ГБ вдвое); доступны полные 64-разрядные версии.

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

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

В sys/mman.h объявлены следующие функции:

Функция: void * mmap (void * address , size_t length , int protect , int flags , int filedes , off_t offset )

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

Функция mmap создает новое сопоставление, связанное с байтами (смещение) и (смещение + длина - 1) в файле, открытом на filedes. Создается новая ссылка на файл, заданный параметром filedes, который не удаляется при закрытии файла.

address дает предпочтительный начальный адрес для сопоставления. NULL не выражает предпочтения. Любое предыдущее сопоставление по этому адресу автоматически удаляется. Указанный вами адрес может быть изменен, если только вы не используете флаг MAP_FIXED.

protect содержит флаги, определяющие разрешенный вид доступа. К ним относятся PROT_READ, PROT_WRITE и PROT_EXEC. Специальный флаг PROT_NONE резервирует область адресного пространства для будущего использования. Функцию mprotect можно использовать для изменения флагов защиты. См. Защита памяти.

flags содержит флаги, управляющие характером карты. Необходимо указать один из MAP_SHARED или MAP_PRIVATE.

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

Поскольку частные сопоставления фактически возвращаются в обычную память при записи, у вас должно быть достаточно виртуальной памяти для копии всей области mmapped, если вы используете этот режим с PROT_WRITE .

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

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

Это вынуждает систему использовать точный адрес сопоставления, указанный в address, и завершается ошибкой, если это невозможно.

Этот флаг указывает системе создать анонимное сопоставление, не связанное с файлом. filedes и offset игнорируются, а область инициализируется нулями.

Анонимные карты используются в качестве базового примитива для расширения кучи в некоторых системах. Они также полезны для обмена данными между несколькими задачами без создания файла.

В некоторых системах использование частных анонимных mmap более эффективно, чем использование malloc для больших блоков. Это не проблема с библиотекой GNU C, так как включенный malloc автоматически использует mmap, где это необходимо.

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

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

Не все файловые системы поддерживают сопоставления с увеличенным размером страницы.

Флаг MAP_HUGETLB специфичен для Linux.

mmap возвращает адрес нового сопоставления или MAP_FAILED в случае ошибки.

К возможным ошибкам относятся:

Либо адрес был непригоден для использования (поскольку он не кратен применимому размеру страницы), либо были заданы несовместимые флаги.

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

filedes не был открыт для типа доступа, указанного в Protect .

Либо для операции недостаточно памяти, либо процессу не хватает адресного пространства.

Этот файл не поддерживает сопоставление.

Файл находится в файловой системе, которая не поддерживает сопоставление.

Функция: void * mmap64 (void * address , size_t length , int protect , int flags , int filedes , off64_t offset )

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

Функция mmap64 эквивалентна функции mmap, но параметр смещения имеет тип off64_t . В 32-разрядных системах это позволяет файлу, связанному с дескриптором filedes, иметь размер более 2 ГБ. filedes должен быть дескриптором, возвращаемым из вызова open64 или fopen64 и freopen64, где дескриптор извлекается с помощью fileno .

Когда исходники переведены с _FILE_OFFSET_BITS == 64, эта функция фактически доступна под именем mmap. То есть новый расширенный API, использующий 64-битные размеры файлов и смещения, прозрачно заменяет старый API.

Функция: int munmap (void * addr , size_t length )

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

munmap удаляет все карты памяти от (addr) до (addr + length). length должен быть длиной сопоставления.

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

Он возвращает 0 в случае успеха и -1 в случае ошибки.

Возможна одна ошибка:

Указанный диапазон памяти находился за пределами пользовательского диапазона mmap или не был выровнен по страницам.

Функция: int msync (void * address , size_t length , int flags )

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

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

Она работает с адресом региона ( адрес + длина ). Его можно использовать для части сопоставления или нескольких сопоставлений, однако указанная область не должна содержать несопоставленного пространства.

флаги могут содержать некоторые параметры:

Этот флаг гарантирует, что данные действительно записываются на диск. Обычно msync только гарантирует, что доступ к файлу с обычным вводом-выводом отражает последние изменения.

Это указывает msync начать синхронизацию, но не ждать ее завершения.

msync возвращает 0 в случае успеха и -1 в случае ошибки. Ошибки включают:

Указан неверный регион или неправильные флаги.

Нет существующего сопоставления по крайней мере в части данного региона.

Функция: void * mremap (void * address , size_t length , size_t new_length , int flag )

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

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

Возможен один вариант: MREMAP_MAYMOVE . Если он указан в flags , система может удалить существующее сопоставление и создать новое нужной длины в другом месте.

Возвращается адрес результирующего сопоставления или -1. Возможные коды ошибок включают:

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

Указанный адрес неверен или не подходит.

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

Регион доступен для записи, и для его расширения недостаточно виртуальной памяти. Кроме того, эта ошибка возникает, если MREMAP_MAYMOVE не задан, и расширение может столкнуться с другим сопоставленным регионом.

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

Не все файловые дескрипторы могут быть сопоставлены. Сокеты, каналы и большинство устройств допускают только последовательный доступ и не вписываются в абстракцию отображения.Кроме того, некоторые обычные файлы могут не поддерживать отображение, а старые ядра могут вообще не поддерживать отображение. Таким образом, программы, использующие mmap, должны иметь резервный метод на случай сбоя. См. Mmap в Стандартах кодирования GNU.

Функция: int madvise (void * addr , size_t length , int консультация )

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

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

Для этого региона больше не должно быть особых условий.

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

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

Потребуется регион. Страницы в этом регионе могут быть предварительно повреждены ядром.

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

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

Этот флаг специфичен для Linux.

Отменить действие предыдущего совета MADV_HUGEPAGE. Этот флаг специфичен для Linux.

Имена POSIX немного отличаются, но имеют те же значения:

Это соответствует MADV_NORMAL BSD.

Это соответствует MADV_RANDOM BSD.

Это соответствует MADV_SEQUENTIAL BSD.

Это соответствует MADV_WILLNEED в BSD.

Это соответствует MADV_DONTNEED в BSD.

madvise возвращает 0 в случае успеха и -1 в случае ошибки. Ошибки включают:

Указан недопустимый регион или совет недействителен.

Нет существующего сопоставления по крайней мере в части данного региона.

Функция: int shm_open (const char * name, int oflag, mode_t mode)

Предварительно: | MT-безопасная локаль | Блокировка кучи инициализации AS-Unsafe | Блокировка памяти AC-Unsafe fd | См. раздел «Концепции безопасности POSIX».

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

Аргумент имени указывает объект общей памяти, который необходимо открыть. В библиотеке GNU C это должна быть строка меньше NAME_MAX байт, начинающаяся с необязательной косой черты, но не содержащая других косых черт.

Семантика аргументов oflag и mode такая же, как и в open .

shm_open возвращает дескриптор файла в случае успеха или -1 в случае ошибки. При сбое устанавливается ошибка errno.

Функция: int shm_unlink (const char * name)

Предварительно: | MT-безопасная локаль | Блокировка кучи инициализации AS-Unsafe | Блокировка памяти AC-Unsafe fd | См. раздел «Концепции безопасности POSIX».

Эта функция обратна shm_open и удаляет объект с заданным именем, ранее созданный с помощью shm_open .

shm_unlink возвращает 0 в случае успеха или -1 в случае ошибки. При сбое устанавливается ошибка errno.

Функция: int memfd_create (const char * name, unsigned int flags)

Предварительно: | МТ-Сейф | AS-безопасный | AC-Safe fd | См. раздел «Концепции безопасности POSIX».

Функция memfd_create возвращает дескриптор файла, который можно использовать для создания отображений памяти с помощью функции mmap. Она похожа на функцию shm_open в том смысле, что эти сопоставления не поддерживаются реальными файлами. Однако дескриптор, возвращаемый memfd_create, не соответствует именованному объекту; аргумент имени используется только в целях отладки (например, появится в /proc ), а отдельные вызовы memfd_create с тем же именем не вернут дескрипторы для одной и той же области памяти. Дескриптор также можно использовать для создания сопоставлений псевдонимов в рамках того же процесса.

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

Аргумент flags может быть комбинацией следующих флагов:

Дескриптор создается с флагом O_CLOEXEC.

Дескриптор поддерживает добавление печатей с помощью функции fcntl.

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

Этот флаг несовместим с MFD_ALLOW_SEALING .

memfd_create возвращает дескриптор файла в случае успеха и -1 в случае ошибки.

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

Относится к: Windows 10 — все выпуски
Исходный номер базы знаний: 4055223

Симптомы

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

Причина

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

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

Временное решение

Чтобы обойти эту проблему, настройте размер файла подкачки вручную. Для этого выполните следующие действия:

  1. Нажмите клавишу с логотипом Windows + клавишу паузы/разрыва, чтобы открыть свойства системы.
  2. Выберите «Дополнительные параметры системы», а затем выберите «Настройки» в разделе «Производительность» на вкладке «Дополнительно».
  3. Перейдите на вкладку "Дополнительно", а затем выберите "Изменить" в разделе "Виртуальная память".
  4. Снимите флажок Автоматически управлять размером файла подкачки для всех дисков.
  5. Выберите «Нестандартный размер», а затем задайте значения «Начальный размер» и «Максимальный размер» для файла подкачки. Мы рекомендуем установить начальный размер в 1,5 раза больше объема оперативной памяти в системе.
  6. Нажмите «ОК», чтобы применить настройки, а затем перезапустите систему. Если вы продолжаете получать сообщения об ошибке "недостаточно памяти", увеличьте "начальный размер" файла подкачки.

Статус

Microsoft подтвердила, что это проблема Windows 10.

Подробнее

Если вы столкнулись с этой проблемой при использовании компилятора Microsoft Visual C++ (cl.exe), вы можете увидеть периодически возникающие ошибки сборки, подобные приведенным ниже:

  • Неустранимая ошибка C1076: ограничение компилятора: достигнута внутренняя куча; используйте /Zm, чтобы указать более высокий предел
  • Неустранимая ошибка C1083: невозможно открыть typefile: 'файл': сообщение
  • Неустранимая ошибка C1090: не удалось выполнить вызов API PDB, код ошибки "код": "сообщение"
  • Ошибка компилятора C3859: превышен диапазон виртуальной памяти для PCH; пожалуйста, перекомпилируйте с параметром командной строки '-ZmXXX' или выше

Дополнительную информацию об ошибках компилятора Visual C++ и способах их устранения см. в разделе Проблемы и рекомендации, связанные с предварительно скомпилированным заголовком (PCH).

Файл с отображением памяти содержит содержимое файла в виртуальной памяти. Это сопоставление между файлом и областью памяти позволяет приложению, включая несколько процессов, изменять файл, читая и записывая непосредственно в память. Вы можете использовать управляемый код для доступа к файлам, отображаемым в памяти, так же, как собственные функции Windows обращаются к файлам, отображаемым в памяти, как описано в разделе Управление файлами, отображаемыми в памяти.

Существует два типа отображаемых в память файлов:

Сохраняемые файлы, отображенные в памяти

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

Не сохраняемые файлы с отображением в памяти

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

Процессы, представления и управление памятью

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

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

Несколько представлений также могут потребоваться, если размер файла превышает размер логической памяти приложения, доступной для отображения памяти (2 ГБ на 32-разрядном компьютере).

Существует два типа представлений: представление потокового доступа и представление произвольного доступа. Используйте представления потокового доступа для последовательного доступа к файлу; это рекомендуется для несохраняемых файлов и IPC. Представления с произвольным доступом предпочтительны для работы с постоянными файлами.

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

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

На следующем изображении показаны несколько и перекрывающиеся представления файла с отображением в памяти:

Снимок экрана, на котором показаны представления файла, отображенного в памяти.

Программирование с помощью файлов, отображенных в памяти

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

Библиотеки Java NIO отображают файлы mmap в Windows таким образом, что сопоставленный файл нельзя удалить, пока в куче остается какая-либо ссылка MappedByteBuffer без сбора мусора. Команда JDK утверждает, что это ограничение Windows, но только в том случае, когда файлы передаются через mmap, а не когда они открываются как обычные файлы:

(Очевидно, что если файл удаляется во время mmap'а, то, что именно должно произойти с областью mmap'а, является спорным в мире семантики файлов Windows, хотя это четко определено в Linux.)

Для справки: невозможность удалить файлы, пока они отображены в память (или еще не собраны мусор), создает множество проблем в Java:

Кроме того, операция удаления карты не поддерживается по соображениям безопасности:

@RbMm, мы можем удалить сопоставленный файл с открытием удаления при закрытии (через CreateFile / CloseHandle или NtDeleteFile ). В этом случае файловая система проверяет только MmFlushImageSection(SectionObjectPointer, MmFlushForWrite) вместо MmFlushForDelete . Вероятно, изначально это была ошибка, но теперь это стандарт.

@eryksun - да, вы правы. мы можем удалить файл таким образом, если раздел создается без атрибута SEC_IMAGE

1 Ответ 1

как заметил @eryksun, мы можем удалить сопоставленный файл, если раздел (сопоставление файла) был создан без атрибута SEC_IMAGE двумя способами:

  • открыть файл с флагом FILE_FLAG_DELETE_ON_CLOSE. Файл должен быть удален сразу же после закрытия всех его дескрипторов, включая указанный дескриптор и любые другие открытые или дублированные дескрипторы. или мы можем использовать NtOpenFile или Вызов NtCreateFile с флагом FILE_DELETE_ON_CLOSE .
  • вызовом ZwDeleteFile . действительно внутренний открытый файл NtDeleteFile с флагом FILE_DELETE_ON_CLOSE и специальным внутренним расположением DeleteOnly = TRUE . это делает вызов более эффективным по сравнению с обычным открытым файлом, а затем закрывает его дескриптор.

в коде это выглядит так.

обратите внимание, что вызов DeleteFileW здесь завершается ошибкой со статусом - STATUS_CANNOT_DELETE . я рекомендую вызывать здесь RtlGetLastNtStatus() вместо GetLastError(), потому что win32, отображающий NTSTATUS на код ошибки, не инъективен и часто теряет ценную информацию. скажем, STATUS_CANNOT_DELETE сопоставляется с ERROR_ACCESS_DENIED . но существуют огромные другие коды NTSATUS, которые также отображаются на ERROR_ACCESS_DENIED . ERROR_ACCESS_DENIED не только STATUS_ACCESS_DENIED (реальный доступ запрещен). получил STATUS_CANNOT_DELETE намного информативнее здесь сравнить ERROR_ACCESS_DENIED . RtlGetLastNtStatus имеет точно такую ​​же подпись, что и GetLastError, и экспортируется из ntdll.dll (поэтому включите ntdll.lib или ntdllp.lib)

Файловые объекты, отображаемые в память, ведут себя и как bytearray, и как файловые объекты. Вы можете использовать объекты mmap в большинстве мест, где ожидается использование bytearray; например, вы можете использовать модуль re для поиска в отображенном в памяти файле. Вы также можете изменить один байт, выполнив obj[index] = 97, или изменить подпоследовательность, назначив слайсу: obj[i1:i2] = b'. ' . Вы также можете читать и записывать данные, начиная с текущей позиции в файле, и выполнять функцию seek() по файлу в разные позиции.

Файл с отображением памяти создается конструктором mmap, который отличается в Unix и Windows. В любом случае вы должны указать файловый дескриптор для файла, открытого для обновления. Если вы хотите сопоставить существующий файловый объект Python, используйте его метод fileno(), чтобы получить правильное значение для параметра fileno. В противном случае вы можете открыть файл с помощью функции os.open(), которая напрямую возвращает дескриптор файла (после завершения файл все равно нужно закрыть).

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

Для версий конструктора для Unix и Windows доступ может быть указан как необязательный параметр ключевого слова. access принимает одно из четырех значений: ACCESS_READ , ACCESS_WRITE или ACCESS_COPY для указания памяти только для чтения, сквозной записи или копирования при записи соответственно, или ACCESS_DEFAULT для отсрочки до защиты.доступ можно использовать как в Unix, так и в Windows. Если доступ не указан, Windows mmap возвращает сопоставление со сквозной записью. Начальные значения памяти для всех трех типов доступа берутся из указанного файла. Присвоение карте памяти ACCESS_READ вызывает исключение TypeError. Назначение карты памяти ACCESS_WRITE влияет как на память, так и на базовый файл. Назначение карты памяти ACCESS_COPY влияет на память, но не обновляет базовый файл.

Изменено в версии 3.7: добавлена ​​константа ACCESS_DEFAULT.

Чтобы отобразить анонимную память, в качестве номера файла вместе с длиной следует передать -1.

класс mmap. mmap ( fileno, длина, tagname=None, access=ACCESS_DEFAULT [ , смещение ] ) ¶

(версия для Windows) Сопоставляет байты length из файла, указанного дескриптором файла fileno, и создает объект mmap. Если length больше текущего размера файла, файл расширяется и содержит length байт. Если length равно 0 , максимальная длина карты равна текущему размеру файла, за исключением случая, когда файл пуст, Windows вызывает исключение (вы не можете создать пустое сопоставление в Windows).

tagname, если указано и не None , представляет собой строку, задающую имя тега для сопоставления. Windows позволяет вам иметь много разных сопоставлений с одним и тем же файлом. Если вы указываете имя существующего тега, этот тег открывается, в противном случае создается новый тег с этим именем. Если этот параметр опущен или None , сопоставление создается без имени. Отказ от использования параметра тега поможет обеспечить переносимость вашего кода между Unix и Windows.

смещение может быть указано как неотрицательное целочисленное смещение. Ссылки mmap будут относиться к смещению от начала файла. смещение по умолчанию равно 0. смещение должно быть кратно ALLOCATIONGRANULARITY .

Вызывает событие аудита mmap.__new__ с аргументами номер_файла, длина, доступ, смещение.

класс mmap. mmap ( fileno, длина, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT [ , смещение ] )

(Версия для Unix) Сопоставляет байты length из файла, указанного дескриптором файла fileno, и возвращает объект mmap. Если length равно 0 , максимальная длина карты будет равна текущему размеру файла при вызове mmap.

флаги определяют характер сопоставления. MAP_PRIVATE создает частное сопоставление с копированием при записи, поэтому изменения содержимого объекта mmap будут частными для этого процесса, а MAP_SHARED создает сопоставление, совместно используемое всеми другими процессами, отображающими те же области файла. Значение по умолчанию — MAP_SHARED. В некоторых системах есть дополнительные возможные флаги с полным списком, указанным в константах MAP_*.

prot, если он указан, дает желаемую защиту памяти; два наиболее полезных значения PROT_READ и PROT_WRITE указывают, что страницы могут быть прочитаны или записаны. prot по умолчанию PROT_READ | PROT_WRITE .

access может быть указан вместо flags и prot в качестве необязательного ключевого параметра. Указание обоих флагов, защиты и доступа является ошибкой. См. описание доступа выше, чтобы узнать, как использовать этот параметр.

смещение может быть указано как неотрицательное целочисленное смещение. Ссылки mmap будут относиться к смещению от начала файла. смещение по умолчанию равно 0. смещение должно быть кратно ALLOCATIONGRANULARITY, которое равно PAGESIZE в системах Unix.

Чтобы обеспечить достоверность созданного сопоставления памяти, файл, указанный дескриптором fileno, автоматически синхронизируется внутри с физическим резервным хранилищем в macOS и OpenVMS.

Читайте также: