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 함수를 사용합니다.
lpAddress가 NULL인 경우 함수는 지역을 할당할 위치를 결정합니다.
[in] dwSize
할당할 메모리 영역의 크기(바이트)입니다.
lpAddress가 NULL인 경우 함수는 dwSize를 다음 페이지 경계까지 반올림합니다.
lpAddress가 NULL이 아닌 경우 함수는 lpAddress(lpAddress+dwSize)
에서 까지 범위에서 하나 이상의 바이트를 포함하는 모든 페이지를 할당합니다. 예를 들어 페이지 경계를 가로지르는 2 바이트 범위는 함수가 두 페이지를 모두 할당하도록 합니다.
[in] flAllocationType
메모리 할당 유형입니다. 이 매개 변수는 다음 값 중 하나를 포함해야 합니다.
값 | 의미 |
---|---|
|
지정된 예약된 메모리 페이지에 대한 메모리 요금(전체 메모리 크기 및 디스크의 페이징 파일)을 할당합니다. 또한 함수는 호출자가 나중에 처음에 메모리에 액세스할 때 콘텐츠가 0이 되도록 보장합니다. 실제 실제 페이지는 가상 주소에 실제로 액세스하지 않는 한 할당되지 않습니다.
한 단계에서 페이지를 예약하고 커밋하려면 를 사용하여 함수 MEM_RESERVE 없이MEM_COMMIT 지정하여 특정 주소 범위를 커밋하려고 시도하면 전체 범위가 이미 예약되지 않은 한 NULL이 아닌 lpAddress가 실패합니다. 결과 오류 코드가 ERROR_INVALID_ADDRESS. 이미 커밋된 페이지를 커밋하려고 하면 함수가 실패하지 않습니다. 즉, 각 페이지의 현재 약정 상태를 먼저 결정하지 않고도 페이지를 커밋할 수 있습니다. |
|
메모리 또는 디스크의 페이징 파일에 실제 실제 스토리지를 할당하지 않고 프로세스의 가상 주소 공간 범위를 예약합니다.
MEM_COMMIT 사용하여 함수를 다시 호출하여 예약된 페이지를 커밋합니다. 한 단계에서 페이지를 예약하고 커밋하려면 를 사용하여 함수 malloc 및 LocalAlloc과 같은 다른 메모리 할당 함수는 릴리스될 때까지 예약된 메모리를 사용할 수 없습니다. |
|
lpAddress 및 dwSize로 지정된 메모리 범위의 데이터가 더 이상 관심이 없음을 나타냅니다. 페이지를 페이징 파일에서 읽거나 쓸 수 없습니다. 그러나 메모리 블록은 나중에 다시 사용되므로 커밋 해제하면 안 됩니다. 이 값은 다른 값과 함께 사용할 수 없습니다.
이 값을 사용하면 MEM_RESET 함께 작동하는 범위에 0이 포함되지 않습니다. 범위에 0이 포함되도록 하려면 메모리 커밋을 해제한 다음 다시 커밋합니다. MEM_RESET 사용하면 함수는 fProtect 값을 무시합니다. 그러나 여전히 fProtect 를 PAGE_NOACCESS 같은 유효한 보호 값으로 설정해야 합니다. 함수는 MEM_RESET 사용하고 메모리 범위가 파일에 매핑되는 경우 오류를 반환합니다. 공유 보기는 페이징 파일에 매핑된 경우에만 허용됩니다. |
|
MEM_RESET_UNDO MEM_RESET 이전에 성공적으로 적용된 주소 범위에서만 호출해야 합니다. lpAddress 및 dwSize로 지정된 지정된 메모리 범위의 데이터가 호출자에게 관심을 가지며 MEM_RESET 효과를 되돌리려고 시도한다는 것을 나타냅니다. 함수가 성공하면 지정된 주소 범위의 모든 데이터가 그대로 유지됩니다. 함수가 실패하면 주소 범위의 데이터 중 적어도 일부가 0으로 대체됩니다.
이 값은 다른 값과 함께 사용할 수 없습니다. 이전에 MEM_RESET 않은 주소 범위에서 MEM_RESET_UNDO 호출되면 동작이 정의되지 않습니다. MEM_RESET 지정하면 VirtualAllocExNuma 함수는 flProtect 값을 무시합니다. 그러나 여전히 flProtect 를 PAGE_NOACCESS 같은 유효한 보호 값으로 설정해야 합니다. Windows Server 2008 R2, Windows 7, Windows Server 2008 및 Windows Vista: MEM_RESET_UNDO 플래그는 Windows 8 및 Windows Server 2012까지 지원되지 않습니다. |
이 매개 변수는 표시된 대로 다음 값을 지정할 수도 있습니다.
값 | 의미 |
---|---|
|
큰 페이지 지원을 사용하여 메모리를 할당합니다.
크기 및 맞춤은 큰 페이지 최소값의 배수여야 합니다. 이 값을 가져오려면 GetLargePageMinimum 함수를 사용합니다. 이 값을 지정하는 경우 MEM_RESERVE 및 MEM_COMMIT 지정해야 합니다. |
|
AWE( 주소 창 확장 ) 페이지를 매핑하는 데 사용할 수 있는 주소 범위를 예약합니다.
이 값은 다른 값이 아닌 MEM_RESERVE 사용해야 합니다. |
|
가능한 가장 높은 주소로 메모리를 할당합니다. |
[in] flProtect
할당할 페이지 영역에 대한 메모리 보호입니다. 페이지가 커밋되는 경우 메모리 보호 상수 중 하나를 지정할 수 있습니다.
페이지를 보호할 때 지정된 보호 특성은 페이지를 할당할 때 지정된 특성과 충돌할 수 없습니다.
[in] nndPreferred
실제 메모리가 상주해야 하는 NUMA 노드입니다.
새 VA 지역을 할당할 때만 사용됩니다(커밋되거나 예약됨). 그렇지 않으면 API를 사용하여 이미 존재하는 지역의 페이지를 커밋할 때 이 매개 변수가 무시됩니다.
반환 값
함수가 성공하면 반환 값은 할당된 페이지 영역의 기본 주소입니다.
함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
설명
각 페이지에는 연결된 페이지 상태가 있습니다. VirtualAllocExNuma 함수는 다음 작업을 수행할 수 있습니다.
- 예약된 페이지의 영역 커밋
- 무료 페이지 영역 예약
- 무료 페이지 영역을 동시에 예약 및 커밋
VirtualAllocExNuma 는 예약된 페이지를 예약할 수 없습니다. 이미 커밋된 페이지를 커밋할 수 있습니다. 즉, 이미 커밋되었는지 여부에 관계없이 다양한 페이지를 커밋할 수 있으며 함수는 실패하지 않습니다.
VirtualAllocExNuma를 사용하여 페이지 블록을 예약한 다음 VirtualAllocExNuma를 추가로 호출하여 예약된 블록에서 개별 페이지를 커밋할 수 있습니다. 이렇게 하면 프로세스가 필요할 때까지 실제 스토리지를 사용하지 않고도 해당 가상 주소 공간의 범위를 예약할 수 있습니다.
lpAddress 매개 변수가 NULL이 아닌 경우 함수는 lpAddress 및 dwSize 매개 변수를 사용하여 할당할 페이지 영역을 계산합니다. 전체 페이지 범위의 현재 상태는 flAllocationType 매개 변수에 지정된 할당 유형과 호환되어야 합니다. 그렇지 않으면 함수가 실패하고 페이지가 할당되지 않습니다. 이 호환성 요구 사항은 이미 커밋된 페이지를 커밋하는 것을 배제하지 않습니다. 위의 목록을 참조하세요.
VirtualAllocExNuma는 물리적 페이지를 할당하지 않으므로 해당 노드 또는 시스템의 다른 위치에서 페이지를 사용할 수 있는지 여부에 관계없이 성공합니다. 물리적 페이지는 요청 시 할당됩니다. 기본 설정 노드에 페이지가 부족하면 메모리 관리자는 다른 노드의 페이지를 사용합니다. 메모리가 페이징되면 메모리를 다시 가져올 때 동일한 프로세스가 사용됩니다.
동적으로 생성된 코드를 실행하려면 VirtualAllocExNuma 를 사용하여 메모리를 할당하고 VirtualProtectEx 함수를 사용하여 PAGE_EXECUTE 액세스 권한을 부여합니다.
VirtualAllocExNuma 함수를 사용하여 지정된 프로세스의 가상 주소 공간 내에서 AWE(주소 창 확장) 메모리 영역을 예약할 수 있습니다. 그런 다음 이 메모리 영역을 사용하여 애플리케이션에 필요한 대로 실제 페이지를 가상 메모리 내부 및 외부에 매핑할 수 있습니다. MEM_PHYSICAL 및 MEM_RESERVE 값은 AllocationType 매개 변수에서 설정해야 합니다. MEM_COMMIT 값을 설정하면 안 됩니다. 페이지 보호는 PAGE_READWRITE 설정해야 합니다.
VirtualFreeEx 함수는 커밋된 페이지를 커밋 해제하거나, 페이지의 스토리지를 해제하거나, 커밋된 페이지를 동시에 커밋 해제하고 해제할 수 있습니다. 또한 예약된 페이지를 해제하여 무료 페이지로 만들 수도 있습니다.
이 함수를 사용하는 애플리케이션을 컴파일하려면 _WIN32_WINNT 0x0600 이상으로 정의합니다.
예제
요구 사항
지원되는 최소 클라이언트 | Windows Vista [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2008 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | memoryapi.h(Windows.h, Memoryapi.h 포함) |
라이브러리 | onecore.lib |
DLL | Kernel32.dll |