Wikipedia · einfach zusammengefasst · Stand
Multithreading
Multithreading (englisch wörtlich für Mehrfädigkeit oder auch Mehrsträngigkeit und, weiter übertragen, die Nebenläufigkeit) bezeichnet in der Informatik das …
Inhalt5 Abschnitte
Grundidee und Abgrenzung
Multithreading bezeichnet in der Informatik das gleichzeitige oder quasi-gleichzeitige Abarbeiten mehrerer Threads innerhalb eines einzelnen Prozesses oder Tasks, also eines Anwendungsprogramms. Ein Thread ist ein Ausführungsstrang: ein Teil eines Programms, der als eigener Ablauf organisiert ist.
Wichtig ist die Abgrenzung zum Multitasking. Beim Multitasking werden mehrere unabhängige Programme voneinander abgeschottet quasi-gleichzeitig ausgeführt. Beim Multithreading gehören die Threads dagegen zum selben Anwendungsprogramm und sind nicht voneinander abgeschottet. Dadurch können sie gemeinsame Daten oder Ressourcen nutzen, aber auch Fehler verursachen. Ein typisches Risiko sind Race Conditions: Fehler, die entstehen, wenn mehrere Threads in ungünstiger Reihenfolge auf dieselben Daten zugreifen. Solche Fehler müssen durch Synchronisation vermieden werden.
Multithreading und Multitasking können auf nur einem Prozessorkern laufen. Sie können aber auch mit Multiprocessing kombiniert werden, also mit echter paralleler Ausführung durch mehrere Prozessorkerne.
Softwareseitiges Multithreading
Beim softwareseitigen Multithreading ist in der Regel nur ein Prozessorkern beteiligt. Aus Sicht der Hardware und meistens auch des Betriebssystems gibt es nur einen einzigen Programmausführungs-Zweig. Die Gleichzeitigkeit ist daher scheinbar: Das Anwendungsprogramm erzeugt sie intern durch geschickte Sequentialisierung, also durch schnelles und geordnetes Wechseln zwischen Aufgaben. Dazu gehört auch eine Priorisierung der Threads und eine logische Abstraktion des Multiplexverfahrens, bei dem mehrere Abläufe nacheinander über dieselbe Ressource geführt werden.
Der Nutzen liegt vor allem darin, dass einzelne Threads schnell auf zeitkritische Ereignisse reagieren können, während andere Threads länger laufende Berechnungen ausführen. Das Artikelbeispiel nennt eine Videobearbeitungs-Software: Sie kann eine Szene im Hintergrund berechnen, während sie im Vordergrund weiter auf Eingaben des Benutzers reagiert.
Ohne zusätzliche Hardwareunterstützung kann Multithreading die Gesamtsystemleistung leicht senken, weil beim Kontextwechsel Overhead entsteht. Ein Kontextwechsel ist der Wechsel von einem Ablaufzustand zu einem anderen. Wenn Abläufe eigentlich unabhängig voneinander sein sollen, kann eine Anwendung durch passende Aufteilung aber auch große Performance-Schübe erreichen.
Rolle von Anwendung und Betriebssystem
Beim softwareseitigen Multithreading wird unterschieden, ob es nur im Anwendungsprogramm selbst implementiert ist oder ob das Betriebssystem es unterstützt.
Wenn Multithreading rein anwendungsseitig implementiert ist, hat der Programmierer volle Kontrolle darüber, wann welcher Thread welche Ressourcen erhält. Für das Betriebssystem erscheint das gesamte Programm aber nur wie ein einzelner Ablauf. Fordert dieses Programm Ressourcen oder Dienste an, die gerade nicht verfügbar sind, kann es komplett eingefroren werden. Das ist besonders problematisch, wenn eine grafische Oberfläche gleichzeitig Nutzereingaben verarbeiten und interne Daten oder Prozeduren abarbeiten soll.
Wenn das Betriebssystem Multithreading unterstützt, kann es erkennen, welche Teile einer Anwendung nicht blockiert sind. Dadurch kann die Anwendung teilweise weiterarbeiten, auch wenn andere Teile gerade warten müssen.
Hardwareseitiges Multithreading
Beim hardwareseitigen Multithreading unterstützt die Hardware eines Prozessors das scheinbare oder echte gleichzeitige Abarbeiten mehrerer Threads. Die Software muss diese Fähigkeit jedoch auch nutzen: Sie muss passend in Threads aufgeteilt sein und diese beim Betriebssystem anlegen oder registrieren.
Moderne Betriebssysteme können die Last einer Anwendung, die Multithreading verwendet, automatisch auf vorhandene Prozessorkerne verteilen. Dabei läuft jeder Kern höchstens mit seinem eigenen Höchsttakt. Das soll sowohl die Reaktivität des Betriebssystems verbessern als auch die Leistung einzelner Anwendungen erhöhen.
Bei symmetrischen Multiprozessorsystemen kann die Rechenarbeit eines Prozesses oder Tasks durch Multithreading auf mehrere Systemprozessoren verteilt werden.
Unterschied zu Multiprocessing und Leistungswirkung
Hardwareseitiges Multithreading muss genau von Multiprocessing unterschieden werden. Beim Multithreading laufen die Threads im selben Task-Kontext. Das ist für die Hardware einfacher umzusetzen, weil zum Beispiel keine zweite MMU oder Seitentabelle benötigt wird. Eine MMU ist die Speicherverwaltungseinheit eines Prozessors; Seitentabellen dienen der Zuordnung von virtuellem zu physischem Speicher.
Beim echten Multiprocessing ist jeder Ablauf ein eigener Prozess. Der Artikel weist aber darauf hin, dass auch das Auslagern von Threads auf tatsächlich vorhandene Prozessorkerne als echt nebenläufig eingestuft werden könnte.
Beim hardwareseitigen Multithreading entsteht nur ein marginaler Overhead beim Kontextwechsel, solange die Zahl der rechenzeitfordernden Software-Threads nicht größer ist als die Zahl der hardwareunterstützten Threads. Dann kann jeder Thread seine CPU-Ressourcen, besonders den Registersatz, behalten. Register sind sehr schnelle Speicherplätze direkt im Prozessor.
Zusätzlich können Funktionseinheiten eines Prozessors, die von einem Rechenablauf gerade nicht genutzt werden, von einem anderen Thread verwendet werden. Dies wird meist Hyper-Threading genannt. Dadurch lassen sich Pipeline-Hazards vermeiden, also Situationen, in denen die Verarbeitungskette des Prozessors warten müsste. So werden unproduktive Taktzyklen reduziert, und die Gesamtsystemleistung pro CPU beziehungsweise Prozessorkern steigt.