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
MEM_COMMIT
0x00001000
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 MEM_COMMIT | MEM_RESERVEauf.

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.

MEM_RESERVE
0x00002000
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 MEM_COMMIT | MEM_RESERVEauf.

Andere Speicherbelegungsfunktionen wie malloc und LocalAlloc können den reservierten Speicher erst verwenden, wenn er freigegeben wurde.

MEM_RESET
0x00080000
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
0x1000000
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
MEM_LARGE_PAGES
0x20000000
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.

MEM_PHYSICAL
0x00400000
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.

MEM_TOP_DOWN
0x00100000
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

Siehe auch

Speicherverwaltungsfunktionen

NUMA-Unterstützung

Funktionen des virtuellen Speichers

VirtualAllocEx

VirtualFreeEx

VirtualLock

VirtualProtect

Virtualquery