VirtualAllocExNuma 함수(memoryapi.h)

지정된 프로세스의 가상 주소 공간 내에서 메모리 영역의 상태를 예약, 커밋 또는 변경하고 실제 메모리에 대한 NUMA 노드를 지정합니다.

구문

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

매개 변수

[in] hProcess

프로세스에 대한 핸들입니다. 함수는 이 프로세스의 가상 주소 공간 내에서 메모리를 할당합니다.

핸들에 PROCESS_VM_OPERATION 액세스 권한이 있어야 합니다. 자세한 내용은 프로세스 보안 및 액세스 권한을 참조하세요.

[in, optional] lpAddress

할당하려는 페이지 영역에 대해 원하는 시작 주소를 지정하는 포인터입니다.

메모리를 예약하는 경우 함수는 이 주소를 할당 세분성의 가장 가까운 배수로 내림합니다.

이미 예약된 메모리를 커밋하는 경우 함수는 이 주소를 가장 가까운 페이지 경계로 내림합니다. 호스트 컴퓨터에서 페이지의 크기와 할당 세분성을 확인하려면 GetSystemInfo 함수를 사용합니다.

lpAddressNULL인 경우 함수는 지역을 할당할 위치를 결정합니다.

[in] dwSize

할당할 메모리 영역의 크기(바이트)입니다.

lpAddressNULL인 경우 함수는 dwSize를 다음 페이지 경계까지 반올림합니다.

lpAddressNULL이 아닌 경우 함수는 lpAddress(lpAddress+dwSize)에서 까지 범위에서 하나 이상의 바이트를 포함하는 모든 페이지를 할당합니다. 예를 들어 페이지 경계를 가로지르는 2 바이트 범위는 함수가 두 페이지를 모두 할당하도록 합니다.

[in] flAllocationType

메모리 할당 유형입니다. 이 매개 변수는 다음 값 중 하나를 포함해야 합니다.

의미
MEM_COMMIT
0x00001000
지정된 예약된 메모리 페이지에 대한 메모리 요금(전체 메모리 크기 및 디스크의 페이징 파일)을 할당합니다. 또한 함수는 호출자가 나중에 처음에 메모리에 액세스할 때 콘텐츠가 0이 되도록 보장합니다. 실제 실제 페이지는 가상 주소에 실제로 액세스하지 않는 한 할당되지 않습니다.

한 단계에서 페이지를 예약하고 커밋하려면 를 사용하여 함수 MEM_COMMIT | MEM_RESERVE를 호출합니다.

MEM_RESERVE 없이MEM_COMMIT 지정하여 특정 주소 범위를 커밋하려고 시도하면 전체 범위가 이미 예약되지 않은 한 NULL이 아닌 lpAddress가 실패합니다. 결과 오류 코드가 ERROR_INVALID_ADDRESS.

이미 커밋된 페이지를 커밋하려고 하면 함수가 실패하지 않습니다. 즉, 각 페이지의 현재 약정 상태를 먼저 결정하지 않고도 페이지를 커밋할 수 있습니다.

MEM_RESERVE
0x00002000
메모리 또는 디스크의 페이징 파일에 실제 실제 스토리지를 할당하지 않고 프로세스의 가상 주소 공간 범위를 예약합니다.

MEM_COMMIT 사용하여 함수를 다시 호출하여 예약된 페이지를 커밋합니다. 한 단계에서 페이지를 예약하고 커밋하려면 를 사용하여 함수 MEM_COMMIT | MEM_RESERVE를 호출합니다.

mallocLocalAlloc과 같은 다른 메모리 할당 함수는 릴리스될 때까지 예약된 메모리를 사용할 수 없습니다.

MEM_RESET
0x00080000
lpAddressdwSize로 지정된 메모리 범위의 데이터가 더 이상 관심이 없음을 나타냅니다. 페이지를 페이징 파일에서 읽거나 쓸 수 없습니다. 그러나 메모리 블록은 나중에 다시 사용되므로 커밋 해제하면 안 됩니다. 이 값은 다른 값과 함께 사용할 수 없습니다.

이 값을 사용하면 MEM_RESET 함께 작동하는 범위에 0이 포함되지 않습니다. 범위에 0이 포함되도록 하려면 메모리 커밋을 해제한 다음 다시 커밋합니다.

MEM_RESET 사용하면 함수는 fProtect 값을 무시합니다. 그러나 여전히 fProtectPAGE_NOACCESS 같은 유효한 보호 값으로 설정해야 합니다.

함수는 MEM_RESET 사용하고 메모리 범위가 파일에 매핑되는 경우 오류를 반환합니다. 공유 보기는 페이징 파일에 매핑된 경우에만 허용됩니다.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO MEM_RESET 이전에 성공적으로 적용된 주소 범위에서만 호출해야 합니다. lpAddressdwSize로 지정된 지정된 메모리 범위의 데이터가 호출자에게 관심을 가지며 MEM_RESET 효과를 되돌리려고 시도한다는 것을 나타냅니다. 함수가 성공하면 지정된 주소 범위의 모든 데이터가 그대로 유지됩니다. 함수가 실패하면 주소 범위의 데이터 중 적어도 일부가 0으로 대체됩니다.

이 값은 다른 값과 함께 사용할 수 없습니다. 이전에 MEM_RESET 않은 주소 범위에서 MEM_RESET_UNDO 호출되면 동작이 정의되지 않습니다. MEM_RESET 지정하면 VirtualAllocExNuma 함수는 flProtect 값을 무시합니다. 그러나 여전히 flProtectPAGE_NOACCESS 같은 유효한 보호 값으로 설정해야 합니다.

Windows Server 2008 R2, Windows 7, Windows Server 2008 및 Windows Vista: MEM_RESET_UNDO 플래그는 Windows 8 및 Windows Server 2012까지 지원되지 않습니다.

 

이 매개 변수는 표시된 대로 다음 값을 지정할 수도 있습니다.

의미
MEM_LARGE_PAGES
0x20000000
큰 페이지 지원을 사용하여 메모리를 할당합니다.

크기 및 맞춤은 큰 페이지 최소값의 배수여야 합니다. 이 값을 가져오려면 GetLargePageMinimum 함수를 사용합니다.

이 값을 지정하는 경우 MEM_RESERVEMEM_COMMIT 지정해야 합니다.

MEM_PHYSICAL
0x00400000
AWE( 주소 창 확장 ) 페이지를 매핑하는 데 사용할 수 있는 주소 범위를 예약합니다.

이 값은 다른 값이 아닌 MEM_RESERVE 사용해야 합니다.

MEM_TOP_DOWN
0x00100000
가능한 가장 높은 주소로 메모리를 할당합니다.

[in] flProtect

할당할 페이지 영역에 대한 메모리 보호입니다. 페이지가 커밋되는 경우 메모리 보호 상수 중 하나를 지정할 수 있습니다.

페이지를 보호할 때 지정된 보호 특성은 페이지를 할당할 때 지정된 특성과 충돌할 수 없습니다.

[in] nndPreferred

실제 메모리가 상주해야 하는 NUMA 노드입니다.

새 VA 지역을 할당할 때만 사용됩니다(커밋되거나 예약됨). 그렇지 않으면 API를 사용하여 이미 존재하는 지역의 페이지를 커밋할 때 이 매개 변수가 무시됩니다.

반환 값

함수가 성공하면 반환 값은 할당된 페이지 영역의 기본 주소입니다.

함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

설명

각 페이지에는 연결된 페이지 상태가 있습니다. VirtualAllocExNuma 함수는 다음 작업을 수행할 수 있습니다.

  • 예약된 페이지의 영역 커밋
  • 무료 페이지 영역 예약
  • 무료 페이지 영역을 동시에 예약 및 커밋

VirtualAllocExNuma 는 예약된 페이지를 예약할 수 없습니다. 이미 커밋된 페이지를 커밋할 수 있습니다. 즉, 이미 커밋되었는지 여부에 관계없이 다양한 페이지를 커밋할 수 있으며 함수는 실패하지 않습니다.

VirtualAllocExNuma를 사용하여 페이지 블록을 예약한 다음 VirtualAllocExNuma를 추가로 호출하여 예약된 블록에서 개별 페이지를 커밋할 수 있습니다. 이렇게 하면 프로세스가 필요할 때까지 실제 스토리지를 사용하지 않고도 해당 가상 주소 공간의 범위를 예약할 수 있습니다.

lpAddress 매개 변수가 NULL이 아닌 경우 함수는 lpAddressdwSize 매개 변수를 사용하여 할당할 페이지 영역을 계산합니다. 전체 페이지 범위의 현재 상태는 flAllocationType 매개 변수에 지정된 할당 유형과 호환되어야 합니다. 그렇지 않으면 함수가 실패하고 페이지가 할당되지 않습니다. 이 호환성 요구 사항은 이미 커밋된 페이지를 커밋하는 것을 배제하지 않습니다. 위의 목록을 참조하세요.

VirtualAllocExNuma는 물리적 페이지를 할당하지 않으므로 해당 노드 또는 시스템의 다른 위치에서 페이지를 사용할 수 있는지 여부에 관계없이 성공합니다. 물리적 페이지는 요청 시 할당됩니다. 기본 설정 노드에 페이지가 부족하면 메모리 관리자는 다른 노드의 페이지를 사용합니다. 메모리가 페이징되면 메모리를 다시 가져올 때 동일한 프로세스가 사용됩니다.

동적으로 생성된 코드를 실행하려면 VirtualAllocExNuma 를 사용하여 메모리를 할당하고 VirtualProtectEx 함수를 사용하여 PAGE_EXECUTE 액세스 권한을 부여합니다.

VirtualAllocExNuma 함수를 사용하여 지정된 프로세스의 가상 주소 공간 내에서 AWE(주소 창 확장) 메모리 영역을 예약할 수 있습니다. 그런 다음 이 메모리 영역을 사용하여 애플리케이션에 필요한 대로 실제 페이지를 가상 메모리 내부 및 외부에 매핑할 수 있습니다. MEM_PHYSICALMEM_RESERVE 값은 AllocationType 매개 변수에서 설정해야 합니다. MEM_COMMIT 값을 설정하면 안 됩니다. 페이지 보호는 PAGE_READWRITE 설정해야 합니다.

VirtualFreeEx 함수는 커밋된 페이지를 커밋 해제하거나, 페이지의 스토리지를 해제하거나, 커밋된 페이지를 동시에 커밋 해제하고 해제할 수 있습니다. 또한 예약된 페이지를 해제하여 무료 페이지로 만들 수도 있습니다.

이 함수를 사용하는 애플리케이션을 컴파일하려면 _WIN32_WINNT 0x0600 이상으로 정의합니다.

예제

예제는 NUMA 노드에서 메모리 할당을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 memoryapi.h(Windows.h, Memoryapi.h 포함)
라이브러리 onecore.lib
DLL Kernel32.dll

참고 항목

메모리 관리 함수

NUMA 지원

가상 메모리 함수

VirtualAllocEx

VirtualFreeEx

VirtualLock

VirtualProtect

Virtualquery