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.