Lock-free IPC unter Linux für Multi-Core-Prozessoren

9

Ich versuche einen Weg zu finden, eine Anwendung mit sperrfreiem IPC unter Linux in C mit Multi-Core-Prozessoren zu schreiben.

Nehmen wir an, ich habe Prozess 1 und Prozess 2, die in ein FIFO oder einen gemeinsam genutzten Speicher schreiben. Dann lesen Prozess 3 und Prozess 4 aus diesem gemeinsam genutzten Speicher oder FIFO.

Ist dies mit einem sperrfreien Algorithmus möglich?

Ihre Anleitung wird sehr geschätzt.

poly
quelle
Können Sie Hinweise oder Hinweise auf externe Dokumentationen zur sperrenfreien Kommunikation geben? Was ist genau mit diesem Begriff gemeint?
Giorgio
Wenn ich das richtig verstehe, liegt das Problem in den gleichzeitigen Schreibvorgängen (1, 2) und den gleichzeitigen Lesevorgängen (3, 4). Die Synchronisation zwischen Schreibern und Lesern wird bereits durch den auf der verlinkten Seite beschriebenen Algorithmus abgedeckt.
Giorgio

Antworten:

2

Ich habe Hinweise auf die Verwendung von Ringpuffern und den kontrollierten Zugriff auf die Positionszeiger gesehen, um die Notwendigkeit von Sperren zu beseitigen oder zu verringern. Es macht jedoch keine Wartezeiten überflüssig und sollte nur dann funktionieren, wenn ein Ringpuffer einen Schreiber und einen Leser hat. In Ihrem Fall würden Sie mindestens zwei Puffer benötigen.

Der Mechanismus, wie ich ihn verstehe, ist:

  • Der Autor wartet, bis ein offener Steckplatz frei ist (letzte + 1! = aktuell).
  • Der Schreiber schreibt den Eintrag in den Ringpuffer.
  • Der Writer aktualisiert den letzten Eintragszeiger.

  • Der Leser wartet, bis ein Eintrag im Ringpuffer verfügbar ist (last! = current).

  • Leser verarbeitet Eintrag.
  • Der Leser erhöht den aktuellen Zeiger.

Abhängig von der verwendeten Wartezeit kann dies entweder die Latenz für neue Elemente in einer leeren Warteschlange erhöhen oder viele CPU-Zyklen in der Warteschleife brennen. Die Reihenfolge der Aktualisierung des Zeigers und die strikte Trennung des Schreibzugriffs sind entscheidend, damit dies funktioniert. Der Schreiber darf den Ringpuffereintrag nur schreiben, bevor er den Zeiger inkrementiert, um ihn dem Leser zur Verfügung zu stellen.

BillThor
quelle
Und ich habe dieses auch auf der Wikipedia gefunden, sieht interessant aus, habe es aber nicht ausprobiert, obwohl concurrencykit.org
Poly
1

Ja es ist möglich. In unserem Projekt verwenden wir einen der Algorithmen der Warteschlange ohne Sperren. Aber diese Algorithmen sind wirklich nicht offensichtlich. Wenn Sie sie gründlich verstehen wollen, sollten Sie bereit sein, ein paar Monate dafür zu verbringen.

Dmitry Poroh
quelle
0

Die Kommunikation zwischen Prozessen kann nicht sperrenfrei sein. Nur zwischen Threads. Soweit ich weiß.

DeadMG
quelle
Ich denke, "lock free" ist ein Attribut des Mechanismus, nicht des Benutzers. Der Unterschied zwischen Threads und Prozessen wird ziemlich gering, wenn Sie dem Mix Dinge wie Shared Memory hinzufügen.
Tyler