Los cuatro hilos tendrán el mismo PID pero solo cuando se vean desde arriba. Lo que usted (como usuario) llama un PID no es lo que el núcleo (mirando desde abajo) llama un PID.
En el kernel, cada hilo tiene su propio ID, llamado PID (aunque posiblemente tendría más sentido llamarlo TID, o ID de hilo) y también tienen un TGID (ID de grupo de hilo) que es el PID del hilo que inició todo el proceso.
De manera simplista, cuando se crea un nuevo proceso , aparece como un hilo en el que tanto el PID como el TGID son el mismo (nuevo) número.
Cuando un subproceso inicia otro subproceso, ese subproceso iniciado obtiene su propio PID (por lo que el programador puede programarlo de forma independiente) pero hereda el TGID del subproceso original.
De esa manera, el kernel puede programar subprocesos independientemente del proceso al que pertenecen, mientras que los procesos (ID de grupo de subprocesos) se le informan.
La siguiente jerarquía de subprocesos puede ayudar (a) :
USER VIEW
<-- PID 43 --> <----------------- PID 42 ----------------->
+---------+
| process |
_| pid=42 |_
_/ | tgid=42 | \_ (new thread) _
_ (fork) _/ +---------+ \
/ +---------+
+---------+ | process |
| process | | pid=44 |
| pid=43 | | tgid=42 |
| tgid=43 | +---------+
+---------+
<-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
KERNEL VIEW
Puede ver que comenzar un nuevo proceso (a la izquierda) le brinda un nuevo PID y un nuevo TGID (ambos configurados con el mismo valor), mientras que comenzar un nuevo hilo (a la derecha) le brinda un nuevo PID mientras mantiene el mismo TGID como el hilo que lo inició.
(a) Temblar de asombro ante mis impresionantes habilidades gráficas :-)
getpid()
devuelve tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
como se muestra en www.makelinux.com/gettgid(2)
función. Ygetpid()
no devolverá el TID (el "PID" del hilo), y ahí es dondegettid(2)
entra. De esta manera puedo saber si estamos en el hilo principal o no.Los subprocesos se identifican mediante PID y TGID (ID de grupo de subprocesos). También saben qué subproceso es padre de quién, por lo que esencialmente un proceso comparte su PID con cualquier subproceso que inicia. Los ID de subprocesos generalmente son administrados por la propia biblioteca de subprocesos (como pthread, etc.). Si se inician los 4 hilos, deben tener el mismo PID. El núcleo mismo manejará la programación de subprocesos y demás, pero la biblioteca es la que administrará los subprocesos (si pueden ejecutarse o no dependiendo de su uso de los métodos de unión y espera de subprocesos).
Nota: Esto es de mi recuerdo del kernel 2.6.36. Mi trabajo en las versiones actuales del kernel está en la capa de E / S, así que no sé si eso ha cambiado desde entonces.
fuente
Linux proporciona a la
fork()
llamada al sistema la funcionalidad tradicional de duplicar un proceso. Linux también proporciona la capacidad de crear subprocesos utilizando laclone()
llamada al sistema. Sin embargo, Linux no distingue entre procesos e subprocesos.fuente