Новые API Windows 8.1 для управления виртуальной памятью: `DiscardVirtualMemory ()` vs `VirtualAlloc ()` и `MEM_RESET` и` MEM_RESET_UNDO`
Windows 8.1 / Server 2012RC2 только что представила новые API для управления виртуальной памятью:OfferVirtualMemory()
, ReclaimVirtualMemory()
, DiscardVirtualMemory()
, что их использование довольно просто, просто посмотрев на их имена.
Я не могу понять, как эти API работают противVirtualAlloc()
плюс флагиMEM_RESET
а такжеMEM_RESET_UNDO
и каковы тонкие различия.
ДляOfferVirtualMemory()
MSDN говорит, что очень похоже наVirtualAlloc()
+MEM_RESET
за исключением того, что он удаляет страницы из рабочего набора и ограничивает дальнейший доступ к страницам.
Итак, в основном это ограничивает доступ к страницам, и если я хочу получить доступ к этим страницам снова, я должен позвонитьReclaimVirtualMemory()
и это нормально, но не должноMEM_RESET
также удаляет страницы из рабочего набора? не должныMEM_RESET
действовать как POSIXMADV_DONTNEED
флагmadvise(2)
который в основном удаляет страницы из таблиц страниц процесса, и если я снова получу доступ к этим страницам в будущем, при доступе будет сгенерирована программная ошибка, и эти страницы будут снова перераспределены, инициализированы на ноль.
Если это так, конечно, страницы удаляются из рабочего набора процесса, потому что они в основном освобождаются, даже если процесс сохраняет выделенные виртуальные адреса и видит их «зафиксированными».
Теперь посмотримDiscardVirtualMemory()
: здесь MSDN ничего не говорит оMEM_RESET
флаг, но если я прочитал описание этого API, кажется,действительно то же самое, чтоVirtualAlloc()
+MEM_RESET
.
Итак, кто-нибудь знает, есть ли какие-то различия между этими API, и каковы правильные варианты использования этих тонких различий? Если они представили совершенно новый API, какDiscardVirtualMemory()
Должна быть некоторая разница со старым методом.
Если я хочу портировать приложение из POSIX, которое используетmadvise(2)
сMADV_DONTNEED
а такжеMADV_WILLNEED
Каков наилучший способ имитировать это поведение POSIX? До сих пор я использовалVirtualAlloc()
+MEM_RESET
заMADV_DONTNEED
а такжеVirtualAlloc()
+MEM_RESET_UNDO
заMADV_WILLNEED
, Это нормально, или я могу лучше работать с этими новыми API?