VirtualAllocExNuma-Funktion (memoryapi.h)
Reserviert, commits oder ändert den Zustand einer Speicherregion im virtuellen Adressraum des angegebenen Prozesses und gibt den NUMA-Knoten für den physischen Arbeitsspeicher an.
Syntax
LPVOID VirtualAllocExNuma(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect,
[in] DWORD nndPreferred
);
Parameter
[in] hProcess
Das Handle für einen Prozess. Die Funktion weist Arbeitsspeicher innerhalb des virtuellen Adressraums dieses Prozesses zu.
Das Handle muss über das zugriffsrecht PROCESS_VM_OPERATION verfügen. Weitere Informationen finden Sie unter Prozesssicherheit und Zugriffsrechte.
[in, optional] lpAddress
Der Zeiger, der eine gewünschte Startadresse für den Bereich der Seiten angibt, die Sie zuordnen möchten.
Wenn Sie Arbeitsspeicher reservieren, rundet die Funktion diese Adresse auf das nächste Vielfache der Zuordnungsgranularität ab.
Wenn Sie bereits reservierten Arbeitsspeicher committen, rundet die Funktion diese Adresse auf die nächste Seitengrenze ab. Verwenden Sie die GetSystemInfo-Funktion , um die Größe einer Seite und die Granularität der Zuordnung auf dem Hostcomputer zu bestimmen.
Wenn lpAddressNULL ist, bestimmt die Funktion, wo die Region zugeordnet werden soll.
[in] dwSize
Die Größe des zu zuweisenden Speicherbereichs in Bytes.
Wenn lpAddressNULL ist, rundet die Funktion dwSize bis zur nächsten Seitengrenze ab.
Wenn lpAddress nicht NULL ist, weist die Funktion alle Seiten zu, die ein oder mehrere Bytes im Bereich von lpAddress bis enthalten (lpAddress+dwSize)
. Dies bedeutet beispielsweise, dass ein 2-Byte-Bereich, der eine Seitengrenze überspannt, dazu führt, dass die Funktion beide Seiten zuordnet.
[in] flAllocationType
Der Typ der Speicherzuordnung. Dieser Parameter muss einen der folgenden Werte enthalten.
Wert | Bedeutung |
---|---|
|
Weist Speichergebühren (aus der Gesamtgröße des Arbeitsspeichers und den Auslagerungsdateien auf dem Datenträger) für die angegebenen reservierten Speicherseiten zu. Die Funktion garantiert auch, dass der Inhalt null ist, wenn der Aufrufer später zunächst auf den Speicher zugreift. Die tatsächlichen physischen Seiten werden erst zugeordnet, wenn/bis auf die virtuellen Adressen tatsächlich zugegriffen wird.
Um Seiten in einem Schritt zu reservieren und zu commiten, rufen Sie die Funktion mit Der Versuch, einen bestimmten Adressbereich zu committen, indem MEM_COMMIT ohne MEM_RESERVE und eine lpAddress ohne NULL angegeben wird, schlägt fehl, es sei denn, der gesamte Bereich wurde bereits reserviert. Der resultierende Fehlercode ist ERROR_INVALID_ADDRESS. Ein Versuch, eine Seite zu committen, die bereits committet wurde, führt nicht dazu, dass die Funktion fehlschlägt. Dies bedeutet, dass Sie Seiten commiten können, ohne zuerst den aktuellen Verpflichtungsstatus jeder Seite zu bestimmen. |
|
Reserviert einen Bereich des virtuellen Adressraums des Prozesses, ohne den tatsächlichen physischen Speicher im Arbeitsspeicher oder in der Auslagerungsdatei auf dem Datenträger zuzuweisen.
Sie committen reservierte Seiten, indem Sie die Funktion mit MEM_COMMIT erneut aufrufen. Um Seiten in einem Schritt zu reservieren und zu commiten, rufen Sie die Funktion mit Andere Speicherbelegungsfunktionen wie malloc und LocalAlloc können den reservierten Speicher erst verwenden, wenn er freigegeben wurde. |
|
Gibt an, dass Daten im von lpAddress und dwSize angegebenen Speicherbereich nicht mehr von Interesse sind. Die Seiten sollten nicht aus der Auslagerungsdatei gelesen oder in diese geschrieben werden. Der Speicherblock wird jedoch später wieder verwendet, sodass er nicht dekommittiert werden sollte. Dieser Wert kann nicht mit anderen Werten verwendet werden.
Die Verwendung dieses Werts garantiert nicht, dass der Bereich, der mit MEM_RESET betrieben wird, Nullen enthält. Wenn der Bereich Nullen enthalten soll, heben Sie den Arbeitsspeicher auf, und legen Sie ihn dann erneut zurück. Wenn Sie MEM_RESET verwenden, ignoriert die Funktion den Wert von fProtect. Sie müssen fProtect jedoch trotzdem auf einen gültigen Schutzwert festlegen, z. B. PAGE_NOACCESS. Die Funktion gibt einen Fehler zurück, wenn Sie MEM_RESET verwenden und der Speicherbereich einer Datei zugeordnet ist. Eine freigegebene Ansicht ist nur akzeptabel, wenn sie einer Auslagerungsdatei zugeordnet ist. |
|
MEM_RESET_UNDO sollte nur für einen Adressbereich aufgerufen werden, auf den MEM_RESET zuvor erfolgreich angewendet wurde. Es gibt an, dass die Daten in dem angegebenen Speicherbereich, der von lpAddress und dwSize angegeben wird, für den Aufrufer von Interesse sind und versucht, die Auswirkungen von MEM_RESET rückgängig zu machen. Wenn die Funktion erfolgreich ist, bedeutet dies, dass alle Daten im angegebenen Adressbereich intakt sind. Wenn die Funktion fehlschlägt, wurden mindestens einige Daten im Adressbereich durch Nullen ersetzt.
Dieser Wert kann nicht mit anderen Werten verwendet werden. Wenn MEM_RESET_UNDO für einen Adressbereich aufgerufen wird, der zuvor nicht MEM_RESET wurde, ist das Verhalten nicht definiert. Wenn Sie MEM_RESET angeben, ignoriert die VirtualAllocExNuma-Funktion den Wert von flProtect. Sie müssen flProtect jedoch trotzdem auf einen gültigen Schutzwert festlegen, z. B. PAGE_NOACCESS. Windows Server 2008 R2, Windows 7, Windows Server 2008 und Windows Vista: Das MEM_RESET_UNDO-Flag wird erst unter Windows 8 und Windows Server 2012 unterstützt. |
Dieser Parameter kann auch die folgenden Werte angeben, wie angegeben.
Wert | Bedeutung |
---|---|
|
Ordnet Arbeitsspeicher mithilfe von Unterstützung für große Seiten zu.
Die Größe und Ausrichtung müssen ein Vielfaches des großformatigen Minimums sein. Verwenden Sie zum Abrufen dieses Werts die GetLargePageMinimum-Funktion . Wenn Sie diesen Wert angeben, müssen Sie auch MEM_RESERVE und MEM_COMMIT angeben. |
|
Reserviert einen Adressbereich, der zum Zuordnen von AWE-Seiten ( Address Windowing Extensions ) verwendet werden kann.
Dieser Wert muss mit MEM_RESERVE und keinem anderen Wert verwendet werden. |
|
Ordnet Arbeitsspeicher an der höchstmöglichen Adresse zu. |
[in] flProtect
Der Speicherschutz für die Region der zuzuordnenden Seiten. Wenn die Seiten committet werden, können Sie eine der Speicherschutzkonstanten angeben.
Schutzattribute, die beim Schutz einer Seite angegeben werden, können nicht mit den beim Zuordnen einer Seite angegebenen in Konflikt geraten.
[in] nndPreferred
Der NUMA-Knoten, auf dem sich der physische Arbeitsspeicher befinden soll.
Wird nur beim Zuweisen einer neuen VA-Region (entweder committ oder reserviert) verwendet. Andernfalls wird dieser Parameter ignoriert, wenn die API zum Commit von Seiten in einer Region verwendet wird, die bereits vorhanden ist.
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert die Basisadresse des zugeordneten Bereichs der Seiten.
Wenn bei der Funktion ein Fehler auftritt, ist der Rückgabewert NULL. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.
Hinweise
Jede Seite hat einen zugeordneten Seitenzustand. Die VirtualAllocExNuma-Funktion kann die folgenden Vorgänge ausführen:
- Commit für eine Region mit reservierten Seiten
- Reservieren einer Region mit kostenlosen Seiten
- Gleichzeitige Reservierung und Commit für eine Region mit kostenlosen Seiten
VirtualAllocExNuma kann keine reservierte Seite reservieren. Es kann eine Seite committen, die bereits committet wurde. Dies bedeutet, dass Sie einen Bereich von Seiten committen können, unabhängig davon, ob sie bereits committet wurden, und die Funktion nicht fehlschlägt.
Sie können VirtualAllocExNuma verwenden, um einen Block von Seiten zu reservieren und dann zusätzliche Aufrufe an VirtualAllocExNuma zu tätigen, um einzelne Seiten aus dem reservierten Block zu commiten. Dadurch kann ein Prozess einen Bereich des virtuellen Adressraums reservieren, ohne physischen Speicher zu verwenden, bis er benötigt wird.
Wenn der lpAddress-Parameter nicht NULL ist, verwendet die Funktion die Parameter lpAddress und dwSize , um den Bereich der zuzuordnenden Seiten zu berechnen. Der aktuelle Zustand des gesamten Seitenbereichs muss mit dem Typ der Zuordnung kompatibel sein, der durch den flAllocationType-Parameter angegeben wird. Andernfalls schlägt die Funktion fehl, und keine der Seiten wird zugeordnet. Diese Kompatibilitätsanforderung schließt das Commit einer bereits committeten Seite nicht aus. Weitere Informationen finden Sie in der obigen Liste.
Da VirtualAllocExNuma keine physischen Seiten zuordnet, ist es erfolgreich, unabhängig davon, ob die Seiten auf diesem Knoten oder an anderer Stelle im System verfügbar sind. Die physischen Seiten werden bei Bedarf zugeordnet. Wenn auf dem bevorzugten Knoten keine Seiten vorhanden sind, verwendet der Speicher-Manager Seiten von anderen Knoten. Wenn der Speicher ausgelagert wird, wird der gleiche Prozess verwendet, wenn er wieder eingeholt wird.
Um dynamisch generierten Code auszuführen, verwenden Sie VirtualAllocExNuma , um Arbeitsspeicher zuzuweisen, und die VirtualProtectEx-Funktion , um PAGE_EXECUTE Zugriff zu gewähren.
Die VirtualAllocExNuma-Funktion kann verwendet werden, um einen AWE-Speicherbereich ( Address Windowing Extensions ) innerhalb des virtuellen Adressraums eines angegebenen Prozesses zu reservieren. Dieser Bereich des Arbeitsspeichers kann dann verwendet werden, um physische Seiten in und aus virtuellem Arbeitsspeicher zuzuordnen, wie von der Anwendung benötigt. Die werte MEM_PHYSICAL und MEM_RESERVE müssen im AllocationType-Parameter festgelegt werden. Der MEM_COMMIT Wert darf nicht festgelegt werden. Der Seitenschutz muss auf PAGE_READWRITE festgelegt werden.
Die VirtualFreeEx-Funktion kann eine committete Seite deaktivieren und den Speicher der Seite freigeben, oder sie kann gleichzeitig die Deaktivierung und Freigabe einer committeten Seite ausführen. Es kann auch eine reservierte Seite freigeben, was sie zu einer kostenlosen Seite macht.
Um eine Anwendung zu kompilieren, die diese Funktion verwendet, definieren Sie _WIN32_WINNT als 0x0600 oder höher.
Beispiele
Ein Beispiel finden Sie unter Zuweisen von Arbeitsspeicher aus einem NUMA-Knoten.
Anforderungen
Unterstützte Mindestversion (Client) | Windows Vista [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2008 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | memoryapi.h (einschließlich Windows.h, Memoryapi.h) |
Bibliothek | onecore.lib |
DLL | Kernel32.dll |