Как я могу вычеркнуть страницу с отображением файла? - PullRequest
2 голосов
/ 19 августа 2010

У меня есть файл с отображенной памятью и страница в представлении, которая в данный момент зафиксирована.Я хотел бы списать это.MapViewOfFile говорит мне, что я не могу использовать VirtualFree на отображаемых файлах страниц.Есть ли другой способ сделать это?

1 Ответ

2 голосов
/ 19 августа 2010

Вы не можете вычеркнуть это, но то, что вы действительно хотите, это не вычеркнуть его ...

Что вы действительно хотите - это освободить страницу из памяти. Это можно сделать с помощью VirtualUnlock. См. Замечания VirtualUnlock :

Вызов VirtualUnlock для диапазона памяти, который не заблокирован, освобождает страницы из рабочего набора процесса.

Примечание: как задокументировано, функция вернет FALSE (страница не была заблокирована), а GetLastError вернет ERROR_NOT_LOCKED.

Это описано в вопрос Гильермо Пранди CreateFileMapping, MapViewOfFile, как избежать удержания системной памяти .

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


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

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

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

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

...