Вопрос или проблема
Меня интересует библиотека для управления распределением и освобождением памяти внутри абстрактного слэба. То есть библиотека, которая не использует malloc()
/operator new
/sbrk
, а изначально получает непрерывный диапазон адресов (может быть, я выделил для этого память с помощью malloc(), или, возможно, она управляет пространством на каком-то удаленном устройстве), но принимает запросы на распределение и освобождение и возвращает области внутри слэба. Код управления памятью также не обращается к управляемой памяти; он не знает, что это за память, поэтому не может делать такие вещи, как запись в нее или перемещение ее частей в другое место и т. д.
Требования:
- Бесплатно
- Свободно и с открытым исходным кодом
- Есть документация
- Обратите внимание, что механизм распределения не может использовать слэб/арену для хранения какого-либо состояния (счетчики, указатели и т. д.); он может использовать стандартный аллокатор (например, malloc()/new) или какой-то другой механизм для этого.
Предпочтения:
- Связывание с C или C++
- Написано на современном C++
- Поддерживает предполагаемое/временное распределение (“Мне нужно X байт между абстрактной временной точкой t_1 и абстрактной временной точкой t_2”; это позволяет превышать выделение по всем временным единицам, при условии, что нет превышения по отдельной временной единице.)
- Поддерживает указание требований к выравниванию
- Лучше поддерживает изменение размера, чем выделение нового сегмента и освобождение старого
- Активно поддерживается
Посмотрите на библиотеку boost pool, которая является C++ библиотекой и имеет большинство из искомых вами функций. Она является частью библиотеки boost, которая имеет открытый исходный код, хорошо поддерживается и тестируется в качестве портируемой библиотеки.
В подробной документации о пуле рассматривается, как осуществляется сегментация и распределение памяти. Она очень хорошо документирована с обширными тестовыми случаями.
Ответ или решение
Библиотека управления памятью в стиле «абстрактной слоистой аллокации»
Вопрос о создании библиотеки для управления выделением и освобождением памяти внутри абстрактного "слоя" представляет собой попытку оптимизировать работу с памятью, избегая привязки к стандартным системным вызовам, таким как malloc()
, operator new
и sbrk
. Ниже представлены рекомендации по библиотекам, соответствующим заданным требованиям и предпочтениям, а также некоторые детали реализации подобной библиотеки.
Основные требования
- Бесплатность: Библиотека должна быть доступна без стоимости.
- Открытое программное обеспечение: Она должна быть доступна под лицензией, позволяющей свободное использование, изменение и распространение.
- Документация: Наличие качественной и обширной документации для упрощения интеграции и использования.
- Отсутствие состояния в слое: Библиотека не должна хранить внутренние данные о состоянии в управляемом слое.
Примеры подходящих библиотек
Boost Pool
Одной из наиболее заметных библиотек, которая удовлетворяет большинству заявленных требований, является Boost Pool. Эта библиотека предоставляет механизмы для работы с пулом памяти, которые отвечают следующим критериям:
- Бесплатная и открытая: Boost является проектом с широкой поддержкой, который предоставляет свободный доступ к своему коду.
- Документация: Документация Boost Pool очень подробная и включает примеры использования.
- Поддержка C++: Библиотека написана на современном C++, что соответствует требованиям к стилю кодирования.
Основные функции Boost Pool:
- Управление памятью: Управление сегментами памяти с использованием пула, что позволяет избежать накладных расходов на частые системные вызовы.
- Выравнивание: Поддержка различных требований к выравниванию данных.
- Динамическое управление: Возможность управления временем выделения, что позволяет осуществлять предварительное выделение памяти в большом объёме без создания фрагментации.
Рекомендации по реализации
Если по каким-либо причинам описанная библиотека не подходит, вы можете исследовать возможность создания своей реализации. Учитывая ваши требования, ваша библиотека должна включать следующие функции:
- Пул памяти: Реализуйте пул памяти, использующий контингентные области, предварительно выделенные при помощи
malloc()
, и управляйте с помощью указателей. - Выделение времени: Реализуйте механизм, позволяющий запросить память, связывая время жизни объектов с абстрактными временными метками.
- Поддержка выравнивания: Добавьте поддержку выравнивания по запросу к вашей системе управления памятью.
- Улучшенное управление размером: Используйте стратегию, которая позволяет изменять размер блоков, возможно, через перегруппировку или использование блоков разной степени.
Заключение
Разработка библиотеки для управления "абстрактной слоистой аллокацией" представляет собой интересную задачу, требующую глубокого понимания особенностей работы с памятью. Существующие решения, такие как Boost Pool, могут значительно упростить реализацию и интеграцию. Отказ от использования стандартных функций выделения памяти требует более глубокого анализа архитектуры, но приведённые примеры и рекомендации помогут в достижении поставленных целей.