Sind Linux-Kernel-Threads wirklich Kernel-Prozesse?
19
Ich habe an vielen Stellen gelesen, dass Linux einen Kernel-Thread für jeden Benutzer-Thread in einer Java-VM erstellt. (Ich sehe den Begriff "Kernel-Thread" auf zwei verschiedene Arten:
Ein Thread, der für die Arbeit mit dem Kernbetriebssystem und erstellt wurde
Ein Thread, der dem Betriebssystem bekannt ist, und der die Ausführung der Benutzerarbeit plant.
Ich spreche von letzterem Typ.)
Ist ein Kernel-Thread mit einem Kernel-Prozess identisch, da Linux-Prozesse gemeinsam genutzte Speicherbereiche zwischen Eltern und Kindern unterstützen, oder handelt es sich wirklich um eine andere Entität?
Es gibt absolut keinen Unterschied zwischen einem Thread und einem Prozess unter Linux. Wenn Sie sich Klon (2) ansehen , werden Sie eine Reihe von Flags sehen, die bestimmen, was zwischen den Threads geteilt wird und was nicht.
Klassische Prozesse sind nur Threads, die nichts gemeinsam haben. Sie können die gewünschten Komponenten unter Linux freigeben.
Dies ist bei anderen Betriebssystemimplementierungen nicht der Fall, bei denen es wesentlich größere Unterschiede gibt.
Die Dokumentation kann ziemlich verwirrend sein. Hier ist das " echte " Linux-Modell:
Innerhalb des Linux-Kernels wird etwas, das ausgeführt (und geplant) werden kann, als "Prozess" bezeichnet.
Jeder Prozess verfügt über eine systemspezifische Prozess-ID (PID) und eine Thread-Gruppen-ID (TGID).
Ein "normaler" Prozess hat PID = TGID und kein anderer Prozess teilt diesen TGID-Wert.
Ein "Threaded" -Prozess ist ein Prozess, dessen TGID-Wert von anderen Prozessen gemeinsam genutzt wird.
Mehrere Prozesse, die dieselbe TGID verwenden, verwenden mindestens denselben Speicherplatz und dieselben Signalhandler (manchmal auch mehr).
Wenn ein "Thread" -Prozess PID = TGID hat, kann er "der Haupt-Thread" genannt werden.
Aufruf getpid()von einem beliebigen Prozess wird seine TGID (= "Hauptthread" PID) zurückgeben,
Aufrufen gettid()von einem beliebigen Prozess wird seine PID (!) zurückgeben,
Mit dem clone(2)Systemaufruf kann jede Art von Prozess erstellt werden.
Ordner numerischen Namen , die Sie mit auflisten können , ls /procwie /proc/NUMBERsind TGIDs,
die numerischen Namen der Ordner /proc/TGID/taskwie auch /proc/TGID/task/NUMBERdie PIDs,
Auch wenn Sie nicht alle vorhandenen PIDs mit sehen ls /proc, können Sie dies dennoch tun cd /proc/any_PID.
Fazit : Aus Sicht des Kernels existieren nur Prozesse, von denen jeder eine eigene PID hat, und ein sogenannter Thread ist nur eine andere Art von Prozess.
Hinweis: Die Implementierung des "Thread" -Konzepts in Linux hat zu einer Vokabelverwirrung geführt, und wenn getpid()Sie belogen werden, nicht das tun, was Sie dachten, liegt dies daran, dass sein Verhalten der POSIX-Kompatibilität folgt (Threads sollten eine gemeinsame PID haben). .
Tipp: Wenn Sie das Wort "task" verwenden, können Sie sich auf etwas beziehen, das ausführbar ist, ohne sich so sehr auf den Prozess / die Thread-Verwirrung einzulassen.
Totor
17
Threads sind Prozesse unter Linux. Sie werden mit dem cloneSystemaufruf erstellt, der eine Prozess-ID zurückgibt, die killwie ein Prozess über den Systemaufruf signalisiert werden kann. Thread-Prozesse sind in der psAusgabe sichtbar . Dem cloneAufruf werden Flags übergeben, die bestimmen, wie viel von der Umgebung des übergeordneten Prozesses für den Thread-Prozess freigegeben ist.
Der Mann pthreads(7)sagt, dass für die aktuelle NPTL-Implementierung (Native POSIX Threads Library) "alle Threads in einem Prozess in dieselbe Thread-Gruppe gestellt werden; alle Mitglieder einer Thread-Gruppe haben dieselbe PID." In der veralteten LinuxThreads-Implementierung hat jeder "Thread" eine eigene PID.
Threads sind Prozesse unter Linux. Sie werden mit dem
clone
Systemaufruf erstellt, der eine Prozess-ID zurückgibt, diekill
wie ein Prozess über den Systemaufruf signalisiert werden kann. Thread-Prozesse sind in derps
Ausgabe sichtbar . Demclone
Aufruf werden Flags übergeben, die bestimmen, wie viel von der Umgebung des übergeordneten Prozesses für den Thread-Prozess freigegeben ist.quelle
pthreads(7)
sagt, dass für die aktuelle NPTL-Implementierung (Native POSIX Threads Library) "alle Threads in einem Prozess in dieselbe Thread-Gruppe gestellt werden; alle Mitglieder einer Thread-Gruppe haben dieselbe PID." In der veralteten LinuxThreads-Implementierung hat jeder "Thread" eine eigene PID.