User-Thread

Implementierung von Threads im Userspace, z. B. einer virtuellen Maschine

Als User-Thread (auch Userthread geschrieben), gelegentlich auch Userlevel-Thread und z. B. unter Windows Fiber (s. u.) genannt, wird in der Informatik eine bestimmte Art, Programme bzw. Programmteile verzahnt ablaufen zu lassen, bezeichnet. Die Funktionalität ist dabei nicht direkt im Kernel implementiert (wie bei einem Kernel-Thread), sondern in einer separaten Programmbibliothek, die im Userspace liegt. Dadurch ist ein Kontextwechsel (Taskswitching) zwischen den Userthreads ohne aufwendige Systemaufrufe möglich, wodurch Kontextwechsel deutlich schneller sind als zwischen Kernelthreads oder Prozessen.

Scheduling

Bearbeiten

Da die User-Threads innerhalb eines Kernel-Threads prinzipiell nicht gleichzeitig ([pseudo-]parallel), sondern nur nacheinander ausgeführt werden, können die User-Threads nicht sinnvoll auf mehrere Prozessoren verteilt werden. Da das Betriebssystem nichts von der Existenz der User-Threads weiß, muss das Scheduling (Zeitablaufsteuerung) der User-Threads vom Programm selbst beziehungsweise von der eingesetzten Programmbibliothek erledigt werden. Dabei wird praktisch immer kooperatives Scheduling betrieben und nicht präemptives (von engl. preemptive, ‚bevorrechtigt‘). Die User-Threads müssen also von sich aus die Kontrolle abgeben.

Dies ist allerdings dann problematisch, wenn einer der User-Threads einen blockierenden Systemaufruf tätigt. Dadurch, dass dieser User-Thread blockiert ist, wird es ihm unmöglich, die Kontrolle an einen anderen User-Thread abzugeben – auf diese Weise wird das gesamte Programm blockiert. Dieses Problem kann jedoch umgangen werden, indem die genutzte Bibliothek dem User-Thread Ersatzfunktionen bereitstellt. Die Bibliothek nutzt dann ausschließlich nichtblockierende Systemaufrufe des Betriebssystems, die dieses bereitstellen muss.

Andere Sichtweise

Bearbeiten

Das Konzept der User-Threads kann auch als Erweiterung der Konzepte von Prozeduren oder Funktionen in entsprechenden Programmiersprachen gesehen werden. Ein User-Thread entspricht nach dieser Sichtweise einer Prozedur, die von anderer Stelle aufgerufen wird (über das explizite Scheduling genau dieses User-Threads). Eine solche Prozedur kehrt jedoch nicht unbedingt an genau einer Stelle zum Kontrollfluss des Aufrufers zurück, sondern kann vielmehr über ihr selbst durchgeführtes Scheduling auch mehr als einmal und an verschiedene Stellen „zurückkehren“. Diese Sichtweise spiegelt sich auch in der Art wider, wie in einigen Systemen User-Threads deklariert werden – nämlich als eine gesonderte Prozedur je User-Thread.

Implementierungen

Bearbeiten

User-Thread-Bibliotheken stehen unter vielen Betriebssystemen zur Verfügung, aber auch Interpreter können User-Threads unterstützen. Dabei unterscheidet sich die Benennung der User-Threads je nach Implementierung.

Microsoft nennt die von ihr (seit Windows 98) unter Windows angebotenen User-Threads Fibers.[1] Das englische Wort fiber (dt. ‚Faser‘ → ‚Fiber‘) kann hier als Anlehnung an das natürliche Verhältnis eines thread (englisch) – d. h. eines Fadens – zu einer fiber/Faser verstanden werden: Eine Faser/Fiber ist dünner und einfacher als ein Faden (Thread); ein Faden kann aus mehreren einzelnen Fasern gesponnen sein. Ein Thread kann unter Windows in einen Fiber konvertiert werden und umgekehrt.

User-Threads bieten unter Linux zum Beispiel die Bibliotheken LinuxThreads und GNU Portable Threads. LinuxThreads wird allerdings nicht mehr weiterentwickelt, und sein Nachfolger Native POSIX Thread Library (NPTL) ist keine reine Userspace-Bibliothek mehr.[2]

Die Namenskonvention unter Solaris weicht von der unter Windows und Linux ab. Ein Kernel-Thread wird hier als Lightweight process (engl.; ‚leichtgewichtiger Prozess‘ → vgl. Thread (Informatik)) bezeichnet und ein User-Thread schlicht thread genannt.
Ein Solaris-Thread kann auch anderen lightweight processes desselben Prozesses zugeordnet werden.[3]

Java Virtual Machine

Bearbeiten

Neuere Versionen der Java Virtual Machine (JVM) nutzen, falls vorhanden, die Möglichkeiten des lokalen Betriebssystems, um dem Programmierer Threads zur Verfügung zu stellen. Bei älteren Versionen oder falls das Betriebssystem Kernel-Threads nicht unterstützt, hat die JVM aber auch ihre eigene User-Thread-Funktionalität. Diese wird als Green Thread bezeichnet. Green Threads sind echte User-Threads, bieten aber trotzdem präemptives, prioritätsbasiertes Scheduling, das durch die JVM realisiert wird.[4]

Literatur

Bearbeiten

Einzelnachweise

Bearbeiten
  1. Cprogramming.com: Introduction to Windows Programming and OpenGL. (englisch)
  2. Vikram Shukla: Linux threading models compared: LinuxThreads and NPTL (Memento des Originals vom 31. Mai 2019 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/pdfs.semanticscholar.org (PDF; 50 KB, englisch), abgerufen am 31. Mai 2019.
  3. Fabian Zabatta, Kevin Ying: A Thread Performance Comparison: Windows NT and Solaris on A Symmetric Multiprocessor. 2nd USENIX Windows NT Symposium, 03.–05.08.1998. In: usenix.org. USENIX Association, 10. April 2002, abgerufen am 6. Februar 2014 (englisch).
  4. Glenn L. Vanderburg et al.: Tricks of the Java Programming Gurus. Archiviert vom Original am 25. Mai 2009; abgerufen am 14. April 2018 (englisch).
Bearbeiten