En * nix, los PID son identificadores únicos para ejecutar procesos. ¿Cómo se generan los PID? ¿Es solo un número entero que se incrementa o una estructura más compleja como una lista? ¿Cómo se reciclan? Al reciclar quiero decir que, cuando un proceso termina, su PID eventualmente será reutilizado por otro proceso.
42
Respuestas:
Como dice Wikipedia ,
así que es realmente una política muy simple para "generación", simplemente incremente un contador y "reciclaje", simplemente ajuste el número a un valor máximo y siga incrementándolo hasta que encuentre un número que se asignó a un proceso que ha finalizado y tiene sido eliminado de la tabla de procesos.
Algunas implementaciones de Unix, como AIX, usan una política que es menos simple; consulte, por ejemplo, estas preguntas frecuentes .
fuente
while(true);
), lo siento, estaba respondiendo rápidamente ;-)Varía.
La mayoría de los sistemas simplemente mantienen un recuento del último PID generado, agregan uno (ajuste en un número máximo como 65535 o un poco más pequeño, a menudo el ajuste ocurre en 65000 o incluso 60000), y verifique que el número no esté actualmente en uso ( repetir si el PID todavía está en uso, por lo que el PID 1, el núcleo, todavía está allí y no se 'vuelve a emitir').
Otros sistemas con mentalidad de seguridad generan un número al azar y verifican que no esté en uso.
En cualquier momento, se garantiza que todos los números PID son únicos.
fuente
En cuanto a la parte de reciclaje de la pregunta, una cosa a tener en cuenta es que un pid no estará disponible tan pronto como finalice el proceso con ese pid. El pid no estará disponible hasta que el padre de ese proceso recopile el estado de terminación de su hijo a través de alguna forma de la llamada al sistema wait (). Un niño que se termina pero cuyo padre no ha emitido una espera se llama zombie y, por lo general, aparece en un ps como difunto. Es posible que un padre con mal comportamiento muera de hambre el sistema de pids si lanza niños y no los espera ().
Si el padre de un proceso muere antes de que recopile el estado de un hijo, está bien. El hijo hereda al niño, que se asegurará de que se emita un wait () y se recicle el pid.
fuente
myprog &
seguidowait $!
sería UB.Son números de secuencia y se envuelven (en un valor específico del sistema operativo) si el sistema está funcionando durante el tiempo suficiente. Los números nunca se reutilizan a menos que sean libres en el momento
fork()
.fuente