Was ist der Unterschied zwischen Threads auf Benutzerebene und Threads auf Kernelebene?


33

Nachdem ich mehrere Quellen gelesen habe, bin ich immer noch verwirrt über Threads auf Benutzer- und Kernelebene.

Bestimmtes:

Threads können sowohl auf Benutzerebene als auch auf Kernelebene vorhanden sein

Was ist der Unterschied zwischen der Benutzerebene und der Kernelebene?


1
Ist das wirklich Comp Sci (Theorie) oder nur Programmieren?
Mehrdad

6
@Mehrdad, Betriebssysteme sind Teil der Informatik.
Kaveh

Antworten:


28

Eine der Rollen eines Multitasking-Betriebssystem-Kernels ist das Planen : Bestimmen, welcher Ausführungsthread wann ausgeführt werden soll. Ein solcher Kernel hat also eine Vorstellung von Thread oder Prozess . Ein Thread ist ein sequenzieller Code, der ausgeführt wird und über einen eigenen Stapel und manchmal auch andere Daten verfügt. In einem Betriebssystemkontext wird Prozess normalerweise als ein Thread mit eigenem Speicherbereich und Thread als ein Thread bezeichnet, der seinen Speicherbereich mit anderen Threads teilt. Ein Prozess kann einen oder mehrere Threads haben.

Einige Betriebssysteme, zum Beispiel ältere Unix-Systeme, bieten nur Prozesse an: Jeder Thread, den der Kernel verwaltet, verfügt über einen eigenen Speicherplatz. Andere Betriebssysteme, z. B. die meisten modernen Unix-Systeme, ermöglichen es Prozessen, mehrere Ausführungsthreads zu enthalten: Sie stellen eine Vorstellung von Threads auf Kernel-Ebene bereit.

Es ist auch möglich, dass ein Prozess sein eigenes Threading verwaltet. Beim kooperativen Multithreading enthält der Code jedes Threads Anweisungen zum Wechseln zu einem anderen Thread. Beim präemptiven Multithreading fordert der Prozess regelmäßig asynchrone Benachrichtigungen vom Kernel an und reagiert auf diese Benachrichtigungen, indem er zu einem anderen Thread wechselt. Auf diese Weise wird Multithreading ohne Zusammenarbeit mit dem Kernel auf Benutzerebene in einer Bibliothek implementiert.

Ein System kann sowohl Kernel- als auch Benutzerthreads anbieten. Dies wird als Hybrid-Threading bezeichnet .

Threads auf Benutzer- und Kernelebene haben ihre Vor- und Nachteile. Das Wechseln zwischen Threads auf Benutzerebene ist häufig schneller, da der Speicherschutz nicht zurückgesetzt werden muss, um zum kernelinternen Scheduler zu wechseln und erneut zum Prozess zurückzukehren. Dies ist hauptsächlich für Systeme von Bedeutung, die gleichzeitig eine große Anzahl von sehr kurzlebigen Threads verwenden, z. B. einige Hochsprachen ( insbesondere Erlang ) und deren grüne Threads . Threads auf Benutzerebene erfordern weniger Kernel-Unterstützung, wodurch der Kernel einfacher wird. Threads auf Kernel-Ebene ermöglichen die Ausführung eines Threads, während ein anderer Thread im selben Prozess in einem Systemaufruf blockiert wird; Prozesse mit Threads auf Benutzerebene müssen darauf achten, keine Systemaufrufe zu blockieren, da diese alle Threads des Prozesses blockieren. Threads auf Kernel-Ebene können gleichzeitig auf Multiprozessor-Computern ausgeführt werden, was Threads auf Benutzerebene nicht erreichen können.


In der letzten Zeile heißt es: "Threads auf Kernel-Ebene können gleichzeitig auf Multiprozessor-Computern ausgeführt werden, was Threads auf Benutzerebene nicht erreichen können." Der angegebene Link besagt jedoch, dass ULT gleichzeitig stackoverflow.com/questions/14791801/… ausführen kann . Verstehe ich etwas falsch?
Garrick

Kannst du bitte meinen obigen Kommentar überprüfen?
Garrick

1
@Garrick Mehrere Threads auf Benutzerebene können gleichzeitig auf verschiedenen Kernen ausgeführt werden, vorausgesetzt, sie werden in verschiedenen Kernel-Level-Threads ausgeführt. Wenn Sie nur ULT als Tool haben, sind Sie auf einen einzelnen Prozessor beschränkt. Wenn KLT verfügbar ist, können Sie die Kernel-Threads auf mehrere Prozessoren verteilen und Ihr ULT unter den verfügbaren Kernel-Threads verteilen.
Gilles 'SO- hör auf böse zu sein'

4

Stellen Sie sich Threads auf Kernel-Ebene als " virtuelle Prozessoren " und Threads auf Benutzerebene als einfache Threads vor (nennen wir sie vorerst als solche). Damit ein Thread ausgeführt werden kann, wurde er einem Prozessor zugewiesen, oder? Jeder Thread wird also einem virtuellen Prozessor zugewiesen, damit er ausgeführt werden kann.

Hier sind Fakten

  • Das Erstellen eines neuen virtuellen Prozessors ist etwas kostspielig. (Der Kernel muss einen Eintrag in Thread Control Block erstellen , Stack zuweisen usw.)

  • Das Erstellen eines Threads ist im Vergleich zum Erstellen eines neuen virtuellen Prozessors ziemlich einfach. Ein Anwendungsentwickler kann Threads mithilfe von Thread-Bibliotheken erstellen, die von den Programmiersprachen bereitgestellt werden und im User Space verwaltet werden . Und verschiedene Sprachen implementieren Multithreading auf unterschiedliche Weise.

Modelle

  • Wenn Threads einem einzelnen virtuellen Prozessor zugeordnet sind, muss darauf geachtet werden, keinen der Threads durch ein blockierendes System aufzurufen, da andere Threads nicht mehr gleichzeitig ausgeführt werden können.

  • Diese Einschränkung kann überwunden werden, wenn einige weitere virtuelle Prozessoren erstellt werden können. Jetzt können Threads gleichzeitig ausgeführt werden (parallel, wenn mehrere echte Prozessoren vorhanden sind). Ein Thread hat keine Auswirkungen auf andere Threads, die anderen virtuellen Prozessoren zugeordnet sind.

  • Im letzteren Modell können entweder ein oder mehrere Threads auf einen virtuellen Prozessor abgebildet werden.

  • Die obigen Modelle heißen Viele zu Eins, Eins zu Eins und Viele zu Viele.

Referenzen: Betriebssystemkonzepte von Galvin et al. Thema: Threads -> Multithreading-Modelle

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.