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.
42
Réponses:
Comme le dit wikipedia ,
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 .
la source
while(true);
), désolé, je répondais vite ;-)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.
la source
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é.
la source
myprog &
suivi dewait $!
serait UB.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()
.la source