Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Виртуальная память Добавлено: 14.05.07 15:13  

Автор вопроса:  LamerOnLine | ICQ: 334781088 
В общем, такая есть неувязочка. Нужно зачистить страницы Virtual Memory, VirtualFree бы подошло, но для запроса адресов тех же страниц нужно заюзывать VirtualQuery, и тут непонятно - что для неё есть базовый адрес и откуда его тянуть (память не выделяется через VirtualAlloc вручную)?
Извиняюсь если туплю, пока не глубоко копнулся в теме...

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 14.05.07 15:26
Нужно зачистить страницы Virtual Memory

Почему?

для запроса адресов тех же страниц нужно заюзывать VirtualQuery

Почему?

память не выделяется через VirtualAlloc вручную

А как она выделяется?

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 14.05.07 15:42
Точных причин сам не знаю, просто так у человека проблема стоит.
Выделяется она каким-то приложением в процессе работы. Понятно, что её зачистка наверняка приведет к тасккилу, но суть не в этом...

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 14.05.07 16:41
Чтобы освободить память, надо знать, как она выделена. Остальное фтопку.

Ответить

Номер ответа: 4
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #4 Добавлено: 14.05.07 17:09
Знаю что фтопку. Но ведь система знает, просто спросить надо :)

Ответить

Номер ответа: 5
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #5 Добавлено: 14.05.07 17:34
Система НЕ знает (в том и дело).

Например, функция GlobalAlloc внутри себя поддерживает свои собственные структуры указателей на выделенную память, которые никому не показывает - в результате ею можно выделять память с точностью до байта (сама функция, конечно, выделяет постранично, но помнит, что выделенная на предыдущем вызове страница ещё не исчерпана, и потому вернёт следующие несколько байт из неё же).
VirtualAlloc, напротив, ничего не поддерживает внутри себя и даёт страницу целиком.
Поэтому память, выделенную через GlobalAlloc, надо освобождать через GlobalFree (потому что никто больше не знает, как освободить этот кусок, не освободив остальные и не разрушив кучу).

Что делают внутри себя различные функция рантаймов, как то malloc, например, это тоже сугубо их дело.

Что нужно тебе всё-таки? Я пока так и не понял.

Ответить

Номер ответа: 6
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #6 Добавлено: 14.05.07 17:49
Ну, скажем, насчет VirtualAlloc
lpAddress
[in] The starting address of the region to allocate. If the memory is being reserved, the specified address is rounded down to the next 64-kilobyte boundary. If the memory is already reserved and is being committed, the address is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function. If this parameter is NULL, the system determines where to allocate the region.

Ведь, собака, знает где выделять! По большому счету, наверное можно последовательно через VirtualQuery и параметры BaseAddress и RegionSize. Хотя может и нет :)
Я даже где-то примерчик видел от мелкософта, где как раз была пробежка по выделенным для процесса виртуальным страничкам...
А что нужно - сам не знаю, за что купил, за то и продаю. Но, в целом, начал осознавать - сама идея бредовая :))

Ответить

Номер ответа: 7
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 14.05.07 18:19
Где выделять следующую свободную страницу? Конечно знает. Менеджер памяти. И на это его знание в каждый момент влияет много факторов.

Выделенные странички - GetProcessWorkingSetSize? VirtualQueryEx?

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 14.05.07 18:52
Не, GetProcessWorkingSetSize не то. А VirtualQueryEx просто спрашивает для другого процесса. В общем, понятная лажа...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам