Die Dokumentation kann ziemlich verwirrend sein, deshalb hier die "echte " Linux-Modell:
- innerhalb des Linux-Kernels wird etwas, das ausgeführt (und geplant) werden kann, als "Prozess" bezeichnet,
- jeder Prozess hat 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 geteilt wird,
- mehrere Prozesse, die sich dieselbe TGID teilen, teilen sich zumindest auch denselben Speicherplatz und dieselben Signal-Handler (manchmal mehr),
- Wenn ein "Threaded"-Prozess PID=TGID hat, kann er "der Haupt-Thread" genannt werden
- Anruf
getpid()
von jedem Prozess wird seine TGID (="Haupt-Thread"-PID) zurückgegeben, - Anruf
gettid()
von jedem Prozess wird seine PID (!) zurückgegeben, - Jede Art von Prozess kann mit dem
clone(2)
erstellt werden Systemaufruf, - was zwischen Prozessen geteilt wird, wird entschieden, indem bestimmte Flags an
clone(2)
übergeben werden ,
Die numerischen Namen von - Ordnern können Sie mit
ls /proc
auflisten als/proc/NUMBER
sind TGIDs, - numerische Namen der Ordner in
/proc/TGID/task
als/proc/TGID/task/NUMBER
sind PIDs, - obwohl Sie nicht alle vorhandenen PIDs mit
ls /proc
sehen , können Sie immer nochcd /proc/any_PID
ausführen .
Fazit :Aus Sicht des Kernels existieren nur Prozesse, von denen jeder seine eigene eindeutige PID hat, und ein sogenannter Thread ist nur eine andere Art von Prozess (der sich zumindest den gleichen Speicherplatz und die gleichen Signalhandler mit einem oder mehreren anderen teilt -s).
Hinweis: Die Implementierung des "Thread"-Konzepts in Linux hat zu einer Vokabularverwirrung geführt, und wenn getpid()
lügt dich an tut nicht das, was Sie dachten, es liegt daran, dass sein Verhalten der POSIX-Kompatibilität folgt (Threads sollten eine gemeinsame PID haben).
Es gibt absolut keinen Unterschied zwischen einem Thread und einem Prozess unter Linux. Wenn Sie sich clone(2) ansehen, sehen Sie eine Reihe von Flags, die bestimmen, was zwischen den Threads geteilt wird und was nicht.
Klassische Prozesse sind nur Threads, die nichts gemeinsam haben; Sie können unter Linux freigeben, welche Komponenten Sie möchten.
Dies ist bei anderen Betriebssystemimplementierungen nicht der Fall, wo es wesentlich größere Unterschiede gibt.
Threads sind Prozesse unter Linux. Sie werden mit dem clone
erstellt Systemaufruf, der eine Prozess-ID zurückgibt, die über kill
signalisiert werden kann Systemaufruf, genau wie ein Prozess. Thread-Prozesse sind in ps
sichtbar Ausgang. Die clone
Aufruf wird Flags übergeben, die bestimmen, wie viel von der Umgebung des übergeordneten Prozesses mit dem Thread-Prozess geteilt wird.