Was mache ich mit fork()?
-
Kommt da ein Prozess oder ein Thread raus?
Bzw. ist da ein Unterschied?
Falls ja wie erzeuge ich was?
-
-
Mir ist klar wie ich es verwende, nur wo genau liegt der Unterschied zwischen Thread und Process? Wann sollte ich welches verwenden? Was ist beim jeweiligen geshared, was nicht? Das ist mir unklar.
-
Ohne Garantie: Threads laufen alle im selben Speicher, Prozesse bekommen jeweils einen eigenen Speicherblock übergeben. (oder schau mal hier nach)
-
Die Gesamtheit von Threads gehören zu einem Prozess, dabei gilt, dass Userlevelthreads für den Kernel "unsichtbar" sind. Der Kernel weiß nichts von der Existenz dieser Threads, sehrwohl aber von dem Prozess der Threads beinhalten kann. Nachteil: Sollte ein Thread auf blocked stehen, steht der ganze Prozess auf blocked. Dann gibt es noch Kernellevelthreads. Die wiederrum sind dem Kernel bekannt.
Mit fork() erschaffst du einen Kindprozess des ausführenden Prozesses, also für gewöhnlich deines C-Programmes, um mal deine Frage direkt zu beantworten. Threads sharen sich tatsächlich auch den gleichen Speicherbereich.
-
Also ich denke es ist in den allermeisten Fällen Geschmackssache, ob man Threads oder Prozesse verwendet.
Ein Nachteil von Threads ist, dass deren Anzahl begrenzt ist, die Grenze liegt glaub ich bei ca. 16-17 Tausend, was ab gewissen Größenordnungen von Servern und den darauf laufenden Applikationen eng werden könnte. Aber für die meisten Nutzer wohl ausreichend ist.
Über Threads und Prozesse steht viel in Büchern über Betriebssysteme und Systemprogrammierung.
-
Das ist in den aller wenigsten Fällen Geschmackssache.
Fork dient meistens zum Aufruf externer Programme. Die Funktion "system(const char*)" verwendet fork und exec um ein Programm zu starten. Es wird aber auch benutzt, um Dinge parallel auszuführen. Da hat es einen ähnlichen Einsatzzweck, wie Threads.
Der wesentliche Unterschied ist, daß ein Prozess im eigenen Speicherraum läuft. Das hat, wie vieles im Leben Vor- und Nachteile. Vorteil ist, daß sich die Prozesse nicht gegenseitig die Daten überschreiben können und wenn ein Prozess abstürzt, läuft der andere weiter. Nachteil ist, daß die Prozesse untereinander nicht so leicht Daten austauschen können. Dafür sind IPC-Techniken (inter-process-communication) notwendig.
Threads laufen im gleichen Speicherbereich. Das bedeutet, daß Threads die Variablenwerte teilen. Setzt ein Thread einen Variable auf einen Wert, ist dieser für andere auch sichtbar. Das ist auf der einen Seite praktisch, auf der anderen Seite aber gefährlich. Der Zugriff auf gemeinsame Variablen muß über Mutexe serialisiert werden. Sonst gibt es Datensalat, wobei Salat für den Menschen gesund ist, bei einem Prozess aber schnell zum Tod führt. Und die Threads teilen sich diesen Tod, d.h. greift ein Thread daneben und verursacht eine Speicherschutzverletzung, werden alle Threads des Prozesses beendet.
Es ist offensichtlich, daß die Programmierung mit Threads sehr viel mehr Aufmerksamkeit und Erfahrung erfordert. Alles, was ich in einem Prozess, der mehrere Threads hat, so treibe, muß ich darauf prüfen, ob gleichzeitige Zugriffe problematisch werden können.
Threads in einem Prozess können die Performance, insbesondere in der heutigen Zeit mit Prozessoren mit mehreren Cores, erheblich verbessern, da mehrere Aufgabe eines einzelnen Programms auf mehrere Cores verteilt werden können. Im Serverbereich werden Threads häufig dazu eingesetzt, mehrere Clients zu bedienen.
Tntnet