Ist es sicher, nach dem Abzweigen zu fädeln?

8

Ich habe gelernt, dass man normalerweise mit Forking oder Threading weitermachen sollte, um zu vermeiden, dass man in sehr seltsame und extrem schwer zu debuggende Probleme gerät, so dass ich bis jetzt immer genau das gemacht habe. Mein Problem mit der Sache ist, dass, wenn ich nur bei der Gabelung bleibe, viele kurzlebige Prozesse zur Verteilung von Arbeitsstücken auf die teureren mit den mehr CPU-Kernen, die ich füttern möchte, bis zu bekommen Irgendeine Punktleistung skaliert einfach nicht mehr vernünftig. Zur gleichen Zeit, mit nur Threads muss ich immer so vorsichtig sein, welche Bibliotheken ich benutze und generell extrem defensiv in Bezug auf Thread-Sicherheit bin, was viel kostbare Entwicklungszeit in Anspruch nimmt und den Verzicht auf einige Lieblingsbibliotheken erzwingt. Also, obwohl ich gewarnt bin, gefällt mir der Gedanke, Gabel und Gewinde zu mischen, auf mehreren Ebenen.

Nun, nach dem, was ich bisher gelesen habe, scheinen Probleme immer dann aufzutauchen, wenn beim Abzweigen bereits Threads erzeugt werden.

Gegeben, dass ich ein System entworfen habe, das anläuft, dämonisiert, seine Hauptstufen abzweigt und nie wieder Gabeln macht, nachdem ich vollkommen sicher und robust war. Wenn einige dieser vorgefertigten Ebenen nun anfangen würden, Threads zu verwenden, um ihre Arbeitslast auf viele CPU-Kerne zu verteilen, sodass die verschiedenen untergeordneten Prozesse verarbeitet werden Kennen Sie nie die Thrads des anderen Kindes, wäre das noch sicher ? Ich kann versichern, dass jede Ebene selbst threadsicher ist und dass die nicht threadsicheren Ebenen niemals einen eigenen Thread starten.

Obwohl ich mich bei diesem Ansatz ziemlich sicher fühle, würde ich mich über einige professionelle Meinungen zu diesem Thema freuen, die alle möglichen Vorbehalte, interessante Standpunkte, Links zum fortgeschrittenen Lesen usw. aufzeigen. Die Sprache, die ich persönlich benutze, ist Perl auf Debian, RedHat, SuSe und OS X, aber das Thema sollte allgemein genug sein, um für jede Sprache auf einer beliebigen Un * x / BSD-ähnlichen Plattform gültig zu sein Verhalten POSIXish, vielleicht sogar Interix.

    
Olfan 16.09.2010, 10:26
quelle

2 Antworten

4

Ihr Ansatz ist unter POSIX in Ordnung, solange Sie keine MAP_SHARED shared memory Bereiche erstellen, die von den gegabelten Prozessen gemeinsam genutzt werden. Sobald die Prozesse gegabelt sind, sind sie unabhängig.

Siehe die POSIX-Dokumentation zu fork() .

    
caf 16.09.2010, 11:57
quelle
8
  

Erstellen Sie viele kurzlebige Prozesse, um Arbeitsbrocken zu verteilen, um die teureren mit den mehr CPU-Kernen zu erhalten, die ich füttern möchte

Nicht wirklich.

Sie können jedoch Meldungswarteschlangen verwenden, anstatt einzelne Prozesse für jeden Arbeitsschritt zu verzweigen.

Erstellen Sie einen Stapel von Prozessen, die alle aus einer gemeinsamen Warteschlange lesen. Stellen Sie ihre Arbeit in die Warteschlange. Kein Forking mehr. Viele kleine Aufgaben, die aus einer gemeinsamen Warteschlange gespeist werden.

Und. Keine Threadsicherheitsfragen.

    
S.Lott 16.09.2010 10:29
quelle

Tags und Links