Forum: PC-Programmierung Prozesskommunikation: FIFO vs SHM


von Michael F. (startrekmichi)


Lesenswert?

Hi

Folgendes Szenario:
Auf einem kleinen Rechner (ARM A9 mit Linux) laufen vier Prozesse. Die 
ersten drei Prozesse kümmern sich um Messung, Auswertung, Regelung und 
der vierte ist dafür zuständig das angeschlossene Xbee Funkmodem 
anzusteuern. Vom anderen Ende der Funkverbindung kann man bestimmte 
Datenpakete anfordern, die dann zyklisch (einstellbar 20-1000ms) 
versendet werden sollen. Diese Daten werden in den anderen drei 
Prozessen erzeugt und müssen irgendwie zum Xbee kommen. Jetzt gibt es 
zwei Möglichkeiten das Ganze zu realisieren:

1) In jedem der drei Prozesse gibt es einen Scheduler, der sich um das 
zyklische Senden der Daten des jeweiligen Prozesses kümmert. Wenn Daten 
versendet werden müssen, gehen diese über ein FIFO an den vierten 
Prozess. Dieser baut noch das Xbee API-Frame außen rum und gibt dann das 
Paket an das Xbee.

2) Alle Daten, die überhaupt angefordert werden können, werden in jedem 
Zyklus (10ms) in ein Shared Memory geschrieben. Der einzige Scheduler 
läuft im vierten Prozess und holt dann bei Bedarf die Daten aus dem SHM.

Welche Methode ist die bessere? Funktionieren tun prinzipiell beide 
(bereits getestet, wobei 2 noch nicht voll ausgebaut ist). Beide 
Versionen parallel zu pflegen macht keinen Sinn.

Nr 1 wäre besser gekapselt, allerdings muss in jedem Prozess ein 
Scheduler sein, sprich im Endeffekt dreimal der fast gleiche Code. 
Außerdem ist die Frage, wie sinnvoll/nötig diese Kapselung überhaupt 
ist. Dafür werden nur Daten herumgesendet, wenn es wirklich nötig ist.

Leistungsmäßig ist der Unterschied nicht groß, 2 verbraucht ganz 
geringfügig mehr Rechenzeit, weil zusätzlich Daten ins SHM kopiert 
werden müssen, auch wenn diese gar nicht (oder zumindest nicht so oft) 
verwendet werden.

Im Moment tendiere ich zu 1, aber was meint ihr?

mfg
 Michi

von Klaus W. (mfgkw)


Lesenswert?

Es gibt noch mehr Möglichkeiten (TCP, UDP, Unix domain sockets).

Letztlich kann man es mit jeder Variante machen, also kannst du nehmen, 
was dir am elegantesten vorkommt.

TCP-Sockets oder unix domain sockets haben den Vorteil, daß sie 
bidirektional sind.
Man könnte also die Datenlieferanten einfach auf eine Anfrage warten 
lassen, dann liefern sie ihren Wert.
Den Takt gibt damit das Empfängerprogramm vor, was die Lieferanten 
einfach hält.

von Rolf Magnus (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Es gibt noch mehr Möglichkeiten (TCP, UDP, Unix domain sockets).
>
> Letztlich kann man es mit jeder Variante machen, also kannst du nehmen,
> was dir am elegantesten vorkommt.
>
> TCP-Sockets oder unix domain sockets haben den Vorteil, daß sie
> bidirektional sind.

Dafür haben zumindest die TCP-Sockets einen relativ großen Overhead, 
weil sämtliche Daten zweimal durch den IP-Stack müssen.

> Man könnte also die Datenlieferanten einfach auf eine Anfrage warten
> lassen, dann liefern sie ihren Wert.
> Den Takt gibt damit das Empfängerprogramm vor, was die Lieferanten
> einfach hält.

Dazu braucht man aber nicht unbedingt einen bidirektionalen Datenkanal. 
Da reicht auch eine Semaphore.

Prinzipiell ist shared memory die effizienteste Lösung, weil die Daten 
nicht wie bei den anderen Varianten mehrfach umkopiert werden müssen. 
Dafür muß man sich dann aber darum kümmern, daß ein Prozess nicht gerade 
dann darin liest, wenn ein anderer die Daten überschreibt. Bei FIFOs, 
Sockets, u.s.w. ergibt sich das von selbst.

von Michael F. (startrekmichi)


Lesenswert?

Rolf Magnus schrieb:
> Prinzipiell ist shared memory die effizienteste Lösung, weil die Daten
> nicht wie bei den anderen Varianten mehrfach umkopiert werden müssen.
> Dafür muß man sich dann aber darum kümmern, daß ein Prozess nicht gerade
> dann darin liest, wenn ein anderer die Daten überschreibt. Bei FIFOs,
> Sockets, u.s.w. ergibt sich das von selbst.

In meinem Fall gilt das allerdings nur eingeschränkt, weil ich mir 
manchmal das kopieren ins SHM sparen kann (wenn die Daten nämlich gar 
nicht angefordert wurden).


Aber im Endeffekt ist es wohl wirklich relativ egal, welche Version 
verwendet wird (deshalb konnten wir uns hier nämlich auch nicht 
entscheiden). Somit bleibt es dann bei den FIFOs, da ist nämlich weniger 
Arbeit nötig.

mfg
 Michi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.