GEWINDE: Kernel-Threads vs. Kernel-unterstützte Threads vs. Threads auf Benutzerebene?

9

Weiß jemand, was der Unterschied zwischen diesen ist?

Es scheint mir, dass Kernel-Threads dem Code entsprechen, der den Kernel ausführt (intuitiv), aber ich bin mir bei den anderen beiden nicht sicher ...

Würde der pthreads-Standard auch als Benutzerebene und kernelunterstützt angesehen, da Sie auf eine Bibliothek zugreifen, während der Kernel die gesamte Thread-Planung / -Umschaltung durchführt?

Dunkler Templer
quelle

Antworten:

14

Der Begriff "Kernel-Threads" kann verwendet werden, um sich auf tatsächliche Threads zu beziehen, die vollständig im Kernel-Space ausgeführt werden, oder er kann sich auf User-Space-Threads beziehen, die vom Kernel geplant werden. Der Begriff "kernelunterstützte" Threads bezeichnet letztere, Threads, die im Benutzerbereich ausgeführt werden, aber vom Kernel unterstützt werden, was normalerweise bedeutet, dass der Kernel sie plant.

"Threads auf Benutzerebene" bedeutet normalerweise Threads, die für den Benutzerbereich sichtbar sind. Das ist, was Sie erstellen, wenn Sie die Funktion "Thread erstellen" Ihres Threading-Standards aufrufen. Im Allgemeinen bezeichnet der Begriff "Thread auf Benutzerebene" einen Thread, der vom Anwendungscode erstellt wird, unabhängig davon, wie er vom System implementiert wird. Es kann sich um einen reinen User-Space-Thread mit wenig bis gar keiner Kernel-Unterstützung handeln, oder es kann sich um einen vom Kernel geplanten Thread handeln.

Der pthreads-Standard kann als reine User-Space-Threads (bei denen der Kernel den Prozess und der Prozess die Threads plant), kernelunterstützte Threads (bei denen der Kernel die Threads direkt plant) oder als hybrider Ansatz (bei dem der Kernel plant) implementiert werden ein Thread auf Kernelebene, der dann im Benutzerbereich einen Thread auf Benutzerebene plant). Der Standard verlangt keine bestimmte Art der Implementierung. Die häufigste Implementierung ist die 1-zu-1-Zuordnung, bei der jeder Thread auf Benutzerebene einen entsprechenden Thread hat, der vom Kernel geplant wird.

David Schwartz
quelle
Wie ist die Implementierung unter Linux?
Yati Sagade
3
Auf allen mir bekannten modernen Linux-Systemen (2.6 Kernel oder höher) ist die Standard-Threading-Implementierung des Systems 1: 1. Jeder Thread auf Benutzerebene verfügt über eine entsprechende KSE (Kernel Scheduling Entity - im Grunde genommen einen von der Linux Kernel). Der Thread, den Sie mit 'pthread_create' erstellen, wird direkt vom Kernel geplant. Moderne Systeme verwenden im Allgemeinen NPTL , ältere Systeme verwenden LinuxThreads - beide sind 1: 1.
David Schwartz
"oder ein hybrider Ansatz (bei dem der Kernel einen Thread auf Kernelebene plant, der dann im Benutzerbereich einen Thread auf Benutzerebene plant)." Hey David, kannst du das nochmal erklären? Ich bin mir nicht sicher, was los ist ... Wenn Sie 1-zu-1-Zuordnung sagen, beziehen Sie sich auf Thread-Steuerblöcke, wenn Sie Theads auf Kernel-Ebene erwähnen?
Dunkler Templer
Mit 1 zu 1 meine ich, dass jedes Mal, wenn Sie 'pthread_create' aufrufen, ein neuer Kontext erstellt wird, der vom Kernel geplant wird. Bei einem hybriden Ansatz ist die Anzahl der vom Kernel geplanten Kontexte geringer als die Anzahl der erstellten Threads. Der Kernel plant einen dieser Kontexte, und die Threading-Bibliothek plant dann einen der von der Anwendung erstellten Threads.
David Schwartz