Cosa succede quando si esauriscono i PID?


8

Questa è una domanda puramente accademica, perché non accadrà mai.

Se un PID è archiviato come tipo pid_t e non con un tipo di precisione arbitraria, esiste un limite al numero di PID che possono esistere contemporaneamente. Esiste un comportamento definito per l'overflow dei PID?

Il 65536 ° processo ucciderà / sbin / init e creerà un panico nel kernel? O c'è qualche misura di sicurezza in atto?


2
stackoverflow.com/questions/6294133/maximum-pid-in-linux~~V~~singular~~1st Credo che si potrebbe modificare il valore massimo e scoprire;)

2
Numeri più bassi vengono riutilizzati (OpenBSD e altri randomizzano i PID) e probabilmente colpirai qualche altro limite (ad esempio esaurendo la memoria a causa di tutti i processi o scambiando la morte o il killer OOM impazzendo) prima di forkfallire a causa di no pid disponibile.
thrig

1
Per informazione: non credo di aver visto un PID maggiore di 2 ^ 15-1 = 32767. Hai?
thb

3
Né i duplicati suggeriti rispondono davvero a questa domanda però.
Julie Pelletier,

1
Non è chiaro se ti stai chiedendo cosa succede quando i PID raggiungono un valore massimo (sia circa 2 ^ 15 o circa 2 ^ 32), o cosa succede quando non è più possibile allocare un nuovo PID, che non è la stessa cosa . Non penso che la tua domanda sia un duplicato di una delle domande contrassegnate; entrambi chiedono quale sia il limite, non cosa succede quando lo si supera. Se aggiorni la domanda per chiarire cosa stai chiedendo, voterò per riaprirla. (Hai già le risposte a entrambe le possibili versioni.)
Keith Thompson,

Risposte:


8

Il forksyscall dovrebbe restituire -1 e impostato errnosu EAGAIN . Cosa succederà dopo dipenderà dal processo che ha chiamato fork.

Dalla forcella :

La funzione fork () deve fallire se:

[EAGAIN]

Nel sistema mancavano le risorse necessarie per creare un altro processo, altrimenti si supererebbe il limite imposto dal sistema sul numero totale di processi in corso di esecuzione a livello di sistema o da un singolo utente {CHILD_MAX}.


9

POSIX non specifica che il PID di ogni nuovo processo sia ottenuto incrementando il PID precedente. Richiede solo che sia unico.

Su un sistema in cui i PID sono incrementati su ciascuno fork(), ho osservato che i valori si spostano dopo aver raggiunto un limite superiore (che nella mia esperienza è di circa 2 15 ). Dopo aver eseguito il wrapping, i nuovi PID non vengono rigorosamente incrementati, poiché alcuni valori PID saranno ancora utilizzati dai cicli precedenti.

Non ci dovrebbero essere problemi fino a quando non si hanno 2 N processi in esecuzione contemporaneamente . Ho il sospetto che il sistema avrebbe incontrato un limite di capacità molto prima che ciò accadesse. In tal caso, la fork()chiamata di sistema avrebbe esito negativo e probabilmente impostata errnosu EAGAINo ENOMEM( man forkper dettagli).

Il codice che implementa forkpuò o meno verificare se sono disponibili PID. Potrebbe non disturbare, perché presume che le risorse di sistema si sarebbero esaurite prima di arrivare a quel punto, oppure potrebbe avere un controllo esplicito per completezza e per gestire le possibilità future. Non ho controllato, e se avessi potuto indirizzare solo qualsiasi kernel che avevo guardato.


Naturalmente so che non accadrà mai, ma il sistema ha un numero limitato di PID da assegnare. Voglio solo sapere cosa succede quando si esaurisce.
Fred Frey, il

1
Questa risposta è in realtà l'unica che risponde davvero alla domanda. Il comportamento dipende dal sistema ma deve solo garantire un pid unico per ogni nuovo processo. Ovviamente vieni limitato dalla quantità massima configurata di PID che è dettagliata nelle 2 domande contrassegnate come duplicate, ma è molto improbabile che accada a meno che il tuo sistema non stia eseguendo container o tu abbia un grave bug in un programma o script installato.
Julie Pelletier,

2

Il limite massimo di PID è molto inferiore 2^((sizeof(int)*CHAR_BIT). Vedi Qual è il valore massimo dell'ID processo? . In altre parole, i tuoi PID non supereranno mai i 4 miliardi.

Quando tutti gli slot pid sono occupati, le forkchiamate iniziano a fallire con errno==EAGAIN(vedi fork (2) ). Se colpisci semplicemente la parte superiore senza riempire tutti gli slot, il PID successivo sarà lo slot libero successivo dopo 1 (1 è init)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.