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.