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_UNDO
e 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?