Nuevas API de Windows 8.1 para la administración de memoria virtual: `DiscardVirtualMemory ()` vs `VirtualAlloc ()` y `MEM_RESET` y` MEM_RESET_UNDO`

Windows 8.1 / Server 2012RC2 acaba de presentar nuevas API para la administración de memoria virtual:OfferVirtualMemory(), ReclaimVirtualMemory(), DiscardVirtualMemory(), cuyo uso es bastante sencillo, simplemente mirando sus nombres.

Lo que no puedo entender es cómo funcionan estas API contraVirtualAlloc() más las banderasMEM_RESET yMEM_RESET_UNDO, y cuáles son las diferencias sutiles.

Para elOfferVirtualMemory(), MSDN dice que es muy similar aVirtualAlloc()+MEM_RESET, excepto que elimina páginas del conjunto de trabajo y restringe más accesos a las páginas.

Entonces, básicamente restringe los accesos a las páginas, y si quiero acceder a esas páginas nuevamente, debo llamarReclaimVirtualMemory()y está bien, pero no deberíaMEM_RESET también elimina páginas del conjunto de trabajo? No deberiaMEM_RESET actuar como el POSIXMADV_DONTNEED Bandera demadvise(2) que básicamente elimina páginas de las tablas de páginas del proceso, y si accedo a esas páginas nuevamente en el futuro, el acceso generará una falla suave, y esas páginas serán reasignadas nuevamente, inicializadas a cero.

Si esto es cierto, por supuesto, las páginas se eliminan del conjunto de trabajo del proceso, porque básicamente se desasignan, incluso si el proceso mantiene las direcciones virtuales asignadas y las ve "comprometidas".

Ahora veamosDiscardVirtualMemory(): aquí MSDN no dice nada sobreMEM_RESET bandera, pero si leo la descripción de esta API, pareceDe Verdad lo mismo queVirtualAlloc()+MEM_RESET.

Entonces, ¿alguien sabe si hay algunas diferencias entre esas API y cuáles son los casos de uso adecuados de esas diferencias sutiles? SI introdujeron una API nueva comoDiscardVirtualMemory(), debería haber alguna diferencia con el método anterior.

Si quiero portar una aplicación desde POSIX que usamadvise(2) conMADV_DONTNEED yMADV_WILLNEED, ¿cuál es la mejor manera de imitar este comportamiento POSIX? Hasta ahora, solíaVirtualAlloc()+MEM_RESET paraMADV_DONTNEED yVirtualAlloc()+MEM_RESET_UNDO paraMADV_WILLNEED. ¿Está bien o puedo hacerlo mejor con esas nuevas API?