Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что возвращает HeapWalk, Вопрос по PROCESS_HEAP_ENTRY 
V
    Опции темы
rudolfninja
Дата 23.9.2013, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Доброго времени суток. Пришлось столкнуться с функцией HeapWalk. Пример взял с msdn. 
Вот, что вернула функция:

Код

Region
  4096 bytes committed
  258048 bytes uncommitted
  First block address: 0x14020598
  Last block address: 0x14060000

  Data portion begins at: 0x14020000
  Size: 1416 bytes
  Overhead: 0 bytes
  Region index: 0

Allocated block
  Data portion begins at: 0x140207d0
  Size: 10 bytes
  Overhead: 14 bytes
  Region index: 0

Allocated block
  Data portion begins at: 0x140207e8
  Size: 10 bytes
  Overhead: 14 bytes
  Region index: 0

Block

  Data portion begins at: 0x14020808
  Size: 2008 bytes
  Overhead: 16 bytes
  Region index: 0

Uncommitted range

  Data portion begins at: 0x14021000
  Size: 258048 bytes
  Overhead: 0 bytes
  Region index: 0


Кучу создавал так: _heap = HeapCreate(HEAP_GROWABLE, 0, 0);
Потом выделил в ней 2 блока по 10 байт каждый. Затем вызвал HeapWalk. Насколько я знаю, раз в структуре PROCESS_HEAP_ENTRY установлен флаг PROCESS_HEAP_REGION, значит элемент находится в начале непрерывной области нераспределенной виртуальной памяти. На компе 32ГБ ОЗУ, то есть оперативаня память не могла закончиться, что б система полезла в виртуальную. 

Читал и Рихтера и Побегайло, не нашел там ответа на свой вопрос.
Если не трудно, прокомментируйте, пожалуйста, то, что вернула функция HeapWalk. Хотелось бы понять, что это значит и почему именно так.

Спасибо.


Это сообщение отредактировал(а) rudolfninja - 23.9.2013, 23:15
PM MAIL Skype   Вверх
feodorv
Дата 23.9.2013, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Интересно, зачем Вы задали флаг HEAP_GROWABLE, такого флага в описании функции HeapCreate не числится, это флаг для функции RtlCreateHeap.


Цитата(rudolfninja @  23.9.2013,  22:44 Найти цитируемый пост)
На компе 32ГБ ОЗУ, то есть оперативаня память не могла закончиться, что б система полезла в виртуальную. 

А при чём здесь ОЗУ? У каждого процесса своё виртуальное адресное пространство, неким прозрачным образом отображаемое на ОЗУ или страничный файл. Процесс непосредственно с ОЗУ дела не имеет.


Цитата(rudolfninja @  23.9.2013,  22:44 Найти цитируемый пост)
прокомментируйте, пожалуйста, то, что вернула функция HeapWalk

Первым делом в адресном пространстве процесса был зарезервирован регион (через VirtualAlloc) под нужды кучи, размером 262144 байт (262144 = 0x14060000 - 0x14020000 = 258048 + 4096). Вторым делом первая страница (4096 байт) этого региона передаётся процессу (теперь он может оттуда/туда читать/писать), остальное пространство блока остаётся недоступным для чтения/записи, но всё равно зарезервированным (никто другой эту область адресного пространства уже не сможет перезаказать). Часть переданной страницы адресного пространства ушло на управляющие структуры кучи (размером 1416 байт, 0x598 = 1432 байта, на что ушло ещё 16 байт, я не знаю). Тем не менее, первая аллокированная память пошла со смещением 2000 в регионе...

Ну и потом собственно аллокированная память: 
  • память в 24 байта со смещением 7d0 (2000)
  • память в 24 байта со смещением 7e8 (2024)
 
плюс оставшаяся незанятая непрерывная память в переданных страницах зарезервированного региона размером 2008+16 байт со смещением в регионе 2056 (0x1000 - 0x808 - 16 = 2008+16).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
rudolfninja
Дата 24.9.2013, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Цитата
Куча - это регион зарезервированного адресного пространства. Первоначально большей его части физическая память не передается.

Так написано в книге Рихтера. То есть, получается, что под кучу выделается область виртуальной памяти, а потом, она передается ОЗУ?

Это сообщение отредактировал(а) rudolfninja - 24.9.2013, 09:47
PM MAIL Skype   Вверх
feodorv
Дата 24.9.2013, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(rudolfninja @  24.9.2013,  10:46 Найти цитируемый пост)
Так написано в книге Рихтера

Тут лучше Руссиновича почитать)))


Цитата(rudolfninja @  24.9.2013,  10:46 Найти цитируемый пост)
а потом, она передается ОЗУ?

Эээ... Передаётся процессу, то есть страница адресного пространства процесса ассоциируется со страницей ОЗУ (или страничного файла), при этом переданная страница становится доступной на чтение/запись.

Если страница просто зарезервирована (но не передана), то с ОЗУ она никак не связана.

Механизм отображения страницы адресного пространства процесса на физическую память ОЗУ довольно затейлив, и целиком реализуется в режиме ядра. Пользовательский процесс может только попросить соответствующие подсистемы Windows передать (commit) память или высвободить (decommit) её.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GremlinProg
Дата 24.9.2013, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  24.9.2013,  16:51 Найти цитируемый пост)
Механизм отображения страницы адресного пространства процесса на физическую память ОЗУ довольно затейлив, и целиком реализуется в режиме ядра. Пользовательский процесс может только попросить соответствующие подсистемы Windows передать (commit) память или высвободить (decommit) её.

В общем-то, это не так со времен создания AWE, которое позволяет "пользователю" мепировать физические страницы в виртуальные произвольным образом.

Добавлено через 1 минуту и 27 секунд
вернее - наоборот ))


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
rudolfninja
Дата 24.9.2013, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



В общем, как я понял, память для кучи выделяется в виртуальном адресном пространстве процесса. При создании кучи (речь идет о пользовательской куче) в этом адресном пространстве (виртуальном) резервируется какой-то кусок памяти. Затем, при выделении памяти в куче, через HeapAlloc, часть зарезервированной области передается на физическую память, а остальная область просто остается зарезервированной и ждет, пока ее тоже будут использовать.
Если я все правильно понял, то возникает вопрос: чем куча отличается от виртуальной памяти (кроме того, что в куче меньшая гранулярность выделения памяти)? А если не прав - поправте, пожалуйста.
PM MAIL Skype   Вверх
feodorv
Дата 24.9.2013, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  24.9.2013,  20:45 Найти цитируемый пост)
В общем-то, это не так со времен создания AWE

Ну, имелся в виду стандартный механизм управления памятью. И, по-моему, AWE недалеко от него ушёл)))


Цитата(rudolfninja @  24.9.2013,  23:02 Найти цитируемый пост)
чем куча отличается от виртуальной памяти

Странный вопрос. Всё адресное пространство процесса - виртуальная память. Куча - это просто удобный механизм, позволяющий  динамически её распределять. За простым на вид API спрятана серьёзная работа с памятью, работа, которую Вы при желании можете взять на себя, реализовав свою собственную кучу (правда, многие вызовы при этом всё равно будут использовать стандартную кучу процесса)))) Но даже так Вам придётся работать в виртуальном адресном пространстве процесса...


Цитата(rudolfninja @  24.9.2013,  23:02 Найти цитируемый пост)
кроме того, что в куче меньшая гранулярность выделения памяти

Одно из назначений кучи - оптимальное обращение с памятью, это да. Однако существуют реализации кучи, где каждый запрос на выделение памяти выполняется на новой странице адресного пространства процесса (что может привести к быстрому исчерпанию адресного пространства); такие кучи используются в отладочных целях.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
rudolfninja
Дата 25.9.2013, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Вроде что-то прояснилось. Спасибо.
PM MAIL Skype   Вверх
GremlinProg
Дата 25.9.2013, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  25.9.2013,  01:30 Найти цитируемый пост)
Ну, имелся в виду стандартный механизм управления памятью. И, по-моему, AWE недалеко от него ушёл)))

Само собой, если использовать только VirtualAlloc и VirtualFree (стандартный механизм управления памятью), то вклиниться в процесс "паджинга" не получится, как в сущности - в любой другой процесс, имеющий строгий API режима ядра.

AWE как раз и позволяет создать свой механизм подкачки виртуальных страниц, т.к. управляет только процессом резервирования и отображения физических страниц.

Где это может пригодиться? Ну, даже самое банальное - там, где заранее известно, к каким страницам будет обращаться приложение, т.е. там, где отлов обращений через исключение по PAGE_GUARD может играть какую-то роль в производительности ПО. Или в 32-битном приложении, которому требуется более 4Гб ОЗУ.

...если они (более 4Гб ОЗУ), конечно доступны физически ))


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 25.9.2013, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



AWE, без сомнения, механизм полезный. Но всё равно приходится резервировать регион памяти в адресном пространстве процесса (а я, в сущности, только об этом) путём VirtualAlloc, получается этакое memory mapped RAM (по аналогии с memory mapped file). Приятно иметь невыгружаемый набор страниц)))


Цитата(GremlinProg @  25.9.2013,  12:27 Найти цитируемый пост)
...если они (более 4Гб ОЗУ), конечно доступны физически ))

Мда, памяти много не бывает)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GremlinProg
Дата 25.9.2013, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  25.9.2013,  14:19 Найти цитируемый пост)
Но всё равно приходится резервировать регион памяти в адресном пространстве процесса (а я, в сущности, только об этом) путём VirtualAlloc

А вот только эта операция, пожалуй, и реализуется без какого-либо вмешательства "пользователем" в ядро, верно! Но это банальное резервирование диапазона страниц, без каких-либо дополнительных телодвижений, требующих подкачки или сброса страниц на диск.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1326 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.