Оптимальная работа с виртульной памятью

Тема в разделе "WASM.BEGINNERS", создана пользователем KingT, 26 окт 2008.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Необходимо в памяти хранить большое количесво элементов,каждый из которых не велик(300байт) но их может быть 100 а может и 10000.Программа генерирует элемент и кладет его в память.Проблема в том,что программа не знает заранее сколько элементов она насчитает поэтому надо при нехватке памяти добавлять страницы.Мой алгоритм такой:

    1.Выделяю страницу(VirtualAlloc)
    2.Начинаю добавлять элементы,каждый раз проверяя не происходит ли переполнение.
    3.Если переполнение произошло создаю еще одну страницу и т.д

    Мне непонятно вот что:когда мы вызываем VirtualAlloc и в качестве первого параметра даем 0 то система разместит страницу по своему усмотрению и вернет базовый адрес.Когда я хочу создать еще одну страницу то я о5 передаю 0,и получаю еще один базовый адрес.При выделении нескольких страниц у меня есть несколько базовых адресов которые я допустим сохрнаю в массиве и затем буду использовать для вычисления линейного адреса,но это не удобно и неэффективно.Можно ли каким либо образом создавать страницы так,чтоб они следовали одна за другой?Я пробывал при создании второй страницы в качестве первого параметра VirtualAlloc указать адрес байта,который идет после первой страницы однако система возвращает ошибку.А если создавать страницы указывая 0 то они не следуют одна за другой.
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Ыыы... а больший блок памяти выделить сразу?
     
  3. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    А зачем большой.Может у меня данных будет столько,что в одну страницу уложатся.
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А в чем оптимизация заключается? Не отъедать слишком много физической памяти? Тогда можно отъесть достаточно много виртуальной, а по мере необходимости делать выделанной памяти COMMIT.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Базовый адрес получаешь VirtualAlloc с флагом MEM_RESERVE и большим размером блока памяти - реальная память при этом не расходуется - только резервируется диапазон адресов, чтобы апи в него не залазили.
    А затем VirtualAlloc с флагом MEM_COMMIT и адресом уже тобой заданным в этом диапазоне обеспечит то расположение страниц которе нужно.

    http://www.wasm.ru/forum/viewtopic.php?pid=167377#p167377
    http://www.wasm.ru/forum/viewtopic.php?pid=270546#p270546