He leído en muchos lugares que Linux crea una cadena de kernel para cada subprocess de usuario en una VM Java. (Veo el término "hilo del kernel" usado de dos maneras diferentes:
Estoy hablando del último tipo).
¿Es una cadena del núcleo lo mismo que un process de kernel, ya que los processs de Linux admiten espacios de memory compartida entre padres e hijos, o es realmente una entidad diferente?
No hay absolutamente ninguna diferencia entre un hilo y un process en Linux. Si observa clone (2) , verá un set de indicadores que determinan qué se comparte y qué no se comparte entre los hilos.
Los processs clásicos son solo hilos que no comparten nada; puedes compartir qué componentes quieres en Linux.
Este no es el caso en otras implementaciones del sistema operativo, donde existen diferencias mucho más sustanciales.
Los hilos son processs bajo Linux. Se crean con la llamada al sistema de clone
, que devuelve un ID de process al que se puede enviar una señal mediante la llamada al sistema kill
, como un process. Los processs de subprocesss son visibles en la salida ps
. La llamada de clone
se pasa indicadores que determinan qué parte del entorno del process principal se comparte con el process de subprocesss.
La documentation puede ser bastante confusa, así que aquí está el verdadero model de Linux:
getpid()
desde cualquier process devolverá su TGID (= "PID principal" PID), gettid()
desde cualquier process devolverá su PID (!), clone(2)
, ls /proc
como /proc/NUMBER
son TGID, /proc/TGID/task
como /proc/TGID/task/NUMBER
son PID, ls /proc
, aún puede hacer cd /proc/any_PID
. Conclusión : desde el punto de vista del núcleo, solo existen processs, cada uno con su propio PID único, y un llamado hilo es simplemente un tipo diferente de process.
Nota: la implementación del concepto "hilo" en Linux ha llevado a una confusión de vocabulario, y si getpid()
le miente no hace lo que usted pensaba, es porque su comportamiento sigue la compatibilidad POSIX (se supone que los hilos comparten un PID común).