2010-08-19 1 views
1

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

ответ

1

Вы не можете decommit, но то, что вы действительно хотите, не decommitting его ...

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

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

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

Это описано в Guillermo Prandi's question CreateFileMapping, MapViewOfFile, how to avoid holding up the system memory.

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


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

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

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

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

+0

Я выполнил эксперимент, и до сих пор результаты пока не доказаны. Я опишу его непосредственно в ответе. – Suma

Смежные вопросы