¿Cómo diferencia Linux los hilos de los procesos secundarios?

Respuestas:

28

Desde una task_structperspectiva, los subprocesos de un proceso tienen el mismo líder de grupo de subprocesos ( group_leaderintask_struct ), mientras que los procesos secundarios tienen un líder de grupo de subprocesos diferente (cada proceso secundario individual).

Esta información está expuesta al espacio del usuario a través del /procsistema de archivos. Puede rastrear padres e hijos mirando el ppidcampo en /proc/${pid}/stato .../status(esto le da al padre pid); puede rastrear hilos mirando el tgidcampo en .../status(esto le da la identificación del grupo de hilos, que también es el pid del líder del grupo). Los subprocesos de un proceso se hacen visibles en el /proc/${pid}/taskdirectorio: cada subproceso obtiene su propio subdirectorio. (Cada proceso tiene al menos un hilo).

En la práctica, los programas que desean realizar un seguimiento de sus propios subprocesos dependerían de las API proporcionadas por la biblioteca de subprocesos que están utilizando, en lugar de utilizar información específica del sistema operativo. Típicamente en sistemas tipo Unix, eso significa usar pthreads.

Stephen Kitt
fuente
Cada proceso en una tubería de shell (echo foo | cat) comparte el mismo líder de grupo (el shell), pero no son hilos en el mismo proceso.
psusi
2
Estás hablando de grupos de procesos; en mi respuesta, el líder del grupo es desde la perspectiva del núcleo. En la contabilidad del núcleo, los procesos separados son su propio líder de grupo. Puede ver esto ejecutando (sleep 120 | sleep 120) &y mirando los Tgidvalores en sleepel /proc/${pid}/statusarchivo de cada proceso .
Stephen Kitt
Oh raro No sabía que existía algo así como un "líder de grupo de subprocesos" y pensé que supuestamente todos los subprocesos en un proceso de subprocesos múltiples son iguales y no hay un "líder". Cualquiera de ellos puede salir y mientras uno permanezca, el proceso no está muerto.
psusi
5
  1. Esto ejecuta el topcomando con algunas opciones adicionales:

    top -H -b -n 1
    
    • El -Hargumento indica a top que muestre cada hilo individual. Normalmente, top resume todos los hilos bajo su proceso padre.
    • El -bargumento se ejecuta de manera superior en modo por lotes: la información se recopila, muestra y luego se descarga en stdout en lugar de ejecutarse en modo interactivo y actualizar los datos que se muestran.
    • Con la -bopción, el usuario debe indicarle cuántas veces ejecutar, esto se hace con el -nargumento y un argumento final con cuántas veces ejecutar.

    Por lo tanto, top -H -b -n 1indica al sistema que "ejecute la parte superior, muestre subprocesos individuales, ejecute en modo por lotes y solo se ejecute una vez".

  2. El pscomando informa una instantánea de los procesos actualmente en ejecución.

    ps -eLf
    

    El -eLfargumento (también se puede usar -e -L -f) se desglosa de la siguiente manera:

    • ele indica psque muestre todos los procesos independientemente de quién los posea o su estado actual: activo, en suspensión, en pausa, esperando E / S, etc.
    • Lle dice psque muestre hilos individuales
    • el fle dice psque formatee la salida como una lista de formato completo, y junto con el Largumento, las columnas NLWP (número de hilos) y LWP (ID de hilo) se agregan a la salida.
ivanivan
fuente
1

Considere un proceso con PID p1

El task_structobjeto de un proceso secundario tendrá PPID (PID primario) como p1, y es PID y TGID establecidos, por ejemplo, p2.

El task_structobjeto de un subproceso de p1 tendrá PID establecido como, por ejemplo, p3, pero TGID establecido en p1.

NOLFXceptMe
fuente
Entonces estás diciendo lo mismo que Stephen Kitt , pero mucho menos claramente. PD: ¿Por qué molestarse en traer PPID a la discusión si no va a decir cuál es el PPID de un hilo?
Scott
PID y TGID son siempre iguales.
Tim