ein Kapitel zurück                                           ein Kapitel weiter

Parallelprogrammierung mit Threads

Bei manchen Programmieraufgaben kann es nötig sein das 2 oder mehrere Aufgaben gleichzeitig erfüllt werden müssen. Man spricht dabei von der Parallelprogrammierung. In parallelen Programmen können sie Beispielsweise eine Problemstellung in mehreren Teilaufgaben zerlegen, so das diese parallel ausgeführt werden. Natürlich muss man erwähnen, das Programme nur "wirklich" parallel ablaufen sollen, mindestens 2 Prozessoren vorhanden sein müssen! Aber auch bei Single-CPU's können sich dabei ziemliche Geschwindigkeitsvorteile ergeben.

Unterscheidung zwischen Threads und Prozessen

Sie haben ja schon einges zu den Prozessen kennengelernt. Also brauche ich Ihnen dazu nicht mehr allzuviel erklären. Sie haben gesehen wir einen Prozeß mit dem Systemaufruf fork() erzeugt und anschließend verwaltet haben. Mit den IPC's haben sie gesehen wie es möglich ist, daß die Prozesse untereinander Daten austauschen. Und genau diese Art der Kommunikation stellen bei Programmierern einen erheblichen Aufwand da, denn man mit Threads nicht mehr betreiben muss.

Außerdem wird bei einer Erstellung eine neuen Prozesses, intern ein Erheblich Aufwand betrieben mit der duplizierung des gesamten Namespace. Denn im Gegensatz zu den Prozessen laufen die verschiedenen Threads in einem gemeinsamen Adressraum ab.

Diese bedeutet das das Codesegment, Datensegment der Heap sowie alle anderen Zustandssdaten des Prozesses innherhalb eines Threads jedem Thread zur Verfügung steht. Und daher auch weniger Arbeit beim Austauschen der Daten oder dem Kommunizieren miteinander.

Manch einer wird jetzt bei dem Satz : "...Zustandsdaten des Prozesses innerhalb eines Threads.." ins Straucheln geraten sein. Nun die Frage heißt auch Prozesse und Threads, nicht Prozesse oder Threads!

Dazu wollen wir uns einfach den Begriff PROZESSVERWALTUNG etwas genauer ansehen und zerlegen. Die Prozeßverwaltung ist Verantwortlich für die gleichzeitige Ausführung mehrerer Prozesse bzw. deren Threads, möglich zu machen und zu koordinieren. Ein Prozeß ist also (in der Fachsprache) eine abgeschlossene Verarbeitungseinheit, die einen getrennten Speicherraum und viele andere Resourcen (siehe Kapitel Prozesse) besitzt.

Ein Prozeß besteht aus mindestens einem Thread (jetzt klingelts langsam). Ein Prozeß endet wenn alle Threads in im laufenden Threads beendet sind. Alle Resourcen werde dabei freigegeben.

Im Gegensatz dazu sind Threads unabhängige Befehlsfolgen innerhalb eines Prozesses. Daher teilen sich die Threads auch alles mit dem Prozeß in dem sie laufen. Man könnte auch sagen, Threads sind in einem Prozeß gefangen oder verkapselt. Hierzu eine Grafik.........




Auf diesem Bild könnten nun eine Menge weitere Threads im Prozeß laufen. Daran könne sie erkennen das jeder Thread bis auf ein eigenes Register und einem Teil Stack alles mit dem Prozeß und anderen Threads teilen.

Kernel-Threads und User-Threads

Es gibt 2 Implementationen von Threads, zum einen die Kernel-Threads und zum anderen der User-Threads. Die User-Threads sind in einer Bibliothek implementiert, die im Speicherbereich des Benutzers abläuft. Damit ist es möglich, Threads auch auf den Betriebssystemen zu verwenden, die keine Threads unterstützen. Der Nachteil an den User-Threads ist aber, daß die einzelnen Threads eines Prozesses nicht auf Unterschiedlichen Prozessoren bei Multiprozessor-Rechnern laufen. Kernel-Threads sind bereits im Betriebssystem intregrierte Threadsunterstützung. Dabei wird das Scheduling des Betriebssystem verwendet. Hierbei ist es möglich die einzelnen Threads eines Prozesses auf verschiedenen Prozessoren laufen zu lassen.

Kernel-Threads sind mittlerweile in alle Unix-Systemen intregriert oder besser gesagt werden von allen Unix-Systemen unterstützt. Für Linux wird dabei auf die Library libpthread von Xavier Leroy verwendet, welche eine Implementierung von Kernel-Thread ist.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf