Comment les PID sont-ils générés?

42

Sur * nix, les PID sont des identificateurs uniques pour les processus en cours d'exécution. Comment les PID sont-ils générés? Est-ce juste un entier incrémenté ou une structure plus complexe telle qu'une liste? Comment sont-ils recyclés? Par recyclage, je veux dire que lorsqu'un processus se termine, son PID sera éventuellement réutilisé par un autre processus.

Giovanni Funchal
la source

Réponses:

39

Comme le dit wikipedia ,

Sous Unix, les identifiants de processus sont généralement attribués de manière séquentielle, commençant à 0 et atteignant une valeur maximale variant d'un système à l'autre. Une fois cette limite atteinte, l'allocation reprend à zéro et augmente à nouveau. Cependant, pour cette étape et les suivantes, tous les PID encore attribués aux processus sont ignorés.

c'est donc une politique très simple pour la "génération", incrémentez simplement un compteur et "recyclage", emballez simplement le nombre à une valeur maximale et continuez à l'incrémenter jusqu'à ce que vous trouviez un numéro attribué à un processus terminé et terminé. été retiré de la table de processus.

Certaines implémentations Unix telles qu'AIX utilisent une stratégie moins simple, voir par exemple cette FAQ .

Alex Martelli
la source
Merci d'avoir répondu. À propos, quelle est exactement cette stratégie AIX "qui est moins simple"?
1
@ Helltone, je ne pense pas qu'AIX documente exactement la politique qu'il utilise (elle peut donc être modifiée à tout moment), mais vous pouvez le considérer comme une génération de nombres aléatoires dans la plage appropriée (qui est répétée jusqu'à ce qu'un PID soit généré). non utilisé actuellement).
Alex Martelli
Cet algorithme me semble un peu problématique. Comment vous assurez-vous de ne pas vous retrouver dans une impasse? Et n'y a-t-il pas un problème de performance?
1
Le noyau est en contrôle et n'a pas besoin de verrouiller quoi que ce soit, alors comment pourrait-il se bloquer? Oui, il y a un petit prix de performance à payer (quelques frais généraux supplémentaires au moment de la prise, disons quelques douzaines d'instructions machine pour une lecture congruentielle de PRNG ou / dev / urandom, par rapport à beaucoup moins pour une contre-augmentation), mais c'est toujours le cas pour des mesures destinées à améliorer la sécurité (vérifiez le temps système de la communication HTTPS par rapport au HTTP simple par exemple ;-).
Alex Martelli
Je voulais dire livelock ( while(true);), désolé, je répondais vite ;-)
11

Cela varie.

La plupart des systèmes gardent simplement un compte du dernier PID généré, en ajoutent un (le nombre maximal d’emballages est de 65535 ou un peu inférieur - souvent le maximum est de 65 000 voire 60000), et vérifiez que le nombre n’est pas utilisé actuellement ( répéter si le PID est toujours en cours d'utilisation - donc le PID 1, le noyau, est toujours là et n'est pas «réémis»).

D'autres systèmes soucieux de sécurité génèrent un nombre au hasard et vérifient qu'il n'est pas utilisé.

A tout moment, il est garanti que tous les numéros PID sont uniques.

Jonathan Leffler
la source
9

En ce qui concerne la partie recyclage de la question, une chose à garder à l'esprit est qu'un pid ne devient pas disponible dès que le processus avec ce pid se termine. Le pid n'est disponible que lorsque le parent de ce processus recueille le statut de fin de son enfant via une forme quelconque de l'appel système wait (). Un enfant qui est terminé mais dont le parent n'a pas émis d'attente est appelé un zombie et apparaîtra habituellement dans un ps comme étant obsolète. Il est possible qu'un parent mal élevé affame le système de pids s'il lance des enfants et ne les attend pas ().

Si le parent d'un processus décède avant qu'il ne récupère le statut d'un enfant, c'est correct. Init hérite de l'enfant qui s'assurera qu'un wait () est émis et que le pid est recyclé.

Frankc
la source
C'est un détail très important. Sans cela, même un simple myprog &suivi de wait $!serait UB.
Andreas
3

Il s’agit de numéros de séquence et d’entièreté (à une valeur spécifique au système d’exploitation) si le système est en place suffisamment longtemps. Les numéros ne sont jamais réutilisés à moins d’être gratuits sur le point fork().

Donal Fellows
la source