¿Por qué los valores PID no son continuos?


14

Si escribimos ps -ef, obtenemos una lista de procesos. ¿Por qué los números PID no son continuos?

Respuestas:


16

En Ubuntu son continuos. En otros sistemas operativos puede ser diferente.

El núcleo asigna PID en el rango de (RESERVED_PIDS, PID_MAX_DEFAULT). Lo hace secuencialmente en cada espacio de nombres (las tareas en diferentes espacios de nombres pueden tener los mismos ID). En caso de que el rango se agote, la asignación pid se ajusta.

( /programming/3446727/how-does-linux-determine-the-next-pid )

Mente aunque ...

  • La programación del kernel puede bifurcar un proceso, por lo que puede parecer omitir números.
  • Un PID desaparecerá cuando finalice esa tarea.
  • Los PID no se reutilizan hasta que se alcanza PID_MAX_DEFAULT.
  • Se omite un PID reservado.

Algunos temas sobre stackoverflow:

En los comentarios hay un comando para probar la asignación de PID:

for i in {1..20}; do sh -c 'echo $$'; done

"La programación del núcleo puede bifurcar un proceso, por lo que puede parecer que se omiten los números". - el núcleo puede crear un proceso mientras determina qué proceso ejecutar? Eso parece raro
user253751

Es bastante común que el planificador bifurque un proceso. Probablemente este bit: lxr.free-electrons.com/source/kernel/pid.c#L125 que lo está
disuadiendo

8

Las ID de proceso que faltan en el medio ya están muertas y sus PID serán reutilizados por el núcleo en los procesos posteriores.

Los procesos muertos no se mostrarán en la tabla de procesos (excepto los zombis), por ps -eflo tanto , no los mostrarán.


3

Normalmente, el PID es continuo, pero algunos procesos estarán muertos en el momento en que ejecute el comando ps -ef.

Además, algunos procesos pueden ser solo un subproceso de otro proceso que no se muestra en el ps -efcomando. Para ver un resultado ampliado y puede verificar el PID continuo, use elpstree

pstree -p

Salida de muestra:

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

mientras que si ejecuta ps -efsolo verá el proceso padre.

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f

2

Son continuos. Los PID se asignan en orden secuencial hasta que se alcanza el límite máximo. Después de este límite, comenzará de nuevo desde cero.

Por lo tanto, es solo que los PID faltantes ps -efson procesos muertos. Tenga en cuenta que ps -efsolo enumera los procesos en ejecución.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.