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.
c
linux
multithreading
poly
quelle
quelle
Antworten:
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 Writer aktualisiert den letzten Eintragszeiger.
Der Leser wartet, bis ein Eintrag im Ringpuffer verfügbar ist (last! = current).
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.
quelle
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.
quelle
Die Kommunikation zwischen Prozessen kann nicht sperrenfrei sein. Nur zwischen Threads. Soweit ich weiß.
quelle