3

대용량 메모리 (메가 바이트)를 큰 정렬 (잠재적으로 메가 바이트 범위)으로 할당해야합니다. VirtualAlloc 함수 제품군은이를 수행하는 옵션을 제공하지 않는 것 같습니다.큰 정렬을 사용하는 Win32 메모리 할당

Linux에서이 작업을 수행하기 위해 필요한 것은 더 큰 영역을 mmap하는 것입니다. 필요한 정렬이있는 충분히 큰 영역이 포함될 것임을 보장하기에 충분합니다. 그런 다음 영역의 시작과 끝 부분을 munmap합니다. 필요하지 않은 큰 지역.

예를 들어, 1 메가 바이트 경계 (즉, 가장 낮은 20 비트에서 0을 갖는 영역의 시작)에서 정렬 된 4MB가 필요하다고 가정 해 보겠습니다. 나는 5 메가 바이트 mmap 줄. 0x44ff000-0x49ff000의 영역을 얻는다 고 가정 해 봅시다. 해당 영역 내에는 1 메가 바이트 경계에 정렬 된 0x4500000-0x4900000 영역이 있습니다. 그러면 0x44ff000-0x4500000과 0x4900000-0x49ff000을 munmap합니다.

Win32에서도 이와 비슷한 작업을 수행 할 수 있습니까? PAGE_NOACCESS와 함께 VirtualProtect를 사용하면 메모리가 해제됩니까? 더 나은 해결책이 있습니까?

+0

* 가상 메모리에 대한 정렬 요구 사항이 매우 이상한 경우 물리적 메모리에만 문제가됩니다. Anyhoo, Windows에서 할 수있는 일은 없습니다. 하지만 할당은 * 예약해야하기 때문에 중요하지 않습니다. 커밋은 별도의 단계입니다. 특정 행복한 주소에 할당을 요청하는 것도 가능합니다. VirtualAlloc()을 사용하십시오. –

답변

6

예, 동일한 기술을 사용할 수 있습니다. VirtualAlloc 큰 범위는 MEM_RESERVE입니다. 적절히 정렬 된 하위 범위를 찾고 보조 범위에서 MEM_COMMIT으로 두 번째로 VirtualAlloc을 호출하십시오.

0

_aligned_malloc의 소스를 Windows/MSVC crt에서 살펴 보겠습니다. 가상 메모리를 정렬하는 데 동일한 방법을 사용하는 것이 매우 간단합니다. 말하자면 그 내부를 바꾸기 만하면됩니다. malloc 호출 (_aligned_free과 동일) 시스템 호출로 할당 할 수 있습니다.

그러나 왜 그런 대규모 정렬이 필요합니까? 빠른 메모리 블록 슬랩에 대한 주소 비트 패턴을 악용하려고합니까?