2009-02-24 2 views
0

Я написал диспетчер памяти ac/C++ для распределений кучи (перегруженный new/delete и malloc/realloc/free, основанный на malloc Doug Lea, но предназначенный для ожидания) и, похоже, некоторые проблемы с фрагментацией. Есть ли хорошие ресурсы там, где подробно описаны стратегии для избежания фрагментации через менеджера?Борьба с фрагментацией в пользовательском менеджере памяти

Обратите внимание, что я не могу переупорядочить выделенную память (не используя интеллектуальные указатели с идентификаторами GUID), и перезаписывать систему для использования пулов вместо распределения кучи нецелесообразно.

Спасибо,
Grant

+0

BTW, как вы делаете dlmalloc без ожидания без перезаписи? Я могу понять, как сделать небольшие выделения в dlmalloc блокируемыми с использованием примитивов SLIST (Atomic list), поскольку они просто зарезервированные по размеру фрилисты, но waitfree немного сложнее. Кроме того, вы должны быть очень осторожны, если вы обрезаете (возвращая память в ОС) без блокировки и безжизненных методов, если вы не используете указатели опасности или сбор мусора, чтобы избежать условия гонки, где вы можете разыменовать связанные узлы, которые были освобожденный обратно в ОС. – Adisak

+0

Система основана только на концепции Дуга Ли (не хочет проходить и изучать код, а затем изменять ее), но если вы дадите каждой ветке свои собственные бункеры и блоки, из которых можно выделить (если вы просто попытаетесь сделать только отдельные бункеры , тогда у вас будут проблемы с объединением последовательных блоков памяти вместе), то функции распределения уже ждут. Все, что вам нужно сделать, это освободить дескрипторы дескриптора в режиме ожидания (что я сделал, просто поместив их все в список, чтобы правильно удалить его из потока владельца). –

+0

Чтобы запросить/вернуть память из ОС, я просто использовал мьютекс. Это единственная часть, которая не является свободной от ожидания, поэтому единственные временные потоки могут блокировать друг друга, когда они одновременно запрашивают новую память из ОС (если что-то хочет отпустить в ОС, но другой поток взаимодействует с ОС, то он просто пропустит это и повторит попытку в более поздней точке приложения). –

ответ

0

Посмотрите, как это делают более зрелые проекты, такие как glibc.

Быстрый поиск в Google this с таблицей ссылок.

+0

FWIW, dlmalloc довольно зрелый. Дуг Ли работает над этим с 1987 года. Кроме того, он был основным разработчиком библиотеки GNU C++ (libg ++). Если вы используете «стандартный» malloc во многих библиотеках C и C++, вы уже используете dlmalloc. – Adisak

Смежные вопросы