Есть ли в операционной системе буферизация для malloc ()? - PullRequest
8 голосов
/ 04 сентября 2010

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

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

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

Ответы [ 5 ]

3 голосов
/ 04 сентября 2010

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

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

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

3 голосов
/ 04 сентября 2010

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

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

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

2 голосов
/ 04 сентября 2010

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

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

1 голос
/ 04 сентября 2010

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

0 голосов
/ 04 сентября 2010

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

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

...