Фрагментация диамической памяти ((С,С++))

Модератор: Модераторы разделов

Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Фрагментация диамической памяти

Сообщение korisk »

Существуют ли средства для измерения фрагментации кучи работающего процесса?
Посоветуйте, пожалуйста, средство или метод, чтобы избежать фрагментации кучи в процессе, который вынужден часто выделять и освобождать небольшие кусочки памяти.
Спасибо.
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Фрагментация диамической памяти

Сообщение NickLion »

korisk писал(а):
02.11.2009 21:42
Существуют ли средства для измерения фрагментации кучи работающего процесса?

Зависит от языка, вообще-то ;)
Для C++ можно перегрузить операторы new/delete и встроить механизм подсчета. Для просто C - использовать не malloc/free, а собственные функции, которые потом уже будут malloc/free вызывать и кроме этого делать "черное" дело.
Ну, а еще можно анализировать структуру самой кучи - на предмет этого надо смотреть код - какая структура и как с ней работать.

korisk писал(а):
02.11.2009 21:42
Посоветуйте, пожалуйста, средство или метод, чтобы избежать фрагментации кучи в процессе, который вынужден часто выделять и освобождать небольшие кусочки памяти.

1. Выделение небольших кусочков памяти вынести в отдельную кучу - а потом сносить ее к чертям :) (в том же C++ можно конкретно для этого класса перегрузить new/delete - и не париться больше)
2. Продумать - стоит ли постоянно выделять эти участки? Может стоит завести массив и повторно использовать?
3. Небольшой оффтоп - сборщики мусора теоретически обладают способностью дефрагментации памяти - небольшой плюс в их сторону.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Фрагментация диамической памяти

Сообщение RasenHerz »

korisk писал(а):
02.11.2009 21:42
Существуют ли средства для измерения фрагментации кучи работающего процесса?
Посоветуйте, пожалуйста, средство или метод, чтобы избежать фрагментации кучи в процессе, который вынужден часто выделять и освобождать небольшие кусочки памяти.
Спасибо.

Ну основная часть сделана уже за вас - ядро старается выделять смежные страницы памяти. Лично я каких-то специальных методик не знаю, но думаю если решаемая вами задача требует столь трепетного отношения к управлению памятью, то имеет смысл создать собственный диспетчер памяти (с пулом освобожденной памяти и т.д.). Неплохой пример создания такого диспетчера здесь.
Спасибо сказали: