Windows XP의 32 비트 주소 공간에서 실행되는 복잡하고 메모리가 많은 멀티 스레드 응용 프로그램을 생각해보십시오.실패 가능성없이 MapViewOfFileEx를 여러 번 호출 할 때 공간을 재활용 할 수 있습니까?
특정 작업에는 한 번에 하나의 버퍼 만 액세스해야하는 고정 크기의 대형 버퍼가 필요합니다.
응용 프로그램은 하나의 버퍼 크기가 초기에 예약되어 있고 현재 필요한 버퍼를 포함하는 데 사용되는 패턴을 사용합니다.
이
시퀀스를 따른다 : (초기 실행)에서 VirtualAlloc -> VirtualFree를 -> MapViewOfFileEx (버퍼 변경) UnMapViewOfFile -> MapViewOfFileEx 여기 버퍼 위치로 포인터에서 VirtualAlloc에 대한 호출에 의해 제공되고, 다음 MapViewOfFileEx를 호출 할 때마다 동일한 위치가 사용됩니다.문제는 Windows가 다른 사용자간에 메모리 공간을 전달하는 데 필요한 핸드 셰이크 유형 작업을 제공하지 않는다는 것입니다.
따라서 메모리가 잠기지 않고 다른 스레드가 건너 뛰고 버퍼 내에서 할당을 수행 할 수있는 작은 기회가 있습니다.
MapViewOfFileEx에 대한 다음 호출이 끊어지고 시스템에서 더 이상 버퍼의 주소 공간에 충분한 공간이 있음을 보장 할 수 없습니다.
더 작은 버퍼를 사용하도록 리팩토링하면 분명히 공간을 재 할당하는 속도가 줄어 듭니다.
HeapLock의 일부 사용에는 성공했지만 여전히 문제가 있습니다. 주소 공간에서 일부 메모리를 훔치기 위해 여전히 문제가 있습니다. (GetProcessHeaps를 호출 한 다음 HeapLock을 사용하여 모든 힙을 잠그려고했습니다.)
MapViewOfFileEx와 호환되는 주소 공간의 특정 블록을 잠그고 싶습니다.
편집 : 나는 결국 그를 추가해야이 코드는
그리고 왜 MapViewOfFileEx 전에 VirtualFree를 호출합니까? – Sebastian
전체 메모리 블록에 뮤텍스를 사용하지 않거나 처음 할당 된 메모리 내의 미리 정의 된 주소 공간에 뮤텍스 목록을 사용하는 이유가 있습니까? –
아, 내가 이해할 것 같아. 동일한 힙 블록이 항상 무료임을 보장함으로써 MapViewOfFileEx를 그 뒤에서 최적화하려고합니다. – Sebastian