LINUX.ORG.RU

LockFree очередь сообщений в shared memory - какие хорошие реализации?


1

4

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

  • retcode_t push(void* data, int size);
  • retcode_t pop(void* data, int max_size, int* size);

При том это все рабоатет на уровне сообщения. Т.е. если вставили тру кусочка по 100, 200, и 300 то и выберем 100, 200, 300 а не 600 одним куском.

Хотелось бы это сделать без блокировок. Писателей/читателей от 4 до 50

★★★
Ответ на: комментарий от vertexua

Вы о чем? На память и лепится.

typedef volatile int32_t rx_atomic_int32_t;
rx_shm_area_open("rx_lock_test", sizeof (rx_atomic_int32_t), &shm);
rx_atomic_int32_t* data = (rx_atomic_int32_t*) shm.data;
Вот у тебя и указатель на volatile память. И этот указатель используешь в атомиках

vromanov ★★★
() автор топика
Ответ на: комментарий от vertexua

не пиши того, чего не знаешь.

volatile влияет только на оптимизации, не давая компилятору поместить переменную в более удобное место после чтения и туда обращаться. её антагонист в c++ - слово __restrict

а про кэши не надо анекдоты пороть

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от vromanov

А никто не смотрел какую задержку вносят атомарные операции? По идее обращения с других ядер блокируется, учитывая что доступ к памяти относительно медленный, пару сотен тактов на каждом ядре будет простой.

Удалось найти готовую реализацию?

pulo
()
Ответ на: комментарий от pulo

Не удалось :(. Похоже будем делать свое.

vromanov ★★★
() автор топика
Ответ на: комментарий от pulo

В память никто не ходит. В пределах одного сокета механизм обеспечения когерентности работает быстро. На мультисокетной конфигурации данные и запросы на ownership гоняются через QPI, что значительно быстрее памяти, но всё равно медленно. Поэтому правильные люди стараются не гадить в одну строчку памяти из нескольких ядер, даже спинлоки специальные есть, которые поллят память на своей строчке, добавляемой в список waiter'ов этого спинлока.

mv ★★★★★
()
Ответ на: комментарий от mv

На счет строчек не понял, о чем речь? Памяти без разницы с какого адреса чтение-запись атомарно происходит, блокируется она вся - я правильно понимаю?

pulo
()
Ответ на: комментарий от pulo

Вся не блокируется, слишком жирно. В интеловских мануалах всё расписано, в книжке у Дреппера тоже.

mv ★★★★★
()
Ответ на: комментарий от mv

У Дреппера такого не нашел. Не представляю как без блокировки шины можно обеспечить атомарность доступа, к памяти же обращаться может не только процессор.

pulo
()
Ответ на: комментарий от pulo

У Дреппера такого не нашел. Не представляю как без блокировки шины можно обеспечить атомарность доступа, к памяти же обращаться может не только процессор.

Со времён встроенного в процессор контроллера памяти - только процессор.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.