Was ist der Maximalwert der Prozess-ID?

42

Was ist der Maximalwert der Prozess-ID?

Ist es auch möglich, eine Prozess-ID zu ändern?

Dmitry Kodmov
quelle

Antworten:

61

Unter Linux können Sie den maximalen PID-Wert für Ihr System folgendermaßen ermitteln:

$ cat /proc/sys/kernel/pid_max

Dieser Wert kann auch mit derselben Datei geschrieben werden. Der Wert kann jedoch nur bis zu einem theoretischen Maximum von 32768 für 32-Bit-Systeme oder 4194304 für 64-Bit-Systeme erweitert werden:

$ echo 32768 > /proc/sys/kernel/pid_max

Es scheint bei den meisten 64-Bit-Systemen üblich zu sein, diesen Wert auf den gleichen Wert wie bei 32-Bit-Systemen zu setzen, dies ist jedoch eher eine Konvention als eine Anforderung.

Von man 5 proc:

/proc/sys/kernel/pid_max  
  This file (new in Linux 2.5) specifies the value at which PIDs wrap around
  (i.e., the value in this file is one greater than the maximum PID). The
  default value for this file, 32768, results in the same range of PIDs as
  on earlier kernels. On 32-bit platfroms, 32768 is the maximum value for
  pid_max. On 64-bit systems, pid_max can be set to any value up to 2^22
  (PID_MAX_LIMIT, approximately 4 million).

Und nein, Sie können die PID eines laufenden Prozesses nicht ändern. Es wird vom Kernel zu Beginn des Prozesses als fortlaufende Nummer zugewiesen und ist ab diesem Zeitpunkt seine Kennung. Das einzige, was Sie tun können, um ein neues zu erhalten, ist, Ihren Code-Fork einem neuen Prozess zu unterziehen und den alten zu beenden.

Caleb
quelle
und wir können sicher sein, Kernel-Bits mit diesem
Aquarius Power
2
Ein merkwürdiges Semi-Gegenbeispiel zur Story "PID kann nicht geändert werden" ist der Fall eines Multithread-Programms, bei dem einer der Hilfsthreads eine exec () ausführt. Es überlagert den gesamten Prozess, ändert jedoch die PID (in die TID des ausführenden Threads).
Fche
3
Der Maximalwert einer PID für 32-Bit-Computer ist 32767, nicht 32768. 0 ist der Scheduler und 1 ist init, und Benutzerprozesse erhalten 2 bis 32767.
2
user129258 ist richtig und stimmt sowohl mit der Manualpage als auch mit dem Kernel-Doco überein. Der maximal zulässige Wert einer PID , wie von der Frage angefordert, ist eins weniger als der Wert in dieser Pseudodatei.
JdeBP
1
@ user129258, dies gilt nur, wenn Sie init verwenden. Es gibt immer die Möglichkeit, direkt von einer Shell zu booten, sagen wir busybox, und die Dinge von dort manuell ohne Jobkontrolle zu erledigen. Oder Sie haben sogar einige Start-Skripte und kehren zur Shell zurück. In diesem Fall ist die Shell in jedem Fall PID 1.
Tim
9

Andere Antworten haben erklärt

  • /proc/sys/kernel/pid_max für Linux und
  • 99999 für FreeBSD

In der Frage wurde jedoch kein Betriebssystem angegeben. Also hier sind einige andere:

  • Unter Solaris ist der Maximalwert einer Prozess-ID ein durch den Kernel einstellbarer Parameter - pidmaxin /etc/system-, der standardmäßig 30.000 beträgt und zwischen 266 und 999.999 festgelegt werden kann. Beachten Sie, dass dies kein max_nprocsdurch den Kernel einstellbarer Parameter mit einer geringfügig anderen Funktion ist.
  • Unter HP-UX 10 haben die Kernel-Tunables den Bereich der zulässigen Prozess-IDs benannt process_id_minund process_id_maxvorgeschrieben.
  • Unter AIX bestehen Prozess-IDs aus mehreren Feldern, einschließlich eines "Prozess-Slots" und eines "Generierungszählers". Der maximal mögliche Wert ist 0x03FFFFFE, da die Felder nur die unteren 26 Bits einer Ganzzahl belegen und Bit # 0 mit Ausnahme von Prozess # 1 immer Null ist.
  • Unter OpenBSD ist das Maximum 32766.
  • Unter NetBSD ist das Maximum 30000.
JdeBP
quelle
Ab OpenBSD 6.5 liegt das Maximum laut Intro (2) nun bei 99999, nicht bei 32766.
Kaiepi
4

Unter FreeBSD liegt der Wert von PID laut intro(2)(link) zwischen 0 und 99999 . Hier ist ein Zitat aus dem Handbuch:

Prozess ID.
Jeder aktive Prozess im System wird durch eine nicht negative Ganzzahl, die als Prozess-ID bezeichnet wird, eindeutig identifiziert. Der Bereich dieser ID liegt zwischen 0 und 99999.

Wenn Sie den Quellcode selbst lesen möchten, PID_MAXist in sys/sys/proc.h(Link) definiert .

Mateusz Piotrowski
quelle