Na verdade, o Linux não distingue entre processos e threads e implementa ambos como uma estrutura de dados task_struct
.
Então, o que o Linux fornece a alguns programas para que eles diferenciem os threads de um processo de seus processos filhos? Por exemplo, existe uma maneira de ver detalhes de todos os threads que um processo possui no Linux?
Obrigado.
De uma
task_struct
perspectiva, os encadeamentos de um processo têm o mesmo líder de grupo de encadeamento (group_leader
intask_struct
), enquanto os processos filho têm um líder de grupo de encadeamento diferente (cada processo filho individual).Essas informações são expostas ao espaço do usuário por meio do
/proc
sistema de arquivos. Você pode rastrear pais e filhos observando oppid
campo em/proc/${pid}/stat
ou.../status
(isso fornece o pid pai); você pode rastrear threads observando otgid
campo em.../status
(isso fornece o ID do grupo de threads, que também é o pid do líder do grupo). Os threads de um processo ficam visíveis no/proc/${pid}/task
diretório: cada thread obtém seu próprio subdiretório. (Todo processo tem pelo menos um thread.)Na prática, os programas que desejam acompanhar seus próprios threads dependem de APIs fornecidas pela biblioteca de threads que estão usando, em vez de usar informações específicas do sistema operacional. Normalmente, em sistemas do tipo Unix, isso significa usar pthreads.
Isso executa o
top
comando com algumas opções extras:-H
argumento instrui o top a exibir cada thread individual. Normalmente, o top resume todos os threads em seu processo pai.-b
argumento faz a execução superior no modo de lote – as informações são coletadas, exibidas e, em seguida, despejadas no stdout em vez de executar em um modo interativo e atualizar os dados exibidos.-b
opção, o usuário deve informar ao top quantas vezes executar, isso é feito com o-n
argumento e um argumento final com quantas vezes executar.Então
top -H -b -n 1
, instrui o sistema a “executar no topo, exibir threads individuais, executar em modo de lote e executar apenas uma vez”.O
ps
comando relata um instantâneo dos processos em execução no momento.O
-eLf
argumento (também pode ser usado-e -L -f
) é dividido da seguinte forma:e
informaps
para exibir todos os processos, independentemente de quem os possui ou de seu status atual – ativo, suspenso, pausado, aguardando E/S, etc.L
dizps
para mostrar tópicos individuaisf
instruçõesps
para formatar a saída como uma listagem de formato completo e, em conjunto com oL
argumento, as colunas NLWP (número de encadeamentos) e LWP (ID do encadeamento) são adicionadas à saída.Considere um processo com PID p1
O
task_struct
objeto de um processo filho terá PPID (PID pai) como p1 e seu PID e TGID definidos como, digamos, p2.O
task_struct
objeto de uma thread de p1 terá PID definido como, digamos, p3, mas TGID definido como p1.