¿Los hilos del kernel de Linux son realmente procesos del kernel?
19
He leído en muchos lugares que Linux crea un hilo de kernel para cada hilo de usuario en una máquina virtual Java. (Veo el término "hilo del núcleo" usado de dos maneras diferentes:
un hilo creado para hacer el trabajo central del sistema operativo y
un hilo que el sistema operativo conoce y programa para realizar el trabajo del usuario.
Estoy hablando del último tipo).
¿Es un hilo de kernel lo mismo que un proceso de kernel, ya que los procesos de Linux admiten espacios de memoria compartida entre padre e hijo, o es realmente una entidad diferente?
No hay absolutamente ninguna diferencia entre un hilo y un proceso en Linux. Si observa el 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; puedes compartir qué componentes quieres en Linux.
Este no es el caso en otras implementaciones de sistemas operativos, donde hay diferencias mucho más sustanciales.
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 /proccomo /proc/NUMBERson TGID,
nombres numéricos de las carpetas /proc/TGID/taskcomo /proc/TGID/task/NUMBERson 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) .
Sugerencia: el uso de la palabra "tarea" puede ayudar a referirse a algo ejecutable sin entrar tanto en el proceso / confusión de hilos.
Totor
17
Los hilos son procesos bajo Linux. Se crean con la clonellamada del sistema, que devuelve una ID de proceso que puede enviarse una señal a través de la killllamada del sistema, al igual que un proceso. Los procesos de subprocesos son visibles en la pssalida. La clonellamada pasa banderas que determinan cuánto del entorno del proceso padre se comparte con el proceso del hilo.
El hombre pthreads(7)dice que para la implementación actual de NPTL (Native POSIX Threads Library), "todos los hilos de un proceso se colocan en el mismo grupo de hilos; todos los miembros de un grupo de hilos comparten el mismo PID". En la implementación obsoleta de LinuxThreads, cada "hilo" tiene su propio PID.
Los hilos son procesos bajo Linux. Se crean con la
clone
llamada del sistema, que devuelve una ID de proceso que puede enviarse una señal a través de lakill
llamada del sistema, al igual que un proceso. Los procesos de subprocesos son visibles en laps
salida. Laclone
llamada pasa banderas que determinan cuánto del entorno del proceso padre se comparte con el proceso del hilo.fuente
pthreads(7)
dice que para la implementación actual de NPTL (Native POSIX Threads Library), "todos los hilos de un proceso se colocan en el mismo grupo de hilos; todos los miembros de un grupo de hilos comparten el mismo PID". En la implementación obsoleta de LinuxThreads, cada "hilo" tiene su propio PID.