0

メモリマップトファイルを使用しているWindowsMo​​bile6ARMV4I用のVisualStudio2008C++プロジェクトがあります。残念ながら、デバイスがロックする原因になります。このコードで問題を示すことができます:

#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;
}

私のテストでは、65529回の反復後にWindowsMo​​bile6クラシックエミュレーターがフリーズします。これは私が間違って行っていることですか、それとも私が知っておくべきプラットフォームの問題がありますか?

ありがとう、PaulH

編集: / STACK:1048576,4096に増やすと、デバイスがフリーズする前に65535回の反復をヒットできます。

Edit2:GlobalMemoryStatus障害の直前によると、デバイスには70.5MB/94.1MBの空き物理メモリがあります。

Edit3:2つのMMFを作成し、両方を最大65500*256バイトでロードできます。ただし、どちらも個別に65535の割り当てを超えることはできません。実際には、割り当てサイズは重要ではありません。それぞれ半分から128バイトにカットできますが、それでも65535を超える反復で失敗します。

Edit4:実際のファイルでMMFをバックアップしても、違いはないようです。>65535回の反復での失敗。

4

3 に答える 3

0

これによると(図4を参照)、メモリマップトファイルで使用するために割り当てられたアドレス空間は256MBのみです。64Kの割り当て*4KB= 256MBなので、制限に達しています。

于 2011-05-12T16:58:33.953 に答える
0

Windowsでは、メモリはページで管理されます。さらに、これらのページを割り当てるときは、最小限の粒度があります。デスクトップWindowsでは、ページは通常4KiBであり、最小粒度は通常64KiBです。それよりも小さいサイズにしようとするVirtualAllocMapViewOfFile、切り上げられ、RAMがいくらか無駄になります。

Windows Mobileでもページサイズは4KiBになると確信しています。したがって、256バイトごとMapViewOfFileに、実際には少なくとも4KiBを予約する必要があります。GetSystemInfoこれらの番号を自分で取得するために電話をかけることができます。

これは、コードが実際に少なくとも256MiBを予約していることを意味し、割り当ての粒度が高い場合はさらに多くの予約が行われる可能性があります。アプリがアドレス空間を使い果たしています。

于 2011-05-12T16:19:23.313 に答える
0

ソースにアクセスできる人と話をしました。結局のところ、でMapViewOfFileある内部参照カウンターを使用しUSHORTます。そのため、65535回目の反復で、それはオーバーフローし、いたるところに憎悪と不満を引き起こし、最終的にシステムを停止させました。そのため、メモリマップトファイルへのオープンビューは65535という文書化されていない制限があります。

-PaulH

于 2011-05-13T17:47:02.477 に答える