2011-05-12 7 views
0

Windows Mobile 6 용 ARM Visual Studio 2008 C++ 프로젝트가 있습니다. 여기서는 메모리 매핑 파일을 사용하고 있습니다. 안타깝게도 장치가 잠기는 원인이됩니다. 이 코드로 문제를 설명 할 수MapViewOfFile은 Windows Mobile 6 장치를 고정합니다.

#include <list> 
#include <algorithm> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD alloc_size = 256; 
    DWORD alloc_max = 16 * 1024 * 1024; 
    DWORD alloc_count = alloc_max/alloc_size; 

    HANDLE f = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, alloc_max, NULL); 

    std::list< void* > l; 
    for(DWORD i = 0; i < alloc_count; ++i) 
    { 
     // device freezes after 65529 iterations 
     l.push_back(::MapViewOfFile(f, FILE_MAP_READ | FILE_MAP_WRITE, 0, i * alloc_size, alloc_size)); 
    } 

    std::for_each(l.rbegin(), l.rend(), ::UnmapViewOfFile); 
    ::CloseHandle(f); 
    return 0; 
} 

윈도우 모바일 6 클래식 에뮬레이터 내 테스트에서 65,529 반복 한 후 동결됩니다. 이 문제가 제가 잘못하고있는 것이거나 알고 있어야하는 플랫폼 문제입니까?

덕분에, PaulH

편집 :은/STACK에 증가 : 1048576,4096 나 장치가 정지하기 전에 65535 반복을 공격 할 수 있습니다.

편집 2 : 오류가 발생하기 바로 전에 GlobalMemoryStatus에 따르면 장치의 실제 메모리는 70.5MB/94.1MB입니다.

편집 3 : 두 개의 MMF를 만들고 최대 65500 * 256 바이트까지로드 할 수 있습니다. 그러나 그들 중 누구도 개별적으로 65535 할당을 초과 할 수 없습니다. 사실, 할당 크기는 중요하지 않습니다. 각각 128 바이트로 반으로 줄일 수는 있지만 여전히 65535 회 이상의 반복에서 실패합니다.

Edit4 : 실제 파일로 MMF를 백업해도 아무런 효과가 없습니다. > 65535 반복의 실패.

답변

0

나는 출처에 접근 할 수있는 누군가와 이야기했다. 밝혀진대로 MapViewOfFileUSHORT 인 내부 참조 카운터를 사용합니다. 따라서 65535 번째 반복에서 오버 플로우되어 결국 시스템 전체를 싫어하고 불만을 일으켰습니다. 따라서 메모리 매핑 된 파일에 65535 개의 열린보기가있는 문서화되지 않은 제한이 있습니다.

-PaulH

0

Windows의 경우 메모리는 페이지에서 관리됩니다. 또한 이러한 페이지를 할당 할 때 최소 단위가 있습니다. 데스크톱 Windows에서 페이지는 일반적으로 4KiB이고 최소 세분성은 보통 64KiB입니다. VirtualAlloc 또는 MapViewOfFile 크기보다 작 으면 크기가 반올림되고 RAM을 낭비하게됩니다.

나는 페이지 크기뿐만 아니라 윈도우 모바일 4KiB 될 것입니다 확실 해요 - 그래서 각 256 바이트 MapViewOfFile에 대한, 실제로 적어도 4KiB을 예약 할 수 있어요. 이 번호를 직접 얻으려면 GetSystemInfo으로 전화하십시오.

즉, 은 적어도 256MiB 이상이며, 할당 세분성이 더 높으면 훨씬 더 많은 코드가 저장됩니다. 앱의 주소 공간이 소모되었습니다.

+0

왜 메모리 부족 예외가 발생합니까? –

+0

@Cory Nelson - Windows Mobile 용 MapViewOfFile에서는> 32 비트 주소에 대해 4KB 할당 세분성을 사용할 필요가 없습니다. http://msdn.microsoft.com/en-us/library/aa914405.aspx – PaulH

+0

좋은 질문입니다. 전에 Windows Mobile 용으로 개발했지만 메모리가 부족한 적은 한번도 없었습니다.그 상황에서 어떤 행동을 보여줄지 모르겠습니다. –

0

this (그림 4 참조)에 따르면 메모리 매핑 된 파일과 함께 사용하기 위해 256MB의 주소 공간 만 할당됩니다. 64K 할당 * 4KB = 256MB이므로 한계에 도달했습니다.

+0

CE6 용입니다. 위의 그래프는 MMF에 사용할 수있는 1GB의 CE5를 보여줍니다. Windows Mobile 6.5는 CE5를 기반으로합니다. http://en.wikipedia.org/wiki/Windows_Mobile – PaulH

+0

아, 네 말이 맞아. 아마도 64K 파일 맵핑보기의 하드 한계가 있습니다 (누구에게나 충분해야 함). 그래도 코드가하는 일의 유용성을 알 수는 없습니다. 왜 모든 것을 맵핑하고 여러 포인터를 뷰에 유지하는 것이 아닌가? – Luke

+0

그게 내가하고있는 일이다. 'MapViewOfFile'은 나에게 MMF에 대한 포인터를 제공한다. 메모리는'CreateFileMapping'에 의해 매핑됩니다. – PaulH

관련 문제