Que se passe-t-il lorsque vous manquez de PID?


8

C'est une question purement académique, car cela n'arrivera jamais.

Si un PID est stocké sous le type pid_t, et non avec un type à précision arbitraire, le nombre de PID pouvant exister à la fois est limité. Existe-t-il un comportement défini pour le débordement des PID?

Le processus 65536th tuera / sbin / init et créera une panique du noyau? Ou existe-t-il une mesure de sécurité en place?


2
stackoverflow.com/questions/6294133/maximum-pid-in-linux Je suppose que vous pouvez modifier la valeur maximale et le découvrir;)

2
Les nombres inférieurs sont réutilisés (OpenBSD et d'autres randomisent les PID) et vous atteindrez probablement une autre limite (par exemple, manque de mémoire à cause de tous les processus ou permutez la mort ou le tueur OOM se déchaîne) avant d' forkéchouer en raison de non pid disponible.
thrig

1
Pour information: je ne crois pas avoir vu un PID supérieur à 2 ^ 15-1 = 32767. Avez-vous?
thb

3
Aucun des doublons suggérés ne répond vraiment à cette question.
Julie Pelletier

1
Il n'est pas clair si vous demandez ce qui se passe lorsque les PID atteignent une valeur maximale (que ce soit environ 2 ^ 15 ou environ 2 ^ 32), ou ce qui se passe lorsqu'il n'est plus possible d'allouer un nouveau PID, ce qui n'est pas la même chose . Je ne pense pas que votre question soit un double de l'une des questions marquées; les deux demandent quelle est la limite, pas ce qui se passe lorsque vous la dépassez. Si vous mettez à jour la question pour clarifier ce que vous demandez, je voterai pour la rouvrir. (Vous avez déjà des réponses aux deux versions possibles.)
Keith Thompson

Réponses:


8

L' forkappel système doit renvoyer -1 et défini errnosur EAGAIN . Ce qui se passera ensuite dépendra du processus qui a appelé fork.

De la fourche :

La fonction fork () échouera si:

[Encore une fois]

Le système ne disposait pas des ressources nécessaires pour créer un autre processus, ou la limite imposée par le système sur le nombre total de processus en cours d'exécution à l'échelle du système ou par un seul utilisateur {CHILD_MAX} serait dépassée.


9

POSIX ne spécifie pas que le PID de chaque nouveau processus est obtenu en incrémentant le PID précédent. Il ne demande qu'à être unique.

Sur un système où les PID sont incrémentés sur chacun fork(), j'ai observé que les valeurs s'enroulent après avoir atteint une limite supérieure (qui, selon mon expérience, est d'environ 2 15 ). Après le bouclage, les nouveaux PID ne sont pas strictement incrémentés, car certaines valeurs PID seront toujours utilisées à partir des cycles précédents.

Il ne devrait pas y avoir de problème tant que vous n'avez pas 2 N exécutant simultanément des processus. Je soupçonne que le système se heurterait à une limite de capacité bien avant que cela ne se produise. Dans ce cas, l' fork()appel système échouerait et serait probablement défini errnosur EAGAINou ENOMEM( man forkpour plus de détails).

Le code qui implémente forkpeut ou non vérifier si des PID sont disponibles. Cela pourrait ne pas déranger, car il suppose que les ressources système se seraient épuisées avant d'arriver à ce point, ou il pourrait avoir une vérification explicite par souci d'exhaustivité et pour gérer les possibilités futures. Je n'ai pas vérifié, et si je l'avais fait, je ne pouvais m'adresser qu'au noyau que j'avais regardé.


Bien sûr, je sais que cela n'arriverait jamais, mais le système a un nombre limité de PID à attribuer. Je veux juste savoir ce qui se passe quand ça s'épuise.
Fred Frey

1
Cette réponse est en fait la seule qui répond vraiment à la question. Le comportement dépend du système mais doit uniquement garantir un pid unique par nouveau processus. Bien sûr, vous êtes limité par la quantité maximale configurée de PID qui est détaillée dans les 2 questions marquées comme doublons, mais il est très peu probable que cela se produise à moins que votre système n'exécute des conteneurs ou que vous ayez un bogue grave dans un programme ou script installé.
Julie Pelletier

2

La limite PID maximale est bien inférieure à 2^((sizeof(int)*CHAR_BIT). Voir Quelle est la valeur maximale de l'ID de processus? . En d'autres termes, vos PID n'atteindront jamais les 4 milliards.

Lorsque tous les emplacements pid sont remplis, les forkappels commencent à échouer avec errno==EAGAIN(voir fork (2) ). Si vous frappez simplement le haut sans remplir tous les emplacements, le prochain PID sera le prochain emplacement libre après 1 (1 est init)

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.