Pourquoi les valeurs PID ne sont pas continues?


14

Si nous tapons, ps -efnous obtenons une liste de processus. Pourquoi les numéros PID ne sont-ils pas continus?

Réponses:


16

Sur Ubuntu, ils sont continus. Sur d'autres systèmes d'exploitation, cela peut différer.

Le noyau alloue des PID dans la plage de (RESERVED_PIDS, PID_MAX_DEFAULT). Il le fait de manière séquentielle dans chaque espace de noms (les tâches dans différents espaces de noms peuvent avoir les mêmes ID). Dans le cas où la plage est épuisée, l'affectation pid s'enroule.

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

Attention cependant ...

  • La planification du noyau peut bifurquer un processus, il peut donc sembler ignorer les nombres.
  • Un PID disparaîtra à la fin de cette tâche.
  • Les PID ne sont pas réutilisés tant que PID_MAX_DEFAULT n'est pas atteint.
  • Un PID réservé est ignoré.

Quelques sujets sur stackoverflow:

Dans les commentaires se trouve une commande pour tester l'assignation des PID:

for i in {1..20}; do sh -c 'echo $$'; done

"La planification du noyau peut bifurquer un processus, il peut donc sembler ignorer les nombres." - le noyau peut créer un processus tout en déterminant quel processus exécuter? Cela semble bizarre.
user253751

Il est assez courant pour le planificateur de bifurquer un processus. Probablement ce bit: lxr.free-electrons.com/source/kernel/pid.c#L125 qui le détermine :)
Rinzwind

8

Les ID de processus manquants entre les deux sont déjà morts et leurs PID seront réutilisés par le noyau dans les processus ultérieurs.

Les processus morts ne seront pas affichés dans la table des processus (sauf pour les zombies), donc ps -efne les afficheront pas.


3

Normalement, le PID est continu mais certains processus seront morts juste au moment où vous exécuterez la commande ps -ef.

De plus, certains processus peuvent être simplement un sous-processus d'un autre processus qui n'est pas affiché dans la ps -efcommande. Pour voir un résultat étendu et vous pouvez vérifier le PID continu, utilisez lepstree

pstree -p

Exemple de sortie:

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

tandis que si vous exécutez, ps -efvous voyez simplement le processus parent.

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

2

Ils sont continus. Les PID sont attribués dans un ordre séquentiel jusqu'à ce que la limite maximale soit atteinte. Après cette limite, il recommencera à zéro.

Donc, c'est juste que les PID manquants ps -efsont des processus morts. Notez que ps -efrépertorie uniquement les processus en cours d'exécution.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.