Warum sind die PID-Werte nicht kontinuierlich?

14

Wenn wir tippen, erhalten ps -efwir eine Liste von Prozessen. Warum sind die PID-Nummern nicht fortlaufend?

Vasu Dev Garg
quelle

Antworten:

16

Unter Ubuntu sind sie durchgehend. Bei anderen Betriebssystemen kann dies abweichen.

Der Kernel weist PIDs im Bereich von (RESERVED_PIDS, PID_MAX_DEFAULT) zu. Dies geschieht nacheinander in jedem Namespace (Tasks in verschiedenen Namespaces können die gleichen IDs haben). Wenn der Bereich erschöpft ist, wird die PID-Zuweisung umgebrochen.

( /programming/3446727/how-does-linux-determine-the-next-pid )

Aber was solls ...

  • Die Kernel-Planung kann einen Prozess auslösen, sodass es den Anschein hat, als würde er Zahlen überspringen.
  • Eine PID verschwindet, wenn diese Aufgabe endet.
  • PIDs werden erst wieder verwendet, wenn PID_MAX_DEFAULT erreicht ist.
  • Eine reservierte PID wird übersprungen.

Einige Themen zum Stackoverflow:

In den Kommentaren befindet sich ein Befehl zum Testen der Zuweisung von PIDs:

for i in {1..20}; do sh -c 'echo $$'; done
Rinzwind
quelle
"Die Kernel-Planung kann einen Prozess auslösen, so dass es so aussieht, als würde er Zahlen überspringen." - Der Kernel kann einen Prozess erstellen und gleichzeitig bestimmen, welcher Prozess ausgeführt werden soll. Das scheint komisch.
user253751
Es ist ziemlich üblich, dass der Scheduler einen Prozess verzweigt. Wahrscheinlich dieses Bit: lxr.free-electrons.com/source/kernel/pid.c#L125 , das es bestimmt :)
Rinzwind
8

Die dazwischen fehlenden Prozess-IDs sind bereits tot und ihre PIDs werden vom Kernel in den späteren Prozessen wiederverwendet.

Die toten Prozesse werden nicht in der Prozesstabelle angezeigt (mit Ausnahme von Zombies), daher ps -efwerden sie nicht angezeigt .

heemayl
quelle
3

Normalerweise ist die PID kontinuierlich, aber einige Prozesse sind bereits zum Zeitpunkt der Ausführung des Befehls beendet ps -ef.

Einige Prozesse können auch nur ein Unterprozess eines anderen Prozesses sein, der im ps -efBefehl nicht angezeigt wird . Um ein erweitertes Ergebnis zu erhalten und die kontinuierliche PID zu überprüfen, verwenden Sie diepstree

pstree -p

Beispielausgabe:

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

während, wenn Sie ausführen, sehen ps -efSie nur den übergeordneten Prozess.

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f
Maythux
quelle
2

Sie sind kontinuierlich. Die PID werden der Reihe nach zugewiesen, bis die maximale Grenze erreicht ist. Nach dieser Grenze beginnt es wieder bei Null.

Es ist also nur so, dass die fehlenden PIDs in ps -eftoten Prozessen sind. Beachten Sie, dass ps -efnur laufende Prozesse aufgelistet werden.

7171u
quelle