In che modo Linux distingue i thread dai processi figlio?


Risposte:


28

Da un task_structpunto di vista, i thread di un processo hanno lo stesso leader del gruppo di thread ( group_leaderintask_struct ), mentre i processi figlio hanno un leader del gruppo di thread diverso (ogni singolo processo figlio).

Queste informazioni sono esposte allo spazio utente tramite il /procfile system. Puoi rintracciare genitori e figli guardando il ppidcampo in /proc/${pid}/stato .../status(questo dà il pid genitore); puoi tracciare i thread guardando il tgidcampo in .../status(questo dà l'id del gruppo di thread, che è anche il pid del capogruppo). I thread di un processo sono resi visibili nella /proc/${pid}/taskdirectory: ogni thread ottiene la propria sottodirectory. (Ogni processo ha almeno un thread.)

In pratica, i programmi che desiderano tenere traccia dei propri thread si baserebbero sulle API fornite dalla libreria di thread che stanno utilizzando, anziché utilizzare informazioni specifiche del sistema operativo. Tipicamente su sistemi simili a Unix, questo significa usare pthreads.


Ogni processo in una pipeline di shell (echo foo | cat) condivide lo stesso capogruppo (la shell), ma non sono thread nello stesso processo.
psusi,

2
Stai parlando di gruppi di processi; nella mia risposta, il capogruppo è dal punto di vista del kernel. Nella contabilità del kernel, processi separati sono il proprio leader del gruppo. Puoi vederlo eseguendo (sleep 120 | sleep 120) &e guardando i Tgidvalori nel file di ogni sleepprocesso /proc/${pid}/status.
Stephen Kitt,

Oh strano Non sapevo che esistesse qualcosa come un "leader del gruppo di thread" e pensavo che presumibilmente tutti i thread in un processo multithread siano uguali e non esiste un "leader". Ognuno di loro può uscire e finché uno rimane, il processo non è morto.
psusi,

5
  1. Questo esegue il topcomando con alcune opzioni extra:

    top -H -b -n 1
    
    • L' -Hargomento indica a top di visualizzare ogni singolo thread. Normalmente top riassume tutti i thread nel loro processo genitore.
    • L' -bargomento fa funzionare al meglio in modalità batch: le informazioni vengono raccolte, visualizzate e quindi scaricate su stdout invece di essere eseguite in modalità interattiva e aggiornando i dati visualizzati.
    • Con l' -bopzione, l'utente deve dire in alto quante volte eseguire, questo viene fatto con l' -nargomento e un argomento finale con quante volte eseguire.

    Quindi top -H -b -n 1istruisce il sistema di "eseguire top, visualizzare singoli thread, eseguire in modalità batch ed eseguire una sola volta".

  2. Il pscomando riporta un'istantanea dei processi attualmente in esecuzione.

    ps -eLf
    

    L' -eLfargomento (utilizzabile -e -L -fanche) si suddivide come segue:

    • eindica psdi visualizzare tutti i processi indipendentemente da chi li possiede o dal loro stato corrente: attivo, inattivo, in pausa, in attesa di I / O, ecc.
    • Ldice psdi mostrare i singoli thread
    • la fdice psper formattare l'output come un elenco completo formato, e in collegamento con l' Largomento della NLWP (numero di fili) e LWP (ID) del filo colonne vengono aggiunte all'uscita.

1

Prendi in considerazione un processo con PID p1

L' task_structoggetto di un processo figlio avrà PPID (PID padre) come p1, ed è PID e TGID impostati, ad esempio, su p2.

L' task_structoggetto di un thread di p1 avrà PID impostato come, diciamo p3, ma TGID impostato su p1.


Quindi stai dicendo la stessa cosa di Stephen Kitt , ma molto meno chiaramente. PS Perché preoccuparsi di portare PPID nella discussione se non hai intenzione di dire qual è il PPID di un thread?
Scott,

PID e TGID sono sempre gli stessi.
Tim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.