Re[3]: Перегрузка new/delete, хранение "метки" для выделенно
От: deadSLAYER  
Дата: 18.09.06 09:46
Оценка:
Здравствуйте, SeninAndrew, Вы писали:

SA>Здравствуйте, deadSLAYER, Вы писали:


SLA>>Все кучи делят одно адресное пространство, если предположить, что адресные пространстав разных куч не пересекаются,

SLA>>а идут последовательно, можно просто запоминать диапазон значения указателей а-ля:
SLA>>куча-раз — 0x1324-
SLA>>куча-два — 0x4657-
SLA>>Потом когда делиту приходит указатель можно попробовать по значению понять из какой он кучи.
SLA>>вот.

SA>Интересная идея, только как вот узнать эти диапазоны ...


После создания кучи выделить 8 байт памяти
После создания другой еще 8 байт,
проверить опытным путем все ли указатели получаемые из первой кучи лежат между этими тестовыми указателями,
если все — считай что решение готово — при создании кучи делает "тестовый" аллокейт,
и сохраняешь эти значения, потом смотришь бинарным поиском между какими двумя находится поинтер и получаешь номер кучи.
Re[10]: Перегрузка new/delete, хранение "метки" для выделенн
От: MaximE Великобритания  
Дата: 18.09.06 10:07
Оценка:
Vain wrote:

> ME>Vain wrote:

>
>> > V>>Есть куча, я помню что в куче нельзя выделить больше определённого
>> > размера, вроде 2GB, а так как она виртуальная, то мы имеем дело просто с
>> > "адресным пространством", которое както там мапиться менеджером памяти
>> > на физические страницы.
>
> ME>Несколько не так.
>
> ME>Если ты хочешь использовать больше памяти, чем размер адрессного
> пр-ва процесса,
> ME>тебе придется переключать проекции. Так делалось на zx spectrum 128k
> с 16-битным
> ME>адрессным пространством, где чтобы доступится к памяти больше 64k,
> приходилось
> ME>переключать две страницы, отображенные на 0x4000-0x7fff и
> 0xc000-0xffff. Т.е.
> ME>размер виртуального адрессного пространства ограничивает лишь объем
> памяти, к
> ME>которому ты можешь доступиться одновременно.

> Всё равно не понял, а как ты будешь переключать страницы, через что?

> Пример какойнить приведи этого.

Создай несколько проекций (CreateFileMapping/shm_open). Отображай их
(MapViewOfVileEx/mmap) поочередно на один и тот же виртуальный адрес. С PAE не
работал, но там похожие вызовы.

(на spectrum это делалось выводом байта в непомню какой порт)

> ME>Выделить можно, но придется жонглировать отображаениями. Т.е.

> указатели на
> ME>объекты в этих отображениях, должны помимо адреса также идентифицировать
> ME>конкретную проекцию. Иными словами эмулировать более "широкое" адрессное
> ME>пространство.

> А это возможно в рамках одного процесса?


Про один процесс и речь.

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[11]: Перегрузка new/delete, хранение "метки" для выделенн
От: Vain Россия google.ru
Дата: 18.09.06 12:23
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Создай несколько проекций (CreateFileMapping/shm_open). Отображай их

ME>(MapViewOfVileEx/mmap) поочередно на один и тот же виртуальный адрес. С PAE не
ME>работал, но там похожие вызовы.
А, так ты имеешь ввиду свой менеджер написать? Я так понял что этот кусок пямяти должен обязательно быть Locked в на физическую память иначе будет двойной свап (сначала винды, а потом через мой менеджер)?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Перегрузка new/delete, хранение "метки" для выделенно
От: Risk Server  
Дата: 18.09.06 15:09
Оценка:
Здравствуйте, SeninAndrew, Вы писали:

SA>Здравствуйте, Risk Server, Вы писали:


RS>>А в чём вообще смысл подобной оптимизации? Поскольку удаление возможно из произвольного потока всё равно прийдётся синхронизироваь _все_ операции с кучей.


SA> И синхронизация нужна только в том случае, когда поток А удаляет память из кучи потока В. А это случается существенно реже, чем удаление собственной памяти (из своей кучи).


Правильно. НО когда поток А удаляет память из своей собственной кучи, ему тоже надо синхронизироваться с потоком В, который то же самое время может удалить память из кучи потока А. То есть необходимо входить в критическую секцию при каждой операции с кучей, не зависимо своя она или чужая.
Я не спорю, что при заведении нескольких куч в большей части случаев синхронизация эта обойдётся дёшево ибо критическая секция будет свободна.
Но поскольку синхронизация нужна,то получается что знать чья куча совсем не надо. Удаление памяти из своей и из чужой кучи должно выглядеть абсолютно одинаково.

SA>Более того. Если быть совсем точным, то собственные секции можно и не заводить, так как на уровне каждой кучи синхронизация обеспечена системой.


Ну это опционально, как попросите. Мой поинт в том, что синхронизация нужна. Лучше конечно использовать ту, что система сама предоставляет.
Re[4]: Перегрузка new/delete, хранение "метки" для выделенно
От: Risk Server  
Дата: 18.09.06 15:11
Оценка:
Здравствуйте, deadSLAYER, Вы писали:

SLA>Здравствуйте, SeninAndrew, Вы писали:


SA>>Здравствуйте, deadSLAYER, Вы писали:


SLA>>>Все кучи делят одно адресное пространство, если предположить, что адресные пространстав разных куч не пересекаются,

SLA>>>а идут последовательно, можно просто запоминать диапазон значения указателей а-ля:
SLA>>>куча-раз — 0x1324-
SLA>>>куча-два — 0x4657-
SLA>>>Потом когда делиту приходит указатель можно попробовать по значению понять из какой он кучи.
SLA>>>вот.

SA>>Интересная идея, только как вот узнать эти диапазоны ...


SLA>После создания кучи выделить 8 байт памяти

SLA>После создания другой еще 8 байт,
SLA>проверить опытным путем все ли указатели получаемые из первой кучи лежат между этими тестовыми указателями,
SLA>если все — считай что решение готово — при создании кучи делает "тестовый" аллокейт,
SLA>и сохраняешь эти значения, потом смотришь бинарным поиском между какими двумя находится поинтер и получаешь номер кучи.

почти уверен что куча виндоуз не гарантирует непрерывного диапазона адресов для всех блоков памяти, выделенных из кучи. Пока размер кучи мал — это будет работать, но со временем куча начнёт расти за счёт выделения новых регионов памяти и данные метод работать перестанет.
Re[4]: Перегрузка new/delete, хранение "метки" для выделенно
От: SeninAndrew Россия  
Дата: 18.09.06 15:48
Оценка:
Здравствуйте, Risk Server, Вы писали:

RS>Правильно. НО когда поток А удаляет память из своей собственной кучи, ему тоже надо синхронизироваться с потоком В, который то же самое время может удалить память из кучи потока А. То есть необходимо входить в критическую секцию при каждой операции с кучей, не зависимо своя она или чужая.

RS>Я не спорю, что при заведении нескольких куч в большей части случаев синхронизация эта обойдётся дёшево ибо критическая секция будет свободна.
RS>Но поскольку синхронизация нужна,то получается что знать чья куча совсем не надо. Удаление памяти из своей и из чужой кучи должно выглядеть абсолютно одинаково.

Ну да. Я согласен, что вход в критическую секцию (при их использовании) будет происходить при каждой операции. И действительно, знать, какому потоку какая куча принадлежит на момент удаления не обязательно (при выделении памяти это знать нужно, чтобы определить, откуда память взять). Поэтому, я в Вашем всказывании не вижу никаких противоречий моим утверждениям...
... << RSDN@Home 1.2.0 alpha rev. 651>>
Re[12]: Перегрузка new/delete, хранение "метки" для выделенн
От: MaximE Великобритания  
Дата: 18.09.06 17:15
Оценка:
Vain wrote:

> ME>Создай несколько проекций (CreateFileMapping/shm_open). Отображай их

> ME>(MapViewOfVileEx/mmap) поочередно на один и тот же виртуальный адрес.
> С PAE не
> ME>работал, но там похожие вызовы.
> А, так ты имеешь ввиду свой менеджер написать?

Не совсем понимаю, что ты имееешь ввиду под менеджер. Речь шла об аллокаторе для
многопоточного приложения, или я что-то упускаю?

> Я так понял что этот

> кусок пямяти должен обязательно быть Locked в на физическую память иначе
> будет двойной свап (сначала винды, а потом через мой менеджер)?

Память, которую аллокатор распределяет для приложению, аллокатор получает от ОС
стандартными средствами (sbrk/mmap/CreateFileMapping/whatever-your-os-provides).

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[13]: Перегрузка new/delete, хранение "метки" для выделенн
От: SeninAndrew Россия  
Дата: 18.09.06 17:59
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Не совсем понимаю, что ты имееешь ввиду под менеджер. Речь шла об аллокаторе для

ME>многопоточного приложения, или я что-то упускаю?

Ну менеджер и аллокатор — синонимы в данном контексе (поправьте кто-нибудь, если я неправ).
... << RSDN@Home 1.2.0 alpha rev. 651>>
Re[5]: Перегрузка new/delete, хранение "метки" для выделенно
От: Risk Server  
Дата: 18.09.06 19:00
Оценка:
Здравствуйте, SeninAndrew, Вы писали:

SA>Здравствуйте, Risk Server, Вы писали:


SA>Ну да. Я согласен, что вход в критическую секцию (при их использовании) будет происходить при каждой операции. И действительно, знать, какому потоку какая куча принадлежит на момент удаления не обязательно (при выделении памяти это знать нужно, чтобы определить, откуда память взять). Поэтому, я в Вашем всказывании не вижу никаких противоречий моим утверждениям...


Вы же сами писали, что при выделении и так понятно из какой кучи бать (по идентификатору потока кучу найти можно). Зачем тогда в самом блоке памяти хранить метку какой куче он принадлежит? При удалении эта метка не нужна. При выделении, ясное дело, тоже
Re[6]: Перегрузка new/delete, хранение "метки" для выделенно
От: SeninAndrew Россия  
Дата: 18.09.06 19:55
Оценка:
Здравствуйте, Risk Server, Вы писали:

SA>>знать, какому потоку какая куча принадлежит на момент удаления не обязательно (при выделении памяти это знать нужно, чтобы определить, откуда память взять).

RS>Вы же сами писали, что при выделении и так понятно из какой кучи бать (по идентификатору потока кучу найти можно). Зачем тогда в самом блоке памяти хранить метку какой куче он принадлежит? При удалении эта метка не нужна. При выделении, ясное дело, тоже

Нет, Вы неправильно поняли мое прошлое сообщение. Я имел ввиду, что при удалении необязательно по индексу кучи, который хранится перед выделенной памятью, восстанавливать идентификатор потока, который память выделил. Однако сам индекс кучи необходим, потому что в функцию HeapFree необходимо передать описатель кучи, из которой память была выделена.

Если мы не знаем индекс кучи (а значит и описатель), то нам нечего передать первым параметром в HeapFree:
BOOL HeapFree(
  HANDLE hHeap,  // handle to the heap
  DWORD dwFlags, // heap freeing flags
  LPVOID lpMem   // pointer to the memory to free
);
... << RSDN@Home 1.2.0 alpha rev. 651>>
Re[7]: Перегрузка new/delete, хранение "метки" для выделенно
От: Risk Server  
Дата: 18.09.06 22:51
Оценка: :)
Здравствуйте, SeninAndrew, Вы писали:

SA>Здравствуйте, Risk Server, Вы писали:



SA>Если мы не знаем индекс кучи (а значит и описатель), то нам нечего передать первым параметром в HeapFree:


Да я уже и сам понял, что ерунду написал. Забыл что нэндл кучи нужен для удаления. А ведь HeapFree мог бы и сам догадаться...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.