Quelle est la valeur maximale de l'ID de processus?

42

Quelle est la valeur maximale de l'ID de processus?

De plus, est-il possible de changer un ID de processus?

Dmitry Kodmov
la source

Réponses:

61

Sous Linux, vous pouvez trouver la valeur PID maximale de votre système avec ceci:

$ cat /proc/sys/kernel/pid_max

Cette valeur peut également être écrite à l'aide du même fichier. Toutefois, elle ne peut être étendue que jusqu'à un maximum théorique de 32 768 pour les systèmes 32 bits ou de 4194304 pour les systèmes 64 bits:

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

Il semble être une pratique normative sur la plupart des systèmes 64 bits de définir cette valeur sur la même valeur que celle trouvée sur les systèmes 32 bits, mais il s'agit d'une convention plutôt que d'une exigence.

De 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).

Et non, vous ne pouvez pas changer le PID d'un processus en cours d'exécution. Il est assigné sous forme de numéro séquentiel par le noyau au moment du démarrage du processus et correspond à son identifiant à partir de cet instant. La seule chose que vous puissiez faire pour en obtenir un nouveau est d’avoir votre code un nouveau processus et de mettre fin à l’ancien.

Caleb
la source
et nous pouvons être sûrs des bits de noyau avec cela
Aquarius Power
2
Un curieux semi-contre-exemple à l'histoire "impossible de changer le PID" est le cas d'un programme multithread, dans lequel l'un des threads auxiliaires effectue un exec (). Il recouvre tout le processus, mais change le PID (en TID du thread d'exécution).
fche
3
La valeur maximale d'un PID pour une machine 32 bits est 32767 et non 32768. 0 est le planificateur et 1 est init, puis les processus utilisateur obtiennent de 2 à 32767.
2
user129258 a raison et est en accord avec la page de manuel et le doco du noyau. La valeur maximale autorisée d'un PID , comme demandé par la question, est inférieure de un à la valeur de ce pseudo-fichier.
JdeBP
1
@ user129258, cela ne tient que si vous utilisez init. Il y a toujours la possibilité de démarrer directement sur un shell, par exemple, busybox et de le faire manuellement à partir de là, sans contrôle du travail. Ou même avoir des scripts de démarrage et revenir au shell. Dans tous les cas, le shell sera le PID 1 dans un tel cas.
Tim
9

D'autres réponses ont expliqué

  • /proc/sys/kernel/pid_max pour Linux et
  • 99999 pour FreeBSD

Mais la question ne spécifiait pas de système d'exploitation. Alors voici quelques autres:

  • Sur Solaris, la valeur maximale d'un ID de processus est un paramètre ajustable du noyau - pidmaxen /etc/system- que par défaut et 30 000 qui peut être réglée entre 266 et 999999. Notez que ce n'est pas le cas max_nprocs, qui est un paramètre ajustable du noyau avec une fonction légèrement différente.
  • Sur HP-UX 10, les paramètres ajustables du noyau nommés process_id_minet process_id_maxprescrivent la plage d'ID de processus autorisés.
  • Sous AIX, les ID de processus comprennent plusieurs champs, y compris un "emplacement de processus" et un champ "nombre de générations". La valeur maximale possible est 0x03FFFFFE, car les champs n'occupent que les 26 derniers bits d'un entier, et le bit n ° 0 est toujours égal à zéro, à l'exception du processus n ° 1.
  • Sous OpenBSD, le maximum est de 32766.
  • Sur NetBSD, le maximum est de 30000.
JdeBP
la source
Depuis OpenBSD 6.5, le maximum est maintenant de 99999 selon l'intro (2) et non de 32766.
Kaiepi
4

Sous FreeBSD, la valeur de PID est comprise entre 0 et 99999 selon intro(2)(lien) . Voici une citation du manuel:

ID de processus.
Chaque processus actif du système est identifié de manière unique par un entier non négatif appelé ID de processus. La plage de cet ID est comprise entre 0 et 99999.

Si vous voulez lire le code source vous-même, alors PID_MAXest défini dans sys/sys/proc.h(lien) .

Mateusz Piotrowski
la source