Новые 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?

Ответы на вопрос(1)

Ваш ответ на вопрос