Разрушитель - Кольцевой буфер

Я изучаю исходный код LMAX Disruptor и попал в RingBuffer абстрактный класс. Почему в RingBufferPad ровно 7 длинных полей (p1...p7)? Вот фактический код: https://github.com/LMAX-Exchange/disruptor/blob/master/src/main/java/com/lmax/disruptor/RingBuffer.java

abstract class RingBufferPad
{
    protected long p1, p2, p3, p4, p5, p6, p7;
}

abstract class RingBufferFields<E> extends RingBufferPad
{
....

person Humoyun Ahmad    schedule 12.08.2015    source источник
comment
Это связано с ложным обменом, см.: stackoverflow.com/a/28181831/950252 en.wikipedia.org/wiki/False_sharing   -  person Justin    schedule 12.08.2015


Ответы (1)


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

Здесь предполагается, что длина строки кэша процессора составляет 64 байта (и это на большинстве архитектур, например, процессоры ARM, AMD и Intel). Использование 7 longs несколько параноидально, поскольку заголовок будет состоять минимум из 8 байтов, максимум из 16 байтов (с выравниванием распределения), поэтому 6 или даже 5 значений long будет достаточно.

person Peter Lawrey    schedule 12.08.2015
comment
Ложное совместное использование не приходило в голову, на самом деле в официальном документе LMAX упоминалась строка кэша, увидев ваш ответ, я вспомнил об этом, но, похоже, я не воспринял это всерьез, в любом случае спасибо, что направили меня в нужное место. - person Humoyun Ahmad; 13.08.2015
comment
Я нашел очень полезную статью Мартина Томпсона (Mechanical Sympathy) о ложном обмене информацией механический -sympathy.blogspot.kr/2011/07/false-sharing.html - person Humoyun Ahmad; 13.08.2015
comment
Какое значение long фактически используется в классе кольцевого буфера и может быть ложно передано? Насколько я понимаю, Sequencer — это класс, содержащий long, который может быть ложно передан. - person shibumi; 06.06.2018
comment
@shibumi, если вы создадите два RingBuffers, они могут использовать одну и ту же строку кэша без заполнения. - person Peter Lawrey; 06.06.2018
comment
@PeterLawrey Согласен. Но какая часть состояния кольцевого буфера дополняется, чтобы избежать ложного совместного использования. Разве массив объектов уже не дополнен BUFFER_PAD с обеих сторон вместе с секвенсором? Я не программист Java, поэтому я могу упустить здесь что-то фундаментальное. Спасибо. - person shibumi; 07.06.2018
comment
Массивы @shibumi являются объектами и не являются частью объекта кодирования. Теоретически они могут быть где угодно в памяти. - person Peter Lawrey; 07.06.2018
comment
@PeterLawrey Я не понимаю заголовок, строка кэша составляет 64 байта. Значение дополняется как слева, так и справа длиной 7, оставляя 4 байта пространства. Почему он не дополняет еще один длинный, чтобы сделать его 64-байтовым? Я думаю, что могу упустить здесь какую-то фундаментальную вещь, но извините за глупость. - person chrisckwong821; 16.01.2021