Fork() und Prozesse
-
Liebe C++ Gemeinde!
Ich habe ein paar spezielle Fragen über ein C++-Projekt, das ich unter Ubuntu 11.4 durchführen möchte. Der Prozessor, den mein Notebook besitzt, ist ein Core2 Duo. Also etwas betagt! Ich wollte die Rechenleistung des Prozessors effizient nutzen. :p
Grobe Beschreibung des Projekts:
Ich wollte folgendes Realisieren. Mit Hile der Grafikbib. OpenCV wollte ich eine Bewegungserkennung aus einem Videodatenstrom umsetzen. Da wo Bewegung stattfindet, sollte ein Rahmen die Bewegung markieren. Es soll also ein Punkt berechnet werden, und die Breite und Höhe des Rechtecks.
Anschließend soll in dem Berech des Rechtecks ein Farbsegmentierung stattfinden.Jetzt die eigentliche Frage:
Ich wollte ein Kindprozess mit der Funktion fork() erzeugen, und anschließend soltte dieser Prozess bei erfolgreicher Bewegungserkennung die Positionsdaten des Rechtecks über eine Pipe zu den Elternprozess schicken.
Der Elternprozess nutzt diesen Berech (Recheck) um eine Farbsegmentierung durchzuführen.Wie beschrieben möchte ich das Projekt auf mehrere Prozesse aufteilen.
Jetzt meine Frage?
Ist das überhaupt sinnvoll? Oder kann das die effizient(Schnelligkeit) der Anwendung verbessern?
Kann mir vielleich einer von Euch einen Tipp geben, wie man das realisieren könnte. Umgangssprachlisch habe ich mir das so gedacht! (Keine Angst C++ Erfahrung sind vorhanden)
1. Erzeuge eine Pipe fürs Lesen und Schreiben.
2. Halte letzten Rahmen (Rechteck) bei Nichtbewegung fest, und übertrage Nichts über die Pipe. Wenn Bewegung stattfindet, dann übertrage aktuelle Rechteckparameter.
3. Elternprozess: Warte bis aktuelle Rechteckparameter vorhanden sind. Nehme solange die alten für die Farbsegmentierung!
Ich weiss, dass die Beschreibung nicht so toll ist. Ich hoffe aber , dass mir Jemmand einen Tipp geben könnte! :xmas1:
Grüße ++
-
Elternprozess: Warte bis aktuelle Rechteckparameter vorhanden sind. Nehme solange die alten für die Farbsegmentierung!
Ich habe das Problem markiert. Wenn dein eine Prozess auf den anderen Prozess wartet, dann gewinnst du höchstens was in der Organisation deines Programms, aber du gewinnst keine CPU-Effizienz, verlierst sogar ein kleines bisschen.
So wie das klingt, solltest du lieber versuchen, die eigentlichen Algorithmen zu parallelisieren.
Oder habe ich dich falsch verstanden und das ist so gemeint, dass der Elternprozess in der Zwischenzeit noch was zu tun hat? Falls ja, dann ist das in Ordnung so.
-
Hallo!
Vielleicht noch ein Beispiel um die Sache zu ergänzen!
Natürlich soll z.B. der Vater-Prozess warten auf neue Parameter aber soll mit den alten Parameter weiterarbeiten. Wenn aber neue Parameter auf der Pipe liegen, dann soll der Vater-Prozess die Parameter aktuallisieren.Es gibt ja auch folgendes Problem. Bei der Farbsegmentierung könnte ja ein Farbblob erkannt werden, und für eine erneute Segmentierung der Farbe ausgeblenden werden durch eine Maske. Das heisst, dass mehrere unterschiedliche Farbbereiche segmentiert werden können, und diese so nicht als zusammenhängend erkannt werden würden. Das ist eigentlich ein Vorteil der Umsetzung des Projekts auf mehrere Prozesse.
Hier ein Beispiel:
Ein Farbblob wurde von einem Kind-Prozess erkannt. Das Kind-Prozess liefert Parameter an einem zweiten Prozess. Diese Parameter werden genutzt, um Farbbereiche des Videosignals auszublenden. Hier soll keine Segmentierung mehr stattfinden. Der zweite Prozess findet jetzt einen erneuten Farbblob und liefert die Parameter an einen dritten Prozess usw..
Grüße
-
Du hast also bei der Bearbeitung min Anzahl Farbblob Prozesse. Also ich hoffe dein Programm wird deinen Laufzeitansprüchen genügen.
Kann man das nicht iterativ lösen, indem man das Ausgangsbild ändert... im nächsten Schleifendurchlauf dann weiter analysieren.
Das was Seppj meint ist vermutlich:
Dein Vater läuft
Der Vater stößt das Kind an
NUN arbeitet nurnoch das Kind
Das Kind endet
Der Vater läuft weiterWährend der Zeit, die das Kind beansprucht, hätte der Vater die Aufgabe noch schneller erledigt, da kein fork() nötig wäre.
Sehe ich doch so richtig.
-
Hallo!
Danke für Eure Antworten!
Wäre es also besser das interativ zu lösen?
So z.B.
Wenn ich jetzt 3 Farbblobs aus dem Videosignal selegtieren möchte, dann würde der Algorithmus eine Segmentierung auf das kompletten Bild durchführen. Wurde ein Farbbereich erkannt, so wird eine Maske erstellt und der Berech im nächsten Iterationsschritt ausgeblendet. In diesem Fall wären das 3 Iterrationen maximal.
Sehe ich das richtig? Oder bin ich auf dem Holzweg!
-
Ja, also wenn das deine Vorgehensweise mit Fork gewesen wäre, dann ist das iterativ in einer Funktion/Prozess für mich sinnvoller.
-
Hallo nochmal!
Wäre es aber nicht vorteilhaft trotzdem die Funktion Fork() zu nutzen um Folgendes zu erreichen!
Ich möchte nur zwei Farbblobs aus dem Videodatenstrom erzeugen! Ich erzeuge dafür nur max. 2 Prozesse!
Bei der iterrativen Lösung hätte ich diese Steuerung (nur zwei Farbblobs segmentieren) doch nicht, oder?
Grüße
-
Wüsste nicht, warum das nicht gehen sollte.
-
Machs doch mit Threads, ist simpler zu handhaben.