Was passiert, wenn Ihnen die PIDs ausgehen?

8

Dies ist eine rein akademische Frage, da dies niemals passieren wird.

Wenn eine PID als Typ pid_t und nicht als Typ mit beliebiger Genauigkeit gespeichert ist, ist die Anzahl der PIDs, die gleichzeitig vorhanden sein können, begrenzt. Gibt es ein definiertes Verhalten für den Fall, dass PIDs überlaufen?

Wird der 65536. Prozess / sbin / init töten und eine Kernel-Panik auslösen? Oder gibt es eine Sicherheitsmaßnahme?

Fred Frey
quelle
2
stackoverflow.com/questions/6294133/maximum-pid-in-linux Ich denke, Sie könnten den Maximalwert ändern und herausfinden;)
2
Niedrigere Zahlen werden wiederverwendet (OpenBSD und andere randomisieren die PIDs) und Sie werden wahrscheinlich ein anderes Limit erreichen (z. B. aufgrund all der Prozesse nicht genügend Speicherplatz oder Swap-Tod oder OOM-Killer, der wild wird), bevor forkdies aufgrund von Nein fehlschlägt pid verfügbar.
Thrig
1
Zur Information: Ich glaube nicht, dass ich eine PID gesehen habe, die größer als 2 ^ 15-1 = 32767 ist. Haben Sie?
17.
3
Keines der vorgeschlagenen Duplikate beantwortet diese Frage jedoch wirklich.
Julie Pelletier
1
Es ist nicht klar, ob Sie fragen, was passiert, wenn PIDs einen Maximalwert erreichen (ob es ungefähr 2 ^ 15 oder ungefähr 2 ^ 32 ist), oder was passiert, wenn es nicht mehr möglich ist, eine neue PID zuzuweisen, was nicht dasselbe ist . Ich denke nicht, dass Ihre Frage ein Duplikat einer der markierten Fragen ist. Beide fragen, was das Limit ist, nicht was passiert, wenn Sie es überschreiten. Wenn Sie die Frage aktualisieren, um zu klären, was Sie fragen, stimme ich dafür, sie erneut zu öffnen. (Sie haben bereits Antworten auf beide möglichen Versionen.)
Keith Thompson

Antworten:

8

Der forkSystemaufruf sollte -1 zurückgeben und errnoauf EAGAIN gesetzt sein . Was danach passiert, hängt von dem aufgerufenen Prozess ab fork.

Von der Gabel :

Die Funktion fork () schlägt fehl, wenn:

[EAGAIN]

Dem System fehlten die erforderlichen Ressourcen, um einen anderen Prozess zu erstellen, oder die vom System auferlegte Begrenzung der Gesamtzahl der Prozesse, die systemweit oder von einem einzelnen Benutzer {CHILD_MAX} ausgeführt werden, würde überschritten.

JigglyNaga
quelle
9

POSIX gibt nicht an, dass die PID jedes neuen Prozesses durch Inkrementieren der vorherigen PID erhalten wird. Es muss nur eindeutig sein.

Bei einem System, bei dem die PIDs jeweils erhöht werden fork(), habe ich festgestellt, dass die Werte nach Erreichen einer Obergrenze (die meiner Erfahrung nach bei etwa 2 bis 15 liegt ) umlaufen . Nach dem Umwickeln werden neue PIDs nicht streng inkrementiert, da einige PID-Werte aus früheren Zyklen weiterhin verwendet werden.

Es sollte kein Problem geben, bis 2 N Prozesse gleichzeitig ausgeführt werden. Ich vermute, dass das System lange bevor dies geschah, auf eine Kapazitätsgrenze stoßen würde. In diesem Fall fork()würde der Systemaufruf fehlschlagen und wahrscheinlich errnoauf EAGAINoder ENOMEM( man forkfür Details) gesetzt.

Der implementierte Code forkkann prüfen, ob PIDs verfügbar sind oder nicht. Dies stört möglicherweise nicht, da davon ausgegangen wird, dass die Systemressourcen vor diesem Zeitpunkt aufgebraucht sind, oder es wird eine explizite Überprüfung durchgeführt, um die Vollständigkeit zu gewährleisten und zukünftige Möglichkeiten zu prüfen. Ich habe es nicht überprüft, und wenn ich es hätte, könnte ich nur den Kernel ansprechen, den ich mir angesehen habe.

Keith Thompson
quelle
Natürlich weiß ich, dass es niemals passieren würde, aber das System muss eine begrenzte Anzahl von PIDs zuweisen. Ich möchte nur wissen, was passiert, wenn es ausgeht.
Fred Frey
1
Diese Antwort ist tatsächlich die einzige, die die Frage wirklich beantwortet. Das Verhalten ist systemabhängig, muss jedoch nur eine eindeutige PID pro neuem Prozess sicherstellen. Natürlich werden Sie durch die konfigurierte maximale Anzahl von PIDs begrenzt, die in den 2 als Duplikate gekennzeichneten Fragen aufgeführt ist. Dies ist jedoch sehr unwahrscheinlich, es sei denn, auf Ihrem System werden Container ausgeführt oder Sie haben einen schwerwiegenden Fehler in einem installierten Programm oder Skript.
Julie Pelletier
2

Die maximale PID-Grenze liegt weit unter 2^((sizeof(int)*CHAR_BIT). Siehe Was ist der Maximalwert der Prozess-ID? . Mit anderen Worten, Ihre PIDs werden niemals in die Nähe von 4 Milliarden gehen.

Wenn alle PID-Slots belegt sind, schlagen forkAnrufe fehl errno==EAGAIN(siehe Gabelung (2) ). Wenn Sie einfach nach oben gehen, ohne alle Slots zu füllen, ist die nächste PID der nächste freie Slot nach 1 (1 ist init).

PSkocik
quelle