Распределитель небольших блоков в Linux (или RedHat Linux), чтобы избежать фрагментации памяти - PullRequest
2 голосов
/ 10 марта 2010

Я знаю, что есть распределитель для пользовательских приложений, который обрабатывает большое количество небольших блоков в HP-UX текст ссылки и в Windows XP куча с низкой фрагментацией . В HP-UX можно настроить распределитель, а в Windows XP он считает блок размером менее 16 К как маленький.

Моя проблема в том, что я не могу найти никакой информации об этом типе распределителя для пользовательских программ, работающих в Linux (на самом деле RedHat Linux). Если есть такой распределитель, я бы на самом деле хотел бы узнать, какой максимальный размер блоков он может обработать.

<ч /> Обновление
Я нашел jemalloc (http://www.canonware.com/jemalloc/). Он обрабатывает маленькие, большие и огромные блоки: http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html#size_classes.

Ответы [ 4 ]

3 голосов
/ 10 марта 2010

Redhat Linux или любые дистрибутивы на основе Linux в основном используют DL-Malloc (http://gee.cs.oswego.edu/dl/html/malloc.html).

Для пользовательских приложений, как указал Кирилл, лучше использовать отдельные распределители памяти, если фрагментация больше из-за меньших блоков.

Если пользовательское приложение маленькое, вы можете попробовать использовать размещение C ++ new / delete, которое может переопределить шаблон распределителя по умолчанию. (http://en.wikipedia.org/wiki/Placement_syntax)

3 голосов
/ 10 марта 2010

В качестве независимого от платформы решения попробуйте Boost.Pool Библиотека. Он имеет интерфейс pool, который может обрабатывать блоки любого размера. Вы также можете использовать pool_alloc, которые удовлетворяют требованиям Стандартного распределителя.

В качестве решения для конкретной платформы вы можете попробовать функцию mallopt из библиотеки glibc. Но, насколько я знаю, для небольших блоков это не поможет.

1 голос
/ 10 марта 2010

Это распределитель общего назначения, но куча Hoard утверждает, что имеет "строгие ограничения для фрагментации" [1] :

Все блоки в суперблоке имеют одинаковый размер учебный класс. Используя классы размера, которые являются степенью b друг от друга (где b больше 1) и округляя запрошенный размер до ближайшего класса, мы ограничиваем внутреннюю фрагментацию наихудшего случая в пределах блок с коэффициентом б. Чтобы уменьшить внешнюю фрагментацию, мы перерабатываем абсолютно пустые суперблоки для повторного использования в любом размере класс.

Не знаю, поможет ли это, но достаточно просто попробовать.

0 голосов
/ 08 апреля 2011

TCMalloc: Malloc с кэшированием потоков

Найдена хорошая альтернатива распределителю Linux по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...