Два представления одного и того же файла с отображенной памятью в Windows, как они взаимодействуют по-разному? - PullRequest
0 голосов
/ 24 февраля 2019

Меня особенно интересует поведение сброса.

Предположим, что мы создали MMF с CreateFileMapping () и открыли два представления, V1 и V2, используя MapViewOfFile () с нулевым смещением.

Затем я записываю что-то в A = V1 + a, а что-то в B = V2 + b, так что A и B принадлежат разным страницам физической памяти.

Затем, если я очищаю весь первый вид, используя FlushViewOfFile (V1,0), будут ли затронуты и грязные страницы второго просмотра?

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

Важно, чтобы сброс небольших записей не вызывал сброс массивных записей.

Это поведение по умолчанию?Если нет, то как этого добиться?

Спасибо

1 Ответ

0 голосов
/ 24 февраля 2019

CreateFileMappingA , см. Также CreateProcess , DuplicateHandle и OpenFileMapping функции.

"Создание объекта сопоставления файловфактически не отображает представление в адресное пространство процесса. Функции MapViewOfFile и MapViewOfFileEx отображают представление файла в адресное пространство процесса.

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

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

Согласно FlushViewOfFile ,

" Очистка диапазона отображенного представления инициирует запись грязных страниц вэтот диапазон на диск.Грязные страницы - это те, чье содержимое изменилось с момента отображения файла.Функция FlushViewOfFile не сбрасывает метаданные файла, и она не ожидает возврата, пока изменения не будут сброшены из основного аппаратного дискового кэша и физически записаны на диск .Чтобы очистить все «грязные» страницы, а также метаданные файла и убедиться, что они физически записаны на диск, вызовите FlushViewOfFile, а затем вызовите функцию FlushFileBuffers . "

Итак, когда вы закрываете представленияв UnmapViewOfFile

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

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

Измененные страницы в не отображенном представлении не записываются на диск, пока их общий ресурс не достигнет нуля или вдругими словами, до тех пор, пока они не будут отображены или удалены из рабочих наборов всех процессов, которые совместно используют страницы .Даже тогда измененные страницы записываются «лениво» на диск;то есть изменения могут быть кэшированы в памяти и записаны на диск позднее.Чтобы минимизировать риск потери данных в случае сбоя питания или сбоя системы, приложения должны явно сбрасывать измененные страницы с помощью функции FlushViewOfFile . "

...