2013-05-17 4 views
2

응용 프로그램에서 나는 각각 480MB의 두 개의 버퍼를 할당해야합니다. 메모리 할당은 HeapAlloc 메서드를 사용하여 수행됩니다. 응용 프로그램은 많은 응용 프로그램이 실행되지 않는 시스템에서 정상적으로 작동합니다. 그러나 다른 응용 프로그램도 실행중인 시스템에서는 연속 메모리가 비 가용성이므로 메모리가 할당되지 않습니다. 메모리 공간 (인접하지 않음)은 사용 가능하지만 할당되지 않습니다.연속적인 메모리 할당

비 연속 메모리를 사용할 수있는 경우에도 480MB의 두 버퍼를 할당하는 데 도움이 필요합니다.

+1

수 없습니다. 더 많은 메모리 (스왑 또는 RAM)를 추가하거나 ['std :: deque'] (http://en.cppreference.com/w/cpp/container/deque)와 같이 인접하지 않은 컨테이너를 사용하십시오. –

+0

2 개의 메모리 맵 파일을 사용하여 비슷한 결과를 얻을 수 있습니까? 이 시점에서 시스템은 메모리를 관리하지만 평면적 인 연속적인 IIRC를 보게됩니다. – JimR

+0

@JimR : 정상적인 할당 기능을 사용하면 페이지 파일을 메모리로 매핑하고 디스크에 변경 내용을 실제로 쓰는 것을 피하는 것을 제외하고는 정상적인 할당 기능에서 얻은 것과별로 다르지 않습니다. –

답변

3

설명하는 상황은 각 프로세스에 자체 주소 공간을 제공하는 완전한 기능을 갖춘 OS에서는 불가능합니다. 얼마나 많은 다른 응용 프로그램이 실행되고 있는지는 중요하지 않습니다. 프로세스에서 사용 가능한 주소 공간의 연속성에는 영향을 미치지 않습니다. 또한 가상 메모리는 인접하지 않은 실제 메모리 주소를 가상 주소 공간의 연속 범위에 매핑 할 수 있습니다.

메모리 관리 장치가없는 임베디드 시스템에서만 다른 작업을 수행하면 프로그램이 메모리 조각화를 일으킬 수 있습니다.

HeapAlloc()은 각 프로세스에 별도의 주소 공간을 제공하는 Windows를 제안합니다. 가장 가능성있는 설명은 개인 주소 공간이 흩어져있는 위치에로드되는 라이브러리 (DLL)로 분할된다는 것입니다. 이 문제를 피하고 더 큰 인접한 주소 공간 블록을 제공하기 위해 사용하는 라이브러리를 리베이스 할 수 있습니다.

+0

사용자 공간 대 커널 공간 대 실제 메모리. 모든 프로그래머가 알아야 할 필자의 목록에. – Anthony

0

VirtualAlloc을 사용하십시오. 가상 페이지를 뒷받침하는 기본 메모리는 연속적 일 필요가 없으며 항상 전체 가상 주소 공간 (32 비트 시스템에서는 2GB, Windows x64에서는 8 또는 16TB라고 생각합니다.)은 HeapAlloc이 될 수 있습니다. (다른 사람이 아닌 프로세스의 사용을 통해 조각난). 주소 공간이 조각화 될 수 있으므로 응용 프로그램에서 주소 공간을 일찍 할당하십시오. 실제로 HeapAlloc을 추천하지는 않습니다. 새로운 것을 사용하고 삭제할 수 있습니다 (malloc과 free를 호출합니다). malloc과 같은 큰 블록의 경우 Windows에서 VirtualAlloc을 호출합니다.

+2

'HeapAlloc' 또한'VirtualAlloc'을 호출 할 것입니다. –

+0

나는 그 문제를 주소 공간 조각화와 같이 들리는 것을 몰랐습니다. 당신이 말했듯이로드 된 라이브러리에 의해 발생할 수 있습니다. – Eloff

+0

글쎄, 힙이 생성 될 때 옵션이되는 것 같습니다. "dwMaximumSize가 0이면 힙 크기가 커질 수 있고 힙 크기는 사용 가능한 메모리에 의해서만 제한되며 고정 크기 힙의 한계보다 큰 메모리 블록을 할당하는 요청은 자동으로 실패하지는 않지만 시스템은 대형 블록에 필요한 메모리를 얻기위한 VirtualAlloc 함수 대용량 메모리 블록을 할당해야하는 응용 프로그램은 dwMaximumSize를 0으로 설정해야합니다. " –

1

VirtualAllocfAllocation으로 지정하면 MEM_LARGE_PAGES으로 지정할 수 있습니다. 이 경우 large page support을 사용할 수 있지만 시스템에서 lage 페이지를 지원하는지 확인하려면 GetLargePageMinimum을 확인해야합니다.

또한이 페이지는 details처럼 느릴 수 있습니다.

대형 페이지 메모리 영역은 각 대형 페이지에 대한 물리적 공간이 연속적이어야하기 때문에 시스템이 오랜 시간 동안 실행 된 후 얻기 어려울 수 있지만, 메모리가 조각화 될 수 있습니다. 이러한 조건에서 큰 페이지를 할당하면 시스템 성능에 심각한 영향을 줄 수 있습니다. 따라서 응용 프로그램은 반복적 인 대형 페이지 할당을하지 말고 시작시 모든 대형 페이지를 한 번에 할당해야합니다.

+0

개별 페이지의 크기가 이에 큰 영향을 미치지 않습니다. 페이지 테이블의 각 항목이 데이터의 더 큰 부분에 해당하기 때문에 큰 배열에서 임의 액세스를 수행 할 때 큰 페이지가 바람직합니다. 따라서 필요한 항목이 더 적어서 Translation Look-aside Buffer에 적합 할 가능성이 더 큽니다 페이지 테이블 용 캐시). –