- Multithreading
-
Der Begriff Multithreading (auch Nebenläufigkeit, Mehrsträngigkeit oder Mehrfädigkeit genannt) bezeichnet das gleichzeitige Abarbeiten mehrerer Threads (Ausführungsstränge) innerhalb eines einzelnen Prozesses oder eines Tasks (ein Anwendungsprogramm).
Im Gegensatz zum Multitasking, bei dem mehrere unabhängige Programme voneinander abgeschottet quasi-gleichzeitig ausgeführt werden, sind die Threads eines Anwendungsprogramms nicht voneinander abgeschottet und können somit durch sogenannte Race Conditions Fehler verursachen, die durch Synchronisation vermieden werden müssen.
Sowohl Multithreading wie auch Multitasking können entweder auf nur einem Prozessorkern ausgeführt werden, als auch zusätzlich mit Multiprocessing kombiniert werden (echt-parallele Ausführung durch mehrere Prozessorkerne).
Software
Meist ist mit dem Begriff das softwareseitige Multithreading gemeint, bei dem in aller Regel nur ein Prozessor beteiligt ist. Die dann vorhandene scheinbare Gleichzeitigkeit wird in Wirklichkeit durch geschickte Programmierung erzeugt. Einzelne Threads eines Prozesses/Tasks können sehr schnell auf zeitkritische Ereignisse reagieren, während andere Threads langwierige Berechnungen durchführen. Zum Beispiel kann eine Videobearbeitungs-Software eine Szene „im Hintergrund“ berechnen (Thread 1), während sie „im Vordergrund“ auf Eingaben des Benutzers reagiert (Thread 2).
Ohne weitere Hardwareunterstützung reduziert das Multithreading die Gesamtsystemleistung durch den bei Threadwechseln entstehenden Overhead. Deshalb wird der Programmierer die Anzahl der Threadwechsel möglichst gering halten.
Es wird auch unterschieden, ob das Multithreading einzig im Anwendungsprogramm implementiert ist, oder ob es Betriebssystem-unterstützt stattfindet. Ist es rein Anwendungs-seitig implementiert, so hat der Programmierer volle Kontrolle, wann welcher Thread welche Ressourcen erhält. Da das gesamte Programm für das Betriebssystem jedoch nur wie ein Ablauf erscheint, wird es komplett eingefroren, sobald es Ressourcen/Dienste anfordert, die gerade nicht zur Verfügung stehen.
Ist das Multithreading Betriebssystem-unterstützt, so kann dieses jene Teile einer Anwendung kennen, die nicht blockiert sind - die Anwendung kann (teilweise) weiterarbeiten.Bei symmetrischen Multiprozessorsystemen kann die Rechenarbeit eines Prozesses/Tasks durch Multithreading auf mehrere Systemprozessoren verteilt werden.
Hardware
Das hardwareseitige Multithreading unterscheidet sich vom softwareseitigen dadurch, dass die Hardware eines Prozessors das scheinbare oder echte gleichzeitige Abarbeiten mehrerer Threads unterstützt. Die Software muss durch softwareseitiges Multithreading diese Fähigkeit verwenden.
Es muss hierbei genau unterschieden werden zwischen hardwareseitigem Multithreading und Multiprocessing. Bei Multithreading laufen die Threads („Programmablauffäden“) im selben Task-Kontext, was für die Hardware sehr viel einfacher ist (z.B. keine zweite MMU/Seitentabelle notwendig). Bei echtem Multiprocessing ist jeder Ablauf ein eigener Prozess.
Beim hardwareseitigen Multithreading entsteht nur geringer Overhead beim Thread-Wechsel, sofern die Anzahl Hardware-unterstützter Threads mit der Software-Thread-Anzahl übereinstimmt und somit jeder Thread „seine“ CPU-Ressourcen (v.a. Registersatz) stets behalten kann.Zusätzlich können (sowohl bei Hardware-seitigem Multithreading wie auch bei Multitasking) Prozessor-Funktionseinheiten, die von einem Rechenablauf gerade nicht verwendet werden, von einem anderen verwendet werden (meist Hyper-Threading genannt). Hierdurch können durch die Vermeidung von Pipeline-Hazards unproduktive Taktzyklen vermieden werden, die Gesamtsystemleistung pro CPU steigt.
Echte Thread-Wechsel, bei denen einer der bereitstehenden Threads tatsächlich alle Prozessorressourcen abgeben muss, bleiben dennoch „teuer“.Weblinks
Wikimedia Foundation.