49 votes

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

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.

43voto

Martijn Laarman Points 111

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 .

11voto

Randy6T9 Points 1606

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.

10voto

Hexagon Points 2927

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é.

3voto

Donal Fellows Points 235

Il s'agit de numéros de séquence qui s'arrondissent (à une valeur propre au système d'exploitation) si le système reste en service suffisamment longtemps. Les numéros ne sont jamais réutilisés, à moins qu'ils ne soient libres au moment où ils sont utilisés. fork() .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X