Novas APIs do Windows 8.1 para gerenciamento de memória virtual: `DiscardVirtualMemory ()` vs `VirtualAlloc ()` e `MEM_RESET` e` MEM_RESET_UNDO`

O Windows 8.1 / Server 2012RC2 acaba de introduzir novas APIs para gerenciamento de memória virtual:OfferVirtualMemory(), ReclaimVirtualMemory(), DiscardVirtualMemory(), cujo uso é bastante simples, apenas olhando seus nomes.

O que não consigo entender é como essas APIs funcionam contraVirtualAlloc() mais as bandeirasMEM_RESET eMEM_RESET_UNDOe quais são as diferenças sutis.

Para oOfferVirtualMemory(), O MSDN diz que é muito semelhante aoVirtualAlloc()+MEM_RESET, exceto pelo fato de remover as páginas do conjunto de trabalho e restringir outros acessos às páginas.

Então, basicamente, restringe o acesso às páginas e, se eu quiser acessar essas páginas novamente, devo chamarReclaimVirtualMemory(), e tudo bem, mas não deveriaMEM_RESET também remove páginas do conjunto de trabalho? Não deveriaMEM_RESET agir como o POSIXMADV_DONTNEED bandeira demadvise(2) que basicamente remove as páginas das tabelas de páginas do processo e, se eu acessar essas páginas novamente no futuro, o acesso gerará uma falha suave e essas páginas serão realocadas novamente, inicializadas como zero.

Se isso for verdade, é claro que as páginas são removidas do conjunto de trabalho do processo, porque basicamente são desalocadas, mesmo que o processo mantenha os endereços virtuais alocados e os veja "comprometidos".

Agora vamos verDiscardVirtualMemory(): aqui MSDN não diz nada sobreMEM_RESET sinalizador, mas se eu ler a descrição dessa API, parecerealmente a mesma coisa queVirtualAlloc()+MEM_RESET.

Então, alguém sabe se existem algumas diferenças entre essas APIs e quais são os casos de uso adequados dessas diferenças sutis? Se eles introduziram uma API completamente nova comoDiscardVirtualMemory(), deve haver alguma diferença com o método antigo.

Se eu quiser portar um aplicativo do POSIX que usemadvise(2) comMADV_DONTNEED eMADV_WILLNEED, qual é a melhor maneira de imitar esse comportamento POSIX? Até agora eu costumavaVirtualAlloc()+MEM_RESET paraMADV_DONTNEED eVirtualAlloc()+MEM_RESET_UNDO paraMADV_WILLNEED. Tudo bem, ou posso fazer melhor com essas novas APIs?

questionAnswers(1)

yourAnswerToTheQuestion