Идея стара, но сейчас о ней мало знают / редко пользуются. (А ведь разработка 60х)
Вообще говоря, никто не сказал, что одна куча — это хорошо. Просто — да, но хорошо?!? Слишком часто возникают разные трения. Например, кто-то хапает очень маленькими кусочками, а кто-то большими. Возвращают, но возникает фрагментация памяти. Или другой пример: захват памяти thread'ами. Если памать общая, приходится делать глоабальную блокировку.
Отсюда идея: сделать вариант управления памятью, при котором не просто запрашивают сколько надо, но и из какой кучи (пула). Дальше — интереснее. Пулы можно пополнять динамически (не хватило места — запросим глобальной памяти. Если пул не разделяется между thread'ами, нам и блокировка не нужна (ну, только на момент пополнения). Если разделяется — все равно, блокируются только thread'ы использующие этот пул (блокировка перестает быть глобальной). Мелкие запросы оказываются в одном пуле, крупные — в другом, и фрагментация уменьшается. У пулов может быть общий интрефейс запросов, и разная реализация. Одна из реализаций — когда пул не производит реального возврата памяти (по pool.free(), жадный пул), а возвращает всю память в систему только по уничтожению пула. Жестоко, но иногда очень эффективно.
Описание стандартной Unix-библиотеки есть на Sinlge Unix (посмотрите ссылку в интернет-ресурсах).