La documentación puede ser bastante confusa, así que aquí está el modelo " real " de Linux:
- dentro del kernel de Linux, algo que se puede ejecutar (y programar) se llama "proceso",
- cada proceso tiene un ID de proceso (PID) exclusivo del sistema y un ID de grupo de subprocesos (TGID),
- un proceso "normal" tiene PID = TGID y ningún otro proceso comparte este valor de TGID,
- un proceso "enhebrado" es un proceso cuyo valor TGID es compartido por otros procesos,
- varios procesos que comparten el mismo TGID también comparten, al menos, el mismo espacio de memoria y manejadores de señal (a veces más),
- si un proceso "enhebrado" tiene PID = TGID, puede llamarse "el hilo principal",
- llamar
getpid()
desde cualquier proceso devolverá su TGID (= PID "hilo principal"),
- llamar
gettid()
desde cualquier proceso devolverá su PID (!),
- Se puede crear cualquier tipo de proceso con la
clone(2)
llamada al sistema,
- nombres numéricos de carpetas con los que puede enumerar
ls /proc
como /proc/NUMBER
son TGID,
- nombres numéricos de las carpetas
/proc/TGID/task
como /proc/TGID/task/NUMBER
son PID,
- aunque no vea todos los PID existentes
ls /proc
, aún puede verlos cd /proc/any_PID
.
Conclusión : desde el punto de vista del kernel, solo existen procesos, cada uno con su propio PID único, y un llamado hilo es solo un tipo diferente de proceso.
Nota: la implementación del concepto de "hilo" en Linux ha llevado a una confusión de vocabulario, y si getpid()
mentirle no hace lo que pensaba, es porque su comportamiento sigue la compatibilidad POSIX (se supone que los hilos comparten un PID común) .