Neue Windows 8.1-APIs für die Verwaltung des virtuellen Speichers: `DiscardVirtualMemory ()` vs. `VirtualAlloc ()` und `MEM_RESET` und` MEM_RESET_UNDO`

Windows 8.1 / Server 2012RC2 hat gerade neue APIs für die Verwaltung des virtuellen Speichers eingeführt:OfferVirtualMemory(), ReclaimVirtualMemory(), DiscardVirtualMemory(), was ihre Verwendung ziemlich einfach ist, wenn man sich nur ihre Namen ansieht.

Das, was ich nicht bekommen kann, ist, wie diese APIs gegen @ arbeitVirtualAlloc() plus die FahnenMEM_RESET undMEM_RESET_UNDO, und was sind die subtilen Unterschiede.

Für dieOfferVirtualMemory(), MSDN sagt, dass @ sehr ähnlich iVirtualAlloc()+MEM_RESET, mit der Ausnahme, dass Seiten aus dem Arbeitssatz entfernt und weitere Zugriffe auf die Seiten eingeschränkt werden.

Also, im Grunde beschränkt es den Zugriff auf die Seiten, und wenn ich wieder auf diese Seiten zugreifen möchte, muss ich @ aufrufReclaimVirtualMemory(), und das ist in Ordnung, sollte aber nichtMEM_RESET entfernt auch Seiten aus dem Arbeitssatz? Sollte nichtMEM_RESET als POSIX fungierenMADV_DONTNEED Flagge vonmadvise(2), das im Grunde genommen Seiten aus den Seitentabellen des Prozesses entfernt. Wenn ich in Zukunft erneut auf diese Seiten zugreife, wird durch den Zugriff ein weicher Fehler generiert, und diese Seiten werden erneut zugeordnet und auf Null initialisiert.

Wenn dies zutrifft, werden Seiten natürlich aus dem Arbeitssatz des Prozesses entfernt, da sie grundsätzlich freigegeben werden, auch wenn der Prozess die zugewiesenen virtuellen Adressen beibehält und sie als "festgeschrieben" ansieht.

Now, mal sehenDiscardVirtualMemory(): hier sagt MSDN nichts überMEM_RESET flag, aber wenn ich die Beschreibung dieser API lese, scheint esJa wirklic das gleiche wieVirtualAlloc()+MEM_RESET.

Also, weiß jemand, ob es Unterschiede zwischen diesen APIs gibt, und was sind die richtigen Anwendungsfälle für diese subtilen Unterschiede? WENN sie eine komplett neue API wie @ eingeführt habDiscardVirtualMemory(), es sollte einen Unterschied zur alten Methode geben.

Wenn ich eine Anwendung von POSIX portieren möchte, die @ verwendmadvise(2) mitMADV_DONTNEED undMADV_WILLNEED, wie lässt sich dieses POSIX-Verhalten am besten nachahmen? Bisher habe ich @ verwendVirtualAlloc()+MEM_RESET zumMADV_DONTNEED undVirtualAlloc()+MEM_RESET_UNDO zumMADV_WILLNEED. Ist das in Ordnung, oder kann ich mit diesen neuen APIs besser umgehen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage