Я написал диспетчер памяти ac/C++ для распределений кучи (перегруженный new/delete и malloc/realloc/free, основанный на malloc Doug Lea, но предназначенный для ожидания) и, похоже, некоторые проблемы с фрагментацией. Есть ли хорошие ресурсы там, где подробно описаны стратегии для избежания фрагментации через менеджера?Борьба с фрагментацией в пользовательском менеджере памяти
Обратите внимание, что я не могу переупорядочить выделенную память (не используя интеллектуальные указатели с идентификаторами GUID), и перезаписывать систему для использования пулов вместо распределения кучи нецелесообразно.
Спасибо,
Grant
BTW, как вы делаете dlmalloc без ожидания без перезаписи? Я могу понять, как сделать небольшие выделения в dlmalloc блокируемыми с использованием примитивов SLIST (Atomic list), поскольку они просто зарезервированные по размеру фрилисты, но waitfree немного сложнее. Кроме того, вы должны быть очень осторожны, если вы обрезаете (возвращая память в ОС) без блокировки и безжизненных методов, если вы не используете указатели опасности или сбор мусора, чтобы избежать условия гонки, где вы можете разыменовать связанные узлы, которые были освобожденный обратно в ОС. – Adisak
Система основана только на концепции Дуга Ли (не хочет проходить и изучать код, а затем изменять ее), но если вы дадите каждой ветке свои собственные бункеры и блоки, из которых можно выделить (если вы просто попытаетесь сделать только отдельные бункеры , тогда у вас будут проблемы с объединением последовательных блоков памяти вместе), то функции распределения уже ждут. Все, что вам нужно сделать, это освободить дескрипторы дескриптора в режиме ожидания (что я сделал, просто поместив их все в список, чтобы правильно удалить его из потока владельца). –
Чтобы запросить/вернуть память из ОС, я просто использовал мьютекс. Это единственная часть, которая не является свободной от ожидания, поэтому единственные временные потоки могут блокировать друг друга, когда они одновременно запрашивают новую память из ОС (если что-то хочет отпустить в ОС, но другой поток взаимодействует с ОС, то он просто пропустит это и повторит попытку в более поздней точке приложения). –