¿Qué sucede cuando te quedas sin PID?

8

Esta es una pregunta puramente académica, porque esto nunca sucederá.

Si un PID se almacena como tipo pid_t, y no como un tipo de precisión arbitraria, entonces hay un límite para el número de PID que pueden existir al mismo tiempo. ¿Existe un comportamiento definido para cuando los PID se desbordan?

¿El proceso 65536th matará / sbin / init y creará un kernel panic? ¿O hay alguna medida de seguridad en el lugar?

Fred Frey
fuente
2
stackoverflow.com/questions/6294133/maximum-pid-in-linux Supongo que podría cambiar el valor máximo y averiguarlo;)
2
Los números más bajos se reutilizan (OpenBSD y otros aleatorizan los PID) y probablemente alcanzará algún otro límite (por ejemplo, quedarse sin memoria debido a todos los procesos o intercambiar la muerte o el asesino de OOM volviéndose loco) antes de que forkfalle por no pid disponible.
thrig
1
Para información: no creo que haya visto un PID mayor que 2 ^ 15-1 = 32767. ¿Lo ha hecho?
thb
3
Sin embargo, ninguno de los duplicados sugeridos realmente responde a esta pregunta.
Julie Pelletier
1
No está claro si está preguntando qué sucede cuando los PID alcanzan un valor máximo (si es aproximadamente 2 ^ 15 o aproximadamente 2 ^ 32), o qué sucede cuando ya no es posible asignar un nuevo PID, que no es lo mismo . No creo que su pregunta sea un duplicado de ninguna de las preguntas marcadas; ambos preguntan cuál es el límite, no qué sucede cuando lo excedes. Si actualiza la pregunta para aclarar lo que está preguntando, votaré para volver a abrirla. (Ya tiene respuestas para ambas versiones posibles.)
Keith Thompson

Respuestas:

8

La forkllamada al sistema debería devolver -1 y establecerse errnoen EAGAIN . Lo que suceda después de eso dependerá del proceso que llamó fork.

De tenedor :

La función fork () fallará si:

[EAGAIN]

El sistema carecía de los recursos necesarios para crear otro proceso, o se excedería el límite impuesto por el sistema en el número total de procesos en ejecución en todo el sistema o por un solo usuario {CHILD_MAX}.

JigglyNaga
fuente
9

POSIX no especifica que el PID de cada nuevo proceso se obtiene al incrementar el PID anterior. Solo requiere que sea único.

En un sistema donde los PID se incrementan en cada uno fork(), he observado que los valores se ajustan después de alcanzar un límite superior (que en mi experiencia es de alrededor de 2 15 ). Después de finalizar, los nuevos PID no se incrementan estrictamente, ya que algunos valores de PID seguirán en uso en ciclos anteriores.

No debería haber ningún problema hasta que tenga 2 N ejecutando procesos simultáneamente . Sospecho que el sistema alcanzaría algún límite de capacidad mucho antes de que eso sucediera. En ese caso, la fork()llamada al sistema fallaría y probablemente se establecería errnoen EAGAINo ENOMEM( man forkpara más detalles).

El código que implementa forkpuede o no verificar si hay PID disponibles. Puede que no moleste, porque supone que los recursos del sistema se habrían agotado antes de llegar a ese punto, o podría tener una verificación explícita en aras de la integridad y para manejar las posibilidades futuras. No lo he comprobado, y si lo hubiera hecho, solo podría direccionar el núcleo que había visto.

Keith Thompson
fuente
Por supuesto, sé que nunca sucedería, pero el sistema tiene un número limitado de PID para asignar. Solo quiero saber qué sucede cuando se agota.
Fred Frey
1
Esta respuesta es en realidad la única que realmente responde la pregunta. El comportamiento depende del sistema, pero solo necesita garantizar un pid único por proceso nuevo. Por supuesto, estará limitado por la cantidad máxima configurada de PID que se detalla en las 2 preguntas marcadas como duplicados, pero es muy poco probable que suceda a menos que su sistema esté ejecutando contenedores o tenga un error grave en un programa o script instalado.
Julie Pelletier
2

El límite máximo de PID es mucho mucho menor que 2^((sizeof(int)*CHAR_BIT). Consulte ¿Cuál es el valor máximo de la ID de proceso? . En otras palabras, sus PID nunca se acercarán a los 4 mil millones.

Cuando se llenen todos los espacios pid, las forkllamadas comenzarán a fallar con errno==EAGAIN(ver fork (2) ). Si simplemente toca la parte superior sin llenar todos los espacios, el siguiente PID será el siguiente espacio libre después de 1 (1 es init)

PSkocik
fuente