Два представления одного и того же файла с отображением памяти в Windows, как они взаимодействуют друг с другом?

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

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

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

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

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

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

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

Спасибо


person Sergey S.    schedule 24.02.2019    source источник


Ответы (1)


CreateFileMappingA, см. также CreateProcess, DuplicateHandle и OpenFileMapping.

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

Согласно FlushViewOfFile,

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

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

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

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

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

person Artur Mustafin    schedule 24.02.2019
comment
Спасибо, Артур, но это не ответ на вопрос. Я знаю, что взгляды согласуются, но это не связано с поведением смывания. - person Sergey S.; 24.02.2019