MapViewOfFile замораживает устройство Windows Mobile 6 - PullRequest
0 голосов
/ 12 мая 2011

У меня есть проект Visual Studio 2008 C ++ для Windows Mobile 6 ARMV4I, в котором я использую файлы с отображенной памятью.К сожалению, это приводит к блокировке устройства.Я могу продемонстрировать проблему с этим кодом:

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

Классический эмулятор Windows Mobile 6 Classic зависнет после 65529 итераций в моем тестировании.Это что-то, что я делаю неправильно, или есть проблема с платформой, о которой я должен знать?

Спасибо, PaulH

Редактировать: Увеличение до / STACK: 1048576,4096 позволяет мне выполнить 65535 итераций до того, как устройство зависнет.

Edit2: Согласно GlobalMemoryStatus непосредственно перед отказом, устройство имеет 70,5 МБ / 94,1 МБ свободной физической памяти.

Edit3 : я могу создать две MMF и загрузить их до 65500 * 256 байт.Но ни один из них не может превышать 65535 по отдельности.На самом деле, размер alloc не имеет значения.Я могу сократить его пополам до 128 байт каждая, но все равно не могу выполнить> 65535 итераций.

Edit4: Поддержка MMF с реальным файлом, похоже, не имеет значения.Ошибка в> 65535 итерациях.

Ответы [ 3 ]

0 голосов
/ 12 мая 2011

Согласно это (см. Рисунок 4) только 256 МБ адресного пространства выделено для использования с файлами отображения памяти. Выделение 64 КБ * 4 КБ = 256 МБ, поэтому вы достигли предела.

0 голосов
/ 13 мая 2011

Я говорил с кем-то, у кого есть доступ к источникам. Как выясняется, MapViewOfFile использует внутренний счетчик ссылок, который является USHORT. Итак, на 65535-й итерации она переполнилась и вызвала ненависть и недовольство повсюду, что в итоге остановило систему. Таким образом, существует недокументированное ограничение в 65535 открытых просмотров для файла с отображением в памяти.

-PaulH

0 голосов
/ 12 мая 2011

В Windows память управляется в страницах . Кроме того, при размещении этих страниц существует минимальная степень детализации. В Windows на рабочем столе размер страницы обычно составляет 4 КБ, а минимальная степень детализации обычно составляет 64 КБ. Если вы попытаетесь набрать VirtualAlloc или MapViewOfFile с размером меньше этого, оно будет округлено, и вы потратите немного оперативной памяти.

Я почти уверен, что в Windows Mobile размер страницы будет также равен 4 КБ - поэтому для каждого 256-байтового MapViewOfFile фактически нужно зарезервировать как минимум 4 КБ. Вы можете позвонить GetSystemInfo, чтобы получить эти номера для себя.

Это означает, что ваш код на самом деле резервирует по крайней мере 256MiB и, возможно, намного больше, если степень детализации выделения выше. Ваше приложение исчерпывает свое адресное пространство.

...