tag picard musicbrainz mac kid3 español editar easytag linux apache linux-kernel kernel

picard - ¿Cómo determina Linux el próximo PID?



musicbrainz picard español (4)

¿Cómo determina Linux el próximo PID que usará para un proceso? El propósito de esta pregunta es comprender mejor el kernel de Linux. No tengas miedo de publicar el código fuente del kernel. Si los PID se asignan de forma secuencial, ¿cómo llena Linux los huecos? ¿Qué pasa cuando llega al final?

Por ejemplo, si ejecuto un script PHP de Apache que hace una <?php print(getmypid());?> El mismo PID se imprimirá durante unos minutos mientras pulso actualizar. Este período de tiempo es una función de cuántas solicitudes está recibiendo apache. Incluso si solo hay un cliente, el PID eventualmente cambiará.

Cuando el PID cambia, será un número cercano, pero ¿qué tan cerca? El número no parece ser completamente secuencial. Si hago un ps aux | grep apache ps aux | grep apache obtengo un buen número de procesos:

¿Cómo elige Linux este próximo número? Los pocos PID anteriores todavía se están ejecutando, así como también el PID más reciente que se imprimió. ¿Cómo elige apache reutilizar estos PID?


El kernel 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 esté agotado, la asignación pid se ajusta.

Algunos códigos relevantes:

Inside alloc_pid (...)

for (i = ns->level; i >= 0; i--) { nr = alloc_pidmap(tmp); if (nr < 0) goto out_free; pid->numbers[i].nr = nr; pid->numbers[i].ns = tmp; tmp = tmp->parent; }

alloc_pidmap ()

static int alloc_pidmap(struct pid_namespace *pid_ns) { int i, offset, max_scan, pid, last = pid_ns->last_pid; struct pidmap *map; pid = last + 1; if (pid >= pid_max) pid = RESERVED_PIDS; /* and later on... */ pid_ns->last_pid = pid; return pid; }

Tenga en cuenta que los PID en el contexto del núcleo son más que solo identificadores int ; la estructura relevante se puede encontrar en /include/linux/pid.h . Además de la identificación, contiene una lista de tareas con esa identificación, un contador de referencia y un nodo de lista hash para acceso rápido.

El motivo de que los PID no aparezcan de forma secuencial en el espacio del usuario se debe a que la programación del kernel puede bifurcar un proceso entre las llamadas fork() . Es muy común, de hecho.


Los PID son secuenciales en la mayoría de los sistemas. Puede verlo al iniciar varios procesos usted mismo en la máquina inactiva.

por ejemplo, utilice la recuperación de historial de flecha arriba para ejecutar repetidamente un comando que imprime su propio PID:

$ ls -l /proc/self lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21491 $ ls -l /proc/self lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21492 $ ls -l /proc/self lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21493 $ ls -l /proc/self lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21494

No dependa de esto: por razones de seguridad, algunas personas ejecutan kernels que gastan tiempo de CPU adicional para elegir nuevos PID aleatoriamente.



Prefiero asumir que el comportamiento que observa proviene de otra fuente :

Los buenos servidores web suelen tener varias instancias de proceso para equilibrar la carga de las solicitudes. Estos procesos se administran en un grupo y se asignan a una determinada solicitud cada vez que se recibe una solicitud. Para optimizar el rendimiento, Apache probablemente asigne el mismo proceso a un conjunto de solicitudes secuenciales del mismo cliente. Después de una cierta cantidad de solicitudes, el proceso finaliza y se crea uno nuevo.

No creo que a más de un proceso en secuencia se le asigne el mismo PID por Linux.

Como usted dice que el nuevo PID estará cerca del último, supongo que Linux simplemente asigna a cada proceso el último PID + 1. Pero hay procesos apareciendo y finalizándose todo el tiempo en segundo plano por las aplicaciones y los programas del sistema, por lo tanto no puede predecir el número exacto del proceso de apache que se iniciará a continuación.

Aparte de esto, no debe usar ninguna suposición sobre la asignación de PID como base para algo que implemente. (Ver también el comentario de sanmai)