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?