Если включить сохранение, файл карты памяти не будет удален после перезагрузки.
вы можете использовать атомный процесс действия с флагом, которые показывают данные верны или нет, если действительные вы можете восстановить остальные данные потеряны
Если ваша поддержка ОС (ядро или срок службы файловой системы), как UNIX вы можете использовать долю память с синхронизация, которая быстрее, чем файл карты
Современные операционные системы 3e (2007) файл карты памяти памяти: Общие библиотеки - это особый случай более общего объекта, называемого файлами с отображением памяти. Идея здесь заключается в том, что процесс может выдавать системный вызов для сопоставления файла на части своего виртуального адресного пространства. В большинстве реализаций страницы не отображаются во время сопоставления, но по мере того, как страницы затрагиваются, они запрашиваются по одному за раз, используя файл диска в качестве хранилища резервных копий. Когда процесс завершается или явно отменяет файл, все измененные страницы записываются обратно в файл. Mapped файлы предоставляют альтернативную модель ввода/вывода. Вместо чтения и записи файл можно получить в виде большого массива символов в памяти. В некоторых ситуациях программисты считают эту модель более удобной. Если два или несколько процессов одновременно отображаются в один и тот же файл, они могут связываться через общую память. Записи, выполняемые одним процессом в общей памяти, сразу видны, когда другой читает часть виртуального адреса, размещенную на карте. Таким образом, этот механизм обеспечивает канал с высокой пропускной способностью между процессами и часто используется как таковой (даже в случае сопоставления файла с царапинами).Теперь должно быть ясно, что если отображаемые в память файлы доступны, разделяемые библиотеки могут использовать этот механизм
В http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2044.html
разделяемой памяти
POSIX определяет объект разделяемой памяти, как «объект, который представляет памяти, которая может отображаться одновременно в адресное пространство более чем одного процесса ». Общая память похожа на сопоставление файлов, и пользователь может отображать несколько областей объекта общей памяти, как и файлы с отображением памяти. В некоторых операционных системах, таких как Windows, разделяемая память является частным случаем сопоставления файлов, где объект сопоставления файлов обращается к памяти, поддерживаемой файлом подкачки системы. Тем не менее, в Windows время жизни этой памяти заканчивается, когда последний процесс, подключенный к объекту разделяемой памяти, закрывает соединение или приложение выходит из строя, поэтому нет сохранения данных. Если приложение создает общую память, заполняет ее данными и выходит, данные теряются. Это время жизни известно как время жизни процесса В операционных системах POSIX время жизни разделяемой памяти различно, поскольку для семафоров, разделяемой памяти и очередей сообщений обязательно, чтобы объект и его состояние (включая данные, если они есть) сохранялись после того, как объект не был более длинный, на который ссылается любой процесс. Сохранение объекта не означает, что состояние объекта сохраняется после сбоя системы или перезагрузки, но это может быть достигнуто, поскольку объекты общей памяти могут быть фактически реализованы как сопоставленные файлы постоянной файловой системы. Уничтожение общей памяти происходит с явным вызовом unlink(), который аналогичен механизму уничтожения файлов. Для общей памяти POSIX требуется время жизни ядра (объект явно уничтожен или он уничтожается при перезагрузке операционной системы) или постоянство файловой системы (объект общей памяти имеет такое же время жизни, что и файл). Эта разница в времени важна для достижения переносимости. Многие переносные среды выполнения пытались добиться идеальной переносимости между Windows и общей памятью POSIX, но автор этой статьи не видел никаких удовлетворительных усилий. Добавление счетчика ссылок в общую память POSIX эффективно только до тех пор, пока процесс не сбой, что-то, что очень обычное явление. Эмуляция поведения POSIX в Windows с использованием собственной разделяемой памяти невозможна, поскольку мы можем попытаться сбросить общую память в файл, чтобы получить постоянство, но сбой процесса позволит избежать настойчивости. Единственная жизнеспособная альтернатива - использовать файлы с отображением памяти в Windows, имитирующие разделяемую память, но избегая, насколько это возможно, синхронизации с файловой памятью. Многие другие названные примитивы синхронизации (такие как именованные мьютексы или семафоры) страдают от одной и той же проблемы переносимости жизни. Автоматическая очистка общей памяти полезна во многих контекстах, таких как общие библиотеки или библиотеки DLL, которые взаимодействуют с другими DLL-файлами или процессами. Даже когда происходит сбой, ресурсы автоматически очищаются операционными системами. Персистентность POSIX также полезна, когда программа запуска может создавать и заполнять общую память, которую другой процесс может читать или изменять. Стойкость также позволяет восстановить данные, если происходит сбой сервера. Все данные все еще находятся в общей памяти, и сервер может восстановить свое состояние. В этом документе предлагается срок службы POSIX (время жизни ядра или файловой системы) в качестве более портативного решения, но не имеет сильного мнения об этом. Комитет C++ должен учитывать варианты использования обоих подходов для определения того, какое поведение лучше или если оба варианта должны быть доступны, что приводит к модификации систем POSIX и Windows.
BTW, применим ли это к Windows? :( –
@ MatíasFidemraizer я не тестировал его на окне, но он, похоже, работает, я видел DB, который использует файл карты памяти для стабильной базы данных, как MongoDB –
Да, я знаю, что Mongo использует MMP, кстати, кто знает, как он себя ведет в Windows: \ –