mmalloc это распределитель памяти. Написан полностью с нуля. Основные цели стояли так: "... требуется предельно экономить ОЗУ, поддерживая при этом достаточно высокую производительность ...", т. е. была сделана очередная попытка поиска золотой середины экономичность <---> производительность. И цель в общем достигнута при помощи довольно новой возможности, а именно при помощи прямого постраничного управления виртуальным пространством программы. (в Юниксовом мире скорее всего известна всем, как функция mmap ;-) Также для повышения производительности были использованы AVL деревья.

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

Сравнение с другими распределителями памяти. К сожалению у меня не было достаточно свободного времени, чтобы предложить хорошие тесты, которые бы хорошо эмулировали нагрузки, встречающиеся в реальных программах. Поэтому я решил, что если опубликовать исходные тексты в Сети, то в скором времени кто-то сможет предложить сюда тест и/или результат тестирования/сравнения. Напишите мне.

Стабильность. Эта версия работала всего на нескольких компьютерах, поэтому в ней может быть ошибка. Используйте осторожно. Помните, что я ничего не гарантирую, и то, что mmalloc уже пол-года работает у меня на двух серверах вовсе не значит, что он также хорошо будет работать у вас. Но конечно, вы можете попробовать, и если найдете ошибку, то, пожалуйста, напишите мне.

1