GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Sind Linux-Kernel-Threads wirklich Kernel-Prozesse?

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 noch cd /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.


Linux
  1. UNIX / Linux:3 Möglichkeiten, Signale an Prozesse zu senden

  2. Einführung in Linux-Threads – Teil I

  3. UNIX-/Linux-Prozesse:C fork()-Funktion

  4. Verwalten von Prozessen in Ubuntu Linux

  5. Maximale Anzahl von Threads pro Prozess in Linux?

So listen Sie laufende Prozesse in Linux auf

Ps-Befehl in Linux (Prozesse auflisten)

So beenden Sie Zombie-Prozesse in Linux

Prozessüberwachung unter Linux

Befehle für das Prozessmanagement in Linux

So senden Sie Prozesse unter Linux an den Hintergrund