2010-08-10 30 views
34

¿Cómo determina Linux el próximo PID que utilizará 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?¿Cómo determina Linux el próximo PID?

Por ejemplo, si ejecuto un script PHP desde Apache que hace un <?php print(getmypid());?>, se imprimirá el mismo PID 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 cambia el PID, será un número cercano, pero ¿qué tan cerca? El número no parece ser completamente secuencial. Si hago un ps aux | grep apache consigo un buen número de procesos:

enter image description here

Linux ¿Cómo elegir el 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?

Respuesta

48

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ódigo relevante:

Dentro 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 kernel son más que sólo int identificadores; 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 de usuario se debe a que la programación del kernel puede bifurcar un proceso entre las llamadas de su proceso 'fork(). Es muy común, de hecho.

+0

+1 eres un mal asno, así que te di algo más ... – rook

+0

¿Hay alguna manera de que pueda mapear los PID globales y de espacio de nombres? –

11

yo preferiría asumir el comportamiento ves proviene de otra fuente:

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 más de un proceso en secuencia tenga asignado el mismo PID por linux.

Como dices que el nuevo PID va a 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 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, debe no utilizar cualquier suposición acerca de la asignación de PID como base para algo que implemente. (Consulte también el comentario de sanmai.)

+0

Creo que esto es parcialmente correcto. Desafortunadamente no tiene pruebas para apoyar esta respuesta. – rook

+0

Ahora sí tengo, veo las otras respuestas. :-) – chiccodoro

+0

btw era el (+1) – rook

9

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

p. Ej. utilice la flecha hacia arriba recuerdo la historia de 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 dependen de esto: por razones de seguridad, algunas personas corren granos que pasan mucho tiempo de CPU extra para elegir aleatoriamente nuevas PID.

+0

Esto no parece ser cierto. – rook

+0

@The Rock: ¿Por qué? – chiccodoro

+0

Captura de pantalla de @chiccodoro publicada. – rook

3

Los PID se pueden asignar aleatoriamente. Hay a number of ways para lograr eso.

+0

Por lo que sé, la aleatorización de PID fue rechazada por el equipo de desarrollo de kernel de Linux debido a la seguridad a través de la oscuridad. – Akshay

Cuestiones relacionadas