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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.