IPC без блокировки в Linux для многоядерных процессоров


9

Я пытаюсь найти способ написать приложение с IPC без блокировки на Linux, в C, с многоядерными процессорами.

Давайте предположим, что у меня есть процесс 1 и процесс 2, которые пишут в FIFO или разделяемую память. Затем процесс 3 и процесс 4 будут считываться из этой общей памяти или FIFO.

Возможно ли это с помощью алгоритма без блокировки?

Ваше руководство высоко ценится.


Можете ли вы дать некоторые указания или ссылку на внешнюю документацию, касающуюся связи без блокировки? Что подразумевается именно под этим термином?
— Джорджио


Если я правильно понимаю, проблема заключается в одновременных операциях записи (1, 2) и одновременных операциях чтения (3, 4). Синхронизация между писателями и читателями уже обеспечивается алгоритмом, описанным на связанной странице.
— Джорджио

Ответы:


2

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

Механизм, насколько я понимаю, таков:

  • писатель ждет, пока не появится открытый слот (последний + 1! = текущий)
  • писатель пишет запись в кольцевой буфер.
  • писатель обновляет указатель последней записи.

  • читатель ждет, пока в кольцевом буфере не появится доступная запись (последняя! = текущая).

  • читатель обрабатывает запись.
  • считыватель увеличивает текущий указатель.

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


И я нашел это также в википедии, выглядит интересно, не пробовал, хотя concurrencykit.org
— poly

1

Да, это возможно. Мы используем один из алгоритмов очереди без блокировки в нашем проекте. Но эти алгоритмы действительно не очевидны. Если вы хотите понять их глубже, вы должны быть готовы потратить пару месяцев на это.


0

Интер процесс общение не может быть безблокировочным. Только межпоточная. Насколько я знаю.


Я думаю, что «свободный замок» является атрибутом механизма, а не пользователя. Разница между потоками и процессами становится довольно тонкой, когда вы добавляете в смесь такие вещи, как общая память.
— Tylerl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.