|
![ein Kapitel weiter](../weiter.gif)
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 weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|