Многопоточные средства выделения памяти для C/C++

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

35
задан Yu Hao 17 August 2013 в 17:24
поделиться

5 ответов

Я использовал tcmalloc и чтение о Запасе. У обоих есть подобные реализации, и оба достигают примерно линейной производительности, масштабирующейся относительно количества потоков/Центральных процессоров (согласно графикам на их соответствующих сайтах).

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

И от ссылка trshiv , это похоже на Запас, tcmalloc, и ptmalloc все примерно сопоставимы для скорости. В целом, tt похож на ptmalloc, оптимизирован для взятия как можно меньше комнаты, Запас оптимизирован для компромисса скорости + использование памяти, и tcmalloc оптимизирован для чистой скорости.

17
ответ дан hazzen 27 November 2019 в 07:18
поделиться

Я лично предпочитаю и рекомендую ptmalloc как многопоточное средство выделения. Запас хорош, но в оценке моя команда сделала между Запасом, и ptmalloc несколько лет назад, ptmalloc был лучше. Из того, что я знаю, ptmalloc был вокруг в течение многих лет и вполне широко используется в качестве многопоточного средства выделения.

Вы могли бы найти это сравнение полезный.

5
ответ дан trshiv 27 November 2019 в 07:18
поделиться

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

4
ответ дан Mark Kegel 27 November 2019 в 07:18
поделиться

Мы использовали запас на проекте, где я работал несколько лет назад. Это, казалось, работало отлично. У меня нет опыта iwth другие средства выделения. Это должно быть довольно легко попробовать различные и действительно загружает тестирование, нет?

3
ответ дан jfm3 27 November 2019 в 07:18
поделиться

Единственный способ действительно определить, какой распределитель памяти подходит для вашего приложения, - это попробовать несколько. Все упомянутые распределители были написаны умными людьми и превзойдут другие в том или ином микробенчмарке. Если все, что ваше приложение делает в течение всего дня, - это malloc один 8-байтовый фрагмент в потоке A и освобождает его в потоке B, и ему вообще не нужно обрабатывать что-либо еще, вы, вероятно, могли бы написать распределитель памяти, который превосходит любой перечисленные до сих пор. Это просто не будет очень полезно для чего-то другого. :)

У меня есть некоторый опыт использования Hoard там, где я работаю (достаточно, чтобы одна из наиболее неясных ошибок, исправленных в недавнем выпуске 3.8, была обнаружена в результате этого опыта). Это очень хороший распределитель, но насколько он хорош для вас, зависит от вашей рабочей нагрузки. И вам действительно нужно заплатить за Hoard (хотя это не слишком дорого), чтобы использовать его в коммерческом проекте без использования GPL для вашего кода.

Очень немного адаптированный ptmalloc2 долгое время был распределителем памяти malloc в glibc. сейчас, и поэтому он невероятно широко используется и тестируется. Если стабильность важна превыше всего, это может быть хорошим выбором, но вы не упомянули об этом в своем списке, поэтому я предполагаю, что это не так. Для определенных рабочих нагрузок это ужасно, но то же самое верно и для любого malloc общего назначения.

Если вы готовы платить за это (и цена разумная, по моему опыту), SmartHeap SMP тоже хороший выбор. Большинство других упомянутых распределителей разработаны как вставные замены malloc / free new / delete, которые могут быть LD_PRELOAD. SmartHeap можно использовать и таким образом, но он также включает в себя весь API, связанный с распределением, который позволяет вам точно настраивать ваши распределители в соответствии с вашими предпочтениями. В проведенных нами тестах (опять же, очень специфичных для конкретного приложения) SmartHeap был примерно таким же, как и Hoard, по производительности, когда он действовал как замена вставляемого malloc; реальная разница между ними - степень настройки. Чем менее универсальным должен быть ваш распределитель, тем выше будет производительность.

И в зависимости от вашего варианта использования многопоточный распределитель общего назначения может быть совсем не тем, что вы хотите использовать; если вы постоянно выделяете и освобождаете объекты одинакового размера, вы можете просто написать простой распределитель slab. Распределение Slab используется в нескольких местах ядра Linux, которые соответствуют этому описанию.

11
ответ дан 27 November 2019 в 07:18
поделиться