mmalloc это распределитель памяти. Написан полностью с нуля. Основные цели
стояли так: "... требуется предельно экономить ОЗУ, поддерживая при этом
достаточно высокую производительность ...", т. е. была сделана очередная
попытка поиска золотой середины
экономичность <---> производительность. И цель в общем
достигнута при помощи довольно новой возможности, а именно при помощи
прямого постраничного управления виртуальным пространством программы.
(в Юниксовом мире скорее всего известна всем, как функция mmap ;-) Также для
повышения производительности были использованы AVL деревья.
Основные преимущества этого распределителя памяти:
- Trimming и "no commit". mmalloc освобождает страницы памяти для
системы сразу после того, как они освобождаются соответствующими
вызовами mfree (но не в мире Windows). И все выделенные страницы не
заполняются какой-либо информацией этой библиотекой, это предстоит делать
пользовательской программе. Поэтому правдиво такое правило:
"ЛЮБАЯ НЕИСПОЛЬЗУЕМАЯ ПРОГРАММОЙ СТРАНИЦА БУДЕТ ВСЕГДА ПРЕДОСТАВЛЕНА
ОС".
- Best-fit. Использована хорошо известная стратегия Best-fit. Как
показали эксперементы на реальных задачах, best-fit показывает более
экономичное и дефрагментированное распределение, нежели first-fit.
- AVL деревья. Основная внутренняя структура для управления
распределением больших блоков (>256 байт модифицируемо).
Поэтому время затраченное на выделение нового блока пропорционально
O(log N), где N это количество пустых и занятых фрагментов памяти.
Реализация выполнена на языке C и достаточно хорошо соптимизирована.
- Малые блоки сгруппированы. Небольшие блоки группируются в пределах
одной страницы, что позволяет экономичнее распределять память. Если выполнить
mmalloc(1) 100000 раз, то реально будет затрачено ~130k.
- Умное выравнивание. Блоки размером меньше, чем MALLOC_ALIGN
(модифицируемо) не выравниваются. (типичным размером блока для
платформы i386 - < 4 bytes). Все остальные блоки выравниваются под
границу MALLOC_ALIGN.
- Небольшие потери памяти. Для больших блоков потери составляют
32 байта на блок. Для блоков длиной 256 байт, такие потери составят примерно
12.5%. Для еще больших блоков эти потери еще меньше заметны. Малые же
блоки группируются в пределах одной страницы, и результирующие потери
уже будут меньше 1% (8/400*100%).
- Чистый ANSI-C. Не используются расширения различных реализаций
языка C, поэтому библиотека потенциально легко переносима. Непереносимыми
являются только vmm функции, которые зависят от операционной системы.
Сравнение с другими распределителями памяти. К сожалению у меня не было
достаточно свободного времени, чтобы предложить хорошие тесты, которые бы
хорошо эмулировали нагрузки, встречающиеся в реальных программах. Поэтому я
решил, что если опубликовать исходные тексты в Сети, то в скором времени
кто-то сможет предложить сюда тест и/или результат тестирования/сравнения.
Напишите мне.
Стабильность. Эта версия работала всего на нескольких компьютерах,
поэтому в ней может быть ошибка. Используйте осторожно. Помните, что я ничего
не гарантирую, и то, что mmalloc уже пол-года работает у меня на двух серверах
вовсе не значит, что он также хорошо будет работать у вас. Но конечно, вы
можете попробовать, и если найдете ошибку, то, пожалуйста,
напишите мне.