Sous *nix, les PID sont des identifiants uniques pour les processus en cours d'exécution. Comment les PID sont-ils générés ? S'agit-il simplement d'un nombre entier qui est incrémenté ? Ou s'agit-il d'une structure plus complexe telle qu'une liste ? Comment sont-ils recyclés ? Par recyclage, j'entends que, lorsqu'un processus se termine, son PID sera éventuellement réutilisé par un autre processus.
Réponses
Trop de publicités?En tant que wikipedia dit,
Sous Unix, les identifiants de processus sont attribués sur une base séquentielle, en commençant par 0 et en augmentant jusqu'à une qui varie d'un système à l'autre. système. Une fois cette limite atteinte, l'allocation reprend à zéro et augmente à nouveau augmente à nouveau. [ ] les passages suivants, les PIDs encore attribués encore assignés à des processus sont ignorés.
Il s'agit donc d'une politique très simple pour la "génération", il suffit d'incrémenter un compteur, et pour le "recyclage", il suffit d'entourer le nombre d'une valeur maximale et de continuer à l'incrémenter jusqu'à ce que vous trouviez un numéro qui a été attribué à un processus qui s'est terminé et a été supprimé de la table des processus.
Certaines implémentations Unix telles que AIX utilisent une politique moins simple, voir par exemple cette FAQ .
Cela varie.
La plupart des systèmes se contentent de comptabiliser le dernier PID généré, d'en ajouter un (en l'enveloppant au fur et à mesure) et de l'ajouter à la liste des PID générés. un nombre maximal tel que 65535 ou un peu plus petit - souvent, le bouclage se produit à 65000 ou même 60000), et vérifient que le numéro n'est pas en cours d'utilisation (en répétant si le PID est toujours en cours d'utilisation - ainsi, le PID 1, le noyau, est toujours là et n'est pas "réémis").
D'autres systèmes de sécurité génèrent un numéro au hasard et vérifient qu'il n'est pas utilisé.
À tout moment, il est garanti que tous les numéros PID sont uniques.
En ce qui concerne la partie de la question relative au recyclage, il convient de garder à l'esprit qu'un pid ne devient pas disponible dès que le processus qui en est à l'origine se termine. Le pid ne devient disponible que lorsque le parent de ce processus recueille l'état de terminaison de son enfant via une forme quelconque de l'appel système wait(). Un processus fils qui est terminé mais dont le parent n'a pas émis d'appel wait est appelé un zombie et apparaîtra généralement dans un ps comme défectueux. Il est possible pour un parent mal élevé d'affamer le système de pids s'il lance des enfants et ne les attend pas.
Si le parent d'un processus meurt avant d'avoir recueilli l'état d'un enfant, ce n'est pas grave. L'enfant est hérité par init qui s'assurera qu'un wait() est émis et que le pid est recyclé.