Condividi tramite


Funzione VirtualAllocExNuma (memoryapi.h)

Riserva, commit o modifica lo stato di un'area di memoria all'interno dello spazio indirizzi virtuale del processo specificato e specifica il nodo NUMA per la memoria fisica.

Sintassi

LPVOID VirtualAllocExNuma(
  [in]           HANDLE hProcess,
  [in, optional] LPVOID lpAddress,
  [in]           SIZE_T dwSize,
  [in]           DWORD  flAllocationType,
  [in]           DWORD  flProtect,
  [in]           DWORD  nndPreferred
);

Parametri

[in] hProcess

Handle di un processo. La funzione alloca la memoria all'interno dello spazio indirizzi virtuale di questo processo.

L'handle deve avere il diritto di accesso PROCESS_VM_OPERATION . Per altre informazioni, vedere Sicurezza dei processi e diritti di accesso.

[in, optional] lpAddress

Puntatore che specifica un indirizzo iniziale desiderato per l'area delle pagine da allocare.

Se si riserva memoria, la funzione arrotonda questo indirizzo fino al multiplo più vicino della granularità di allocazione.

Se si esegue il commit della memoria già riservata, la funzione arrotonda questo indirizzo fino al limite di pagina più vicino. Per determinare le dimensioni di una pagina e la granularità di allocazione nel computer host, usare la funzione GetSystemInfo .

Se lpAddress è NULL, la funzione determina dove allocare l'area.

[in] dwSize

Dimensioni dell'area di memoria da allocare, in byte.

Se lpAddress è NULL, la funzione arrotonda dwSize fino al limite di pagina successivo.

Se lpAddress non è NULL, la funzione alloca tutte le pagine che contengono uno o più byte nell'intervallo compreso tra lpAddress e (lpAddress+dwSize). Ciò significa, ad esempio, che un intervallo a 2 byte che si allontana da un limite di pagina determina l'allocazione di entrambe le pagine da parte della funzione.

[in] flAllocationType

Tipo di allocazione di memoria. Questo parametro deve contenere uno dei valori seguenti.

Valore Significato
MEM_COMMIT
0x00001000
Alloca i costi di memoria (dalle dimensioni complessive della memoria e dei file di paging su disco) per le pagine di memoria riservate specificate. La funzione garantisce inoltre che quando il chiamante accede inizialmente alla memoria, il contenuto sarà zero. Le pagine fisiche effettive non vengono allocate a meno che/fino a quando non si accede effettivamente agli indirizzi virtuali.

Per riservare ed eseguire il commit delle pagine in un unico passaggio, chiamare la funzione con MEM_COMMIT | MEM_RESERVE.

Il tentativo di eseguire il commit di un intervallo di indirizzi specifico specificando MEM_COMMIT senza MEM_RESERVE e un lpAddress non NULL ha esito negativo a meno che l'intero intervallo non sia già stato riservato. Il codice di errore risultante è ERROR_INVALID_ADDRESS.

Un tentativo di eseguire il commit di una pagina già sottoposta a commit non causa l'esito negativo della funzione. Ciò significa che è possibile eseguire il commit delle pagine senza prima determinare lo stato di impegno corrente di ogni pagina.

MEM_RESERVE
0x00002000
Riserva un intervallo dello spazio indirizzi virtuale del processo senza allocare alcuna risorsa di archiviazione fisica effettiva in memoria o nel file di paging su disco.

Per eseguire il commit delle pagine riservate, chiamare di nuovo la funzione con MEM_COMMIT. Per riservare ed eseguire il commit delle pagine in un unico passaggio, chiamare la funzione con MEM_COMMIT | MEM_RESERVE.

Altre funzioni di allocazione della memoria, ad esempio malloc e LocalAlloc, non possono usare la memoria riservata fino a quando non viene rilasciata.

MEM_RESET
0x00080000
Indica che i dati nell'intervallo di memoria specificato da lpAddress e dwSize non sono più di interesse. Le pagine non devono essere lette o scritte nel file di paging. Tuttavia, il blocco di memoria verrà usato di nuovo in un secondo momento, quindi non deve essere decommesso. Questo valore non può essere utilizzato con qualsiasi altro valore.

L'uso di questo valore non garantisce che l'intervallo gestito con MEM_RESET contenga zeri. Se si desidera che l'intervallo contenga zeri, decommettere la memoria e quindi ripetere il commento.

Quando si usa MEM_RESET, la funzione ignora il valore di fProtect. Tuttavia, è comunque necessario impostare fProtect su un valore di protezione valido, ad esempio PAGE_NOACCESS.

La funzione restituisce un errore se si utilizza MEM_RESET e l'intervallo di memoria viene mappato a un file. Una visualizzazione condivisa è accettabile solo se è mappata a un file di paging.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO deve essere chiamato solo su un intervallo di indirizzi a cui MEM_RESET è stato applicato correttamente in precedenza. Indica che i dati nell'intervallo di memoria specificato da lpAddress e dwSize sono di interesse per il chiamante e tentano di invertire gli effetti di MEM_RESET. Se la funzione ha esito positivo, significa che tutti i dati nell'intervallo di indirizzi specificato sono intatti. Se la funzione ha esito negativo, almeno alcuni dei dati nell'intervallo di indirizzi sono stati sostituiti con zere.

Questo valore non può essere utilizzato con qualsiasi altro valore. Se MEM_RESET_UNDO viene chiamato su un intervallo di indirizzi che non è stato MEM_RESET in precedenza, il comportamento non è definito. Quando si specifica MEM_RESET, la funzione VirtualAllocExNuma ignora il valore di flProtect. È tuttavia necessario impostare flProtect su un valore di protezione valido, ad esempio PAGE_NOACCESS.

Windows Server 2008 R2, Windows 7, Windows Server 2008 e Windows Vista: Il flag MEM_RESET_UNDO non è supportato fino a Windows 8 e Windows Server 2012.

 

Questo parametro può anche specificare i valori seguenti, come indicato.

Valore Significato
MEM_LARGE_PAGES
0x20000000
Alloca memoria usando il supporto di pagine di grandi dimensioni.

Le dimensioni e l'allineamento devono essere un multiplo del valore minimo della pagina di grandi dimensioni. Per ottenere questo valore, usare la funzione GetLargePageMinimum .

Se si specifica questo valore, è necessario specificare anche MEM_RESERVE e MEM_COMMIT.

MEM_PHYSICAL
0x00400000
Riserva un intervallo di indirizzi che può essere utilizzato per eseguire il mapping delle pagine AWE ( Address Windowing Extensions ).

Questo valore deve essere usato con MEM_RESERVE e nessun altro valore.

MEM_TOP_DOWN
0x00100000
Alloca la memoria al massimo indirizzo possibile.

[in] flProtect

Protezione della memoria per l'area delle pagine da allocare. Se viene eseguito il commit delle pagine, è possibile specificare una delle costanti di protezione della memoria.

Gli attributi di protezione specificati durante la protezione di una pagina non possono essere in conflitto con quelli specificati durante l'allocazione di una pagina.

[in] nndPreferred

Nodo NUMA in cui deve risiedere la memoria fisica.

Usato solo per l'allocazione di una nuova area di archiviazione (con commit o riservato). In caso contrario, questo parametro viene ignorato quando l'API viene usata per eseguire il commit di pagine in un'area già esistente

Valore restituito

Se la funzione ha esito positivo, il valore restituito è l'indirizzo di base dell'area allocata delle pagine.

Se la funzione ha esito negativo, il valore restituito è NULL. Per informazioni dettagliate sull'errore, chiamare GetLastError.

Commenti

Ogni pagina ha uno stato di pagina associato. La funzione VirtualAllocExNuma può eseguire le operazioni seguenti:

  • Eseguire il commit di un'area di pagine riservate
  • Riservare un'area di pagine gratuite
  • Riservare ed eseguire il commit simultaneo di un'area di pagine gratuite

VirtualAllocExNuma non può riservare una pagina riservata. Può eseguire il commit di una pagina già sottoposta a commit. Ciò significa che è possibile eseguire il commit di un intervallo di pagine, indipendentemente dal fatto che sia già stato eseguito il commit e che la funzione non abbia esito negativo.

È possibile usare VirtualAllocExNuma per riservare un blocco di pagine e quindi effettuare chiamate aggiuntive a VirtualAllocExNuma per eseguire il commit di singole pagine dal blocco riservato. In questo modo, un processo può riservare un intervallo dello spazio di indirizzi virtuale senza usare l'archiviazione fisica fino a quando non è necessario.

Se il parametro lpAddress non è NULL, la funzione usa i parametri lpAddress e dwSize per calcolare l'area delle pagine da allocare. Lo stato corrente dell'intero intervallo di pagine deve essere compatibile con il tipo di allocazione specificato dal parametro flAllocationType . In caso contrario, la funzione ha esito negativo e nessuno delle pagine viene allocato. Questo requisito di compatibilità non impedisce il commit di una pagina già commit; vedere l'elenco precedente.

Poiché VirtualAllocExNuma non alloca pagine fisiche, avrà esito positivo se le pagine sono disponibili in tale nodo o altrove nel sistema. Le pagine fisiche vengono allocate su richiesta. Se il nodo preferito esce da pagine, gestione memoria userà pagine da altri nodi. Se la memoria viene annullata, lo stesso processo viene usato quando viene restituito.

Per eseguire codice generato in modo dinamico, usare VirtualAllocExNuma per allocare memoria e la funzione VirtualProtectEx per concedere l'accesso a PAGE_EXECUTE .

La funzione VirtualAllocExNuma può essere usata per riservare un'area AWE ( Address Windowing Extensions ) all'interno dello spazio indirizzi virtuale di un processo specificato. Questa area di memoria può quindi essere usata per eseguire il mapping di pagine fisiche in e fuori memoria virtuale, come richiesto dall'applicazione. I valori MEM_PHYSICAL e MEM_RESERVE devono essere impostati nel parametro AllocationType . Il valore MEM_COMMIT non deve essere impostato. La protezione della pagina deve essere impostata su PAGE_READWRITE.

La funzione VirtualFreeEx può decommettere una pagina commit, rilasciare l'archiviazione della pagina o rilasciare contemporaneamente una pagina di commit. Può anche rilasciare una pagina riservata, rendendola una pagina gratuita.

Per compilare un'applicazione che usa questa funzione, definire _WIN32_WINNT come 0x0600 o versioni successive.

Esempio

Per un esempio, vedere Allocazione della memoria da un nodo NUMA.

Requisiti

   
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione memoryapi.h (includono Windows.h, Memoryapi.h)
Libreria onecore.lib
DLL Kernel32.dll

Vedere anche

Funzioni di gestione della memoria

Supporto NUMA

Funzioni di memoria virtuale

VirtualAllocEx

VirtualFreeEx

VirtualLock

VirtualProtect

VirtualQuery