La documentación puede ser bastante confusa, así que aquí está el "real " Modelo Linux:
- dentro del kernel de Linux, algo que se puede ejecutar (y programar) se denomina "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 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 controladores de señal (a veces más),
- si un proceso "subproceso" tiene PID=TGID, puede llamarse "el subproceso principal",
- llamando a
getpid()
de cualquier proceso devolverá su TGID (=PID "hilo principal"), - llamando
gettid()
de cualquier proceso devolverá su PID (!), - cualquier tipo de proceso se puede crear con el
clone(2)
llamada al sistema, - lo que se comparte entre los procesos se decide pasando banderas específicas a
clone(2)
, - nombres numéricos de carpetas que puede enumerar con
ls /proc
como/proc/NUMBER
son TGID, - nombres numéricos de las carpetas en
/proc/TGID/task
como/proc/TGID/task/NUMBER
son PID, - aunque no vea todos los PID existentes con
ls /proc
, todavía puedes hacercd /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 subproceso es simplemente un tipo diferente de proceso (que comparte, al menos, el mismo espacio de memoria y controladores de señal con uno o varios otros). -s).
Nota: la implementación del concepto "hilo" en Linux ha llevado a una confusión de vocabulario, y si getpid()
te está mintiendo no hace lo que pensabas, es porque su comportamiento sigue la compatibilidad con POSIX (se supone que los subprocesos comparten un PID común).
No hay absolutamente ninguna diferencia entre un hilo y un proceso en Linux. Si observa clon(2), verá un conjunto de indicadores que determinan qué se comparte y qué no se comparte entre los subprocesos.
Los procesos clásicos son solo hilos que no comparten nada; puede compartir los componentes que desee en Linux.
Este no es el caso en otras implementaciones de SO, donde hay diferencias mucho más sustanciales.
Los hilos son procesos bajo Linux. Se crean con el clone
llamada al sistema, que devuelve un ID de proceso al que se puede enviar una señal a través del kill
llamada al sistema, como un proceso. Los procesos de subprocesos son visibles en ps
producción. El clone
la llamada se pasa indicadores que determinan qué parte del entorno del proceso principal se comparte con el proceso del subproceso.