8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)? 8>Знаю про SmartHeap от microquill и про Doug Lea's malloc.
8>Может кто своей реализацией поделится ?
Ещё есть QuickHeap, в одном из опубликованных номеров RSDN журнала есть статья с кодом объясняющим как он работает.
Када-то писал свой пул памяти, и он даже неплохо и довольно быстро работал, но сейчас уже не найду код.
---=== С наилучшими пожеланиями, Phoenics ===--- _
Здравствуйте, 8bit, Вы писали:
8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)? 8>Знаю про SmartHeap от microquill и про Doug Lea's malloc.
Для параллельных систем рулит Hoard — http://www.hoard.org/
Здравствуйте, 8bit, Вы писали:
8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)? 8>Знаю про SmartHeap от microquill и про Doug Lea's malloc.
Здравствуйте, Phoenics, Вы писали:
8>>Может кто своей реализацией поделится ?
P>Ещё есть QuickHeap, в одном из опубликованных номеров RSDN журнала есть статья с кодом объясняющим как он работает. P>Када-то писал свой пул памяти, и он даже неплохо и довольно быстро работал, но сейчас уже не найду код.
Если топикастеру интересно, я могу набросать схему классов своего менеджера и описать как он работал, т.к. примерно помню его устройство
---=== С наилучшими пожеланиями, Phoenics ===--- _
Здравствуйте, Phoenics, Вы писали:
P>Если топикастеру интересно, я могу набросать схему классов своего менеджера и описать как он работал, т.к. примерно помню его устройство
Здравствуйте, Cyberax, Вы писали:
8>>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)? 8>>Знаю про SmartHeap от microquill и про Doug Lea's malloc. C>Для параллельных систем рулит Hoard — http://www.hoard.org/ nedmalloc
nedmalloc is a VERY fast, VERY scalable, multithreaded memory allocator with little memory fragmentation. It is faster in real world code than Hoard, faster than tcmalloc, faster than ptmalloc2 and it scales with extra processing cores better than Hoard, better than tcmalloc and better than ptmalloc2 or ptmalloc3. Put another way, there is no faster portable memory allocator out there! Unlike other allocators, it is written in C and so can be used anywhere and it also comes under the Boost software license which permits commercial usage.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Менеджеры памяти
От:
Аноним
Дата:
12.01.08 09:53
Оценка:
Здравствуйте, Vain, Вы писали:
Подскажите пожалуйста позволит ли Thread malloc или nedmalloc бороться с фрагментацией памяти? Вообще оправданно ли использование менеджера памяти для борьбы с фрагментацией памяти или проще хранить данные в статических массивах? В моем случаи макимум требуеться 10-12mb памяти.
Текущая реализация использует malloc/free память выделяеться блоками по 64/512-1024 байт, но выделяеться и отдаеться очень активно. В результате примерно через 5 дней непрерывной работы появляеться ошибка что невозможно выделить память. После рестарта виндовс все работает нормально.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Vain, Вы писали:
А>Подскажите пожалуйста позволит ли Thread malloc или nedmalloc бороться с фрагментацией памяти? Вообще оправданно ли использование менеджера памяти для борьбы с фрагментацией памяти или проще хранить данные в статических массивах? В моем случаи макимум требуеться 10-12mb памяти.
Что значит "хранить данные в статических массивах"?
А>Текущая реализация использует malloc/free память выделяеться блоками по 64/512-1024 байт, но выделяеться и отдаеться очень активно. В результате примерно через 5 дней непрерывной работы появляеться ошибка что невозможно выделить память. После рестарта виндовс все работает нормально.
Это у вас наверно что-то с ликами, а может и с таймером, здесь трудно гадать.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: Менеджеры памяти
От:
Аноним
Дата:
12.01.08 11:08
Оценка:
Здравствуйте, Vain, Вы писали:
V>Что значит "хранить данные в статических массивах"?
использовать автоматичские переменные или выделить один раз 12mb и размещать в этом блоке памяти свои переменные (у меня список который все время перестраиваеться поэтому множество постоянных вызовов malloc/free).
V>Это у вас наверно что-то с ликами, а может и с таймером, здесь трудно гадать.
скажите пожалуйста что может быть с таймером ?
память скорей всего не течет так как проверял N раз код сам и еще проверял утечки средствами vs и memwatch
Здравствуйте, Аноним, Вы писали:
V>>Что значит "хранить данные в статических массивах"? А>использовать автоматичские переменные или выделить один раз 12mb и размещать в этом блоке памяти свои переменные (у меня список который все время перестраиваеться поэтому множество постоянных вызовов malloc/free).
Конечно выделить раз непрерывный кусок в хипе, благо сегодня 12мб не 12гб.
V>>Это у вас наверно что-то с ликами, а может и с таймером, здесь трудно гадать. А>скажите пожалуйста что может быть с таймером ?
Ну если где-то арифметика из float'а в int округляется криво. Да тут можно гадать сколько угодно! А>память скорей всего не течет так как проверял N раз код сам и еще проверял утечки средствами vs и memwatch
Трудно здесь что-то сказать, можно посоветовать заменить функции выделения памяти и посмотреть лики какими нибудь другими средствами.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)? 8>Знаю про SmartHeap от microquill и про Doug Lea's malloc.
DougLee неплох. Единственное, что у него баг в спин-блокировке, там вызывается Sleep(0), и если память выделяют потоки с разынми приоритетами на 1-процессорной машине, то иногда все зависает.
Ядро NT с этим разбирается, а вот операционка Windows CE зависала намертво вся (один из потоков в программе был с повышенным приоритетом).
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, Phoenics, Вы писали:
P>>Если топикастеру интересно, я могу набросать схему классов своего менеджера и описать как он работал, т.к. примерно помню его устройство
8>Да, если не затруднит.
Схема visio здесь: http://files.rsdn.ru/59213/MemoryManager.rar
Там присутсвует статическая модель(почти для всех классом, их методов и членов добавлены комантарии и примечания, поясняющие что это, зачем это нужно и иногда даже как примерно работает) и сиквенс модель где представлен примерный процесс выделения памяти.
Хочется ещё раз напонимать что это сильно примерный набросок сделанный попамяти, так что за ляпы присуствие которых я вполне допускаю ногами чур не бить В статической модели приведены только наиболее важные методы и члены позволяющие понять общий приницп работы, всякую мишуру тащить не стал.
---=== С наилучшими пожеланиями, Phoenics ===--- _
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Vain, Вы писали:
А>Подскажите пожалуйста позволит ли Thread malloc или nedmalloc бороться с фрагментацией памяти? Вообще оправданно ли использование менеджера памяти для борьбы с фрагментацией памяти или проще хранить данные в статических массивах? В моем случаи макимум требуеться 10-12mb памяти.
А>Текущая реализация использует malloc/free память выделяеться блоками по 64/512-1024 байт, но выделяеться и отдаеться очень активно. В результате примерно через 5 дней непрерывной работы появляеться ошибка что невозможно выделить память. После рестарта виндовс все работает нормально.
А как добиться фрагментации??? Расскажите по шагам, при каких уловиях возникнет эта самая фрагментация? Только не так: выделим память разных размеров, потом удалим, получим кусочек малого размера и при следующей аллокации получим дырку и это типа фрагментация.
Я хочу увидеть логику возникновения постоянно возрастающего числа 'дырок' в памяти, которые собственно и приведут к фрагментации и исчерпанию памяти. А то сам я что-то не могу придумать такого сценария...
[EOF]
Let it be! — Давайте есть пчелу!
Re[5]: Менеджеры памяти
От:
Аноним
Дата:
15.01.08 20:33
Оценка:
Здравствуйте, trophim, Вы писали:
T>Я хочу увидеть логику возникновения постоянно возрастающего числа 'дырок' в памяти, которые собственно и приведут к фрагментации и исчерпанию памяти. А то сам я что-то не могу придумать такого сценария...
В моем случаи есть N списков размер каждого элемента списка 64/512-1024 байт
В минуту создаеться и удаляеться M элементов списка M минимум 200 максимум 3-4 тысячи.
После 5 суток работы в логах появляються сообщения что не возможно выделить память.
После перезагрузки все нормально.
На 98% уверен что память не течет так как проверял код много раз именно на мемору лиик.
Re[5]: Менеджеры памяти
От:
Аноним
Дата:
15.01.08 20:50
Оценка:
Здравствуйте, trophim, Вы писали:
T>Я хочу увидеть логику возникновения постоянно возрастающего числа 'дырок' в памяти, которые собственно и приведут к фрагментации и исчерпанию памяти. А то сам я что-то не могу придумать такого сценария...
Еще уточнения
максимум мне требуеться 10-12mb но это теоретически в практики я не видел что бы списки были более 3mb в моем приложении.
у себя на PC оставлял на 3 суток (выходные добиться эфекта не смог) даже если добюсь что я могу сделать ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, trophim, Вы писали:
T>>Я хочу увидеть логику возникновения постоянно возрастающего числа 'дырок' в памяти, которые собственно и приведут к фрагментации и исчерпанию памяти. А то сам я что-то не могу придумать такого сценария...
А>Еще уточнения А>максимум мне требуеться 10-12mb но это теоретически в практики я не видел что бы списки были более 3mb в моем приложении. А>у себя на PC оставлял на 3 суток (выходные добиться эфекта не смог) даже если добюсь что я могу сделать ?
Теоритически можно внедрить дефрагментацию памяти, наверное есть уже готовые решения, сходу что приходит в голову например менеджер памяти указатель на выделенный блок хранит у себя, а пользователю отдаёт указатель на этот указатель. Соответственно менеджер может свободно переместить блок памяти куда угодно, заменив указатель на него. Хотя это потребует наверное довольно глубокого вмешательства в программу.
Ещё можно попробовать добавить в используемый менеджер функцию логгирования которая будет сбрасывать на диск дамп в примерно таком виде:
1. адрес1-адрес2 РазмерБлока1 Занят/свободен
2. адрес3-адрес4 РазмерБлока2 Занят/свободен
3. ...
на основе такого отчёта можно было бы судить о том насколько сильно фрагментирована память...
---=== С наилучшими пожеланиями, Phoenics ===--- _
Re[7]: Менеджеры памяти
От:
Аноним
Дата:
16.01.08 08:22
Оценка:
Здравствуйте, Phoenics, Вы писали:
P>Ещё можно попробовать добавить в используемый менеджер функцию логгирования которая будет сбрасывать на диск дамп в примерно таком виде: P>1. адрес1-адрес2 РазмерБлока1 Занят/свободен P>2. адрес3-адрес4 РазмерБлока2 Занят/свободен P>3. ... P>на основе такого отчёта можно было бы судить о том насколько сильно фрагментирована память...
Спасибо за идею.
Я могу сбрасывать такой дам при обработки ошибки выделения памяти у клиента.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, trophim, Вы писали:
T>>Я хочу увидеть логику возникновения постоянно возрастающего числа 'дырок' в памяти, которые собственно и приведут к фрагментации и исчерпанию памяти. А то сам я что-то не могу придумать такого сценария...
А>В моем случаи есть N списков размер каждого элемента списка 64/512-1024 байт А>В минуту создаеться и удаляеться M элементов списка M минимум 200 максимум 3-4 тысячи.
Можно элементы сгруппировать по размерам и для каздого размера завести свой менеджер памяти. Ну а менеджеры пусть выделяют блоки одинакового размера. Тогда каждый менеджер всегда будут работать с блоками одинакового размера и дефрагментации не будет.
Правда существует вероятность перерасхода памяти ввиду очень неплотного заполнения, но это в принципе можно свести к минимуму каким-нибудь хитрым алгоритмом выделения объектов на используемых блоках (например выделять объекты на наиболее заполненных блоках).
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Phoenics, Вы писали:
P>>Ещё можно попробовать добавить в используемый менеджер функцию логгирования которая будет сбрасывать на диск дамп в примерно таком виде: P>>1. адрес1-адрес2 РазмерБлока1 Занят/свободен P>>2. адрес3-адрес4 РазмерБлока2 Занят/свободен P>>3. ... P>>на основе такого отчёта можно было бы судить о том насколько сильно фрагментирована память...
А>Спасибо за идею. А>Я могу сбрасывать такой дам при обработки ошибки выделения памяти у клиента.
И все же хоть убейте, не могу понять, как можно достичь фрагментации памяти, если выделять надо 10-12Мб. Менеджер что, не объединяет соседние пустые блоки??? Тут два варианта: либо утечка памяти, либо какой-то странный алгоритм работы менеджера памяти.
З.Ы. Может все же кто-то раскажет, каким же образом можно достичь фрагментации памяти, которая приведет к ее исчерпанию?