Как правильно выделять и освобождать виртуальную память?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Адская_Капча
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 60
Зарегистрирован: 28.07.2014 (Пн) 20:22

Как правильно выделять и освобождать виртуальную память?

Сообщение Адская_Капча » 05.06.2016 (Вс) 19:39

Сабж))

А тонкость заключается в непонятном моменте - можно ли при выделении использовать только один флаг MEM_COMMIT. Вот дискуссии на эту тему:
http://www.wasm.ru/forum/viewtopic.php?id=20116
http://www.programmersforum.ru/showthread.php?t=229591
Но все равно, хочется ведь услышать истину, как это нужно делать идеологически правильно... Изображение

Мне не нужно резервировать диапазоны адресов, а сразу использовать в физической памяти.
И чтобы еще в файл подкачки не сбрасывалось (VirtualLock, видимо, придется юзать для этого...).

Вот так сейчас у меня происходит выделение и освобождение памяти:
Код: Выделить всё
lMem = VirtualAlloc(0&, lSize, MEM_COMMIT, PAGE_READWRITE)

'Какие-то операции с памятью

lRet = VirtualFree(ByVal lMem, 0&, MEM_RELEASE)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как правильно выделять и освобождать виртуальную память?

Сообщение Хакер » 16.06.2016 (Чт) 20:31

Адская_Капча писал(а):Вот так сейчас у меня происходит выделение и освобождение памяти:

Так делать не стоит.

Место в АП процесса резервируется блоками по 64 кб, а страницы выделяются по одной. Не бывает такого, чтобы 1 страница была выделена просто так, без резервирования блока размером 64 кб.

Поэтому такой вызов, как выше, даже если нужна 1 страница, сперва зарезервирует блок размером 64 кб, а затем в нём выделит одну страницу. Если таким образом будет выделяться 100 страницу, то общий размер зарезервированного пространства будет равен 6400 кб, хотя потребность составляет всего 400 кб.

Правильный подход — сначала зарезервировать регион, потом из этого региона выделять страницы по мере надобности. Если коммиты и декоммиты происходят в цикле, или просто это повторяющийся процесс, например раз в секунду, то имеет смысл вынести резервирование за скобки, например резервировать регион при старте программы, хранить адрес региона и выделять потом на протяжении всего времени работы из этого региона.

Никакой выигрыша от того, что вместо двух вызовов VirtualAlloc используется один — нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Адская_Капча
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 60
Зарегистрирован: 28.07.2014 (Пн) 20:22

Re: Как правильно выделять и освобождать виртуальную память?

Сообщение Адская_Капча » 03.07.2016 (Вс) 18:30

Спасибо за разъяснения =)

Значит, более одного флага все же допускается ставить? А то те темы по ссылкам навеяли непонятностей... (The type of memory allocation. This parameter must contain one of the following values в MSDN, т.е. может быть якобы только 1 значением)

Мне нужно единожды зарезервировать и здесь достаточно одного региона. В цикле ничего не нужно. Думается, в этом случае все же можно обойтись одним вызовом?

1. Для чего это нужно - для размещения и последующего запуска нескольких ассемблерных вставок.
2. Почему решено сделать именно через Virtual - Heap-функции не позволяют ведь заблокировать память от выгрузки в файл подкачки. А через VirtualLock это сделать можно.
3. Зачем не выгружать в файл подкачки - для повышения быстродействия, а также продления срока службы диска, отказываяь от излишней тряски памяти «микросхема - жесткий диск». Вставки - на то и ассемблерные, что сам их вызов также должен быть быстрым =)

Такой еще вопрос - вызывать VirtualLock нужно сразу же после вызова VirtualAlloc? Или нужно сначала заполнить память своими данными, и только потом лочить? Вдруг здесь тоже имеется какая-либо тонкость...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 4

    TopList  
cron