Есть ли в операционной системе буферизация для malloc()?

Многие c/malloc() в for/while/do могут занимать много времени, поэтому мне любопытно, буферизует ли какая-либо операционная система память для быстрых malloc.

Я размышлял, смогу ли я ускорить работу malloc, написав "жадную" оболочку для malloc. Например, когда я запрашиваю 1 МБ памяти, начальный распределитель выделит 10 МБ, а на 2-м, 3-м, 4-м и т. Д. Вызов функции malloc просто вернет память из чанка, сначала выделенного "нормальным" способом. Конечно, если недостаточно памяти, вам нужно выделить новый жадный кусок памяти.

Почему-то я думаю, что кто-то должен был сделать это или что-то подобное раньше. Поэтому мой вопрос прост: это что-то, что значительно ускорит процесс выделения памяти. (да, я мог бы попробовать это, прежде чем задавать вопрос, но мне просто лень писать такую ​​вещь, если в этом нет необходимости)

5 ответов

Решение

Все версии malloc() в некоторой степени выполните буферизацию типа, который вы описываете - они будут захватывать больший кусок, чем текущий запрос, и использовать большой кусок для удовлетворения нескольких запросов, но только до некоторого размера запроса. Это означает, что множественные запросы на 16 байтов за раз будут требовать больше памяти от операций ввода-вывода один раз каждые 50-100 вызовов или что-то в этом роде.

Что менее ясно, так это размер границы. Вполне возможно, что они выделяют относительно небольшое кратное 4 КиБ за раз. Большие запросы - запросы размера MiB - будут возвращаться в систему для получения дополнительной памяти каждый раз, когда запрос не может быть выполнен из списка свободных. Этот порог, как правило, значительно меньше, чем 1 МБ.

Некоторые версии malloc() позволяют настраивать их характеристики распределения в большей или меньшей степени. Это была плодородная область исследований - множество различных систем. См. Кнут "Искусство компьютерного программирования", том 1 ("Фундаментальные алгоритмы"), где приведен один из вариантов обсуждения.

Просматривая код Google Chrome некоторое время назад, я обнаружил http://www.canonware.com/jemalloc/. Это бесплатная, универсальная и масштабируемая реализация malloc.

По-видимому, он используется во многих проектах, так как обычно он превосходит стандартные реализации malloc во многих реальных сценариях (много небольших выделений вместо нескольких больших).

Определенно стоит посмотреть!

Этот метод называется Slab Allocator, и большинство операционных систем поддерживают его, но я не могу найти информацию, которая доступна для malloc пользовательского пространства, только для выделения ядра.

Вы можете найти статью Джеффа Бонвика здесь, где описывается оригинальная техника на Solaris.

У Google есть жадная реализация malloc(), которая делает примерно то, о чем вы думаете. У него есть некоторые недостатки, но он очень быстр во многих случаях использования.

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

Если вы можете написать собственный диспетчер памяти в пользовательском пространстве для своей программы и вызывать malloc() только тогда, когда вам нужно больше памяти для пула, вы, вероятно, увидите уменьшение задержки.

Другие вопросы по тегам