Função VirtualAllocExNuma (memoryapi.h)

Reserva, confirma ou altera o estado de uma região de memória dentro do espaço de endereço virtual do processo especificado e especifica o nó NUMA para a memória física.

Sintaxe

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

Parâmetros

[in] hProcess

O identificador de um processo. A função aloca memória dentro do espaço de endereço virtual desse processo.

O identificador deve ter o direito de acesso PROCESS_VM_OPERATION . Para obter mais informações, consulte Direitos de acesso e segurança do processo.

[in, optional] lpAddress

O ponteiro que especifica um endereço inicial desejado para a região das páginas que você deseja alocar.

Se você estiver reservando memória, a função arredonda esse endereço para baixo até o múltiplo mais próximo da granularidade de alocação.

Se você estiver confirmando a memória que já está reservada, a função arredonda esse endereço para baixo até o limite de página mais próximo. Para determinar o tamanho de uma página e a granularidade de alocação no computador host, use a função GetSystemInfo .

Se lpAddress for NULL, a função determinará onde alocar a região.

[in] dwSize

O tamanho da região da memória a ser alocada, em bytes.

Se lpAddress for NULL, a função arredonda dwSize até o limite da próxima página.

Se lpAddress não for NULL, a função alocará todas as páginas que contêm um ou mais bytes no intervalo de lpAddress a (lpAddress+dwSize). Isso significa, por exemplo, que um intervalo de 2 bytes que atravessa um limite de página faz com que a função aloque ambas as páginas.

[in] flAllocationType

O tipo de alocação de memória. Esse parâmetro deve conter um dos valores a seguir.

Valor Significado
MEM_COMMIT
0x00001000
Aloca encargos de memória (do tamanho geral da memória e dos arquivos de paginação no disco) para as páginas de memória reservada especificadas. A função também garante que, quando o chamador acessar inicialmente a memória, o conteúdo será zero. As páginas físicas reais não são alocadas, a menos que/até que os endereços virtuais sejam realmente acessados.

Para reservar e confirmar páginas em uma etapa, chame a função com MEM_COMMIT | MEM_RESERVE.

Tentar confirmar um intervalo de endereços específico especificando MEM_COMMIT sem MEM_RESERVE e um lpAddress não NULL falhará, a menos que todo o intervalo já tenha sido reservado. O código de erro resultante é ERROR_INVALID_ADDRESS.

Uma tentativa de confirmar uma página que já está confirmada não faz com que a função falhe. Isso significa que você pode confirmar páginas sem primeiro determinar o estado de compromisso atual de cada página.

MEM_RESERVE
0x00002000
Reserva um intervalo do espaço de endereço virtual do processo sem alocar nenhum armazenamento físico real na memória ou no arquivo de paginação no disco.

Você confirma páginas reservadas chamando a função novamente com MEM_COMMIT. Para reservar e confirmar páginas em uma etapa, chame a função com MEM_COMMIT | MEM_RESERVE.

Outras funções de alocação de memória, como malloc e LocalAlloc, não podem usar memória reservada até que ela seja liberada.

MEM_RESET
0x00080000
Indica que os dados no intervalo de memória especificado por lpAddress e dwSize não são mais de interesse. As páginas não devem ser lidas ou gravadas no arquivo de paginação. No entanto, o bloco de memória será usado novamente mais tarde, portanto, ele não deve ser descompactado. Esse valor não pode ser usado com nenhum outro valor.

O uso desse valor não garante que o intervalo operado com MEM_RESET conterá zeros. Se você quiser que o intervalo contenha zeros, descomita a memória e, em seguida, recompacione-a.

Quando você usa MEM_RESET, a função ignora o valor de fProtect. No entanto, você ainda deve definir fProtect como um valor de proteção válido, como PAGE_NOACCESS.

A função retornará um erro se você usar MEM_RESET e o intervalo de memória for mapeado para um arquivo. Uma exibição compartilhada só será aceitável se ela for mapeada para um arquivo de paginação.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO só deve ser chamado em um intervalo de endereços ao qual MEM_RESET foi aplicado com êxito anteriormente. Indica que os dados no intervalo de memória especificado por lpAddress e dwSize são de interesse do chamador e tenta reverter os efeitos de MEM_RESET. Se a função for bem-sucedida, isso significa que todos os dados no intervalo de endereços especificado estão intactos. Se a função falhar, pelo menos alguns dos dados no intervalo de endereços serão substituídos por zeros.

Esse valor não pode ser usado com nenhum outro valor. Se MEM_RESET_UNDO for chamado em um intervalo de endereços que não foi MEM_RESET anteriormente, o comportamento será indefinido. Quando você especifica MEM_RESET, a função VirtualAllocExNuma ignora o valor de flProtect. No entanto, você ainda deve definir flProtect como um valor de proteção válido, como PAGE_NOACCESS.

Windows Server 2008 R2, Windows 7, Windows Server 2008 e Windows Vista: O sinalizador MEM_RESET_UNDO não tem suporte até o Windows 8 e o Windows Server 2012.

 

Esse parâmetro também pode especificar os valores a seguir, conforme indicado.

Valor Significado
MEM_LARGE_PAGES
0x20000000
Aloca memória usando suporte de página grande.

O tamanho e o alinhamento devem ser um múltiplo do mínimo de página grande. Para obter esse valor, use a função GetLargePageMinimum .

Se você especificar esse valor, também deverá especificar MEM_RESERVE e MEM_COMMIT.

MEM_PHYSICAL
0x00400000
Reserva um intervalo de endereços que pode ser usado para mapear páginas do AWE ( Address Windowing Extensions ).

Esse valor deve ser usado com MEM_RESERVE e nenhum outro valor.

MEM_TOP_DOWN
0x00100000
Aloca memória no endereço mais alto possível.

[in] flProtect

A proteção de memória para a região das páginas a serem alocadas. Se as páginas estiverem sendo confirmadas, você poderá especificar qualquer uma das constantes de proteção de memória.

Atributos de proteção especificados ao proteger uma página não podem entrar em conflito com aqueles especificados ao alocar uma página.

[in] nndPreferred

O nó NUMA no qual a memória física deve residir.

Usado somente ao alocar uma nova região de VA (confirmada ou reservada). Caso contrário, esse parâmetro será ignorado quando a API for usada para confirmar páginas em uma região que já existe

Valor retornado

Se a função for bem-sucedida, o valor retornado será o endereço base da região alocada de páginas.

Se a função falhar, o valor retornado será NULL. Para obter informações de erro estendidas, chame GetLastError.

Comentários

Cada página tem um estado de página associado. A função VirtualAllocExNuma pode executar as seguintes operações:

  • Confirmar uma região de páginas reservadas
  • Reservar uma região de páginas gratuitas
  • Reservar e confirmar simultaneamente uma região de páginas gratuitas

VirtualAllocExNuma não pode reservar uma página reservada. Ele pode confirmar uma página que já está confirmada. Isso significa que você pode confirmar um intervalo de páginas, independentemente de elas já terem sido confirmadas e a função não falhará.

Você pode usar VirtualAllocExNuma para reservar um bloco de páginas e, em seguida, fazer chamadas adicionais para VirtualAllocExNuma para confirmar páginas individuais do bloco reservado. Isso permite que um processo reserve um intervalo de seu espaço de endereço virtual sem consumir armazenamento físico até que seja necessário.

Se o parâmetro lpAddress não for NULL, a função usará os parâmetros lpAddress e dwSize para calcular a região das páginas a serem alocadas. O estado atual de todo o intervalo de páginas deve ser compatível com o tipo de alocação especificado pelo parâmetro flAllocationType . Caso contrário, a função falhará e nenhuma das páginas será alocada. Esse requisito de compatibilidade não impede a confirmação de uma página já confirmada; consulte a lista anterior.

Como VirtualAllocExNuma não aloca nenhuma página física, ele terá êxito se as páginas estiverem disponíveis ou não nesse nó ou em outro lugar do sistema. As páginas físicas são alocadas sob demanda. Se o nó preferencial ficar sem páginas, o gerenciador de memória usará páginas de outros nós. Se a memória for paginada, o mesmo processo será usado quando ela for trazida de volta.

Para executar o código gerado dinamicamente, use VirtualAllocExNuma para alocar memória e a função VirtualProtectEx para conceder acesso PAGE_EXECUTE .

A função VirtualAllocExNuma pode ser usada para reservar uma região de memória AWE ( Extensões de Janela de Endereço ) dentro do espaço de endereço virtual de um processo especificado. Essa região de memória pode ser usada para mapear páginas físicas para dentro e para fora da memória virtual, conforme exigido pelo aplicativo. Os valores MEM_PHYSICAL e MEM_RESERVE devem ser definidos no parâmetro AllocationType . O valor MEM_COMMIT não deve ser definido. A proteção de página deve ser definida como PAGE_READWRITE.

A função VirtualFreeEx pode descompromissar uma página confirmada, liberar o armazenamento da página ou descompromissar simultaneamente e liberar uma página confirmada. Ele também pode liberar uma página reservada, tornando-a uma página gratuita.

Para compilar um aplicativo que usa essa função, defina _WIN32_WINNT como 0x0600 ou posterior.

Exemplos

Para obter um exemplo, consulte Alocando memória de um nó NUMA.

Requisitos

   
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho memoryapi.h (inclua Windows.h, Memoryapi.h)
Biblioteca onecore.lib
DLL Kernel32.dll

Confira também

Funções de gerenciamento da memória

Suporte ao NUMA

Funções de memória virtual

VirtualAllocEx

Virtualfreeex

VirtualLock

Virtualprotect

Virtualquery